Allow player to add a "priority unit" to production queue

* If production is ordered by `Ctrl + Left Click` the item is added to the top of the stack after the currently produced item
* Works with `Shift` for priority queueing of 5 items
* This modifier is not taken into account for `ParallelProductionQueue` as it doesn't make sense in that context
This commit is contained in:
Ivaylo Draganov
2018-11-03 17:51:19 +02:00
committed by abcdefg30
parent 81d53a4f1a
commit a7279415dc
4 changed files with 18 additions and 8 deletions

View File

@@ -231,9 +231,9 @@ namespace OpenRA
return new Order("Command", null, false) { IsImmediate = true, TargetString = text }; return new Order("Command", null, false) { IsImmediate = true, TargetString = text };
} }
public static Order StartProduction(Actor subject, string item, int count) public static Order StartProduction(Actor subject, string item, int count, bool queued = true)
{ {
return new Order("StartProduction", subject, false) { ExtraData = (uint)count, TargetString = item }; return new Order("StartProduction", subject, queued) { ExtraData = (uint)count, TargetString = item };
} }
public static Order PauseProduction(Actor subject, string item, bool pause) public static Order PauseProduction(Actor subject, string item, bool pause)

View File

@@ -50,6 +50,12 @@ namespace OpenRA.Mods.Common.Traits
return Queue.Contains(item); return Queue.Contains(item);
} }
protected override void BeginProduction(ProductionItem item, bool hasPriority)
{
// Ignore `hasPriority` as it's not relevant in parallel production context.
Queue.Add(item);
}
public override int RemainingTimeActual(ProductionItem item) public override int RemainingTimeActual(ProductionItem item)
{ {
var parallelBuilds = Queue.FindAll(i => !i.Paused && !i.Done) var parallelBuilds = Queue.FindAll(i => !i.Paused && !i.Done)

View File

@@ -406,7 +406,7 @@ namespace OpenRA.Mods.Common.Traits
else if (!hasPlayedSound && time > 0) else if (!hasPlayedSound && time > 0)
hasPlayedSound = Game.Sound.PlayNotification(rules, self.Owner, "Speech", Info.BlockedAudio, self.Owner.Faction.InternalName); hasPlayedSound = Game.Sound.PlayNotification(rules, self.Owner, "Speech", Info.BlockedAudio, self.Owner.Faction.InternalName);
} }
}))); })), !order.Queued);
} }
break; break;
@@ -470,9 +470,12 @@ namespace OpenRA.Mods.Common.Traits
Queue.Remove(item); Queue.Remove(item);
} }
protected void BeginProduction(ProductionItem item) protected virtual void BeginProduction(ProductionItem item, bool hasPriority)
{ {
Queue.Add(item); if (hasPriority && Queue.Count > 1)
Queue.Insert(1, item);
else
Queue.Add(item);
} }
public virtual int RemainingTimeActual(ProductionItem item) public virtual int RemainingTimeActual(ProductionItem item)

View File

@@ -259,7 +259,7 @@ namespace OpenRA.Mods.Common.Widgets
} }
} }
bool HandleLeftClick(ProductionItem item, ProductionIcon icon, int handleCount) bool HandleLeftClick(ProductionItem item, ProductionIcon icon, int handleCount, Modifiers modifiers)
{ {
if (PickUpCompletedBuildingIcon(icon, item)) if (PickUpCompletedBuildingIcon(icon, item))
{ {
@@ -287,7 +287,8 @@ namespace OpenRA.Mods.Common.Widgets
if (canQueue) if (canQueue)
{ {
World.IssueOrder(Order.StartProduction(CurrentQueue.Actor, icon.Name, handleCount)); var queued = !modifiers.HasModifier(Modifiers.Ctrl);
World.IssueOrder(Order.StartProduction(CurrentQueue.Actor, icon.Name, handleCount, queued));
return true; return true;
} }
} }
@@ -338,7 +339,7 @@ namespace OpenRA.Mods.Common.Widgets
// PERF: avoid an unnecessary enumeration by casting back to its known type // PERF: avoid an unnecessary enumeration by casting back to its known type
var cancelCount = modifiers.HasModifier(Modifiers.Ctrl) ? ((List<ProductionItem>)CurrentQueue.AllQueued()).Count : startCount; var cancelCount = modifiers.HasModifier(Modifiers.Ctrl) ? ((List<ProductionItem>)CurrentQueue.AllQueued()).Count : startCount;
var item = icon.Queued.FirstOrDefault(); var item = icon.Queued.FirstOrDefault();
var handled = btn == MouseButton.Left ? HandleLeftClick(item, icon, startCount) var handled = btn == MouseButton.Left ? HandleLeftClick(item, icon, startCount, modifiers)
: btn == MouseButton.Right ? HandleRightClick(item, icon, cancelCount) : btn == MouseButton.Right ? HandleRightClick(item, icon, cancelCount)
: btn == MouseButton.Middle ? HandleMiddleClick(item, icon, cancelCount) : btn == MouseButton.Middle ? HandleMiddleClick(item, icon, cancelCount)
: false; : false;