diff --git a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj index 903c3dda2a..7d11866b4b 100644 --- a/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj +++ b/OpenRA.Mods.Cnc/OpenRA.Mods.Cnc.csproj @@ -1,4 +1,4 @@ - + Debug @@ -51,7 +51,7 @@ - + diff --git a/OpenRA.Mods.Cnc/TiberiumRefinery.cs b/OpenRA.Mods.Cnc/TiberiumRefinery.cs deleted file mode 100644 index dbf5cd6399..0000000000 --- a/OpenRA.Mods.Cnc/TiberiumRefinery.cs +++ /dev/null @@ -1,151 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. - * This file is part of OpenRA. - * - * OpenRA is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * OpenRA is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenRA. If not, see . - */ -#endregion - -using System; -using System.Linq; -using System.Collections.Generic; -using OpenRA.Mods.RA; -using OpenRA.Mods.RA.Activities; -using OpenRA.Traits; -using OpenRA.Traits.Activities; -using System.Drawing; - -namespace OpenRA.Mods.Cnc -{ - class TiberiumRefineryInfo : ITraitInfo - { - public readonly int PipCount = 0; - public readonly PipType PipColor = PipType.Red; - public readonly int Capacity = 0; - public readonly int ProcessTick = 25; - public readonly int ProcessAmount = 50; - public readonly string DeathWeapon = null; - public object Create(Actor self) { return new TiberiumRefinery(self, this); } - } - - class TiberiumRefinery : ITick, IAcceptOre, INotifyDamage, INotifySold, INotifyCapture, IPips - { - readonly Actor self; - readonly TiberiumRefineryInfo Info; - readonly PlayerResources Player; - List LinkedHarv; - - [Sync] - int nextProcessTime = 0; - [Sync] - public int Tiberium = 0; - - public TiberiumRefinery(Actor self, TiberiumRefineryInfo info) - { - this.self = self; - Info = info; - Player = self.Owner.PlayerActor.traits.Get(); - LinkedHarv = new List(); - } - - public void LinkHarvester(Actor self, Actor harv) - { - LinkedHarv.Add(harv); - } - - public void UnlinkHarvester(Actor self, Actor harv) - { - if (LinkedHarv.Contains(harv)) - LinkedHarv.Remove(harv); - } - - public void GiveOre(int amount) - { - Tiberium += amount; - if (Tiberium > Info.Capacity) - Tiberium = Info.Capacity; - } - - public void Tick(Actor self) - { - if (--nextProcessTime <= 0) - { - // Convert resources to cash - int amount = Math.Min(Tiberium, Info.ProcessAmount); - amount = Math.Min(amount, Player.OreCapacity - Player.Ore); - - if (amount > 0) - { - Tiberium -=amount; - Player.GiveOre(amount); - } - nextProcessTime = Info.ProcessTick; - } - } - - public void Damaged(Actor self, AttackInfo e) - { - if (self.IsDead) - { - if (Info.DeathWeapon != null && Tiberium > 0) - { - Combat.DoExplosion(e.Attacker, Info.DeathWeapon, - self.CenterLocation.ToInt2(), 0); - } - - foreach (var harv in LinkedHarv) - harv.traits.Get().UnlinkProc(harv, self); - } - } - - public int2 DeliverOffset { get { return new int2(0, 2); } } - public void OnDock(Actor harv, DeliverResources dockOrder) - { - // Todo: need to be careful about cancellation and multiple harvs - harv.QueueActivity(new Move(self.Location + new int2(1,1), self)); - harv.QueueActivity(new Turn(96)); - harv.QueueActivity( new CallFunc( () => - self.traits.Get().PlayCustomAnimThen(self, "active", () => { - harv.traits.Get().Deliver(harv, self); - harv.QueueActivity(new Move(self.Location + DeliverOffset, self)); - harv.QueueActivity(new Harvest()); - }))); - } - - public void OnCapture(Actor self, Actor captor) - { - // Todo: Do the right thing if a harv is docked - - // Unlink any other harvs - foreach (var harv in LinkedHarv) - harv.traits.Get().UnlinkProc(harv, self); - - } - - public void Selling(Actor self) {} - public void Sold(Actor self) - { - foreach (var harv in LinkedHarv) - harv.traits.Get().UnlinkProc(harv, self); - } - - public IEnumerable GetPips(Actor self) - { - return Graphics.Util.MakeArray( Info.PipCount, - i => (Tiberium * 1.0f / Info.Capacity > i * 1.0f / Info.PipCount) - ? Info.PipColor : PipType.Transparent ); - } - } -} diff --git a/OpenRA.Mods.Cnc/TiberiumRefineryDockAction.cs b/OpenRA.Mods.Cnc/TiberiumRefineryDockAction.cs new file mode 100644 index 0000000000..b8e21ee9f5 --- /dev/null +++ b/OpenRA.Mods.Cnc/TiberiumRefineryDockAction.cs @@ -0,0 +1,65 @@ +#region Copyright & License Information +/* + * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. + * This file is part of OpenRA. + * + * OpenRA is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * OpenRA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenRA. If not, see . + */ +#endregion + +using System; +using System.Linq; +using System.Collections.Generic; +using OpenRA.Mods.RA; +using OpenRA.Mods.RA.Activities; +using OpenRA.Traits; +using OpenRA.Traits.Activities; + +namespace OpenRA.Mods.Cnc +{ + class TiberiumRefineryDockActionInfo : TraitInfo {} + + class TiberiumRefineryDockAction : IAcceptOreDockAction, ITraitPrerequisite + { + Actor dockedHarv = null; + public void OnDock(Actor self, Actor harv, DeliverResources dockOrder) + { + float2 startDock = harv.CenterLocation; + float2 endDock = self.CenterLocation + new float2(-15,8); + var harvester = harv.traits.Get(); + + harv.QueueActivity( new Turn(112) ); + harv.QueueActivity( new CallFunc( () => + { + dockedHarv = harv; + self.traits.Get().PlayCustomAnim(self, "active"); + }) ); + harv.QueueActivity( new Drag(startDock, endDock, 11) ); + harv.QueueActivity( new CallFunc( () => + { + self.World.AddFrameEndTask( w1 => + { + harvester.Visible = false; + harvester.Deliver(harv, self); + }); + }) ); + harv.QueueActivity( new Wait(18) ); + harv.QueueActivity( new CallFunc( () => harvester.Visible = true) ); + harv.QueueActivity( new Drag(endDock, startDock, 11) ); + harv.QueueActivity( new CallFunc( () => dockedHarv = null) ); + harv.QueueActivity( new Harvest() ); + } + + } +} diff --git a/OpenRA.Mods.RA/Activities/Drag.cs b/OpenRA.Mods.RA/Activities/Drag.cs new file mode 100644 index 0000000000..50ef6cab4d --- /dev/null +++ b/OpenRA.Mods.RA/Activities/Drag.cs @@ -0,0 +1,55 @@ +#region Copyright & License Information +/* + * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. + * This file is part of OpenRA. + * + * OpenRA is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * OpenRA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenRA. If not, see . + */ +#endregion + +using System.Linq; +using OpenRA.Traits; +using OpenRA.Traits.Activities; + +namespace OpenRA.Mods.RA.Activities +{ + public class Drag : IActivity + { + public IActivity NextActivity { get; set; } + + float2 endLocation; + float2 startLocation; + int length; + + public Drag(float2 start, float2 end, int length) + { + startLocation = start; + endLocation = end; + this.length = length; + } + + int ticks = 0; + public IActivity Tick( Actor self ) + { + self.CenterLocation = float2.Lerp(startLocation, endLocation, (float)ticks/(length-1)); + + if (++ticks >= length) + return NextActivity; + + return this; + } + + public void Cancel(Actor self) { } + } +} diff --git a/OpenRA.Mods.RA/Harvester.cs b/OpenRA.Mods.RA/Harvester.cs index f0a4b9a5ed..bb718fbd1c 100755 --- a/OpenRA.Mods.RA/Harvester.cs +++ b/OpenRA.Mods.RA/Harvester.cs @@ -37,9 +37,14 @@ namespace OpenRA.Mods.RA public object Create(Actor self) { return new Harvester(self, this); } } - public class Harvester : IIssueOrder, IResolveOrder, INotifyDamage, IPips + public class Harvester : IIssueOrder, IResolveOrder, INotifyDamage, IPips, IRenderModifier { Dictionary contents = new Dictionary(); + + [Sync] + public bool Visible = true; + + [Sync] public Actor LinkedProc = null; readonly HarvesterInfo Info; @@ -180,5 +185,10 @@ namespace OpenRA.Mods.RA yield return PipType.Transparent; } } + + public IEnumerable ModifyRender(Actor self, IEnumerable r) + { + return Visible ? r : new Renderable[] { }; + } } } diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index 1026237cec..936581e439 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -180,6 +180,8 @@ + + diff --git a/OpenRA.Mods.RA/OreRefinery.cs b/OpenRA.Mods.RA/OreRefinery.cs index 54b62c2db3..122719f4b4 100755 --- a/OpenRA.Mods.RA/OreRefinery.cs +++ b/OpenRA.Mods.RA/OreRefinery.cs @@ -31,6 +31,7 @@ namespace OpenRA.Mods.RA { public readonly int PipCount = 0; public readonly PipType PipColor = PipType.Red; + public readonly int2 DockOffset = new int2 (1, 2); public readonly int Capacity = 0; public readonly int ProcessTick = 25; public readonly int ProcessAmount = 50; @@ -41,7 +42,7 @@ namespace OpenRA.Mods.RA } } - class OreRefinery : ITick, IAcceptOre, INotifyDamage, INotifySold, INotifyCapture, IPips + class OreRefinery : ITick, IAcceptOre, INotifyDamage, INotifySold, INotifyCapture, IPips, ITraitPrerequisite { readonly Actor self; readonly OreRefineryInfo Info; @@ -102,42 +103,31 @@ namespace OpenRA.Mods.RA } foreach (var harv in LinkedHarv) - harv.traits.Get ().UnlinkProc (harv, self); + harv.traits.Get ().UnlinkProc(harv, self); } } - public int2 DeliverOffset {get{ return new int2 (1, 2); }} + public int2 DeliverOffset {get{ return Info.DockOffset; }} public void OnDock (Actor harv, DeliverResources dockOrder) { - var unit = harv.traits.Get (); - if (unit.Facing != 64) - harv.QueueActivity (new Turn (64)); - - harv.QueueActivity (new CallFunc (() => - { - var renderUnit = harv.traits.Get (); - if (renderUnit.anim.CurrentSequence.Name != "empty") - renderUnit.PlayCustomAnimation (harv, "empty", () => - { - harv.traits.Get ().Deliver (harv, self); - harv.QueueActivity (new Harvest ()); - }); - })); + self.traits.Get().OnDock(self, harv, dockOrder); } + public void OnCapture (Actor self, Actor captor) - { - // Todo: Do the right thing if a harv is docked - - // Unlink any other harvs + { + // Unlink any non-docked harvs foreach (var harv in LinkedHarv) - harv.traits.Get ().UnlinkProc (harv, self); + { + if (harv.Owner == self.Owner) + harv.traits.Get().UnlinkProc (harv, self); + } } public void Selling (Actor self) {} public void Sold (Actor self) { foreach (var harv in LinkedHarv) - harv.traits.Get ().UnlinkProc (harv, self); + harv.traits.Get().UnlinkProc (harv, self); } public IEnumerable GetPips (Actor self) diff --git a/OpenRA.Mods.RA/OreRefineryDockAction.cs b/OpenRA.Mods.RA/OreRefineryDockAction.cs new file mode 100644 index 0000000000..0388f41b3f --- /dev/null +++ b/OpenRA.Mods.RA/OreRefineryDockAction.cs @@ -0,0 +1,52 @@ +#region Copyright & License Information +/* + * Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford. + * This file is part of OpenRA. + * + * OpenRA is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * OpenRA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenRA. If not, see . + */ +#endregion + +using System; +using System.Linq; +using System.Collections.Generic; +using OpenRA.Mods.RA.Activities; +using OpenRA.Traits; +using OpenRA.Traits.Activities; + +namespace OpenRA.Mods.RA +{ + class OreRefineryDockActionInfo : TraitInfo {} + + class OreRefineryDockAction : IAcceptOreDockAction + { + public void OnDock(Actor self, Actor harv, DeliverResources dockOrder) + { + var unit = harv.traits.Get(); + if (unit.Facing != 64) + harv.QueueActivity (new Turn (64)); + + harv.QueueActivity (new CallFunc (() => + { + var renderUnit = harv.traits.Get (); + if (renderUnit.anim.CurrentSequence.Name != "empty") + renderUnit.PlayCustomAnimation (harv, "empty", () => + { + harv.traits.Get().Deliver(harv, self); + harv.QueueActivity (new Harvest ()); + }); + })); + } + } +} diff --git a/OpenRA.Mods.RA/TraitsInterfaces.cs b/OpenRA.Mods.RA/TraitsInterfaces.cs index 09b63624df..40f95771df 100755 --- a/OpenRA.Mods.RA/TraitsInterfaces.cs +++ b/OpenRA.Mods.RA/TraitsInterfaces.cs @@ -30,4 +30,9 @@ namespace OpenRA.Mods.RA void UnlinkHarvester(Actor self, Actor harv); int2 DeliverOffset { get; } } + + public interface IAcceptOreDockAction + { + void OnDock(Actor self, Actor harv, DeliverResources dockOrder); + } } diff --git a/mods/cnc/structures.yaml b/mods/cnc/structures.yaml index 173a5b927f..0948b5d4d8 100644 --- a/mods/cnc/structures.yaml +++ b/mods/cnc/structures.yaml @@ -36,6 +36,7 @@ NUKE: Crewed: yes Sight: 4 Bib: + PROC.proxy: Inherits: ^Building Buildable: @@ -74,12 +75,14 @@ PROC: Crewed: yes Sight: 6 Bib: - TiberiumRefinery: + OreRefinery: PipCount: 15 PipColor: Red + DockOffset: 0,2 Capacity: 1000 ProcessTick: 25 ProcessAmount: 50 + TiberiumRefineryDockAction: CustomSellValue: Value: 600 FreeActor: diff --git a/mods/ra/structures.yaml b/mods/ra/structures.yaml index c8e26c2d58..9c0e79d189 100644 --- a/mods/ra/structures.yaml +++ b/mods/ra/structures.yaml @@ -472,6 +472,7 @@ PROC: Capacity: 1000 ProcessTick: 25 ProcessAmount: 50 + OreRefineryDockAction: StoresOre: PipCount: 17 Capacity: 2000