Improve rule upgrade logic for immobilization

This commit is contained in:
atlimit8
2015-11-27 00:51:51 -06:00
parent c827dbe183
commit e9b0691f70

View File

@@ -2510,29 +2510,176 @@ namespace OpenRA.Mods.Common.UtilityCommands
}
}
// Notify how to restore blocking movement of Mobile actors with Carryable and/or Cargo
if (engineVersion < 20151204 && depth == 2)
// Mobile actors immobilized by Carryable, Cargo, DeployToUpgrade, and/or others using upgrade(s)
if (engineVersion < 20151204 && depth == 0)
{
if (node.Key == "Carryable")
var notMobile = "notmobile";
var mobileNode = node.Value.Nodes.Find(n => n.Key == "Mobile");
var carryableNode = node.Value.Nodes.Find(n => n.Key == "Carryable");
var cargoNode = node.Value.Nodes.Find(n => n.Key == "Cargo");
var deployToUpgradeNode = node.Value.Nodes.Find(n => n.Key == "DeployToUpgrade");
var disableUpgradeNode = node.Value.Nodes.Find(n => n.Key == "DisableUpgrade");
var disableMovementOnUpgradeNode = node.Value.Nodes.Find(n => n.Key == "DisableMovementOnUpgrade");
Action<MiniYamlNode, string> addNotMobileToTraitUpgrades = (trait, upgradesKey) =>
{
Console.WriteLine("Use CarryableUpgrades of Carryable to disable Mobile while " + parent.Key + " is waiting or being carried.");
if (trait != null)
{
var upgrades = trait.Value.Nodes.Find(u => u.Key == upgradesKey);
if (upgrades == null)
trait.Value.Nodes.Add(new MiniYamlNode(upgradesKey, notMobile));
else if (string.IsNullOrEmpty(upgrades.Value.Value))
upgrades.Value.Value = notMobile;
else if (!upgrades.Value.Value.Contains(notMobile))
upgrades.Value.Value += ", " + notMobile;
}
};
if (mobileNode != null)
{
var mobileUpgrades = mobileNode.Value.Nodes.Find(n => n.Key == "UpgradeTypes");
var mobileUpgradeMaxEnabledLevel = mobileNode.Value.Nodes.Find(n => n.Key == "UpgradeMaxEnabledLevel");
var comma = new char[] { ',' };
Func<bool> addUpgradeMaxEnabledLevelNode = () =>
{
if (mobileUpgradeMaxEnabledLevel == null)
{
mobileUpgradeMaxEnabledLevel = new MiniYamlNode("UpgradeMaxEnabledLevel", "0");
mobileNode.Value.Nodes.Add(mobileUpgradeMaxEnabledLevel);
return true;
}
else
return mobileUpgradeMaxEnabledLevel.Value.Value == "0";
};
// If exactly one upgrade type is in UpgradeTypes and UpgradeMaxEnabledLevel is/can be 0 , then use it as notmobile
if (mobileUpgrades != null && !string.IsNullOrEmpty(mobileUpgrades.Value.Value)
&& !mobileUpgrades.Value.Value.Contains(",") && addUpgradeMaxEnabledLevelNode())
notMobile = mobileUpgrades.Value.Value;
if (mobileUpgradeMaxEnabledLevel != null && mobileUpgradeMaxEnabledLevel.Value.Value != "0")
Console.WriteLine("\t\t" + node.Key + " actor rules may require manual upgrading for immobilization upgrade logic.");
else
{
Action<string> addImmobilizeUpgradeType = upgradeType =>
{
if (mobileUpgrades == null)
{
mobileUpgrades = new MiniYamlNode("UpgradeTypes", upgradeType);
mobileNode.Value.Nodes.Add(mobileUpgrades);
}
else if (string.IsNullOrEmpty(mobileUpgrades.Value.Value))
mobileUpgrades.Value.Value = upgradeType;
else if (!mobileUpgrades.Value.Value.Split(comma).Contains(upgradeType))
mobileUpgrades.Value.Value += ", " + upgradeType;
};
Predicate<string> addImmobilizeUpgradeTypes = upgradeTypes =>
{
if (string.IsNullOrEmpty(upgradeTypes))
return false;
foreach (var upgradeType in upgradeTypes.Split(comma))
addImmobilizeUpgradeType(upgradeType);
return true;
};
Predicate<MiniYamlNode> addUpgradeTypeFromTrait = trait =>
{
var upgradeTypesNode = trait.Value.Nodes.Find(n => n.Key == "UpgradeTypes");
if (upgradeTypesNode == null)
return false;
addUpgradeMaxEnabledLevelNode();
return addImmobilizeUpgradeTypes(upgradeTypesNode.Value.Value);
};
var noticeWritten = false;
Action writeNotice = () =>
{
if (noticeWritten)
return;
Console.WriteLine("\t\t" + node.Key + " actor rules may require manual upgrading for immobilization upgrade logic.");
noticeWritten = true;
};
if (disableUpgradeNode != null && !addUpgradeTypeFromTrait(disableUpgradeNode))
{
writeNotice();
Console.WriteLine("\t\t\tOne or more upgrades may need to be copied from the DisableUpgrade trait to the Mobile trait.");
}
if (disableMovementOnUpgradeNode != null)
{
if (addUpgradeTypeFromTrait(disableMovementOnUpgradeNode))
parent.Value.Nodes.Remove(disableMovementOnUpgradeNode);
else
{
writeNotice();
Console.WriteLine("\t\t\tOne or more upgrades may need to be moved from the DisableMovementOnUpgrade trait to the Mobile trait.");
Console.WriteLine("\t\t\t\tRemember to remove the DisableMovementOnUpgrade trait.");
}
}
if (carryableNode != null || cargoNode != null || deployToUpgradeNode != null)
{
addUpgradeMaxEnabledLevelNode();
addImmobilizeUpgradeTypes(notMobile);
addNotMobileToTraitUpgrades(carryableNode, "CarryableUpgrades");
addNotMobileToTraitUpgrades(cargoNode, "LoadingUpgrades");
addNotMobileToTraitUpgrades(deployToUpgradeNode, "DeployedUpgrades");
}
}
}
else if (node.Key == "Cargo")
else if (!node.Value.Nodes.Exists(n => n.Key == "Husk" || n.Key == "Building" || n.Key == "Aircraft" || n.Key == "Immobile"))
{
Console.WriteLine("Use LoadingUpgrades of Cargo to disable Mobile while " + parent.Key + " is loading cargo.");
}
else if (node.Key == "DeployToUpgrade")
{
Console.WriteLine("Use Upgrades of DeployToUpgrade to disable Mobile while " + parent.Key + " is deployed (instead of DisableUpgrade).");
}
else if (node.Key == "DisableUpgrade")
{
Console.WriteLine("DisableUpgrade no longer disables Mobile. Use Mobile upgradablility instead for " + parent.Key + ".");
}
else if (node.Key == "DisableMovementOnUpgrade")
{
parent.Value.Nodes.Remove(node);
Console.WriteLine("DisableMovementOnUpgrade is removed. Use Mobile upgradablility instead for " + parent.Key + ".");
if (carryableNode != null || cargoNode != null || deployToUpgradeNode != null)
{
Console.WriteLine("\t\tIf " + node.Key
+ " has a Mobile trait then adding the following with <upgrade> substituted by an immobilization upgrade for "
+ node.Key + " may be neeeded:");
if (carryableNode != null)
{
Console.WriteLine("\t\t\tCarryable:");
Console.WriteLine("\t\t\t\tCarryableUpgrades: <upgrade>");
}
if (cargoNode != null)
{
Console.WriteLine("\t\t\tCargo:");
Console.WriteLine("\t\t\t\tLoadingUpgrades: <upgrade>");
}
if (deployToUpgradeNode != null)
{
Console.WriteLine("\t\t\tDeployToUpgrade:");
Console.WriteLine("\t\t\t\tDeployedUpgrades: <upgrade>");
}
}
var disableUpgradeUpgradeTypesNode = disableUpgradeNode != null
? disableUpgradeNode.Value.Nodes.Find(n => n.Key == "UpgradeTypes")
: null;
var disableMovementOnUpgradeUpgradeTypesNode = disableMovementOnUpgradeNode != null
? disableMovementOnUpgradeNode.Value.Nodes.Find(n => n.Key == "UpgradeTypes")
: null;
if (disableUpgradeUpgradeTypesNode != null || disableMovementOnUpgradeUpgradeTypesNode != null)
Console.WriteLine("\t\t" + node.Key + " actor rules may require manual upgrading for immobilization upgrade logic.");
if (disableUpgradeUpgradeTypesNode != null)
Console.WriteLine("\t\t\tDisableUpgrade UpgradeTypes: " + disableUpgradeUpgradeTypesNode.Value.Value);
if (disableMovementOnUpgradeUpgradeTypesNode != null)
Console.WriteLine("\t\t\tDisableMovementOnUpgrade UpgradeTypes: " + disableMovementOnUpgradeUpgradeTypesNode.Value.Value);
if (disableMovementOnUpgradeNode != null)
node.Value.Nodes.Remove(disableMovementOnUpgradeNode);
}
}