Add plumbing for short game option

This commit is contained in:
Oliver Brakmann
2014-11-17 18:44:32 +01:00
parent 470ae17271
commit 280b30961f
7 changed files with 57 additions and 5 deletions

View File

@@ -68,6 +68,7 @@ namespace OpenRA
public string TechLevel;
public bool ConfigurableStartingUnits = true;
public string[] Difficulties = { };
public bool? ShortGame;
public void UpdateServerSettings(Session.Global settings)
{
@@ -85,6 +86,8 @@ namespace OpenRA
settings.StartingCash = StartingCash.Value;
if (FragileAlliances.HasValue)
settings.FragileAlliances = FragileAlliances.Value;
if (ShortGame.HasValue)
settings.ShortGame = ShortGame.Value;
}
}

View File

@@ -186,6 +186,7 @@ namespace OpenRA.Network
public int StartingCash = 5000;
public string TechLevel = "none";
public string StartingUnitsClass = "none";
public bool ShortGame = true;
public bool AllowVersionMismatch;
public string GameUid;

View File

@@ -17,7 +17,11 @@ namespace OpenRA.Mods.Common
{
public static bool HasNoRequiredUnits(this Player player)
{
return player.World.ActorsWithTrait<MustBeDestroyed>().All(p => p.Actor.Owner != player);
return !player.World.ActorsWithTrait<MustBeDestroyed>().Any(p =>
{
return p.Actor.Owner == player &&
(player.World.LobbyInfo.GlobalSettings.ShortGame ? p.Trait.Info.RequiredForShortGame : p.Actor.IsInWorld);
});
}
}
}

View File

@@ -809,6 +809,29 @@ namespace OpenRA.Mods.Common.Server
server.SyncLobbyClients();
return true;
}
},
{ "shortgame",
s =>
{
if (!client.IsAdmin)
{
server.SendOrderTo(conn, "Message", "Only the host can set that option");
return true;
}
if (server.Map.Options.ShortGame.HasValue)
{
server.SendOrderTo(conn, "Message", "Map has disabled short game configuration");
return true;
}
bool.TryParse(s, out server.LobbyInfo.GlobalSettings.ShortGame);
server.SyncLobbyGlobalSettings();
server.SendMessage("{0} {1} Short Game."
.F(client.Name, server.LobbyInfo.GlobalSettings.ShortGame ? "enabled" : "disabled"));
return true;
}
}
};

View File

@@ -12,7 +12,22 @@ using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits
{
[Desc("Tag trait for things that must be destroyed for a short game to end.")]
public class MustBeDestroyedInfo : TraitInfo<MustBeDestroyed> { }
public class MustBeDestroyed { }
[Desc("Actors with this trait must be destroyed for a game to end.")]
public class MustBeDestroyedInfo : ITraitInfo
{
[Desc("In a short game only actors that have this value set to true need to be destroyed.")]
public bool RequiredForShortGame = false;
public object Create(ActorInitializer init) { return new MustBeDestroyed(this); }
}
public class MustBeDestroyed
{
public readonly MustBeDestroyedInfo Info;
public MustBeDestroyed(MustBeDestroyedInfo info)
{
Info = info;
}
}
}

View File

@@ -690,6 +690,11 @@ namespace OpenRA.Mods.Common.UtilityCommands
}
}
// Adjust MustBeDestroyed for short games
if (engineVersion < 20141218)
if (depth == 1 && node.Key == "MustBeDestroyed")
node.Value.Nodes.Add(new MiniYamlNode("RequiredForShortGame", "true"));
UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1);
}
}

View File

@@ -109,7 +109,8 @@ namespace OpenRA.Mods.RA.Scripting
}
[ScriptActorPropertyActivity]
[Desc("Returns true if this player has lost all units/actors that have the MustBeDestroyed trait.")]
[Desc("Returns true if this player has lost all units/actors that have" +
"the MustBeDestroyed trait (according to the short game option).")]
public bool HasNoRequiredUnits()
{
return player.HasNoRequiredUnits();