Convert PrimaryBuilding to conditions.

This commit is contained in:
Paul Chote
2016-12-03 17:06:18 +00:00
parent bcb3d52eb0
commit e0583af663
6 changed files with 65 additions and 35 deletions

View File

@@ -26,10 +26,11 @@ namespace OpenRA.Mods.Common.Traits
} }
[Desc("Used together with ClassicProductionQueue.")] [Desc("Used together with ClassicProductionQueue.")]
public class PrimaryBuildingInfo : ITraitInfo, Requires<UpgradeManagerInfo> public class PrimaryBuildingInfo : ITraitInfo
{ {
[UpgradeGrantedReference, Desc("The upgrades to grant while the primary building.")] [UpgradeGrantedReference]
public readonly string[] Upgrades = { "primary" }; [Desc("The condition to grant to self while this is the primary building.")]
public readonly string PrimaryCondition = null;
[Desc("The speech notification to play when selecting a primary building.")] [Desc("The speech notification to play when selecting a primary building.")]
public readonly string SelectionNotification = "PrimaryBuildingSelected"; public readonly string SelectionNotification = "PrimaryBuildingSelected";
@@ -37,25 +38,30 @@ namespace OpenRA.Mods.Common.Traits
public object Create(ActorInitializer init) { return new PrimaryBuilding(init.Self, this); } public object Create(ActorInitializer init) { return new PrimaryBuilding(init.Self, this); }
} }
public class PrimaryBuilding : IIssueOrder, IResolveOrder public class PrimaryBuilding : INotifyCreated, IIssueOrder, IResolveOrder
{ {
readonly PrimaryBuildingInfo info; readonly PrimaryBuildingInfo info;
readonly UpgradeManager manager; UpgradeManager um;
int primaryToken = UpgradeManager.InvalidConditionToken;
public bool IsPrimary { get; private set; } public bool IsPrimary { get; private set; }
public PrimaryBuilding(Actor self, PrimaryBuildingInfo info) public PrimaryBuilding(Actor self, PrimaryBuildingInfo info)
{ {
this.info = info; this.info = info;
manager = self.Trait<UpgradeManager>();
} }
public IEnumerable<IOrderTargeter> Orders void INotifyCreated.Created(Actor self)
{
um = self.TraitOrDefault<UpgradeManager>();
}
IEnumerable<IOrderTargeter> IIssueOrder.Orders
{ {
get { yield return new DeployOrderTargeter("PrimaryProducer", 1); } get { yield return new DeployOrderTargeter("PrimaryProducer", 1); }
} }
public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) Order IIssueOrder.IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
{ {
if (order.OrderID == "PrimaryProducer") if (order.OrderID == "PrimaryProducer")
return new Order(order.OrderID, self, false); return new Order(order.OrderID, self, false);
@@ -63,41 +69,39 @@ namespace OpenRA.Mods.Common.Traits
return null; return null;
} }
public void ResolveOrder(Actor self, Order order) void IResolveOrder.ResolveOrder(Actor self, Order order)
{ {
if (order.OrderString == "PrimaryProducer") if (order.OrderString == "PrimaryProducer")
SetPrimaryProducer(self, !IsPrimary); SetPrimaryProducer(self, !IsPrimary);
} }
public void SetPrimaryProducer(Actor self, bool state) public void SetPrimaryProducer(Actor self, bool isPrimary)
{ {
if (state == false) IsPrimary = isPrimary;
{
IsPrimary = false;
foreach (var up in info.Upgrades)
manager.RevokeUpgrade(self, up, this);
return;
}
// TODO: THIS IS SHIT if (isPrimary)
{
// Cancel existing primaries // Cancel existing primaries
// TODO: THIS IS SHIT
foreach (var p in self.Info.TraitInfo<ProductionInfo>().Produces) foreach (var p in self.Info.TraitInfo<ProductionInfo>().Produces)
{ {
var productionType = p; // benign closure hazard
foreach (var b in self.World foreach (var b in self.World
.ActorsWithTrait<PrimaryBuilding>() .ActorsWithTrait<PrimaryBuilding>()
.Where(a => .Where(a =>
a.Actor != self &&
a.Actor.Owner == self.Owner && a.Actor.Owner == self.Owner &&
a.Trait.IsPrimary && a.Trait.IsPrimary &&
a.Actor.Info.TraitInfo<ProductionInfo>().Produces.Contains(productionType))) a.Actor.Info.TraitInfo<ProductionInfo>().Produces.Contains(p)))
b.Trait.SetPrimaryProducer(b.Actor, false); b.Trait.SetPrimaryProducer(b.Actor, false);
} }
IsPrimary = true; if (um != null && primaryToken == UpgradeManager.InvalidConditionToken && !string.IsNullOrEmpty(info.PrimaryCondition))
foreach (var up in info.Upgrades) primaryToken = um.GrantCondition(self, info.PrimaryCondition);
manager.GrantUpgrade(self, up, this);
Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", info.SelectionNotification, self.Owner.Faction.InternalName); Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", info.SelectionNotification, self.Owner.Faction.InternalName);
} }
else if (primaryToken != UpgradeManager.InvalidConditionToken)
primaryToken = um.RevokeCondition(self, primaryToken);
}
} }
} }

View File

@@ -610,6 +610,13 @@ namespace OpenRA.Mods.Common.UtilityCommands
if (!node.Value.Nodes.Any(n => n.Key == "ParachutingCondition")) if (!node.Value.Nodes.Any(n => n.Key == "ParachutingCondition"))
node.Value.Nodes.Add(new MiniYamlNode("ParachutingCondition", "parachute")); node.Value.Nodes.Add(new MiniYamlNode("ParachutingCondition", "parachute"));
} }
if (node.Key == "PrimaryBuilding")
{
ConvertUpgradesToCondition(parent, node, "Upgrades", "PrimaryCondition");
if (!node.Value.Nodes.Any(n => n.Key == "PrimaryCondition"))
node.Value.Nodes.Add(new MiniYamlNode("PrimaryCondition", "primary"));
}
} }
UpgradeActorRules(modData, engineVersion, ref node.Value.Nodes, node, depth + 1); UpgradeActorRules(modData, engineVersion, ref node.Value.Nodes, node, depth + 1);

View File

@@ -88,6 +88,7 @@ construction_yard:
WithBuildingPlacedOverlay: WithBuildingPlacedOverlay:
Palette: d2k Palette: d2k
PrimaryBuilding: PrimaryBuilding:
PrimaryCondition: primary
ProvidesPrerequisite@buildingname: ProvidesPrerequisite@buildingname:
GlobalUpgradable: GlobalUpgradable:
Prerequisites: upgrade.conyard Prerequisites: upgrade.conyard
@@ -181,6 +182,7 @@ barracks:
Production: Production:
Produces: Infantry Produces: Infantry
PrimaryBuilding: PrimaryBuilding:
PrimaryCondition: primary
ProductionBar: ProductionBar:
ProvidesPrerequisite@atreides: ProvidesPrerequisite@atreides:
Prerequisite: barracks.atreides Prerequisite: barracks.atreides
@@ -360,6 +362,7 @@ light_factory:
Production: Production:
Produces: Vehicle Produces: Vehicle
PrimaryBuilding: PrimaryBuilding:
PrimaryCondition: primary
ProductionBar: ProductionBar:
ProvidesPrerequisite@atreides: ProvidesPrerequisite@atreides:
Prerequisite: light.atreides Prerequisite: light.atreides
@@ -430,6 +433,7 @@ heavy_factory:
Production: Production:
Produces: Armor Produces: Armor
PrimaryBuilding: PrimaryBuilding:
PrimaryCondition: primary
ProductionBar: ProductionBar:
ProvidesPrerequisite@atreides: ProvidesPrerequisite@atreides:
Prerequisite: heavy.atreides Prerequisite: heavy.atreides
@@ -567,6 +571,7 @@ starport:
Palette: starportlights Palette: starportlights
ProductionBar: ProductionBar:
PrimaryBuilding: PrimaryBuilding:
PrimaryCondition: primary
RequiresPower: RequiresPower:
CanPowerDown: CanPowerDown:
PowerupSound: EnablePower PowerupSound: EnablePower

View File

@@ -134,6 +134,7 @@ SPEN:
Production: Production:
Produces: Ship, Submarine Produces: Ship, Submarine
PrimaryBuilding: PrimaryBuilding:
PrimaryCondition: primary
-EmitInfantryOnSell: -EmitInfantryOnSell:
RepairsUnits: RepairsUnits:
FinishRepairingNotification: UnitRepaired FinishRepairingNotification: UnitRepaired
@@ -223,6 +224,7 @@ SYRD:
Production: Production:
Produces: Ship, Boat Produces: Ship, Boat
PrimaryBuilding: PrimaryBuilding:
PrimaryCondition: primary
-EmitInfantryOnSell: -EmitInfantryOnSell:
RepairsUnits: RepairsUnits:
FinishRepairingNotification: UnitRepaired FinishRepairingNotification: UnitRepaired
@@ -854,6 +856,7 @@ WEAP:
RequiresPrerequisites: structures.ukraine RequiresPrerequisites: structures.ukraine
Prerequisite: vehicles.ukraine Prerequisite: vehicles.ukraine
PrimaryBuilding: PrimaryBuilding:
PrimaryCondition: primary
ProductionBar: ProductionBar:
Power: Power:
Amount: -30 Amount: -30
@@ -1060,6 +1063,7 @@ HPAD:
Reservable: Reservable:
ProductionBar: ProductionBar:
PrimaryBuilding: PrimaryBuilding:
PrimaryCondition: primary
Power: Power:
Amount: -10 Amount: -10
ProvidesPrerequisite@allies: ProvidesPrerequisite@allies:
@@ -1206,6 +1210,7 @@ AFLD:
ProductionBar: ProductionBar:
SupportPowerChargeBar: SupportPowerChargeBar:
PrimaryBuilding: PrimaryBuilding:
PrimaryCondition: primary
Power: Power:
Amount: -20 Amount: -20
ProvidesPrerequisite@buildingname: ProvidesPrerequisite@buildingname:
@@ -1354,6 +1359,7 @@ BARR:
Production: Production:
Produces: Infantry, Soldier Produces: Infantry, Soldier
PrimaryBuilding: PrimaryBuilding:
PrimaryCondition: primary
ProductionBar: ProductionBar:
ProvidesPrerequisite: ProvidesPrerequisite:
Prerequisite: barracks Prerequisite: barracks
@@ -1428,6 +1434,7 @@ KENN:
Production: Production:
Produces: Infantry, Dog Produces: Infantry, Dog
PrimaryBuilding: PrimaryBuilding:
PrimaryCondition: primary
ProductionBar: ProductionBar:
-EmitInfantryOnSell: -EmitInfantryOnSell:
Power: Power:
@@ -1472,6 +1479,7 @@ TENT:
Production: Production:
Produces: Infantry, Soldier Produces: Infantry, Soldier
PrimaryBuilding: PrimaryBuilding:
PrimaryCondition: primary
ProductionBar: ProductionBar:
ProvidesPrerequisite@barracks: ProvidesPrerequisite@barracks:
Prerequisite: barracks Prerequisite: barracks

View File

@@ -96,6 +96,7 @@ GAPILE:
Production: Production:
Produces: Infantry Produces: Infantry
PrimaryBuilding: PrimaryBuilding:
PrimaryCondition: primary
ProductionBar: ProductionBar:
WithProductionOverlay@LIGHTS: WithProductionOverlay@LIGHTS:
Sequence: production-lights Sequence: production-lights
@@ -153,6 +154,7 @@ GAWEAP:
Production: Production:
Produces: Vehicle Produces: Vehicle
PrimaryBuilding: PrimaryBuilding:
PrimaryCondition: primary
ProductionBar: ProductionBar:
WithIdleOverlay@ROOF: WithIdleOverlay@ROOF:
Sequence: idle-roof Sequence: idle-roof
@@ -206,6 +208,7 @@ GAHPAD:
Production: Production:
Produces: Air Produces: Air
PrimaryBuilding: PrimaryBuilding:
PrimaryCondition: primary
Reservable: Reservable:
RepairsUnits: RepairsUnits:
PlayerExperience: 15 PlayerExperience: 15

View File

@@ -112,6 +112,7 @@ NAHAND:
Production: Production:
Produces: Infantry Produces: Infantry
PrimaryBuilding: PrimaryBuilding:
PrimaryCondition: primary
ProductionBar: ProductionBar:
WithIdleOverlay@LIGHTS: WithIdleOverlay@LIGHTS:
Sequence: idle-lights Sequence: idle-lights
@@ -167,6 +168,7 @@ NAWEAP:
Production: Production:
Produces: Vehicle Produces: Vehicle
PrimaryBuilding: PrimaryBuilding:
PrimaryCondition: primary
ProductionBar: ProductionBar:
WithIdleOverlay@ROOF: WithIdleOverlay@ROOF:
Sequence: idle-roof Sequence: idle-roof
@@ -216,6 +218,7 @@ NAHPAD:
Production: Production:
Produces: Air Produces: Air
PrimaryBuilding: PrimaryBuilding:
PrimaryCondition: primary
Reservable: Reservable:
RepairsUnits: RepairsUnits:
PlayerExperience: 15 PlayerExperience: 15