Merge branch 'master' of git://github.com/chrisforbes/OpenRA

This commit is contained in:
Alli
2009-12-23 22:24:31 +13:00
6 changed files with 33 additions and 36 deletions

View File

@@ -241,20 +241,11 @@ namespace OpenRa.Game
} }
public static bool IsActorCrushableByMovementType(Actor a, UnitMovementType umt) public static bool IsActorCrushableByMovementType(Actor a, UnitMovementType umt)
{ {
if (a != null) return a != null &&
{ a.traits.WithInterface<ICrushable>()
foreach (var crush in a.traits.WithInterface<ICrushable>()) .Any(c => c.CrushableBy(umt) &&
{ ((c.IsCrushableByEnemy() && a.Owner != Game.LocalPlayer) ||
if (((crush.IsCrushableByEnemy() && a.Owner != Game.LocalPlayer) || (crush.IsCrushableByFriend() && a.Owner == Game.LocalPlayer)) (c.IsCrushableByFriend() && a.Owner == Game.LocalPlayer)));
&& crush.CrushableBy().Contains(umt))
{
Log.Write("{0} is crushable by MovementType {1}", a.Info.Name, umt);
return true;
}
}
Log.Write("{0} is NOT crushable by MovementType {1}", a.Info.Name, umt);
}
return false;
} }
public static bool IsWater(int2 a) public static bool IsWater(int2 a)

View File

@@ -43,8 +43,6 @@ namespace OpenRa.Game.Graphics
Log.Write("* LoadSequencesForCursor() done"); Log.Write("* LoadSequencesForCursor() done");
} }
public static void ForcePrecache() { } // force static ctor to run
static void LoadSequencesForUnit(XmlElement eUnit) static void LoadSequencesForUnit(XmlElement eUnit)
{ {
string unitName = eUnit.GetAttribute("name"); string unitName = eUnit.GetAttribute("name");

View File

@@ -37,32 +37,30 @@ namespace OpenRa.Game
WorldRenderer.ShowUnitPaths = settings.GetValue("pathdebug", false); WorldRenderer.ShowUnitPaths = settings.GetValue("pathdebug", false);
Game.timestep = settings.GetValue("rate", 40); Game.timestep = settings.GetValue("rate", 40);
Game.Replay = settings.GetValue("replay", ""); Game.Replay = settings.GetValue("replay", "");
Game.NetworkHost = settings.GetValue( "host", "" ); Game.NetworkHost = settings.GetValue("host", "");
Game.NetworkPort = int.Parse( settings.GetValue( "port", "0" ) ); Game.NetworkPort = int.Parse(settings.GetValue("port", "0"));
var useAftermath = bool.Parse( settings.GetValue( "aftermath", "false" ) ); var useAftermath = bool.Parse(settings.GetValue("aftermath", "false"));
Renderer.SheetSize = int.Parse( settings.GetValue( "sheetsize", "512" ) ); Renderer.SheetSize = int.Parse(settings.GetValue("sheetsize", "512"));
while( !File.Exists( "redalert.mix" ) ) while (!File.Exists("redalert.mix"))
{ {
var current = Directory.GetCurrentDirectory(); var current = Directory.GetCurrentDirectory();
if( Directory.GetDirectoryRoot( current ) == current ) if (Directory.GetDirectoryRoot(current) == current)
throw new InvalidOperationException( "Unable to load MIX files." ); throw new InvalidOperationException("Unable to load MIX files.");
Directory.SetCurrentDirectory( ".." ); Directory.SetCurrentDirectory("..");
} }
FileSystem.MountDefault( useAftermath ); FileSystem.MountDefault(useAftermath);
bool windowed = !settings.GetValue( "fullscreen", false ); bool windowed = !settings.GetValue("fullscreen", false);
renderer = new Renderer( this, GetResolution( settings ), windowed ); renderer = new Renderer(this, GetResolution(settings), windowed);
var controller = new Controller( () => (Modifiers)(int)ModifierKeys ); /* a bit of insane input routing */ var controller = new Controller(() => (Modifiers)(int)ModifierKeys); /* a bit of insane input routing */
Game.Initialize(settings.GetValue("map", "scm12ea.ini"), renderer, new int2(ClientSize), Game.Initialize(settings.GetValue("map", "scm12ea.ini"), renderer, new int2(ClientSize),
settings.GetValue("player", 1), useAftermath, controller ); settings.GetValue("player", 1), useAftermath, controller);
SequenceProvider.ForcePrecache();
ShowCursor(false); ShowCursor(false);
Game.ResetTimer(); Game.ResetTimer();

View File

@@ -29,10 +29,13 @@ namespace OpenRa.Game.Traits
self.InflictDamage(crusher, self.Health, Rules.WarheadInfo["Crush"]); self.InflictDamage(crusher, self.Health, Rules.WarheadInfo["Crush"]);
} }
public IEnumerable<UnitMovementType> CrushableBy() public bool CrushableBy(UnitMovementType umt)
{ {
yield return UnitMovementType.Track; switch (umt)
//yield return UnitMovementType.Wheel; // Can infantry be crushed by wheel? {
case UnitMovementType.Track: return true;
default: return false;
}
} }
} }
} }

View File

@@ -37,7 +37,14 @@ namespace OpenRa.Game.Traits
public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor) public Order IssueOrder(Actor self, int2 xy, MouseInput mi, Actor underCursor)
{ {
if (mi.Button == MouseButton.Left) return null; if (mi.Button == MouseButton.Left) return null;
if (underCursor != null) return null;
if (underCursor != null)
{
// force-move
if (!mi.Modifiers.HasModifier(Modifiers.Alt)) return null;
if (!Game.IsActorCrushableByActor(underCursor, self)) return null;
}
if (Util.GetEffectiveSpeed(self) == 0) return null; /* allow disabling move orders from modifiers */ if (Util.GetEffectiveSpeed(self) == 0) return null; /* allow disabling move orders from modifiers */
if (xy == toCell) return null; if (xy == toCell) return null;
return Order.Move(self, xy); return Order.Move(self, xy);

View File

@@ -64,6 +64,6 @@ namespace OpenRa.Game.Traits
bool IsCrushableByFriend(); bool IsCrushableByFriend();
bool IsCrushableByEnemy(); bool IsCrushableByEnemy();
void OnCrush(Actor crusher); void OnCrush(Actor crusher);
IEnumerable<UnitMovementType>CrushableBy(); bool CrushableBy(UnitMovementType umt);
} }
} }