diff --git a/OpenRA.Mods.CA/Activities/EnterCarrierMaster.cs b/OpenRA.Mods.CA/Activities/EnterCarrierMaster.cs index c12d99843d..dcff11492b 100644 --- a/OpenRA.Mods.CA/Activities/EnterCarrierMaster.cs +++ b/OpenRA.Mods.CA/Activities/EnterCarrierMaster.cs @@ -53,6 +53,10 @@ protected override void OnEnterComplete(Actor self, Actor targetActor) foreach (var pool in ammoPools) while (pool.GiveAmmo(self, 1)) { } + + var aircraft = self.TraitOrDefault(); + if (aircraft != null) + aircraft.RemoveInfluence(); }); } } diff --git a/OpenRA.Mods.CA/Traits/AirstrikeSlave.cs b/OpenRA.Mods.CA/Traits/AirstrikeSlave.cs index d3803b3492..77e98725bb 100644 --- a/OpenRA.Mods.CA/Traits/AirstrikeSlave.cs +++ b/OpenRA.Mods.CA/Traits/AirstrikeSlave.cs @@ -16,13 +16,6 @@ namespace OpenRA.Mods.CA.Traits [Desc("Can be slaved to a spawner.")] public class AirstrikeSlaveInfo : BaseSpawnerSlaveInfo { - [Desc("Move this close to the spawner, before entering it.")] - public readonly WDist LandingDistance = new WDist(5 * 1024); - - [Desc("We consider this is close enought to the spawner and enter it, instead of trying to reach 0 distance." + - "This allows the spawned unit to enter the spawner while the spawner is moving.")] - public readonly WDist CloseEnoughDistance = new WDist(128); - public override object Create(ActorInitializer init) { return new AirstrikeSlave(init, this); } } diff --git a/OpenRA.Mods.CA/Traits/CarrierMaster.cs b/OpenRA.Mods.CA/Traits/CarrierMaster.cs index 250ec86ac4..c034ccf65b 100644 --- a/OpenRA.Mods.CA/Traits/CarrierMaster.cs +++ b/OpenRA.Mods.CA/Traits/CarrierMaster.cs @@ -28,7 +28,7 @@ public class CarrierMasterInfo : BaseSpawnerMasterInfo public readonly int RearmTicks = 150; [GrantedConditionReference] - [Desc("The condition to grant to self right after launching a spawned unit. (Used by V3 to make immobile.)")] + [Desc("The condition to grant to self right after launching a spawned unit.")] public readonly string LaunchingCondition = null; [GrantedConditionReference] @@ -273,7 +273,7 @@ void ITick.Tick(Actor self) foreach (var slaveEntry in SlaveEntries) { var carrierSlaveEntry = slaveEntry as CarrierSlaveEntry; - if (carrierSlaveEntry.Actor.CurrentActivity is EnterCarrierMaster) + if (carrierSlaveEntry.Actor.IsInWorld && carrierSlaveEntry.Actor.CurrentActivity is EnterCarrierMaster) slaveIsEntering = true; if (CarrierMasterInfo.RearmAsGroup && numLaunched > 0) @@ -284,9 +284,9 @@ void ITick.Tick(Actor self) } if (slaveIsEntering && beingEnteredToken == Actor.InvalidConditionToken) - self.GrantCondition(CarrierMasterInfo.BeingEnteredCondition); + beingEnteredToken = self.GrantCondition(CarrierMasterInfo.BeingEnteredCondition); else if (!slaveIsEntering && beingEnteredToken != Actor.InvalidConditionToken) - self.RevokeCondition(beingEnteredToken); + beingEnteredToken = self.RevokeCondition(beingEnteredToken); // range check RangeCheck(self); diff --git a/OpenRA.Mods.CA/Traits/CarrierSlave.cs b/OpenRA.Mods.CA/Traits/CarrierSlave.cs index 90534fd96b..fba58f6240 100644 --- a/OpenRA.Mods.CA/Traits/CarrierSlave.cs +++ b/OpenRA.Mods.CA/Traits/CarrierSlave.cs @@ -18,9 +18,6 @@ namespace OpenRA.Mods.CA.Traits [Desc("Can be slaved to a spawner.")] public class CarrierSlaveInfo : BaseSpawnerSlaveInfo { - [Desc("Move this close to the spawner, before entering it.")] - public readonly WDist LandingDistance = new WDist(5 * 1024); - public override object Create(ActorInitializer init) { return new CarrierSlave(init, this); } } diff --git a/OpenRA.Mods.CA/Traits/Render/RenderLine.cs b/OpenRA.Mods.CA/Traits/Render/RenderLine.cs new file mode 100644 index 0000000000..ec1b473da1 --- /dev/null +++ b/OpenRA.Mods.CA/Traits/Render/RenderLine.cs @@ -0,0 +1,118 @@ +#region Copyright & License Information +/** + * Copyright (c) The OpenRA Combined Arms Developers (see CREDITS). + * This file is part of OpenRA Combined Arms, 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.Collections.Generic; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.Common.Graphics; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.CA.Traits.Render +{ + [Desc(".")] + public class RenderLineInfo : ConditionalTraitInfo + { + [Desc("Color of the line.")] + public readonly Color Color = Color.FromArgb(128, Color.White); + + [Desc("Line width.")] + public readonly float Width = 1; + + [Desc("Line angle.")] + public readonly WAngle Angle = WAngle.Zero; + + [Desc("Line length.")] + public readonly WDist Length = WDist.Zero; + + [Desc("Dash length.")] + public readonly WDist DashLength = WDist.Zero; + + [Desc("Fade duration in ticks.")] + public readonly int FadeTicks = 0; + + [Desc("If true, fade in as well as out.")] + public readonly bool FadeIn = true; + + public override object Create(ActorInitializer init) { return new RenderLine(init.Self, this); } + } + + public class RenderLine : ConditionalTrait, INotifyCreated, IRenderAnnotations, ITick + { + readonly RenderLineInfo info; + int currentAlpha; + int ticksUntilFaded; + int fadePerTick; + + public RenderLine(Actor self, RenderLineInfo info) + : base(info) + { + this.info = info; + currentAlpha = info.Color.ToAhsv().A; + ticksUntilFaded = info.FadeTicks; + fadePerTick = info.FadeTicks > 0 ? currentAlpha / info.FadeTicks : 0; + } + + protected override void Created(Actor self) + { + base.Created(self); + } + + void ITick.Tick(Actor self) + { + if (info.FadeTicks == 0) + return; + + if (--ticksUntilFaded <= 0) + { + ticksUntilFaded = info.FadeTicks; + + if (info.FadeIn) + fadePerTick *= -1; + else + currentAlpha = info.Color.ToAhsv().A; + } + + currentAlpha -= fadePerTick; + } + + public IEnumerable LineRenderables(Actor self, WorldRenderer wr) + { + if (!self.Owner.IsAlliedWith(self.World.RenderPlayer)) + yield break; + + if (IsTraitDisabled) + yield break; + + var dashLength = info.DashLength == WDist.Zero ? info.Length : info.DashLength; + var dashVector = new WVec(0, -dashLength.Length, 0); + dashVector = dashVector.Rotate(WRot.FromYaw(info.Angle)); + + var currentDashStartPos = self.CenterPosition; + var lengthTravelled = WDist.Zero; + var color = Color.FromArgb(currentAlpha, info.Color); + + while (lengthTravelled.Length < info.Length.Length) + { + lengthTravelled = lengthTravelled + (dashLength * 2); + yield return new LineAnnotationRenderable(currentDashStartPos, currentDashStartPos + dashVector, info.Width, color); + currentDashStartPos += (dashVector * 2); + } + } + + IEnumerable IRenderAnnotations.RenderAnnotations(Actor self, WorldRenderer wr) + { + return LineRenderables(self, wr); + } + + bool IRenderAnnotations.SpatiallyPartitionable { get { return false; } } + } +} diff --git a/OpenRA.Mods.CA/Traits/TargetedAttackAbility.cs b/OpenRA.Mods.CA/Traits/TargetedAttackAbility.cs index 0cc30d4926..3402d7996a 100644 --- a/OpenRA.Mods.CA/Traits/TargetedAttackAbility.cs +++ b/OpenRA.Mods.CA/Traits/TargetedAttackAbility.cs @@ -205,7 +205,7 @@ public TargetedAttackAbilityOrderGenerator(Actor self, TargetedAttackAbility abi info = ability.Info; selectedWithAbility = self.World.Selection.Actors - .Where(a => a.Info.HasTraitInfo() && a != self && a.Owner == self.Owner) + .Where(a => a.Info.HasTraitInfo() && a != self && a.Owner == self.Owner && !a.IsDead) .Select(a => new TraitPair(a, a.Trait())) .Where(s => s.Trait.Info.Type == ability.Info.Type); } diff --git a/mods/ca/maps/ca-composition-tester/map.yaml b/mods/ca/maps/ca-composition-tester/map.yaml index 7dae3d3283..0e6fd06d1b 100644 --- a/mods/ca/maps/ca-composition-tester/map.yaml +++ b/mods/ca/maps/ca-composition-tester/map.yaml @@ -1570,4 +1570,4 @@ Actors: TurretFacing: 192 Owner: Multi2 -Rules: composition-tester-rules-base.yaml, rules.yaml +Rules: ca|rules/custom/composition-tester.yaml, rules.yaml diff --git a/mods/ca/maps/ca-composition-tournament/map.yaml b/mods/ca/maps/ca-composition-tournament/map.yaml index d2551c532b..99d22ce4cc 100644 --- a/mods/ca/maps/ca-composition-tournament/map.yaml +++ b/mods/ca/maps/ca-composition-tournament/map.yaml @@ -1312,6 +1312,6 @@ Actors: Owner: Neutral Location: 104,118 -Rules: ca|maps/ca-composition-tester/composition-tester-rules-base.yaml, rules.yaml +Rules: ca|rules/custom/composition-tester.yaml, rules.yaml Weapons: weapons.yaml diff --git a/mods/ca/maps/ca-prologue-03/ca-prologue-03.lua b/mods/ca/maps/ca-prologue-03/ca-prologue-03.lua index 446f0e5746..8ef32c537e 100644 --- a/mods/ca/maps/ca-prologue-03/ca-prologue-03.lua +++ b/mods/ca/maps/ca-prologue-03/ca-prologue-03.lua @@ -19,7 +19,7 @@ WorldLoaded = function() InitUSSR() ObjectiveLocateForces = GDI.AddObjective("Locate all GDI forces.") - ObjectiveExit = GDI.AddObjective("Find an safe exit route.") + ObjectiveExit = GDI.AddObjective("Find a safe exit route.") SetupReveals({ Reveal1, Reveal3, Reveal4 }) diff --git a/mods/ca/maps/ca01-crossrip/ca01.lua b/mods/ca/maps/ca01-crossrip/ca01.lua index 2889dea388..c64721220d 100644 --- a/mods/ca/maps/ca01-crossrip/ca01.lua +++ b/mods/ca/maps/ca01-crossrip/ca01.lua @@ -136,7 +136,7 @@ Squads = { MaxTime = DateTime.Minutes(6) }, { - Infantry = { "e3", "e1", "e1", "e3", "shok", "e1", { "shok", "n8" }, "e1", "e2", "e3", "e4" }, -- 2510 + Infantry = { "e3", "e1", "e1", "e3", "shok", "e1", { "shok", "e8" }, "e1", "e2", "e3", "e4" }, -- 2510 Vehicles = { { "3tnk", "3tnk.atomic" }, "4tnk", "btr.ai", { "katy", "v2rl" }, "ttra" }, -- 5475 (+800) MinTime = DateTime.Minutes(6) } diff --git a/mods/ca/maps/ca04-containment/rules.yaml b/mods/ca/maps/ca04-containment/rules.yaml index f17917f449..5d724d8a2d 100644 --- a/mods/ca/maps/ca04-containment/rules.yaml +++ b/mods/ca/maps/ca04-containment/rules.yaml @@ -177,6 +177,12 @@ OCAR.CHPR: OCAR.Husk: Inherits@GDIPAL: ^GDIPalette +SEAS: + RevealsShroud: + Range: 4c512 + MinRange: 0 + -RevealsShroud@GAPGEN: + SAPC: ExternalCondition@FORCEUNCLOAK: Condition: cloak-force-disabled diff --git a/mods/ca/maps/ca04-containment/weapons.yaml b/mods/ca/maps/ca04-containment/weapons.yaml index b7705f2bb8..45c2f6a58b 100644 --- a/mods/ca/maps/ca04-containment/weapons.yaml +++ b/mods/ca/maps/ca04-containment/weapons.yaml @@ -12,6 +12,7 @@ FireballLauncher: Speed: 200 FLAK-SEAS-AG: + Range: 4c512 Warhead@1Dam: SpreadDamage Versus: None: 100 diff --git a/mods/ca/maps/ca06-conspiracy/map.yaml b/mods/ca/maps/ca06-conspiracy/map.yaml index a199452d96..56f26e38ff 100644 --- a/mods/ca/maps/ca06-conspiracy/map.yaml +++ b/mods/ca/maps/ca06-conspiracy/map.yaml @@ -3926,4 +3926,4 @@ Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/c Weapons: ca|weapons/campaign.yaml, weapons.yaml -Notifications: ca|rules/map/force-cabal-eva.yaml +Notifications: ca|rules/custom/force-cabal-eva.yaml diff --git a/mods/ca/maps/ca07-subversion/map.yaml b/mods/ca/maps/ca07-subversion/map.yaml index 7f67536688..52a1d5a8b7 100644 --- a/mods/ca/maps/ca07-subversion/map.yaml +++ b/mods/ca/maps/ca07-subversion/map.yaml @@ -4155,7 +4155,7 @@ Actors: Owner: Neutral Location: 75,67 BattleTankPatroller1: mtnk - Owner: Neutral + Owner: GDI Facing: 0 Location: 75,68 BattleTankPatrol2: waypoint @@ -4382,4 +4382,4 @@ Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/c Weapons: ca|weapons/campaign.yaml, weapons.yaml -Notifications: ca|rules/map/force-cabal-eva.yaml +Notifications: ca|rules/custom/force-cabal-eva.yaml diff --git a/mods/ca/maps/ca08-salvation/map.yaml b/mods/ca/maps/ca08-salvation/map.yaml index 704523ef80..9baad683dc 100644 --- a/mods/ca/maps/ca08-salvation/map.yaml +++ b/mods/ca/maps/ca08-salvation/map.yaml @@ -1871,4 +1871,4 @@ Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/c Weapons: ca|weapons/campaign.yaml -Notifications: ca|rules/map/force-cabal-eva.yaml +Notifications: ca|rules/custom/force-cabal-eva.yaml diff --git a/mods/ca/maps/ca09-zenith/map.yaml b/mods/ca/maps/ca09-zenith/map.yaml index 3751abf807..5c911c5d78 100644 --- a/mods/ca/maps/ca09-zenith/map.yaml +++ b/mods/ca/maps/ca09-zenith/map.yaml @@ -4418,4 +4418,4 @@ Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/c Weapons: ca|weapons/campaign.yaml, weapons.yaml -Notifications: ca|rules/map/force-cabal-eva.yaml +Notifications: ca|rules/custom/force-cabal-eva.yaml diff --git a/mods/ca/maps/ca10-awakening/map.yaml b/mods/ca/maps/ca10-awakening/map.yaml index 094af86607..f1ef6a29b4 100644 --- a/mods/ca/maps/ca10-awakening/map.yaml +++ b/mods/ca/maps/ca10-awakening/map.yaml @@ -1775,4 +1775,4 @@ Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/c Weapons: ca|weapons/campaign.yaml -Notifications: ca|rules/map/force-cabal-eva.yaml +Notifications: ca|rules/custom/force-cabal-eva.yaml diff --git a/mods/ca/maps/ca11-abasement/ca11.lua b/mods/ca/maps/ca11-abasement/ca11.lua index 1a652a50e3..ed59f167de 100644 --- a/mods/ca/maps/ca11-abasement/ca11.lua +++ b/mods/ca/maps/ca11-abasement/ca11.lua @@ -435,13 +435,15 @@ SignalTransmitterDiscovered = function() end BaseFlipNotification = function() - Trigger.AfterDelay(DateTime.Seconds(3), function() + Trigger.AfterDelay(AdjustTimeForGameSpeed(DateTime.Seconds(4)), function() if not IsFirstBaseFlipped then IsFirstBaseFlipped = true - Media.DisplayMessage("Your efforts are appreciated. The Brotherhood will provide support.", "Nod Commander", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound("seth_appreciate.aud", 2) + Media.DisplayMessage("The Brotherhood appreciates your efforts. We will begin deploying our troops to assist you.", "Nod Commander", HSLColor.FromHex("FF0000")) elseif not IsSecondBaseFlipped then IsSecondBaseFlipped = true - Media.DisplayMessage("Kane will be pleased. Now we must focus our efforts and secure the Signal Transmitter!", "Nod Commander", HSLColor.FromHex("FF0000")) + MediaCA.PlaySound("seth_kanepleased.aud", 2) + Media.DisplayMessage("Kane will be pleased. Now focus your efforts on securing the Signal Transmitter.", "Nod Commander", HSLColor.FromHex("FF0000")) end end) end diff --git a/mods/ca/maps/ca11-abasement/seth_appreciate.aud b/mods/ca/maps/ca11-abasement/seth_appreciate.aud new file mode 100644 index 0000000000..7e4b3c5344 Binary files /dev/null and b/mods/ca/maps/ca11-abasement/seth_appreciate.aud differ diff --git a/mods/ca/maps/ca11-abasement/seth_kanepleased.aud b/mods/ca/maps/ca11-abasement/seth_kanepleased.aud new file mode 100644 index 0000000000..bbcf18c8f9 Binary files /dev/null and b/mods/ca/maps/ca11-abasement/seth_kanepleased.aud differ diff --git a/mods/ca/maps/ca26-foothold/ca26.lua b/mods/ca/maps/ca26-foothold/ca26.lua index 8da2757bbd..b35ead2d5b 100644 --- a/mods/ca/maps/ca26-foothold/ca26.lua +++ b/mods/ca/maps/ca26-foothold/ca26.lua @@ -14,6 +14,12 @@ ReinforcementsInterval = { hard = DateTime.Minutes(5) } +HarvesterDeathDelayTime = { + easy = DateTime.Seconds(30), + normal = DateTime.Seconds(25), + hard = DateTime.Seconds(20), +} + Squads = { ScrinMain = { Delay = { @@ -22,9 +28,9 @@ Squads = { hard = DateTime.Minutes(3) }, AttackValuePerSecond = { - easy = { { MinTime = 0, Value = 20 }, { MinTime = DateTime.Minutes(14), Value = 50 } }, - normal = { { MinTime = 0, Value = 50 }, { MinTime = DateTime.Minutes(12), Value = 100 } }, - hard = { { MinTime = 0, Value = 80 }, { MinTime = DateTime.Minutes(10), Value = 160 } }, + easy = { { MinTime = 0, Value = 20 }, { MinTime = DateTime.Minutes(13), Value = 50 } }, + normal = { { MinTime = 0, Value = 50 }, { MinTime = DateTime.Minutes(11), Value = 100 } }, + hard = { { MinTime = 0, Value = 80 }, { MinTime = DateTime.Minutes(9), Value = 160 } }, }, QueueProductionStatuses = { Infantry = false, @@ -42,9 +48,11 @@ Squads = { }, ScrinWater = { Delay = { + normal = DateTime.Minutes(7), hard = DateTime.Minutes(6) }, AttackValuePerSecond = { + normal = { { MinTime = 0, Value = 20 } }, hard = { { MinTime = 0, Value = 28 }, { MinTime = DateTime.Minutes(10), Value = 55 } }, }, QueueProductionStatuses = { @@ -56,6 +64,10 @@ Squads = { ProducerActors = nil, ProducerTypes = { Infantry = { "port" }, Vehicles = { "wsph" } }, Units = { + normal = { + { Vehicles = { "intl.ai2", { "seek", "lace" } }, }, + { Vehicles = { { "seek", "lace" }, { "seek", "lace" }, { "seek", "lace" } }, }, + }, hard = { { Vehicles = { "intl", "intl.ai2", "seek" }, }, { Vehicles = { "seek", "seek", "seek" }, }, @@ -342,7 +354,7 @@ BeginScrinAttacks = function() InitAirAttackSquad(Squads.ScrinAir, Scrin, GDI, { "harv.td", "msam", "hsam", "nuke", "nuk2", "orca", "a10", "a10.upg", "auro", "htnk", "htnk.drone", "htnk.ion", "htnk.hover", "titn", "titn.rail" }) end) - if Difficulty == "hard" then + if Difficulty ~= "easy" then Trigger.AfterDelay(Squads.ScrinWater.Delay[Difficulty], function() InitAttackSquad(Squads.ScrinWater, Scrin) end) @@ -352,11 +364,11 @@ end InitTibLifeforms = function() if Difficulty ~= "hard" then - Blob2.Destroy() + Blob1.Destroy() end if Difficulty == "easy" then - Blob1.Destroy() + Blob2.Destroy() Blob3.Destroy() return end diff --git a/mods/ca/maps/ca27-convergence/ca27.lua b/mods/ca/maps/ca27-convergence/ca27.lua index a15e4f3c46..a0014d9e50 100644 --- a/mods/ca/maps/ca27-convergence/ca27.lua +++ b/mods/ca/maps/ca27-convergence/ca27.lua @@ -143,10 +143,27 @@ WorldLoaded = function() SetupIonStorm() UpdateMissionText() + if Difficulty == "hard" then + Sensor3.Destroy() + end + + if Difficulty ~= "easy" then + Sensor1.Destroy() + Sensor2.Destroy() + end + + Trigger.AfterDelay(DateTime.Seconds(10), function() + if Difficulty == "hard" then + Tip("Scrin fleet vessels will be pinged on the minimap when entering the area.") + else + Tip("Scrin fleet vessels will be pinged on the minimap when entering the area and their paths will be visible as long as you have an active radar.") + end + end) + Trigger.AfterDelay(TimeBetweenWaves[Difficulty] + DateTime.Minutes(1), function() SendFleetWave() - Trigger.AfterDelay(DateTime.Seconds(40), function() + Trigger.AfterDelay(DateTime.Seconds(120), function() Notification("The area across the river is infested with Tiberium lifeforms. You will need to use aicraft to intercept Scrin fleet vessels attempting to break through there.") MediaCA.PlaySound("c_acrossriver.aud", 2) Beacon.New(GDI, AcrossRiver.CenterPosition) @@ -162,9 +179,9 @@ WorldLoaded = function() end if Difficulty == "hard" then - ObjectiveStopFleet = GDI.AddObjective("Prevent any Scrin fleet ships breaking through.") + ObjectiveStopFleet = GDI.AddObjective("Prevent any Scrin fleet vessels breaking through.") else - ObjectiveStopFleet = GDI.AddObjective("Allow no more than " .. MaxBreakthroughs[Difficulty] .. " fleet ships through.") + ObjectiveStopFleet = GDI.AddObjective("Allow no more than " .. MaxBreakthroughs[Difficulty] .. " fleet vessels through.") end BottomOfMap = { } @@ -280,20 +297,34 @@ SendFleetWave = function() table.insert(composition, "pac") end + local xUsed = { } + -- for each unit in the wave, get the possible base spawn points, pick one and generate offsetted entry/exit Utils.Do(composition, function(shipType) Trigger.AfterDelay(interval, function() - local spawn = Utils.Random(WaveSpawns[currentWave]) - local xOffset = Utils.RandomInteger(-5, 5) - local entry = spawn.Location + CVec.New(xOffset, 0) + local spawn = nil + local xOffset = nil + local entry = nil + while entry == nil or xUsed[entry.X] ~= nil do + spawn = Utils.Random(WaveSpawns[currentWave]) + xOffset = Utils.RandomInteger(-7, 7) + entry = spawn.Location + CVec.New(xOffset, 0) + end + xUsed[entry.X] = true local exit = CPos.New(entry.X, 96) Beacon.New(GDI, spawn.CenterPosition + WVec.New(xOffset * 1024, 0, 0)) - Reinforcements.Reinforce(Scrin, { shipType }, { entry, exit }, 25, function(self) + local ships = Reinforcements.Reinforce(Scrin, { shipType }, { entry, exit }, 25, function(self) self.Destroy() NumBreakthroughs = NumBreakthroughs + 1 Media.PlaySoundNotification(GDI, "AlertBuzzer") Notification("A Scrin fleet vessel has broken through.") end) + if Difficulty ~= "hard" then + local pathRenderer = Actor.Create("pathRenderer", true, { Owner = GDI, Location = entry }) + Trigger.OnRemovedFromWorld(ships[1], function(self) + pathRenderer.Destroy() + end) + end Media.PlaySound("beepslct.aud") end) interval = interval + DateTime.Seconds(5) diff --git a/mods/ca/maps/ca27-convergence/map.bin b/mods/ca/maps/ca27-convergence/map.bin index a446c3120a..14424c5759 100644 Binary files a/mods/ca/maps/ca27-convergence/map.bin and b/mods/ca/maps/ca27-convergence/map.bin differ diff --git a/mods/ca/maps/ca27-convergence/map.yaml b/mods/ca/maps/ca27-convergence/map.yaml index bb5c8dd83e..9098898c34 100644 --- a/mods/ca/maps/ca27-convergence/map.yaml +++ b/mods/ca/maps/ca27-convergence/map.yaml @@ -1695,6 +1695,31 @@ Actors: Actor546: camera Owner: Scrin Location: 54,79 + Sensor3: msar + Owner: GDI + Location: 82,87 + DeployState: Deployed + Facing: 384 + Sensor1: msar + Owner: GDI + Location: 21,72 + DeployState: Deployed + Facing: 384 + Sensor2: msar + Owner: GDI + Location: 47,64 + DeployState: Deployed + Facing: 384 + Actor547: n1 + Owner: GDI + SubCell: 3 + Facing: 919 + Location: 22,70 + Actor548: n3 + Owner: GDI + SubCell: 3 + Location: 19,74 + Facing: 174 Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml diff --git a/mods/ca/maps/ca27-convergence/rules.yaml b/mods/ca/maps/ca27-convergence/rules.yaml index 5976191f82..a42cefa548 100644 --- a/mods/ca/maps/ca27-convergence/rules.yaml +++ b/mods/ca/maps/ca27-convergence/rules.yaml @@ -93,6 +93,25 @@ SHAR: FirepowerMultiplier@BUFF: Modifier: 120 +pathrenderer: + Inherits: ^InvisibleDummy + HitShape: + BodyOrientation: + QuantizedFacings: 1 + Immobile: + OccupiesSpace: false + RenderLine: + Angle: 512 + Length: 95c0 + Color: ff000033 + Width: 2 + DashLength: 0c256 + FadeTicks: 50 + RequiresCondition: radarenabled + GrantConditionOnPrerequisite@RADAR: + Condition: radarenabled + Prerequisites: radar-active + # Hunt() requires only 1 AttackBase DEVA: -AttackFrontalCharged: diff --git a/mods/ca/maps/ca28-illumination/ca28.lua b/mods/ca/maps/ca28-illumination/ca28.lua index c7896d2d5e..0a7c4d4216 100644 --- a/mods/ca/maps/ca28-illumination/ca28.lua +++ b/mods/ca/maps/ca28-illumination/ca28.lua @@ -46,8 +46,8 @@ FinalBattleInfantryInterval = { } FinalBattleVehicleInterval = { - easy = DateTime.Seconds(30), - normal = DateTime.Seconds(25), + easy = DateTime.Seconds(28), + normal = DateTime.Seconds(24), hard = DateTime.Seconds(20) } diff --git a/mods/ca/maps/ca28-illumination/map.yaml b/mods/ca/maps/ca28-illumination/map.yaml index d563f42551..2dd4d5f4c8 100644 --- a/mods/ca/maps/ca28-illumination/map.yaml +++ b/mods/ca/maps/ca28-illumination/map.yaml @@ -590,6 +590,60 @@ Actors: SubCell: 3 Location: 16,70 Facing: 824 + Actor156: stcr + Owner: Scrin + Facing: 384 + Location: 45,8 + Actor157: stcr + Owner: Scrin + Location: 46,68 + Facing: 642 + Actor158: stcr + Owner: Scrin + Location: 78,31 + Facing: 134 + Actor159: corr + Owner: Scrin + Location: 15,71 + Facing: 745 + Actor160: gscr + Owner: Scrin + SubCell: 3 + Location: 106,36 + Facing: 237 + Actor161: gscr + Owner: Scrin + SubCell: 3 + Location: 110,39 + Facing: 618 + Actor162: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 109,35 + Actor163: gscr + Owner: Scrin + SubCell: 3 + Location: 92,81 + Facing: 610 + Actor164: gscr + Owner: Scrin + Facing: 384 + SubCell: 3 + Location: 60,42 + Actor165: gscr + Owner: Scrin + SubCell: 3 + Location: 61,48 + Facing: 832 + Actor166: gunw + Owner: Scrin + Location: 104,67 + Facing: 118 + Actor167: stcr + Owner: Scrin + Location: 92,48 + Facing: 745 Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-tooltips.yaml, ca|rules/campaign-palettes.yaml, rules.yaml @@ -599,4 +653,4 @@ Weapons: ca|weapons/campaign.yaml Voices: voices.yaml -Notifications: ca|rules/map/force-cabal-eva.yaml +Notifications: ca|rules/custom/force-cabal-eva.yaml diff --git a/mods/ca/maps/ca29-purification/ca29.lua b/mods/ca/maps/ca29-purification/ca29.lua index a1c984ff2c..b30000403f 100644 --- a/mods/ca/maps/ca29-purification/ca29.lua +++ b/mods/ca/maps/ca29-purification/ca29.lua @@ -14,14 +14,14 @@ ScrinReinforcementSpawns = { Squads = { ScrinMain = { Delay = { - easy = DateTime.Seconds(270), - normal = DateTime.Minutes(3), - hard = DateTime.Seconds(90) + easy = DateTime.Seconds(240), + normal = DateTime.Seconds(150), + hard = DateTime.Seconds(60) }, AttackValuePerSecond = { - easy = { { MinTime = 0, Value = 20 }, { MinTime = DateTime.Minutes(12), Value = 50 } }, - normal = { { MinTime = 0, Value = 50 }, { MinTime = DateTime.Minutes(10), Value = 100 } }, - hard = { { MinTime = 0, Value = 80 }, { MinTime = DateTime.Minutes(8), Value = 160 } }, + easy = { { MinTime = 0, Value = 20 }, { MinTime = DateTime.Minutes(11), Value = 50 } }, + normal = { { MinTime = 0, Value = 50 }, { MinTime = DateTime.Minutes(9), Value = 100 } }, + hard = { { MinTime = 0, Value = 80 }, { MinTime = DateTime.Minutes(7), Value = 160 } }, }, QueueProductionStatuses = { Infantry = false, @@ -346,33 +346,40 @@ PurificationWave = function() end PurifyScrin = function() - local scrinToPurify = Utils.Where(Scrin.GetGroundAttackers(), IsScrinGroundHunterUnit) - - Utils.Do(scrinToPurify, function(a) - Purify(a) + local scrinGroundUnits = Utils.Shuffle(Utils.Where(Scrin.GetGroundAttackers(), IsScrinGroundHunterUnit)) + local count = 1 + + Utils.Do(scrinGroundUnits, function(a) + Purify(a, count) + count = count + 1 + if count > 10 then + count = 1 + end end) - local scrinAirToPurify = Scrin.GetActorsByTypes({ "pac", "deva" }) + local scrinAirUnits = Scrin.GetActorsByTypes({ "pac", "deva" }) + count = 1 - Utils.Do(scrinAirToPurify, function(a) - Purify(a) + Utils.Do(scrinAirUnits, function(a) + Purify(a, count) + count = count + 1 + if count > 10 then + count = 1 + end end) end -Purify = function(a) +Purify = function(a, count) Trigger.ClearAll(a) - local random = Utils.RandomInteger(1,100) - local threshold + local shouldConvert = false - if Difficulty == "easy" then - threshold = 30 - elseif Difficulty == "normal" then - threshold = 40 - else - threshold = 50 + if Difficulty == "easy" and count % 3 > 0 then + shouldConvert = true + elseif count % 2 == 0 then + shouldConvert = true end - if random > threshold then + if shouldConvert then a.Owner = ScrinRebels end Trigger.AfterDelay(1, function() diff --git a/mods/ca/maps/ca29-purification/map.yaml b/mods/ca/maps/ca29-purification/map.yaml index 7863668b2b..906b1c4152 100644 --- a/mods/ca/maps/ca29-purification/map.yaml +++ b/mods/ca/maps/ca29-purification/map.yaml @@ -2023,4 +2023,4 @@ Sequences: sequences.yaml Weapons: ca|weapons/campaign.yaml -Notifications: ca|rules/map/force-cabal-eva.yaml +Notifications: ca|rules/custom/force-cabal-eva.yaml diff --git a/mods/ca/maps/ca29-purification/rules.yaml b/mods/ca/maps/ca29-purification/rules.yaml index 37a69797db..810411e27b 100644 --- a/mods/ca/maps/ca29-purification/rules.yaml +++ b/mods/ca/maps/ca29-purification/rules.yaml @@ -300,6 +300,7 @@ WORMHOLE: Inherits@INF: ^ProducesInfantry Inherits@VEH: ^ProducesVehicles -PopControlled: + -TeleportNetwork: Health: HP: 500000 ChangesHealth: @@ -318,3 +319,9 @@ WORMHOLE: Condition: being-warped MustBeDestroyed: RequiredForShortGame: true + +# Removing TeleportNetwork from Wormhole above causes exception as no actors with TeleportNetwork are defined +dummyteleport: + Inherits: ^InvisibleDummy + TeleportNetwork: + Type: Wormhole diff --git a/mods/ca/maps/ca30-reckoning/map.bin b/mods/ca/maps/ca30-reckoning/map.bin index 5c235bf9f7..62458b9f91 100644 Binary files a/mods/ca/maps/ca30-reckoning/map.bin and b/mods/ca/maps/ca30-reckoning/map.bin differ diff --git a/mods/ca/maps/ca30-reckoning/map.yaml b/mods/ca/maps/ca30-reckoning/map.yaml index cdab3d1137..0a01348545 100644 --- a/mods/ca/maps/ca30-reckoning/map.yaml +++ b/mods/ca/maps/ca30-reckoning/map.yaml @@ -3101,4 +3101,4 @@ Sequences: sequences.yaml Weapons: ca|weapons/campaign.yaml, weapons.yaml -Notifications: ca|rules/map/force-cabal-eva.yaml +Notifications: ca|rules/custom/force-cabal-eva.yaml diff --git a/mods/ca/maps/containment-coop/rules.yaml b/mods/ca/maps/containment-coop/rules.yaml index 79896f338a..83cec6fcec 100644 --- a/mods/ca/maps/containment-coop/rules.yaml +++ b/mods/ca/maps/containment-coop/rules.yaml @@ -6,6 +6,9 @@ World: Briefing: ================\n\nSpoiler warning: This is a co-op version of the GDI campaign mission with the same name.\n\nThe two USA players control the Navy SEALs. The third (optional) England player controls the Spy. If there are only two players, the first player also controls the Spy.\n\n1. Destroy Atomic Reactors.\n2. Destroy Soviet SAM sites along shoreline.\n3. Destroy Atom Bomb silos before they launch.\n4. Neutralize the Chronosphere.\n\n================\n MapStartingLocations: SeparateTeamSpawnsCheckboxVisible: False + MapBuildRadius: + AllyBuildRadiusCheckboxVisible: False + BuildRadiusCheckboxVisible: False ScriptLobbyDropdown@RESPAWN: ID: respawn Label: Respawns @@ -18,6 +21,3 @@ World: Player: PlayerResources: SelectableCash: 0 - MapBuildRadius: - BuildRadiusCheckboxLocked: True - BuildRadiusCheckboxVisible: False diff --git a/mods/ca/maps/duality-coop/rules.yaml b/mods/ca/maps/duality-coop/rules.yaml index 7b53b445e9..bc9ae6d5fd 100644 --- a/mods/ca/maps/duality-coop/rules.yaml +++ b/mods/ca/maps/duality-coop/rules.yaml @@ -8,6 +8,9 @@ World: Briefing: ================\n\nSpoiler warning: This is a co-op version of the Allied campaign mission with the same name.\n\nThe Scrin have been stockpiling Tiberium in an abandoned underground facility. Get in, blow up the stockpiles, and get out alive.\n\n================\n MapStartingLocations: SeparateTeamSpawnsCheckboxVisible: False + MapBuildRadius: + AllyBuildRadiusCheckboxVisible: False + BuildRadiusCheckboxVisible: False ScriptLobbyDropdown@RESPAWN: ID: respawn Label: Respawns @@ -20,6 +23,3 @@ World: Player: PlayerResources: SelectableCash: 0 - MapBuildRadius: - BuildRadiusCheckboxLocked: True - BuildRadiusCheckboxVisible: False diff --git a/mods/ca/maps/dystopia-8v8.oramap b/mods/ca/maps/dystopia-8v8.oramap index 78d81f013d..d3677a1b01 100644 Binary files a/mods/ca/maps/dystopia-8v8.oramap and b/mods/ca/maps/dystopia-8v8.oramap differ diff --git a/mods/ca/maps/infection-ca.oramap b/mods/ca/maps/infection-ca.oramap index 228ec6b624..e668a13a30 100644 Binary files a/mods/ca/maps/infection-ca.oramap and b/mods/ca/maps/infection-ca.oramap differ diff --git a/mods/ca/maps/shellmap/map.yaml b/mods/ca/maps/shellmap/map.yaml index 681b3e77a1..0a530960a8 100644 --- a/mods/ca/maps/shellmap/map.yaml +++ b/mods/ca/maps/shellmap/map.yaml @@ -5795,6 +5795,6 @@ Actors: Owner: Scrin Location: 180,88 -Rules: ca|rules/campaign-rules.yaml, ca|rules/campaign-palettes.yaml, ca|rules/map/two-tone-nod.yaml, rules.yaml +Rules: ca|rules/campaign-rules.yaml, ca|rules/custom/two-tone-nod.yaml, rules.yaml Weapons: weapons.yaml diff --git a/mods/ca/maps/shellmap/rules.yaml b/mods/ca/maps/shellmap/rules.yaml index 5ecfcae5ef..b45a11a8ee 100644 --- a/mods/ca/maps/shellmap/rules.yaml +++ b/mods/ca/maps/shellmap/rules.yaml @@ -186,6 +186,10 @@ STNK.Nod: RAH: -WithColoredSelectionBox@INVIS: +TRAN.Evac: + RenderSprites: + PlayerPalette: player-twotonenod + # defense buffs BRIK: diff --git a/mods/ca/rules/ai.yaml b/mods/ca/rules/ai.yaml index 335d013375..403bf4a197 100644 --- a/mods/ca/rules/ai.yaml +++ b/mods/ca/rules/ai.yaml @@ -1873,7 +1873,7 @@ Player: ProtectionScanRadius: 16 HighValueTargetTypes: fact, afac, sfac, proc, proc.td, proc.scrin, atek, stek, gtek, tmpl, scrt HighValueTargetPriority: 20 - AirToAirPriority: 65 + AirToAirPriority: 60 BigAirThreats: pac, deva, kiro, mshp AirSquadTargetTypes: heli: Aircraft, Vehicle @@ -2141,7 +2141,7 @@ Player: ProtectionScanRadius: 12 HighValueTargetTypes: fact, afac, sfac, proc, proc.td, proc.scrin, atek, stek, gtek, tmpl, scrt HighValueTargetPriority: 10 - AirToAirPriority: 55 + AirToAirPriority: 50 BigAirThreats: pac, deva, kiro, mshp AirSquadTargetTypes: heli: Aircraft, Vehicle @@ -2409,7 +2409,7 @@ Player: ConstructionYardTypes: fact,afac,sfac StaticAntiAirTypes: agun, sam, nsam, cram, shar NavalProductionTypes: spen,syrd,spen.nod,syrd.gdi - AirToAirPriority: 45 + AirToAirPriority: 40 AirSquadTargetTypes: mshp: Building UnitBuilderBotModuleCA@normal: @@ -2644,7 +2644,7 @@ Player: ConstructionYardTypes: fact,afac,sfac StaticAntiAirTypes: agun, sam, nsam, cram, shar NavalProductionTypes: spen,syrd,spen.nod,syrd.gdi - AirToAirPriority: 35 + AirToAirPriority: 30 AirSquadTargetTypes: mshp: Building UnitBuilderBotModuleCA@easy: diff --git a/mods/ca/rules/aircraft.yaml b/mods/ca/rules/aircraft.yaml index 6b1d766639..44a68a9a4e 100644 --- a/mods/ca/rules/aircraft.yaml +++ b/mods/ca/rules/aircraft.yaml @@ -1348,7 +1348,6 @@ SMIG: AmmoPool: Ammo: 1 AirstrikeSlave: - LandingDistance: 1c0 SpawnActorOnDeath: Actor: SMIG.Husk RequiresCondition: !empdisable diff --git a/mods/ca/maps/ca-composition-tester/composition-tester-rules-base.yaml b/mods/ca/rules/custom/composition-tester.yaml similarity index 100% rename from mods/ca/maps/ca-composition-tester/composition-tester-rules-base.yaml rename to mods/ca/rules/custom/composition-tester.yaml diff --git a/mods/ca/rules/map/disable-player-experience.yaml b/mods/ca/rules/custom/disable-player-experience.yaml similarity index 100% rename from mods/ca/rules/map/disable-player-experience.yaml rename to mods/ca/rules/custom/disable-player-experience.yaml diff --git a/mods/ca/rules/map/force-cabal-eva.yaml b/mods/ca/rules/custom/force-cabal-eva.yaml similarity index 100% rename from mods/ca/rules/map/force-cabal-eva.yaml rename to mods/ca/rules/custom/force-cabal-eva.yaml diff --git a/mods/ca/rules/map/two-tone-nod.yaml b/mods/ca/rules/custom/two-tone-nod.yaml similarity index 71% rename from mods/ca/rules/map/two-tone-nod.yaml rename to mods/ca/rules/custom/two-tone-nod.yaml index c23d90f7e4..2b6e85cc11 100644 --- a/mods/ca/rules/map/two-tone-nod.yaml +++ b/mods/ca/rules/custom/two-tone-nod.yaml @@ -1,26 +1,26 @@ ^Palettes: OverlayPlayerColorPalette@RAUNIT: BasePalette: player - BaseName: playerraunit + BaseName: player-twotonenod RemapIndex: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 PlayerColors: Nod: E6E6FF OverlayPlayerColorPalette@TDUNIT: BasePalette: temptd - BaseName: playertdunit + BaseName: playertd-twotonenod RemapIndex: 176, 178, 180, 182, 184, 186, 189, 191, 177, 179, 181, 183, 185, 187, 188, 190 PlayerColors: Nod: E6E6FF ^TDPalette: RenderSprites: - PlayerPalette: playertdunit + PlayerPalette: playertd-twotonenod ^Infantry: RenderSprites: - PlayerPalette: playertdunit + PlayerPalette: playertd-twotonenod WithDeathAnimation: - DeathSequencePalette: playertdunit + DeathSequencePalette: playertd-twotonenod SHAD: RenderSprites: @@ -56,7 +56,7 @@ ENLI: SAPC: RenderSprites: - PlayerPalette: playerraunit + PlayerPalette: player-twotonenod HARV.TD: RenderSprites: @@ -68,16 +68,24 @@ AMCV: LST: RenderSprites: - PlayerPalette: playerraunit + PlayerPalette: player-twotonenod SB: RenderSprites: - PlayerPalette: playerraunit + PlayerPalette: player-twotonenod SS2: RenderSprites: - PlayerPalette: playerraunit + PlayerPalette: player-twotonenod ISUB: RenderSprites: - PlayerPalette: playerraunit + PlayerPalette: player-twotonenod + +TRAN: + RenderSprites: + PlayerPalette: player-twotonenod + +SCRN: + RenderSprites: + PlayerPalette: playertd diff --git a/mods/ca/rules/defaults.yaml b/mods/ca/rules/defaults.yaml index b59ac9b1ed..c361c007e3 100644 --- a/mods/ca/rules/defaults.yaml +++ b/mods/ca/rules/defaults.yaml @@ -1271,7 +1271,7 @@ Palette: cloak CloakSound: cloak5md.aud UncloakSound: appear1md.aud - UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Damage, Heal + UncloakOn: Attack, Unload, Infiltrate, Demolish, Damage, Heal ExternalCondition@SGENCLOAK: Condition: sgencloak WithColoredSelectionBox@INVIS: @@ -1287,7 +1287,7 @@ Palette: cloak IsPlayerPalette: false RequiresCondition: (crate-cloak) && !(cloak-force-disabled || invisibility) - UncloakOn: Attack, Unload, Infiltrate, Demolish, Dock, Damage, Heal + UncloakOn: Attack, Unload, Infiltrate, Demolish, Damage, Heal TimedConditionBar@CRATE-CLOAK: Condition: crate-cloak Color: 606060 diff --git a/mods/ca/rules/infantry.yaml b/mods/ca/rules/infantry.yaml index e83be3ba72..65b6397185 100644 --- a/mods/ca/rules/infantry.yaml +++ b/mods/ca/rules/infantry.yaml @@ -912,7 +912,7 @@ MECH: CaptureTypes: husk PlayerExperience: 5 ConsumedByCapture: False - CaptureDelay: 150 + CaptureDelay: 75 PlayerExperienceRelationships: Neutral, Enemy EnterCursor: sell2 EnterBlockedCursor: move-blocked @@ -3972,7 +3972,7 @@ ENLI: Type: EnlightenedEmp GrantConditionOnAttack@EMPCOOLDOWN: Condition: emp-fired - RevokeDelay: 65 + RevokeDelay: 30 ArmamentNames: secondary AmmoPool: Armaments: secondary diff --git a/mods/ca/rules/scrin.yaml b/mods/ca/rules/scrin.yaml index 8c526bd120..e3f722de1d 100644 --- a/mods/ca/rules/scrin.yaml +++ b/mods/ca/rules/scrin.yaml @@ -2675,7 +2675,6 @@ INVA: Type: CenterPosition RequiresCondition: enable-smoke CarrierSlave: - LandingDistance: 8c0 Contrail@1: Offset: -432,0,0 StartColorUsePlayerColor: true diff --git a/mods/ca/rules/ships.yaml b/mods/ca/rules/ships.yaml index 220c0bf30e..9c65093487 100644 --- a/mods/ca/rules/ships.yaml +++ b/mods/ca/rules/ships.yaml @@ -746,9 +746,10 @@ CV: Offset: 30,70,600 PauseOnCondition: empdisable || being-warped RequiresCondition: !under-bridge - AttackOmni: + AttackFrontal: Voice: Attack TargetFrozenActors: True + FacingTolerance: 512 PauseOnCondition: empdisable || being-warped CarrierMaster: Actors: horn, horn, horn @@ -760,6 +761,7 @@ CV: RequiresCondition: !empdisable && !being-warped BeingEnteredCondition: drone-landing RearmAsGroup: true + MaxSlaveDistance: 20c0 WithSpawnerMasterPipsDecoration: Position: BottomLeft Margin: 4, 3 @@ -772,9 +774,8 @@ CV: DecorationBounds: 1877, 1877 Voiced: VoiceSet: DroneCarrVoice - WithRangeCircle@Attack: - Type: CarrierRange - Range: 25c0 + RenderRangeCircle@Attack: + RangeCircleType: CarrierRange Color: 0000FF80 ProductionCostMultiplier@arcBonus: Multiplier: 90 diff --git a/mods/ca/rules/vehicles.yaml b/mods/ca/rules/vehicles.yaml index 96fb64dc36..0de914c9e1 100644 --- a/mods/ca/rules/vehicles.yaml +++ b/mods/ca/rules/vehicles.yaml @@ -2001,6 +2001,9 @@ MNLY: PauseOnCondition: empdisable || being-warped ShowSelectionBar: true SelectionBarColor: ffff00 + -WithDecoration@BOMBARD: + -WithDecoration@BOMBARD2: + -WithDecoration@BOMBARD3: TRUK: Inherits: ^Vehicle @@ -2037,6 +2040,9 @@ TRUK: TargetTypes: Ground, Vehicle, C4, ChaosImmune -ProductionCostMultiplier@IndustrialPlantLevel1: -ProductionCostMultiplier@IndustrialPlantLevel2: + -WithDecoration@BOMBARD: + -WithDecoration@BOMBARD2: + -WithDecoration@BOMBARD3: TRUK.DROP: Inherits: TRUK @@ -5981,6 +5987,9 @@ MSAR: ProvidesPrerequisite@radar-active: Prerequisite: radar-active RequiresCondition: deployed && !(jammed || empdisable || being-warped) + -WithDecoration@BOMBARD: + -WithDecoration@BOMBARD2: + -WithDecoration@BOMBARD3: PTNK: Inherits: ^Tank diff --git a/mods/ca/weapons/other.yaml b/mods/ca/weapons/other.yaml index efae09acfe..6cec12b675 100644 --- a/mods/ca/weapons/other.yaml +++ b/mods/ca/weapons/other.yaml @@ -1158,16 +1158,19 @@ EnlightenedEmp: ReloadDelay: 500 Range: 5c0 Report: enli-empfire.aud - Projectile: Bullet + Projectile: Missile Blockable: false + HorizontalRateOfTurn: 8 Shadow: true Image: enliempproj Palette: effect + MaximumLaunchSpeed: 190 + MinimumLaunchSpeed: 190 Speed: 190 + RangeLimit: 5c0 + Jammable: false TrailImage: smokey TrailPalette: scrinplasma - LaunchAngle: 30 - Inaccuracy: 128 Warhead@1Emp: GrantExternalCondition Range: 0c896 Duration: 100 @@ -1997,7 +2000,7 @@ MicrowaveZap.UPG: HornetLauncher: ReloadDelay: 15 - Range: 25c0 + Range: 20c0 ValidTargets: Ground, Water Projectile: InstantHit Warhead@1Dam: TargetDamage diff --git a/mods/ca/weapons/scrin.yaml b/mods/ca/weapons/scrin.yaml index 94a297ee33..9f831b69bd 100644 --- a/mods/ca/weapons/scrin.yaml +++ b/mods/ca/weapons/scrin.yaml @@ -1377,7 +1377,7 @@ LeecherBeam: StartBurstReport: leecher-fire1.aud Range: 5c512 ReloadDelay: 60 - Burst: 6 + Burst: 7 BurstDelays: 5 Projectile: PlasmaBeam Duration: 7 diff --git a/mods/ca/weapons/smallcaliber.yaml b/mods/ca/weapons/smallcaliber.yaml index 6eaf3c60a8..c8735a21da 100644 --- a/mods/ca/weapons/smallcaliber.yaml +++ b/mods/ca/weapons/smallcaliber.yaml @@ -704,6 +704,8 @@ MP5: ReloadDelay: 10 -Burst: Range: 6c0 + Projectile: InstantHit + Blockable: true Warhead@1Dam: SpreadDamage Versus: Light: 35