From 1a879009f1ed29beea5b25b48c0d0850e977c146 Mon Sep 17 00:00:00 2001 From: Oliver Brakmann Date: Sun, 17 May 2015 19:07:01 +0200 Subject: [PATCH 1/3] Change InitialStance to Defend for human players --- OpenRA.Mods.Common/Traits/AutoTarget.cs | 10 +++++++--- OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs | 11 +++++++++++ mods/cnc/rules/vehicles.yaml | 5 +++-- mods/d2k/rules/infantry.yaml | 2 ++ mods/d2k/rules/vehicles.yaml | 7 ++++--- mods/ra/maps/fort-lonestar/map.yaml | 2 +- mods/ra/rules/aircraft.yaml | 2 ++ mods/ra/rules/infantry.yaml | 5 ++++- mods/ra/rules/ships.yaml | 6 ++++-- mods/ra/rules/vehicles.yaml | 3 ++- mods/ts/rules/nod-vehicles.yaml | 1 + 11 files changed, 41 insertions(+), 13 deletions(-) diff --git a/OpenRA.Mods.Common/Traits/AutoTarget.cs b/OpenRA.Mods.Common/Traits/AutoTarget.cs index 559eff04dc..7a511e8340 100644 --- a/OpenRA.Mods.Common/Traits/AutoTarget.cs +++ b/OpenRA.Mods.Common/Traits/AutoTarget.cs @@ -24,8 +24,12 @@ namespace OpenRA.Mods.Common.Traits [Desc("Set to a value >1 to override weapons maximum range for this.")] public readonly int ScanRadius = -1; - [Desc("Possible values are HoldFire, ReturnFire, Defend and AttackAnything.")] - public readonly UnitStance InitialStance = UnitStance.AttackAnything; + [Desc("Possible values are HoldFire, ReturnFire, Defend and AttackAnything.", + "Used for computer-controlled players, both Lua-scripted and regular Skirmish AI alike.")] + public readonly UnitStance InitialStanceAI = UnitStance.AttackAnything; + + [Desc("Possible values are HoldFire, ReturnFire, Defend and AttackAnything. Used for human players.")] + public readonly UnitStance InitialStance = UnitStance.Defend; [Desc("Allow the player to change the unit stance.")] public readonly bool EnableStances = true; @@ -63,7 +67,7 @@ namespace OpenRA.Mods.Common.Traits { this.info = info; attack = self.Trait(); - Stance = info.InitialStance; + Stance = self.Owner.IsBot || !self.Owner.Playable ? info.InitialStanceAI : info.InitialStance; PredictedStance = Stance; at = self.TraitOrDefault(); } diff --git a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs index 6db88ddb75..a9ca53425b 100644 --- a/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs +++ b/OpenRA.Mods.Common/UtilityCommands/UpgradeRules.cs @@ -2266,6 +2266,17 @@ namespace OpenRA.Mods.Common.UtilityCommands } } + // Add InitialStance for bots + if (engineVersion < 20151025) + { + if (depth == 1 && node.Key == "AutoTarget") + { + var stance = node.Value.Nodes.FirstOrDefault(n => n.Key == "InitialStance"); + if (stance != null) + node.Value.Nodes.Add(new MiniYamlNode("InitialStanceAI", stance.Value.Value)); + } + } + UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1); } } diff --git a/mods/cnc/rules/vehicles.yaml b/mods/cnc/rules/vehicles.yaml index c03cc58cc4..36375bbd0e 100644 --- a/mods/cnc/rules/vehicles.yaml +++ b/mods/cnc/rules/vehicles.yaml @@ -150,7 +150,7 @@ ARTY: AttackFrontal: WithMuzzleOverlay: AutoTarget: - InitialStance: Defend + InitialStanceAI: Defend SpawnActorOnDeath: Actor: ARTY.Husk Explodes: @@ -488,7 +488,7 @@ MLRS: WithReloadingTurret: AmmoPoolName: primary AutoTarget: - InitialStance: Defend + InitialStanceAI: Defend RenderRangeCircle: SpawnActorOnDeath: Actor: MLRS.Husk @@ -526,6 +526,7 @@ STNK: AttackFrontal: AutoTarget: InitialStance: HoldFire + InitialStanceAI: ReturnFire Targetable: SpawnActorOnDeath: Actor: STNK.Husk diff --git a/mods/d2k/rules/infantry.yaml b/mods/d2k/rules/infantry.yaml index 430fb76c1d..150ba32b31 100644 --- a/mods/d2k/rules/infantry.yaml +++ b/mods/d2k/rules/infantry.yaml @@ -126,6 +126,8 @@ fremen: Range: 4c768 AutoTarget: ScanRadius: 7 + InitialStance: HoldFire + InitialStanceAI: ReturnFire Armament@PRIMARY: Weapon: Fremen_S Armament@SECONDARY: diff --git a/mods/d2k/rules/vehicles.yaml b/mods/d2k/rules/vehicles.yaml index cf6fccfa4a..cd532a4bcc 100644 --- a/mods/d2k/rules/vehicles.yaml +++ b/mods/d2k/rules/vehicles.yaml @@ -210,7 +210,7 @@ siege_tank: Weapon: UnitExplodeMed EmptyWeapon: UnitExplodeMed AutoTarget: - InitialStance: Defend + InitialStanceAI: Defend Selectable: Class: siegetank SpawnActorOnDeath: @@ -245,7 +245,7 @@ missile_tank: LocalOffset: -128,128,171, -128,-128,171 AttackFrontal: AutoTarget: - InitialStance: Defend + InitialStanceAI: Defend Explodes: Weapon: UnitExplodeMed EmptyWeapon: UnitExplodeMed @@ -394,6 +394,7 @@ stealth_raider: IsPlayerPalette: true AutoTarget: InitialStance: HoldFire + InitialStanceAI: ReturnFire -MustBeDestroyed: deviator: @@ -423,7 +424,7 @@ deviator: LocalOffset: -299,0,85 AttackFrontal: AutoTarget: - InitialStance: Defend + InitialStanceAI: Defend Explodes: Weapon: UnitExplodeLarge EmptyWeapon: UnitExplodeLarge diff --git a/mods/ra/maps/fort-lonestar/map.yaml b/mods/ra/maps/fort-lonestar/map.yaml index f0d4933d17..580b096529 100644 --- a/mods/ra/maps/fort-lonestar/map.yaml +++ b/mods/ra/maps/fort-lonestar/map.yaml @@ -654,7 +654,7 @@ Rules: Health: HP: 200 AutoTarget: - InitialStance: Defend + InitialStanceAI: Defend SNIPER.soviets: Inherits: SNIPER Buildable: diff --git a/mods/ra/rules/aircraft.yaml b/mods/ra/rules/aircraft.yaml index 6c9ded5379..028152b3d9 100644 --- a/mods/ra/rules/aircraft.yaml +++ b/mods/ra/rules/aircraft.yaml @@ -273,6 +273,7 @@ HELI: CanHover: True AutoTarget: InitialStance: HoldFire + InitialStanceAI: HoldFire WithSpriteRotorOverlay: Offset: 0,0,85 AmmoPool: @@ -326,6 +327,7 @@ HIND: CanHover: True AutoTarget: InitialStance: HoldFire + InitialStanceAI: HoldFire WithSpriteRotorOverlay: AmmoPool: Ammo: 24 diff --git a/mods/ra/rules/infantry.yaml b/mods/ra/rules/infantry.yaml index f8c243bf11..8779868f27 100644 --- a/mods/ra/rules/infantry.yaml +++ b/mods/ra/rules/infantry.yaml @@ -32,6 +32,8 @@ DOG: Voice: Attack AttackMove: Voice: Move + AutoTarget: + InitialStance: AttackAnything Targetable: TargetTypes: Ground, Infantry WithInfantryBody: @@ -517,7 +519,8 @@ SNIPER: RevealsShroud: Range: 6c0 AutoTarget: - InitialStance: ReturnFire + InitialStance: HoldFire + InitialStanceAI: ReturnFire Armament@PRIMARY: Weapon: Sniper Armament@GARRISONED: diff --git a/mods/ra/rules/ships.yaml b/mods/ra/rules/ships.yaml index a157bc9a18..38dcb2af36 100644 --- a/mods/ra/rules/ships.yaml +++ b/mods/ra/rules/ships.yaml @@ -43,7 +43,8 @@ SS: SelectionDecorations: VisualBounds: 38,38 AutoTarget: - InitialStance: ReturnFire + InitialStance: HoldFire + InitialStanceAI: ReturnFire DetectCloaked: CloakTypes: Underwater Range: 4c0 @@ -98,7 +99,8 @@ MSUB: SelectionDecorations: VisualBounds: 44,44 AutoTarget: - InitialStance: ReturnFire + InitialStance: HoldFire + InitialStanceAI: ReturnFire DetectCloaked: CloakTypes: Underwater Range: 4c0 diff --git a/mods/ra/rules/vehicles.yaml b/mods/ra/rules/vehicles.yaml index d1a24af220..62574ff50a 100644 --- a/mods/ra/rules/vehicles.yaml +++ b/mods/ra/rules/vehicles.yaml @@ -723,7 +723,8 @@ STNK: RevealsShroud: Range: 6c0 AutoTarget: - InitialStance: ReturnFire + InitialStance: HoldFire + InitialStanceAI: ReturnFire Armament: Weapon: APTusk LocalOffset: 400,0,0 diff --git a/mods/ts/rules/nod-vehicles.yaml b/mods/ts/rules/nod-vehicles.yaml index ab46e39122..e53c8bd106 100644 --- a/mods/ts/rules/nod-vehicles.yaml +++ b/mods/ts/rules/nod-vehicles.yaml @@ -272,5 +272,6 @@ STNK: Voice: Attack AutoTarget: InitialStance: HoldFire + InitialStanceAI: ReturnFire -MustBeDestroyed: From b096671acb76eb9cbbfc72fd8fc8970c70281af6 Mon Sep 17 00:00:00 2001 From: Oliver Brakmann Date: Sun, 17 May 2015 19:44:19 +0200 Subject: [PATCH 2/3] Add an ActorInit for unit stances --- OpenRA.Mods.Common/Traits/AutoTarget.cs | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/OpenRA.Mods.Common/Traits/AutoTarget.cs b/OpenRA.Mods.Common/Traits/AutoTarget.cs index 7a511e8340..4c85995474 100644 --- a/OpenRA.Mods.Common/Traits/AutoTarget.cs +++ b/OpenRA.Mods.Common/Traits/AutoTarget.cs @@ -16,7 +16,7 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { [Desc("The actor will automatically engage the enemy when it is in range.")] - public class AutoTargetInfo : ITraitInfo, Requires + public class AutoTargetInfo : ITraitInfo, Requires, UsesInit { [Desc("It will try to hunt down the enemy if it is not set to defend.")] public readonly bool AllowMovement = true; @@ -44,7 +44,7 @@ namespace OpenRA.Mods.Common.Traits public readonly bool TargetWhenDamaged = true; - public object Create(ActorInitializer init) { return new AutoTarget(init.Self, this); } + public object Create(ActorInitializer init) { return new AutoTarget(init, this); } } public enum UnitStance { HoldFire, ReturnFire, Defend, AttackAnything } @@ -63,11 +63,17 @@ namespace OpenRA.Mods.Common.Traits // NOT SYNCED: do not refer to this anywhere other than UI code public UnitStance PredictedStance; - public AutoTarget(Actor self, AutoTargetInfo info) + public AutoTarget(ActorInitializer init, AutoTargetInfo info) { + var self = init.Self; this.info = info; attack = self.Trait(); - Stance = self.Owner.IsBot || !self.Owner.Playable ? info.InitialStanceAI : info.InitialStance; + + if (init.Contains()) + Stance = init.Get(); + else + Stance = self.Owner.IsBot || !self.Owner.Playable ? info.InitialStanceAI : info.InitialStance; + PredictedStance = Stance; at = self.TraitOrDefault(); } @@ -202,4 +208,12 @@ namespace OpenRA.Mods.Common.Traits [Desc("Will not get automatically targeted by enemy (like walls)")] class AutoTargetIgnoreInfo : TraitInfo { } class AutoTargetIgnore { } + + public class StanceInit : IActorInit + { + [FieldFromYamlKey] readonly UnitStance value = UnitStance.AttackAnything; + public StanceInit() { } + public StanceInit(UnitStance init) { value = init; } + public UnitStance Value(World world) { return value; } + } } From a0fdfc3f79f319bed1fb41c6eeb2f3ab02a3068a Mon Sep 17 00:00:00 2001 From: Oliver Brakmann Date: Sun, 17 May 2015 19:44:36 +0200 Subject: [PATCH 3/3] Add testcase for StanceInit --- mods/ra/maps/intervention/intervention.lua | 3 --- mods/ra/maps/intervention/map.yaml | 6 ++++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/mods/ra/maps/intervention/intervention.lua b/mods/ra/maps/intervention/intervention.lua index a4030baddc..a7f4a6667e 100644 --- a/mods/ra/maps/intervention/intervention.lua +++ b/mods/ra/maps/intervention/intervention.lua @@ -40,7 +40,6 @@ BaseRearAttackWpts = { GroundAttackWpt1.Location, BaseRearAttackWpt1.Location, B SovietHarvesters = { Harvester1, Harvester2, Harvester3 } HarvesterGuard = { HarvGuard1, HarvGuard2, HarvGuard3 } -UBoats = { Uboat1, Uboat2, Uboat3, Uboat4, Uboat5, Uboat6 } UboatPatrolWpts1 = { UboatPatrolWpt1.Location, UboatPatrolWpt2.Location, UboatPatrolWpt3.Location, UboatPatrolWpt4.Location } UboatPatrolWpts2 = { UboatPatrolWpt4.Location, UboatPatrolWpt2.Location, UboatPatrolWpt1.Location } UBoatPatrolUnits = { "ss" } @@ -183,8 +182,6 @@ SetupWorld = function() end) end) - Utils.Do(UBoats, function(a) a.Stance = "Defend" end) - Utils.Do(Map.NamedActors, function(actor) if actor.Owner == soviets and actor.HasProperty("StartBuildingRepairs") then Trigger.OnDamaged(actor, function(building) diff --git a/mods/ra/maps/intervention/map.yaml b/mods/ra/maps/intervention/map.yaml index a3a9de9f93..51a8b9d539 100644 --- a/mods/ra/maps/intervention/map.yaml +++ b/mods/ra/maps/intervention/map.yaml @@ -2053,26 +2053,32 @@ Actors: Location: 17,92 Owner: Soviets Facing: 128 + Stance: Defend Uboat2: ss Location: 20,91 Owner: Soviets Facing: 128 + Stance: Defend Uboat3: ss Location: 17,112 Owner: Soviets Facing: 192 + Stance: Defend Uboat4: ss Location: 34,120 Owner: Soviets Facing: 160 + Stance: Defend Uboat5: ss Location: 24,126 Owner: Soviets Facing: 160 + Stance: Defend Uboat6: ss Location: 29,131 Owner: Soviets Facing: 192 + Stance: Defend WarFactory: weap Location: 70,72 Owner: Soviets