Skip to content

Commit

Permalink
Refactor, add settings for randomizing mechs/pilots
Browse files Browse the repository at this point in the history
  • Loading branch information
Michael P. Starkweather committed Jun 4, 2019
1 parent 4d5e89f commit 10d7036
Show file tree
Hide file tree
Showing 5 changed files with 160 additions and 127 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ With 1.6, you can choose if you'd like a random start by selecting the randomize

|Setting|Description|Default|
|----|----|----|
|RandomizePilots|Randomize the starting pilots with the following settings|true|
|RerollRoninStats|Rerolls all randomly given ronin stats as if they had been randomly generated|true|
|NumberRandomRonin|Number of random ronin to give you|4|
|NumberProceduralPilots|Number of random pilots to give you|0|
Expand All @@ -22,6 +23,7 @@ With 1.6, you can choose if you'd like a random start by selecting the randomize

|Setting|Description|Default|
|----|----|----|
|RandomizeMechs|Randomize the starting 'Mechs with the following settings|true|
|UseVanillaMechRandomizer|Uses the 'Mechs generated by the career mode random generator instead of using own algorithm|false|
|RemoveAncestralMech|Removes the default starting 'Mech as well|true|
|NumberLightMechs|Number of randomized light 'Mechs|3|
Expand Down
263 changes: 148 additions & 115 deletions RandomCampaignStart/Features/RandomizeSimGame.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,154 @@ public static class RandomizeSimGame
{
private static readonly Random RNG = new Random();


public static void TryRandomize(SimGameState simGame)
{
// don't randomize if career is not with random mechs
if (simGame.SimGameMode == SimGameState.SimGameType.CAREER
&& !simGame.Constants.CareerMode.StartWithRandomMechs)
return;

// don't randomize if campaign and we don't have that setting
if (simGame.SimGameMode == SimGameState.SimGameType.KAMEA_CAMPAIGN
&& !Main.Settings.RandomizeStoryCampaign)
return;

if (Main.Settings.RandomizePilots)
{
var numPilots = Main.Settings.StartingRonin.Count + Main.Settings.NumberRandomRonin +
Main.Settings.NumberProceduralPilots;

if (numPilots > 0)
RandomizePilots(simGame);
else
Main.HBSLog.LogWarning("Tried to randomize pilots but settings had 0!");
}

if (simGame.SimGameMode == SimGameState.SimGameType.CAREER && Main.Settings.UseVanillaMechRandomizer)
return;

if (Main.Settings.RandomizeMechs)
{
var numMechs = Main.Settings.NumberLightMechs + Main.Settings.NumberMediumMechs +
Main.Settings.NumberHeavyMechs + Main.Settings.NumberAssaultMechs;

if (numMechs > 0)
RandomizeMechs(simGame);
else
Main.HBSLog.LogWarning("Tried to randomize mechs but settings had 0!");
}
}


private static void RandomizeMechs(SimGameState simGame)
{
Main.HBSLog.Log("Randomizing mechs, removing old mechs");

// clear the initial lance
for (var i = 1; i < simGame.Constants.Story.StartingLance.Length + 1; i++)
simGame.ActiveMechs.Remove(i);

// remove ancestral mech if specified
if (Main.Settings.RemoveAncestralMech)
{
Main.HBSLog.Log("\tRemoving ancestral mech");
simGame.ActiveMechs.Remove(0);
}

// add the random mechs to mechIds
var mechIds = new List<string>();
mechIds.AddRange(GetRandomSubList(Main.Settings.AssaultMechsPossible, Main.Settings.NumberAssaultMechs));
mechIds.AddRange(GetRandomSubList(Main.Settings.HeavyMechsPossible, Main.Settings.NumberHeavyMechs));
mechIds.AddRange(GetRandomSubList(Main.Settings.MediumMechsPossible, Main.Settings.NumberMediumMechs));
mechIds.AddRange(GetRandomSubList(Main.Settings.LightMechsPossible, Main.Settings.NumberLightMechs));

// remove mechIDs that don't have a valid mechDef
var numInvalid = mechIds.RemoveAll(id => !simGame.DataManager.MechDefs.Exists(id));
if (numInvalid > 0)
Main.HBSLog.LogWarning($"\tREMOVED {numInvalid} INVALID MECHS! Check mod.json for misspellings");

// actually add the mechs to the game
foreach (var mechID in mechIds)
{
var baySlot = simGame.GetFirstFreeMechBay();
var mechDef = new MechDef(simGame.DataManager.MechDefs.Get(mechID), simGame.GenerateSimGameUID());

if (baySlot >= 0)
{
Main.HBSLog.Log($"\tAdding {mechID} to bay {baySlot}");
simGame.AddMech(baySlot, mechDef, true, true, false);
}
else
{
Main.HBSLog.Log($"\tAdding {mechID} to storage, bays are full");
simGame.AddItemStat(mechDef.Chassis.Description.Id, mechDef.GetType(), false);
}
}
}

private static void RandomizePilots(SimGameState simGame)
{
Main.HBSLog.Log("Randomizing pilots, removing old pilots");

// clear roster
while (simGame.PilotRoster.Count > 0)
simGame.PilotRoster.RemoveAt(0);

// starting ronin that are always present
if (Main.Settings.StartingRonin != null && Main.Settings.StartingRonin.Count > 0)
foreach (var pilotID in Main.Settings.StartingRonin)
{
if (!simGame.DataManager.PilotDefs.Exists(pilotID))
{
Main.HBSLog.LogWarning($"\tMISSING StartingRonin {pilotID}!");
continue;
}

var pilotDef = simGame.DataManager.PilotDefs.Get(pilotID);

if (Main.Settings.RerollRoninStats)
ReplacePilotStats(pilotDef,
simGame.PilotGenerator.GeneratePilots(1, Main.Settings.PilotPlanetDifficulty, 0, out _)[0]);

simGame.AddPilotToRoster(pilotDef, true);
Main.HBSLog.Log($"\tAdding StartingRonin {pilotDef.Description.Id}");
}

// random ronin
if (Main.Settings.NumberRandomRonin > 0)
{
// make sure to remove the starting ronin list from the possible random pilots! yay linq
var randomRonin =
GetRandomSubList(
simGame.RoninPilots.Where(x => !Main.Settings.StartingRonin.Contains(x.Description.Id))
.ToList(),
Main.Settings.NumberRandomRonin);
foreach (var pilotDef in randomRonin)
{
if (Main.Settings.RerollRoninStats)
ReplacePilotStats(pilotDef,
simGame.PilotGenerator.GeneratePilots(1, Main.Settings.PilotPlanetDifficulty, 0, out _)[0]);

simGame.AddPilotToRoster(pilotDef, true);
Main.HBSLog.Log($"\tAdding random Ronin {pilotDef.Description.Id}");
}
}

// random procedural pilots
if (Main.Settings.NumberProceduralPilots > 0)
{
var randomProcedural = simGame.PilotGenerator.GeneratePilots(Main.Settings.NumberProceduralPilots,
Main.Settings.PilotPlanetDifficulty, 0, out _);
foreach (var pilotDef in randomProcedural)
{
simGame.AddPilotToRoster(pilotDef, true);
Main.HBSLog.Log($"\tAdding random procedural pilot {pilotDef.Description.Id}");
}
}
}


private static void RNGShuffle<T>(IList<T> list)
{
// from https://stackoverflow.com/questions/273313/randomize-a-listt
Expand Down Expand Up @@ -67,120 +215,5 @@ private static void ReplacePilotStats(PilotDef pilotDef, PilotDef replacementSta
pilotDef.AbilityDefs?.Clear();
pilotDef.ForceRefreshAbilityDefs();
}


public static void Randomize(SimGameState simGame)
{
if (Main.Settings.StartingRonin.Count + Main.Settings.NumberRandomRonin + Main.Settings.NumberProceduralPilots > 0)
{
Main.HBSLog.Log("Randomizing pilots, removing old pilots");

// clear roster
while (simGame.PilotRoster.Count > 0)
simGame.PilotRoster.RemoveAt(0);

// starting ronin that are always present
if (Main.Settings.StartingRonin != null && Main.Settings.StartingRonin.Count > 0)
foreach (var pilotID in Main.Settings.StartingRonin)
{
if (!simGame.DataManager.PilotDefs.Exists(pilotID))
{
Main.HBSLog.LogWarning($"\tMISSING StartingRonin {pilotID}!");
continue;
}

var pilotDef = simGame.DataManager.PilotDefs.Get(pilotID);

if (Main.Settings.RerollRoninStats)
ReplacePilotStats(pilotDef,
simGame.PilotGenerator.GeneratePilots(1, Main.Settings.PilotPlanetDifficulty, 0, out _)[0]);

simGame.AddPilotToRoster(pilotDef, true);
Main.HBSLog.Log($"\tAdding StartingRonin {pilotDef.Description.Id}");
}

// random ronin
if (Main.Settings.NumberRandomRonin > 0)
{
// make sure to remove the starting ronin list from the possible random pilots! yay linq
var randomRonin =
GetRandomSubList(
simGame.RoninPilots.Where(x => !Main.Settings.StartingRonin.Contains(x.Description.Id)).ToList(),
Main.Settings.NumberRandomRonin);
foreach (var pilotDef in randomRonin)
{
if (Main.Settings.RerollRoninStats)
ReplacePilotStats(pilotDef,
simGame.PilotGenerator.GeneratePilots(1, Main.Settings.PilotPlanetDifficulty, 0, out _)[0]);

simGame.AddPilotToRoster(pilotDef, true);
Main.HBSLog.Log($"\tAdding random Ronin {pilotDef.Description.Id}");
}
}

// random procedural pilots
if (Main.Settings.NumberProceduralPilots > 0)
{
var randomProcedural = simGame.PilotGenerator.GeneratePilots(Main.Settings.NumberProceduralPilots,
Main.Settings.PilotPlanetDifficulty, 0, out _);
foreach (var pilotDef in randomProcedural)
{
simGame.AddPilotToRoster(pilotDef, true);
Main.HBSLog.Log($"\tAdding random procedural pilot {pilotDef.Description.Id}");
}
}
}

if (simGame.SimGameMode == SimGameState.SimGameType.CAREER && Main.Settings.UseVanillaMechRandomizer)
return;

// mechs
if (Main.Settings.NumberLightMechs + Main.Settings.NumberMediumMechs + Main.Settings.NumberHeavyMechs +
Main.Settings.NumberAssaultMechs > 0)
{
Main.HBSLog.Log("Randomizing mechs, removing old mechs");

// clear the initial lance
for (var i = 1; i < simGame.Constants.Story.StartingLance.Length + 1; i++)
simGame.ActiveMechs.Remove(i);

// remove ancestral mech if specified
if (Main.Settings.RemoveAncestralMech)
{
Main.HBSLog.Log("\tRemoving ancestral mech");
simGame.ActiveMechs.Remove(0);
}

// add the random mechs to mechIds
var mechIds = new List<string>();
mechIds.AddRange(GetRandomSubList(Main.Settings.AssaultMechsPossible, Main.Settings.NumberAssaultMechs));
mechIds.AddRange(GetRandomSubList(Main.Settings.HeavyMechsPossible, Main.Settings.NumberHeavyMechs));
mechIds.AddRange(GetRandomSubList(Main.Settings.MediumMechsPossible, Main.Settings.NumberMediumMechs));
mechIds.AddRange(GetRandomSubList(Main.Settings.LightMechsPossible, Main.Settings.NumberLightMechs));

// remove mechIDs that don't have a valid mechDef
var numInvalid = mechIds.RemoveAll(id => !simGame.DataManager.MechDefs.Exists(id));
if (numInvalid > 0)
Main.HBSLog.LogWarning($"\tREMOVED {numInvalid} INVALID MECHS! Check mod.json for misspellings");

// actually add the mechs to the game
foreach (var mechID in mechIds)
{
var baySlot = simGame.GetFirstFreeMechBay();
var mechDef = new MechDef(simGame.DataManager.MechDefs.Get(mechID), simGame.GenerateSimGameUID());

if (baySlot >= 0)
{
Main.HBSLog.Log($"\tAdding {mechID} to bay {baySlot}");
simGame.AddMech(baySlot, mechDef, true, true, false);
}
else
{
Main.HBSLog.Log($"\tAdding {mechID} to storage, bays are full");
simGame.AddItemStat(mechDef.Chassis.Description.Id, mechDef.GetType(), false);
}
}
}
}
}
}
2 changes: 2 additions & 0 deletions RandomCampaignStart/ModSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ internal class ModSettings
public bool RerollRoninStats = true;
public bool RandomizeStoryCampaign = false;
public bool UseVanillaMechRandomizer = false;
public bool RandomizePilots = true;
public bool RandomizeMechs = true;

public static ModSettings ReadSettings(string json)
{
Expand Down
8 changes: 1 addition & 7 deletions RandomCampaignStart/Patches/SimGameState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,7 @@ public static class SimGameState_FirstTimeInitializeDataFromDefs_Patch
{
public static void Postfix(SimGameState __instance)
{
switch (__instance.SimGameMode)
{
case SimGameState.SimGameType.KAMEA_CAMPAIGN when Main.Settings.RandomizeStoryCampaign:
case SimGameState.SimGameType.CAREER when __instance.Constants.CareerMode.StartWithRandomMechs:
RandomizeSimGame.Randomize(__instance);
break;
}
RandomizeSimGame.TryRandomize(__instance);
}
}
}
12 changes: 7 additions & 5 deletions mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,18 @@

"Settings": {
"RandomizeStoryCampaign": true,
"UseVanillaMechRandomizer": false,
"RemoveAncestralMech": true,

"RandomizePilots": true,
"RandomizeMechs": true,

"NumberRandomRonin": 4,
"NumberProceduralPilots": 0,
"RerollRoninStats": true,
"NumberProceduralPilots": 0,
"PilotPlanetDifficulty": 0,
"StartingRonin": [],

"StartingRonin": [
],
"UseVanillaMechRandomizer": false,
"RemoveAncestralMech": true,

"NumberLightMechs": 3,
"NumberMediumMechs": 2,
Expand Down

0 comments on commit 10d7036

Please sign in to comment.