forked from OpenRA/OpenRA
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
53b9b63
commit 4c24547
Showing
2 changed files
with
65 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
#region Copyright & License Information | ||
/* | ||
* Copyright 2007-2010 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 LICENSE. | ||
*/ | ||
#endregion | ||
|
||
using System.Linq; | ||
using OpenRA.Traits; | ||
|
||
namespace OpenRA.Mods.RA.Crates | ||
{ | ||
class GiveUnitCrateActionInfo : CrateActionInfo | ||
{ | ||
[ActorReference] | ||
public readonly string Unit = null; | ||
|
||
public override object Create(ActorInitializer init) { return new GiveUnitCrateAction(init.self, this); } | ||
} | ||
|
||
class GiveUnitCrateAction : CrateAction | ||
{ | ||
GiveUnitCrateActionInfo Info; | ||
public GiveUnitCrateAction(Actor self, GiveUnitCrateActionInfo info) | ||
: base(self, info) { Info = info; } | ||
|
||
public override int GetSelectionShares(Actor collector) | ||
{ | ||
var valuedInfo = Rules.Info[Info.Unit].Traits.Get<ValuedInfo>(); | ||
return valuedInfo.Owner.Contains(collector.Owner.Country.Race) | ||
? base.GetSelectionShares(collector) | ||
: 0; // this unit is not buildable by the collector's country, so | ||
// don't give them free ones either. | ||
} | ||
|
||
public override void Activate(Actor collector) | ||
{ | ||
var location = ChooseEmptyCellNear(collector); | ||
if (location != null) | ||
collector.World.AddFrameEndTask( | ||
w => w.Add(new Actor(w, Info.Unit, location.Value, collector.Owner))); | ||
|
||
base.Activate(collector); | ||
} | ||
|
||
int2? ChooseEmptyCellNear(Actor a) | ||
{ | ||
// hack: use `a`'s movement capability. | ||
var move = a.traits.Get<ITeleportable>(); | ||
var loc = a.Location; | ||
|
||
for (var i = -1; i < 2; i++) | ||
for (var j = -1; j < 2; j++) | ||
if (move.CanEnterCell(loc + new int2(i, j))) | ||
return loc + new int2(i, j); | ||
|
||
return null; // nowhere we can place this -- so the crate will do nothing. | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters