Merge pull request #9438 from atlimit8/UpgradableMobile

Upgradable Mobile and replace IDisableMove
This commit is contained in:
Matthias Mailänder
2015-12-05 18:24:40 +01:00
24 changed files with 300 additions and 98 deletions

View File

@@ -19,7 +19,7 @@ using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits
{
[Desc("This actor can transport Passenger actors.")]
public class CargoInfo : ITraitInfo, Requires<IOccupySpaceInfo>
public class CargoInfo : ITraitInfo, Requires<IOccupySpaceInfo>, Requires<UpgradeManagerInfo>
{
[Desc("The maximum sum of Passenger.Weight that this actor can support.")]
public readonly int MaxWeight = 0;
@@ -51,14 +51,19 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Cursor to display when unable to unload the passengers.")]
public readonly string UnloadBlockedCursor = "deploy-blocked";
[UpgradeGrantedReference]
[Desc("The upgrades to grant to self while loading cargo.")]
public readonly string[] LoadingUpgrades = { };
public object Create(ActorInitializer init) { return new Cargo(init, this); }
}
public class Cargo : IPips, IIssueOrder, IResolveOrder, IOrderVoice, INotifyCreated, INotifyKilled,
INotifyOwnerChanged, INotifyAddedToWorld, ITick, INotifySold, IDisableMove, INotifyActorDisposing
INotifyOwnerChanged, INotifyAddedToWorld, ITick, INotifySold, INotifyActorDisposing
{
public readonly CargoInfo Info;
readonly Actor self;
readonly UpgradeManager upgradeManager;
readonly Stack<Actor> cargo = new Stack<Actor>();
readonly HashSet<Actor> reserves = new HashSet<Actor>();
readonly Lazy<IFacing> facing;
@@ -80,6 +85,7 @@ namespace OpenRA.Mods.Common.Traits
Info = info;
Unloading = false;
checkTerrainType = info.UnloadTerrainTypes.Count > 0;
upgradeManager = self.Trait<UpgradeManager>();
if (init.Contains<RuntimeCargoInit>())
{
@@ -183,6 +189,10 @@ namespace OpenRA.Mods.Common.Traits
if (!HasSpace(w))
return false;
if (reserves.Count == 0)
foreach (var u in Info.LoadingUpgrades)
upgradeManager.GrantUpgrade(self, u, this);
reserves.Add(a);
reservedWeight += w;
@@ -196,6 +206,10 @@ namespace OpenRA.Mods.Common.Traits
reservedWeight -= GetWeight(a);
reserves.Remove(a);
if (reserves.Count == 0)
foreach (var u in Info.LoadingUpgrades)
upgradeManager.RevokeUpgrade(self, u, this);
}
public string CursorForOrder(Actor self, Order order)
@@ -214,7 +228,6 @@ namespace OpenRA.Mods.Common.Traits
return Info.UnloadVoice;
}
public bool MoveDisabled(Actor self) { return reserves.Any(); }
public bool HasSpace(int weight) { return totalWeight + reservedWeight + weight <= Info.MaxWeight; }
public bool IsEmpty(Actor self) { return cargo.Count == 0; }
@@ -235,7 +248,7 @@ namespace OpenRA.Mods.Common.Traits
p.Transport = null;
foreach (var u in p.Info.GrantUpgrades)
self.Trait<UpgradeManager>().RevokeUpgrade(self, u, p);
upgradeManager.RevokeUpgrade(self, u, p);
return a;
}
@@ -287,6 +300,10 @@ namespace OpenRA.Mods.Common.Traits
{
reservedWeight -= w;
reserves.Remove(a);
if (reserves.Count == 0)
foreach (var u in Info.LoadingUpgrades)
upgradeManager.RevokeUpgrade(self, u, this);
}
foreach (var npe in self.TraitsImplementing<INotifyPassengerEntered>())
@@ -295,7 +312,7 @@ namespace OpenRA.Mods.Common.Traits
var p = a.Trait<Passenger>();
p.Transport = self;
foreach (var u in p.Info.GrantUpgrades)
self.Trait<UpgradeManager>().GrantUpgrade(self, u, p);
upgradeManager.GrantUpgrade(self, u, p);
}
public void Killed(Actor self, AttackInfo e)

View File

