diff --git a/OpenRA.Mods.RA/Activities/EnterTransport.cs b/OpenRA.Mods.RA/Activities/EnterTransport.cs index 67cc097bc6..7b4e324131 100644 --- a/OpenRA.Mods.RA/Activities/EnterTransport.cs +++ b/OpenRA.Mods.RA/Activities/EnterTransport.cs @@ -28,7 +28,7 @@ namespace OpenRA.Mods.RA.Activities if (transport == null || !transport.IsInWorld) return NextActivity; var cargo = transport.Trait(); - if (cargo.IsFull(transport)) + if (!cargo.HasSpace(1)) return NextActivity; diff --git a/OpenRA.Mods.RA/Cargo.cs b/OpenRA.Mods.RA/Cargo.cs index 99779a08b3..0d435a2404 100644 --- a/OpenRA.Mods.RA/Cargo.cs +++ b/OpenRA.Mods.RA/Cargo.cs @@ -17,7 +17,8 @@ namespace OpenRA.Mods.RA { public class CargoInfo : ITraitInfo { - public readonly int Passengers = 0; + public readonly int MaxWeight = 0; + public readonly int PipCount = 0; public readonly string[] Types = { }; public readonly int UnloadFacing = 0; @@ -28,7 +29,8 @@ namespace OpenRA.Mods.RA { readonly Actor self; readonly CargoInfo info; - + + int totalWeight = 0; List cargo = new List(); public IEnumerable Passengers { get { return cargo; } } @@ -101,8 +103,8 @@ namespace OpenRA.Mods.RA if (order.OrderString != "Unload" || IsEmpty(self)) return null; return "Move"; } - - public bool IsFull(Actor self) { return cargo.Count == info.Passengers; } + + public bool HasSpace(int weight) { return totalWeight + weight <= info.MaxWeight; } public bool IsEmpty(Actor self) { return cargo.Count == 0; } public Actor Peek(Actor self) { return cargo[0]; } @@ -111,22 +113,42 @@ namespace OpenRA.Mods.RA { var a = cargo[0]; cargo.RemoveAt(0); + + var pi = a.Info.Traits.GetOrDefault(); + totalWeight -= pi != null ? pi.Weight : 1; + return a; } - public IEnumerable GetPips( Actor self ) + public IEnumerable GetPips(Actor self) { - var numPips = info.Passengers; - for (var i = 0; i < numPips; i++) - if (i >= cargo.Count) - yield return PipType.Transparent; + int numPips = info.PipCount; + + for (int i = 0; i < numPips; i++) + yield return GetPipAt(i); + } + + PipType GetPipAt(int i) + { + var n = i * info.MaxWeight / info.PipCount; + + foreach (var c in cargo) + { + var pi = c.Info.Traits.Get(); + if (n < pi.Weight) + return pi.PipType; else - yield return cargo[i].Trait().ColorOfCargoPip(); + n -= pi.Weight; + } + + return PipType.Transparent; } public void Load(Actor self, Actor a) { cargo.Add(a); + var pi = a.Info.Traits.GetOrDefault(); + totalWeight += pi != null ? pi.Weight : 1; } public void Killed(Actor self, AttackInfo e) diff --git a/OpenRA.Mods.RA/Passenger.cs b/OpenRA.Mods.RA/Passenger.cs index 631e942dc2..fd9212dd6d 100644 --- a/OpenRA.Mods.RA/Passenger.cs +++ b/OpenRA.Mods.RA/Passenger.cs @@ -21,6 +21,7 @@ namespace OpenRA.Mods.RA { public readonly string CargoType = null; public readonly PipType PipType = PipType.Green; + public int Weight = 1; public object Create( ActorInitializer init ) { return new Passenger( this ); } } @@ -56,7 +57,7 @@ namespace OpenRA.Mods.RA bool CanEnter( Actor target ) { var cargo = target.TraitOrDefault(); - return (cargo != null && !cargo.IsFull(target)); + return cargo != null && cargo.HasSpace(info.Weight); } public string VoicePhraseForOrder(Actor self, Order order) @@ -81,7 +82,5 @@ namespace OpenRA.Mods.RA self.QueueActivity(new EnterTransport(self, order.TargetActor)); } } - - public PipType ColorOfCargoPip() { return info.PipType; } } } diff --git a/mods/cnc/rules/aircraft.yaml b/mods/cnc/rules/aircraft.yaml index 8914bd3e47..d90a84eea4 100644 --- a/mods/cnc/rules/aircraft.yaml +++ b/mods/cnc/rules/aircraft.yaml @@ -32,7 +32,8 @@ TRAN: WithShadow: Cargo: Types: Infantry - Passengers: 5 + MaxWeight: 5 + PipCount: 5 FallsToEarth: HELI: @@ -119,7 +120,8 @@ C17: WithShadow: Cargo: # Types: Infantry, Vehicle - Passengers: 10 + MaxWeight: 10 + PipCount: 10 Invulnerable: -Selectable: -TargetableUnit: diff --git a/mods/cnc/rules/ships.yaml b/mods/cnc/rules/ships.yaml index 00afd32fb9..14a9e7f064 100644 --- a/mods/cnc/rules/ships.yaml +++ b/mods/cnc/rules/ships.yaml @@ -58,7 +58,8 @@ LST: -Selectable: Cargo: Types: Infantry, Vehicle - Passengers: 5 + MaxWeight: 5 + PipCount: 5 AttackMove: JustMove: true diff --git a/mods/cnc/rules/vehicles.yaml b/mods/cnc/rules/vehicles.yaml index e089a91d6e..15759e4c82 100644 --- a/mods/cnc/rules/vehicles.yaml +++ b/mods/cnc/rules/vehicles.yaml @@ -100,7 +100,7 @@ APC: AutoTarget: Cargo: Types: Infantry - Passengers: 5 + MaxWeight: 5 UnloadFacing: 220 LeavesHusk: HuskActor: APC.Husk diff --git a/mods/ra/rules/aircraft.yaml b/mods/ra/rules/aircraft.yaml index 3367c3c82f..945d52abe9 100644 --- a/mods/ra/rules/aircraft.yaml +++ b/mods/ra/rules/aircraft.yaml @@ -14,7 +14,7 @@ BADR: WithShadow: IronCurtainable: Cargo: - Passengers: 10 + MaxWeight: 10 # Types: Infantry, Vehicle -Selectable: -GainsExperience: @@ -212,7 +212,8 @@ TRAN: WithShadow: Cargo: Types: Infantry - Passengers: 5 + MaxWeight: 5 + PipCount: 5 IronCurtainable: FallsToEarth: Explosion: UnitExplode diff --git a/mods/ra/rules/ships.yaml b/mods/ra/rules/ships.yaml index 32cf279462..9f6fc5aec6 100644 --- a/mods/ra/rules/ships.yaml +++ b/mods/ra/rules/ships.yaml @@ -190,7 +190,8 @@ LST: RenderUnit: Cargo: Types: Infantry, Vehicle - Passengers: 5 + MaxWeight: 5 + PipCount: 5 IronCurtainable: RepairableNear: AttackMove: diff --git a/mods/ra/rules/vehicles.yaml b/mods/ra/rules/vehicles.yaml index 85ea3d2b7c..0567828a78 100644 --- a/mods/ra/rules/vehicles.yaml +++ b/mods/ra/rules/vehicles.yaml @@ -293,7 +293,8 @@ JEEP: AutoTarget: Cargo: Types: Infantry - Passengers: 1 + MaxWeight: 1 + PipCount: 1 UnloadFacing: 220 APC: @@ -324,7 +325,8 @@ APC: AutoTarget: Cargo: Types: Infantry - Passengers: 5 + MaxWeight: 5 + PipCount: 5 UnloadFacing: 220 MNLY.AP: