static void Postfix(ref SimGameState __instance, ref int __result) { try { Settings settings = Helper.LoadSettings(); float expenditureCostModifier = __instance.GetExpenditureCostModifier(__instance.ExpenditureLevel); foreach (MechDef mechDef in __instance.ActiveMechs.Values) { __result -= Mathf.CeilToInt(__instance.Constants.Finances.MechCostPerQuarter * expenditureCostModifier); if (settings.CostByTons) { __result += Mathf.RoundToInt((float)mechDef.Chassis.Tonnage * settings.cbillsPerTon * expenditureCostModifier); if (settings.TonsAdditive) { __result += Mathf.RoundToInt(Helper.CalculateCBillValue(mechDef) * settings.PercentageOfMechCost * expenditureCostModifier); } } else { __result += Mathf.RoundToInt(Helper.CalculateCBillValue(mechDef) * settings.PercentageOfMechCost * expenditureCostModifier); } } } catch (Exception e) { Logger.LogError(e); } }
public static void Postfix(SimGameState __instance, ref int __result, EconomyScale expenditureLevel, bool proRate) { Mod.Log.Info($"SGS:GE entered with {__result}"); // Subtract the base cost of mechs float expenditureCostModifier = __instance.GetExpenditureCostModifier(expenditureLevel); int defaultMechCosts = 0; foreach (MechDef mechDef in __instance.ActiveMechs.Values) { defaultMechCosts += Mathf.RoundToInt(expenditureCostModifier * (float)__instance.Constants.Finances.MechCostPerQuarter); } // Add the new costs int activeMechCosts = Helper.CalculateTotalForUpkeep(__instance); double gearInventorySize = Helper.GetGearInventorySize(__instance); int gearStorageCosts = Helper.CalculateTotalForGearCargo(__instance, gearInventorySize); double mechPartsTonnage = Helper.CalculateTonnageForAllMechParts(__instance); int mechPartsStorageCost = Helper.CalculateTotalForMechPartsCargo(__instance, mechPartsTonnage); int total = __result - defaultMechCosts + activeMechCosts + gearStorageCosts + mechPartsStorageCost; Mod.Log.Info($"SGS:GE - total:{total} ==> result:{__result} - defaultMechCosts:{defaultMechCosts} = {__result - defaultMechCosts} + activeMechs:{activeMechCosts} + gearStorage:{gearStorageCosts} + partsStorage:{mechPartsStorageCost}"); __result = total; }
public static bool Prefix(SimGameState __instance, EconomyScale expenditureLevel, bool proRate, int ___ProRateRefund, ref int __result) { FinancesConstantsDef finances = __instance.Constants.Finances; int baseMaintenanceCost = __instance.GetShipBaseMaintenanceCost(); for (int index = 0; index < __instance.ShipUpgrades.Count; ++index) { float pilotQurikModifier = PilotQuirkManager.Instance.getArgoUpgradeCostModifier(__instance.PilotRoster.ToList(), __instance.ShipUpgrades[index].Description.Id, true); float baseCost = (float)__instance.ShipUpgrades[index].AdditionalCost * pilotQurikModifier; baseMaintenanceCost += Mathf.CeilToInt(baseCost * __instance.Constants.CareerMode.ArgoMaintenanceMultiplier); } foreach (MechDef mechDef in __instance.ActiveMechs.Values) { baseMaintenanceCost += finances.MechCostPerQuarter; } for (int index = 0; index < __instance.PilotRoster.Count; ++index) { baseMaintenanceCost += __instance.GetMechWarriorValue(__instance.PilotRoster[index].pilotDef); } float expenditureCostModifier = __instance.GetExpenditureCostModifier(expenditureLevel); __result = Mathf.CeilToInt((float)(baseMaintenanceCost - (proRate ? ___ProRateRefund : 0)) * expenditureCostModifier); return(false); }
public static void Postfix(SimGameState __instance, ref int __result, EconomyScale expenditureLevel, bool proRate) { Mod.Log.Trace?.Write($"SGS:GE entered with {__result}"); // Evaluate old versus new cost int vanillaCosts = 0; int newCosts = 0; for (int i = 0; i < __instance.PilotRoster.Count; i++) { PilotDef def = __instance.PilotRoster[i].pilotDef; vanillaCosts += __instance.GetMechWarriorValue(def); CrewDetails details = ModState.GetCrewDetails(def); newCosts += details.AdjustedSalary; } // Multiply old costs by expenditure. New has that built in. Then subtract them from the running total float expenditureCostModifier = __instance.GetExpenditureCostModifier(expenditureLevel); int vanillaTotal = Mathf.CeilToInt((float)vanillaCosts * expenditureCostModifier); Mod.Log.Trace?.Write($"Removing {vanillaCosts} costs x {expenditureCostModifier} expenditureMulti " + $"= {vanillaTotal} total vanilla costs."); __result -= vanillaTotal; // Add the new costs __result += newCosts; }
static void Postfix(SGCaptainsQuartersStatusScreen __instance) { try { ReflectionHelper.InvokePrivateMethode(__instance, "ClearListLineItems", new object[] { ReflectionHelper.GetPrivateField(__instance, "SectionOneExpensesList") }); Settings settings = Helper.LoadSettings(); SimGameState simState = (SimGameState)ReflectionHelper.GetPrivateField(__instance, "simState"); float expenditureCostModifier = simState.GetExpenditureCostModifier(simState.ExpenditureLevel); List <KeyValuePair <string, int> > list = new List <KeyValuePair <string, int> >(); int ongoingUpgradeCosts = 0; string key = (simState.CurDropship != DropshipType.Leopard) ? "Argo Operating Costs" : "Bank Loan Interest Payment"; int value = Mathf.RoundToInt(expenditureCostModifier * (float)simState.GetShipBaseMaintenanceCost()); list.Add(new KeyValuePair <string, int>(key, value)); foreach (ShipModuleUpgrade shipModuleUpgrade in simState.ShipUpgrades) { if (simState.CurDropship == DropshipType.Argo && shipModuleUpgrade.AdditionalCost > 0) { string name = shipModuleUpgrade.Description.Name; value = Mathf.RoundToInt(expenditureCostModifier * (float)shipModuleUpgrade.AdditionalCost); list.Add(new KeyValuePair <string, int>(name, value)); } } foreach (MechDef mechDef in simState.ActiveMechs.Values) { key = mechDef.Name; if (settings.CostByTons) { value = Mathf.RoundToInt(expenditureCostModifier * (float)mechDef.Chassis.Tonnage * settings.cbillsPerTon); if (settings.TonsAdditive) { value += Mathf.RoundToInt(expenditureCostModifier * Helper.CalculateCBillValue(mechDef) * settings.PercentageOfMechCost); } } else { value = Mathf.RoundToInt(expenditureCostModifier * Helper.CalculateCBillValue(mechDef) * settings.PercentageOfMechCost); } list.Add(new KeyValuePair <string, int>(key, value)); } list.Sort((KeyValuePair <string, int> a, KeyValuePair <string, int> b) => b.Value.CompareTo(a.Value)); list.ForEach(delegate(KeyValuePair <string, int> entry) { ongoingUpgradeCosts += entry.Value; ReflectionHelper.InvokePrivateMethode(__instance, "AddListLineItem", new object[] { ReflectionHelper.GetPrivateField(__instance, "SectionOneExpensesList"), entry.Key, SimGameState.GetCBillString(entry.Value) }); }); ReflectionHelper.InvokePrivateMethode(__instance, "SetField", new object[] { ReflectionHelper.GetPrivateField(__instance, "SectionOneExpensesField"), SimGameState.GetCBillString(ongoingUpgradeCosts) }, new Type[] { typeof(TextMeshProUGUI), typeof(string) }); } catch (Exception e) { Logger.LogError(e); } }
static void Postfix(SGCaptainsQuartersStatusScreen __instance, EconomyScale expenditureLevel, SimGameState ___simState, Transform ___SectionOneExpensesList, LocalizableText ___SectionOneExpensesField) { try { List <KeyValuePair <string, int> > keyValuePairList = new List <KeyValuePair <string, int> >(); float expenditureCostModifier = ___simState.GetExpenditureCostModifier(expenditureLevel); string sectionOneExpenses = ___SectionOneExpensesField.OriginalText; sectionOneExpenses = sectionOneExpenses.Replace("¢", "").Replace(",", ""); int ongoingUpgradeCosts = int.Parse(sectionOneExpenses); List <string> mechNames = new List <string>(); foreach (MechDef mechDef in ___simState.ActiveMechs.Values) { string key = mechDef.Name; mechNames.Add(key); int value = Mathf.RoundToInt(expenditureCostModifier * (float)___simState.Constants.Finances.MechCostPerQuarter); ongoingUpgradeCosts -= value; if (settings.CostByTons) { value = Mathf.RoundToInt(expenditureCostModifier * (float)mechDef.Chassis.Tonnage * settings.cbillsPerTon); if (settings.TonsAdditive) { value += Mathf.RoundToInt(expenditureCostModifier * Helper.CalculateCBillValue(mechDef) * settings.PercentageOfMechCost); } } else { value = Mathf.RoundToInt(expenditureCostModifier * Helper.CalculateCBillValue(mechDef) * settings.PercentageOfMechCost); } ongoingUpgradeCosts += value; keyValuePairList.Add(new KeyValuePair <string, int>(key, value)); } FilterListItems(___SectionOneExpensesList, ___simState, mechNames, keyValuePairList); keyValuePairList.Sort((Comparison <KeyValuePair <string, int> >)((a, b) => b.Value.CompareTo(a.Value))); keyValuePairList.ForEach((Action <KeyValuePair <string, int> >)(entry => { Traverse.Create(__instance).Method("AddListLineItem", new Type[] { typeof(Transform), typeof(string), typeof(string) }).GetValue( new object[] { ___SectionOneExpensesList, entry.Key, SimGameState.GetCBillString(entry.Value) }); })); Traverse.Create(__instance).Method("SetField", new Type[] { typeof(LocalizableText), typeof(string) }).GetValue( new object[] { ___SectionOneExpensesField, SimGameState.GetCBillString(ongoingUpgradeCosts) }); } catch (Exception e) { Helper.Logger.LogError(e); } }
public static void Postfix(SimGameState __instance, EconomyScale expenditureLevel, ref int __result) { FinancesConstantsDef finances = __instance.Constants.Finances; float expenditureCostModifier = __instance.GetExpenditureCostModifier(expenditureLevel); int baseMaintenanceCost = __result; foreach (MechDef mechDef in __instance.ActiveMechs.Values) { baseMaintenanceCost -= finances.MechCostPerQuarter; if (settings.CostByTons) { baseMaintenanceCost += Mathf.RoundToInt((float)mechDef.Chassis.Tonnage * settings.cbillsPerTon * expenditureCostModifier); if (settings.TonsAdditive) { baseMaintenanceCost += Mathf.RoundToInt(Helper.CalculateCBillValue(mechDef) * settings.PercentageOfMechCost * expenditureCostModifier); } } else { baseMaintenanceCost += Mathf.RoundToInt(Helper.CalculateCBillValue(mechDef) * settings.PercentageOfMechCost * expenditureCostModifier); } } __result = baseMaintenanceCost; }
public static bool Prefix(SGCaptainsQuartersStatusScreen __instance, EconomyScale expenditureLevel, bool showMoraleChange, SimGameState ___simState, SGDifficultyIndicatorWidget ___ExpenditureLevelIndicatorWidget, LocalizableText ___ExpenditureLevelField, LocalizableText ___SectionOneExpenseLevel, LocalizableText ___SectionTwoExpenseLevel, SGFinancialForecastWidget ___FinanceWidget, LocalizableText ___MoraleValueField, SGMoraleBar ___MoralBar, Transform ___SectionOneExpensesList, LocalizableText ___SectionOneExpensesField, LocalizableText ___SectionTwoExpensesField, Transform ___SectionTwoExpensesList, LocalizableText ___EndOfQuarterFunds, LocalizableText ___QuarterOperatingExpenses, LocalizableText ___CurrentFunds, List <LocalizableText> ___ExpenditureLvlBtnMoraleFields, List <LocalizableText> ___ExpenditureLvlBtnCostFields) { if (__instance == null || ___simState == null) { return(true); } float expenditureCostModifier = ___simState.GetExpenditureCostModifier(expenditureLevel); Traverse methodSetField = Traverse.Create(__instance) .Method("SetField", new Type[] { typeof(LocalizableText), typeof(string) }); int expLevel = (int)Traverse.Create(__instance) .Method("GetExpendetureLevelIndexNormalized", new object[] { expenditureLevel }).GetValue(); ___ExpenditureLevelIndicatorWidget.SetDifficulty(expLevel * 2); methodSetField.GetValue(new object[] { ___ExpenditureLevelField, string.Format("{0}", (object)expenditureLevel) }); methodSetField.GetValue(new object[] { ___SectionOneExpenseLevel, string.Format("{0}", (object)expenditureLevel) }); methodSetField.GetValue(new object[] { ___SectionTwoExpenseLevel, string.Format("{0}", (object)expenditureLevel) }); ___FinanceWidget.RefreshData(expenditureLevel); int num1 = ___simState.ExpenditureMoraleValue[expenditureLevel]; methodSetField.GetValue(new object[] { ___MoraleValueField, string.Format("{0}{1}", num1 > 0 ? (object)"+" : (object)"", (object)num1) }); if (showMoraleChange) { int morale = ___simState.Morale; ___MoralBar.ShowMoraleChange(morale, morale + num1); } else { ___MoralBar.ShowCurrentMorale(); } Traverse.Create(__instance).Method("ClearListLineItems", new object[] { ___SectionOneExpensesList }).GetValue(); List <KeyValuePair <string, int> > keyValuePairList = new List <KeyValuePair <string, int> >(); int ongoingUpgradeCosts = 0; string key = ___simState.CurDropship == DropshipType.Leopard ? Strings.T("Bank Loan Interest Payment") : Strings.T("Argo Operating Costs"); int num2 = Mathf.RoundToInt(expenditureCostModifier * (float)___simState.GetShipBaseMaintenanceCost()); keyValuePairList.Add(new KeyValuePair <string, int>(key, num2)); foreach (ShipModuleUpgrade shipUpgrade in ___simState.ShipUpgrades) { float pilotQurikModifier = PilotQuirkManager.Instance.getArgoUpgradeCostModifier(___simState.PilotRoster.ToList(), shipUpgrade.Description.Id, true); float baseCost = (float)shipUpgrade.AdditionalCost * pilotQurikModifier; if (___simState.CurDropship == DropshipType.Argo && Mathf.CeilToInt((float)baseCost * ___simState.Constants.CareerMode.ArgoMaintenanceMultiplier) > 0) { string name = shipUpgrade.Description.Name; int num3 = Mathf.RoundToInt(expenditureCostModifier * (float)Mathf.CeilToInt((float)baseCost * ___simState.Constants.CareerMode.ArgoMaintenanceMultiplier)); keyValuePairList.Add(new KeyValuePair <string, int>(name, num3)); } } foreach (MechDef mechDef in ___simState.ActiveMechs.Values) { string name = mechDef.Name; int num3 = Mathf.RoundToInt(expenditureCostModifier * (float)___simState.Constants.Finances.MechCostPerQuarter); keyValuePairList.Add(new KeyValuePair <string, int>(name, num3)); } keyValuePairList.Sort((Comparison <KeyValuePair <string, int> >)((a, b) => b.Value.CompareTo(a.Value))); keyValuePairList.ForEach((Action <KeyValuePair <string, int> >)(entry => { ongoingUpgradeCosts += entry.Value; methodAddLineItem.Invoke(__instance, new object[] { ___SectionOneExpensesList, entry.Key, SimGameState.GetCBillString(entry.Value) }); })); methodSetField.GetValue(new object[] { ___SectionOneExpensesField, SimGameState.GetCBillString(ongoingUpgradeCosts) }); keyValuePairList.Clear(); Traverse.Create(__instance).Method("ClearListLineItems", new object[] { ___SectionTwoExpensesList }).GetValue(); int ongoingMechWariorCosts = 0; foreach (Pilot pilot in ___simState.PilotRoster) { string displayName = pilot.pilotDef.Description.DisplayName; int num3 = Mathf.CeilToInt(expenditureCostModifier * (float)___simState.GetMechWarriorValue(pilot.pilotDef)); keyValuePairList.Add(new KeyValuePair <string, int>(displayName, num3)); } keyValuePairList.Sort((Comparison <KeyValuePair <string, int> >)((a, b) => b.Value.CompareTo(a.Value))); keyValuePairList.ForEach((Action <KeyValuePair <string, int> >)(entry => { ongoingMechWariorCosts += entry.Value; methodAddLineItem.Invoke(__instance, new object[] { ___SectionTwoExpensesList, entry.Key, SimGameState.GetCBillString(entry.Value) }); })); methodSetField.GetValue(new object[] { ___SectionTwoExpensesField, SimGameState.GetCBillString(ongoingMechWariorCosts) }); methodSetField.GetValue(new object[] { ___EndOfQuarterFunds, SimGameState.GetCBillString(___simState.Funds + ___simState.GetExpenditures(false)) }); methodSetField.GetValue(new object[] { ___QuarterOperatingExpenses, SimGameState.GetCBillString(___simState.GetExpenditures(false)) }); methodSetField.GetValue(new object[] { ___CurrentFunds, SimGameState.GetCBillString(___simState.Funds) }); int index = 0; foreach (KeyValuePair <EconomyScale, int> keyValuePair in ___simState.ExpenditureMoraleValue) { ___ExpenditureLvlBtnMoraleFields[index].SetText(string.Format("{0}", (object)keyValuePair.Value), (object[])Array.Empty <object>()); ___ExpenditureLvlBtnCostFields[index].SetText(SimGameState.GetCBillString(___simState.GetExpenditures(keyValuePair.Key, false)), (object[])Array.Empty <object>()); ++index; } return(false); }
public static void Postfix(SGCaptainsQuartersStatusScreen __instance, EconomyScale expenditureLevel, bool showMoraleChange, Transform ___SectionTwoExpensesList, TextMeshProUGUI ___SectionTwoExpensesField, SimGameState ___simState) { // Redo all the mechwarrior cost float expenditureCostModifier = ___simState.GetExpenditureCostModifier(expenditureLevel); ClearListLineItems(___SectionTwoExpensesList, ___simState); int ongoingMechWariorCosts = 0; //int oldCosts = 0; List <KeyValuePair <string, int> > list = new List <KeyValuePair <string, int> >(); foreach (Pilot item in ___simState.PilotRoster) { string key = item.pilotDef.Description.DisplayName; CrewDetails details = ModState.GetCrewDetails(item.pilotDef); //oldCosts += Mathf.CeilToInt(expenditureCostModifier * (float)___simState.GetMechWarriorValue(item.pilotDef)); Mod.Log.Debug?.Write($" Pilot: {item.Name} has salary: {details.AdjustedSalary}"); list.Add(new KeyValuePair <string, int>(key, details.AdjustedSalary)); } // Sort by most expensive list.Sort((KeyValuePair <string, int> a, KeyValuePair <string, int> b) => b.Value.CompareTo(a.Value)); // Create a new line item for each list.ForEach(delegate(KeyValuePair <string, int> entry) { ongoingMechWariorCosts += entry.Value; AddListLineItem(___SectionTwoExpensesList, ___simState, entry.Key, SimGameState.GetCBillString(entry.Value)); }); ___SectionTwoExpensesField.SetText(SimGameState.GetCBillString(ongoingMechWariorCosts)); // Rectify the salary field //SimGameState simGameState = UnityGameInstance.BattleTechGame.Simulation; //if (__instance == null || ___SectionOneExpensesList == null || ___SectionOneExpensesField == null || simGameState == null) //{ // Mod.Log.Debug?.Write($"SGCQSS:RD - skipping"); // return; //} //// TODO: Add this to mech parts maybe? ////float expenditureCostModifier = simGameState.GetExpenditureCostModifier(expenditureLevel); //// Determine the level of aerospace support ////Statistic aerospaceAssets = simGameState.CompanyStats.GetStatistic("AerospaceAssets"); ////int aerospaceSupport = aerospaceAssets != null ? aerospaceAssets.Value<int>() : 0; //Mod.Log.Info?.Write($"SGCQSS:RD - entered. Parsing current keys."); //List<KeyValuePair<string, int>> currentKeys = GetCurrentKeys(___SectionOneExpensesList, ___simState); //// Extract the active mechs from the list, then re-add the updated price //List<KeyValuePair<string, int>> filteredKeys = FilterActiveMechs(currentKeys, ___simState); //List<KeyValuePair<string, int>> activeMechs = GetUpkeepLabels(___simState); //filteredKeys.AddRange(activeMechs); //// Add the new costs //int newActiveMechCosts = MonthlyCostCalcs.SumMonthlyMechCosts(___simState); //filteredKeys.Sort(new ExpensesSorter()); //Mod.Log.Info?.Write($"SGCQSS:RD - Clearing items"); //ClearListLineItems(___SectionOneExpensesList, ___simState); //Mod.Log.Info?.Write($"SGCQSS:RD - Adding listLineItems"); //int totalCost = 0; //try //{ // foreach (KeyValuePair<string, int> kvp in filteredKeys) // { // Mod.Log.Info?.Write($"SGCQSS:RD - Adding key:{kvp.Key} value:{kvp.Value}"); // totalCost += kvp.Value; // AddListLineItem(___SectionOneExpensesList, ___simState, kvp.Key, SimGameState.GetCBillString(kvp.Value)); // } //} //catch (Exception e) //{ // Mod.Log.Info?.Write($"SGCQSS:RD - failed to add lineItemParts due to: {e.Message}"); //} //// Update summary costs //int newCosts = totalCost; //string newCostsS = SimGameState.GetCBillString(newCosts); //Mod.Log.Debug?.Write($"SGCQSS:RD - total:{newCosts} = activeMechs:{newActiveMechCosts}"); //try //{ // ___SectionOneExpensesField.SetText(SimGameState.GetCBillString(newCosts)); // Mod.Log.Debug?.Write($"SGCQSS:RD - updated "); //} //catch (Exception e) //{ // Mod.Log.Info?.Write($"SGCQSS:RD - failed to update summary costs section due to: {e.Message}"); //} }