diff --git a/OpenRA.Mods.RA/CrateAction.cs b/OpenRA.Mods.RA/CrateAction.cs index 997220719e..d0a478b791 100644 --- a/OpenRA.Mods.RA/CrateAction.cs +++ b/OpenRA.Mods.RA/CrateAction.cs @@ -30,6 +30,9 @@ namespace OpenRA.Mods.RA [Desc("The earliest time (in ticks) that this crate action can occur on.")] public readonly int TimeDelay = 0; + + [Desc("Only allow this crate action when the collector has these prerequisites")] + public readonly string[] Prerequisites = { }; [Desc("Actor types that this crate action will not occur for.")] [ActorReference] public string[] ExcludedActorTypes = { }; @@ -52,10 +55,13 @@ namespace OpenRA.Mods.RA { if (self.World.WorldTick < info.TimeDelay) return 0; - + if (info.ExcludedActorTypes.Contains(collector.Info.Name)) return 0; + if (info.Prerequisites.Any() && !collector.Owner.PlayerActor.Trait().HasPrerequisites(info.Prerequisites)) + return 0; + return GetSelectionShares(collector); } diff --git a/OpenRA.Mods.RA/Crates/GiveUnitCrateAction.cs b/OpenRA.Mods.RA/Crates/GiveUnitCrateAction.cs index 2132d2e2f6..b9f42d047f 100644 --- a/OpenRA.Mods.RA/Crates/GiveUnitCrateAction.cs +++ b/OpenRA.Mods.RA/Crates/GiveUnitCrateAction.cs @@ -38,7 +38,12 @@ namespace OpenRA.Mods.RA.Crates readonly List usedCells = new List(); public GiveUnitCrateAction(Actor self, GiveUnitCrateActionInfo info) - : base(self, info) { Info = info; } + : base(self, info) + { + Info = info; + if (!Info.Units.Any()) + throw new YamlException("A GiveUnitCrateAction does not specify any units to give. This might be because the yaml is referring to 'Unit' rather than 'Units'."); + } public bool CanGiveTo(Actor collector) { diff --git a/mods/d2k/rules/misc.yaml b/mods/d2k/rules/misc.yaml index 78eec36622..3e1cf4e9e1 100644 --- a/mods/d2k/rules/misc.yaml +++ b/mods/d2k/rules/misc.yaml @@ -21,59 +21,74 @@ CRATE: GiveUnitCrateAction@Trike: SelectionShares: 20 Units: trike + Prerequisites: techlevel.low, Light GiveUnitCrateAction@Raider: SelectionShares: 15 Units: raider ValidRaces: ordos + Prerequisites: techlevel.low, Light GiveUnitCrateAction@Quad: SelectionShares: 40 Units: quad + Prerequisites: techlevel.medium, Light, Outpost GiveUnitCrateAction@CombatA: SelectionShares: 10 Units: combata ValidRaces: atreides + Prerequisites: techlevel.low, Heavy GiveUnitCrateAction@CombatH: SelectionShares: 10 Units: combath ValidRaces: harkonnen + Prerequisites: techlevel.low, Heavy GiveUnitCrateAction@CombatO: SelectionShares: 10 Units: combato ValidRaces: ordos + Prerequisites: techlevel.low, Heavy GiveUnitCrateAction@SiegeTank: SelectionShares: 10 Units: siegetank + Prerequisites: techlevel.medium, Heavy, Outpost GiveUnitCrateAction@MissileTank: SelectionShares: 10 Units: missiletank + Prerequisites: techlevel.high, Hitech GiveUnitCrateAction@StealthRaider: SelectionShares: 7 Units: stealthraider ValidRaces: ordos + Prerequisites: techlevel.medium, Hitech GiveUnitCrateAction@Fremen: SelectionShares: 5 Units: fremen,fremen ValidRaces: atreides + Prerequisites: techlevel.high, Palace GiveUnitCrateAction@Sardaukar: SelectionShares: 8 Units: sardaukar,sardaukar ValidRaces: harkonnen + Prerequisites: techlevel.high, Palace GiveUnitCrateAction@Saboteur: SelectionShares: 3 Units: saboteur,saboteur ValidRaces: ordos + Prerequisites: techlevel.high, Palace GiveUnitCrateAction@SonicTank: SelectionShares: 5 Units: sonictank ValidRaces: atreides + Prerequisites: techlevel.high, Research GiveUnitCrateAction@Devast: SelectionShares: 2 Units: devast ValidRaces: harkonnen + Prerequisites: techlevel.high, Research GiveUnitCrateAction@DeviatorTank: SelectionShares: 5 Units: deviatortank ValidRaces: ordos + Prerequisites: techlevel.high, Research GiveMcvCrateAction@Atreides: SelectionShares: 0 NoBaseSelectionShares: 9001 diff --git a/mods/ra/rules/misc.yaml b/mods/ra/rules/misc.yaml index ce7aaec68c..1588faf8b6 100644 --- a/mods/ra/rules/misc.yaml +++ b/mods/ra/rules/misc.yaml @@ -102,37 +102,37 @@ CRATE: SelectionShares: 7 Units: jeep ValidRaces: allies - TimeDelay: 3000 + Prerequisites: techlevel.low GiveUnitCrateAction@arty: SelectionShares: 6 Units: arty ValidRaces: allies - TimeDelay: 4500 + Prerequisites: techlevel.medium, dome GiveUnitCrateAction@v2rl: SelectionShares: 6 Units: v2rl ValidRaces: soviet - TimeDelay: 4500 + Prerequisites: techlevel.medium, dome GiveUnitCrateAction@1tnk: SelectionShares: 5 Units: 1tnk ValidRaces: allies - TimeDelay: 3000 + Prerequisites: techlevel.low GiveUnitCrateAction@2tnk: SelectionShares: 4 Units: 2tnk ValidRaces: allies - TimeDelay: 4500 + Prerequisites: techlevel.medium, fix GiveUnitCrateAction@3tnk: SelectionShares: 4 Units: 3tnk ValidRaces: soviet - TimeDelay: 4500 + Prerequisites: techlevel.medium, fix GiveUnitCrateAction@4tnk: SelectionShares: 3 Units: 4tnk ValidRaces: soviet - TimeDelay: 9000 + Prerequisites: techlevel.unrestricted, fix, techcenter GiveUnitCrateAction@squadlight: SelectionShares: 7 Units: e1,e1,e1,e3,e3