@@ -38,7 +38,7 @@ namespace OpenRA.Mods.Common.Traits
}
[Desc("Unit is able to move.")]
public class MobileInfo : IMoveInfo, IPositionableInfo, IOccupySpaceInfo, IFacingInfo,
public class MobileInfo : UpgradableTraitInfo, IMoveInfo, IPositionableInfo, IOccupySpaceInfo, IFacingInfo,
UsesInit<FacingInit>, UsesInit<LocationInit>, UsesInit<SubCellInit>
{
[FieldLoader.LoadUsing("LoadSpeeds", true)]
@@ -72,7 +72,7 @@ namespace OpenRA.Mods.Common.Traits
[VoiceReference] public readonly string Voice = "Action";
public virtual object Create(ActorInitializer init) { return new Mobile(init, this); }
public override object Create(ActorInitializer init) { return new Mobile(init, this); }
static object LoadSpeeds(MiniYaml y)
{
@@ -304,8 +304,8 @@ namespace OpenRA.Mods.Common.Traits
bool IOccupySpaceInfo.SharesCell { get { return SharesCell; } }
}
public class Mobile : IIssueOrder, IResolveOrder, IOrderVoice, IPositionable, IMove, IFacing, ISync, IDeathActorInitModifier,
INotifyAddedToWorld, INotifyRemovedFromWorld, INotifyBlockingMove
public class Mobile : UpgradableTrait<MobileInfo>, IIssueOrder, IResolveOrder, IOrderVoice, IPositionable, IMove, IFacing, ISync,
IDeathActorInitModifier, INotifyAddedToWorld, INotifyRemovedFromWorld, INotifyBlockingMove
{
const int AverageTicksBeforePathing = 5;
const int SpreadTicksBeforePathing = 5;
@@ -313,7 +313,6 @@ namespace OpenRA.Mods.Common.Traits
readonly Actor self;
readonly Lazy<IEnumerable<int>> speedModifiers;
public readonly MobileInfo Info;
public bool IsMoving { get; set; }
int facing;
@@ -349,9 +348,9 @@ namespace OpenRA.Mods.Common.Traits
}
public Mobile(ActorInitializer init, MobileInfo info)
: base(info)
{
self = init.Self;
Info = info;
speedModifiers = Exts.Lazy(() => self.TraitsImplementing<ISpeedModifier>().ToArray().Select(x => x.GetSpeedModifier()));
@@ -438,7 +437,7 @@ namespace OpenRA.Mods.Common.Traits
self.World.ScreenMap.Remove(self);
}
public IEnumerable<IOrderTargeter> Orders { get { yield return new MoveOrderTargeter(self, Info); } }
public IEnumerable<IOrderTargeter> Orders { get { yield return new MoveOrderTargeter(self, this); } }
// Note: Returns a valid order even if the unit can't move to the target
public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued)
@@ -629,6 +628,9 @@ namespace OpenRA.Mods.Common.Traits
public void Nudge(Actor self, Actor nudger, bool force)
{
if (IsTraitDisabled)
return;
/* initial fairly braindead implementation. */
if (!force && self.Owner.Stances[nudger.Owner] != Stance.Ally)
return; /* don't allow ourselves to be pushed around
@@ -691,16 +693,14 @@ namespace OpenRA.Mods.Common.Traits
class MoveOrderTargeter : IOrderTargeter
{
readonly MobileInfo unitType;
readonly Mobile mobile;
readonly bool rejectMove;
readonly IDisableMove[] moveDisablers;
public bool OverrideSelection { get { return false; } }
public MoveOrderTargeter(Actor self, MobileInfo unitType)
public MoveOrderTargeter(Actor self, Mobile unit)
{
this.unitType = unitType;
this.mobile = unit;
rejectMove = !self.AcceptsOrder("Move");
moveDisablers = self.TraitsImplementing<IDisableMove>().ToArray();
}
public string OrderID { get { return "Move"; } }
@@ -717,12 +717,12 @@ namespace OpenRA.Mods.Common.Traits
var explored = self.Owner.Shroud.IsExplored(location);
cursor = self.World.Map.Contains(location) ?
(self.World.Map.GetTerrainInfo(location).CustomCursor ?? unitType.Cursor) : unitType.BlockedCursor;
(self.World.Map.GetTerrainInfo(location).CustomCursor ?? mobile.Info.Cursor) : mobile.Info.BlockedCursor;
if ((!explored && !unitType.MoveIntoShroud)
|| (explored && unitType.MovementCostForCell(self.World, location) == int.MaxValue)
|| moveDisablers.Any(d => d.MoveDisabled(self)))
cursor = unitType.BlockedCursor;
if (mobile.IsTraitDisabled
|| (!explored && !mobile.Info.MoveIntoShroud)
|| (explored && mobile.Info.MovementCostForCell(self.World, location) == int.MaxValue))
cursor = mobile.Info.BlockedCursor;
return true;
}

View File

@@ -1,28 +0,0 @@
#region Copyright & License Information
/*
* Copyright 2007-2015 The OpenRA Developers (see AUTHORS)
* 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. For more information,
* see COPYING.
*/
#endregion
using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits
{
[Desc("Disable the ability to move and turn of the actor when this trait is enabled by an upgrade.")]
public class DisableMovementInfo : UpgradableTraitInfo
{
public override object Create(ActorInitializer init) { return new DisableMovementOnUpgrade(this); }
}
public class DisableMovementOnUpgrade : UpgradableTrait<DisableMovementInfo>, IDisableMove
{
public DisableMovementOnUpgrade(DisableMovementInfo info)
: base(info) { }
public bool MoveDisabled(Actor self) { return !IsTraitDisabled; }
}
}

View File

@@ -18,12 +18,11 @@ namespace OpenRA.Mods.Common.Traits
public override object Create(ActorInitializer init) { return new DisableOnUpgrade(this); }
}
public class DisableOnUpgrade : UpgradableTrait<DisableOnUpgradeInfo>, IDisable, IDisableMove
public class DisableOnUpgrade : UpgradableTrait<DisableOnUpgradeInfo>, IDisable
{
public DisableOnUpgrade(DisableOnUpgradeInfo info)
: base(info) { }
public bool Disabled { get { return !IsTraitDisabled; } }
public bool MoveDisabled(Actor self) { return !IsTraitDisabled; }
}
}