diff --git a/Source/RP0/Harmony/PartListTooltip.cs b/Source/RP0/Harmony/PartListTooltip.cs index 08c3225165d..e66c6a346e1 100644 --- a/Source/RP0/Harmony/PartListTooltip.cs +++ b/Source/RP0/Harmony/PartListTooltip.cs @@ -45,6 +45,7 @@ private static void PatchButtons(PartListTooltip __instance, AvailablePart avail techID = availablePart.TechRequired; eCost = availablePart.entryCost; } + if (SpaceCenterManagement.Instance.TechListHas(techID)) { __instance.buttonPurchaseContainer.SetActive(false); @@ -52,7 +53,7 @@ private static void PatchButtons(PartListTooltip __instance, AvailablePart avail } else if (__instance.buttonPurchase.gameObject.activeSelf || __instance.buttonPurchaseRed.gameObject.activeSelf) { - var cmq = UnlockCreditHandler.Instance.GetCMQ(eCost, techID, TransactionReasonsRP0.PartOrUpgradeUnlock); + var cmq = UnlockCreditHandler.Instance.GetCMQ(eCost, TransactionReasonsRP0.PartOrUpgradeUnlock); // If we still can't afford, bail without setting tooltip if (!cmq.CanAfford()) return; diff --git a/Source/RP0/Harmony/RDController.cs b/Source/RP0/Harmony/RDController.cs index c4d775370f8..29c79dde010 100644 --- a/Source/RP0/Harmony/RDController.cs +++ b/Source/RP0/Harmony/RDController.cs @@ -33,7 +33,7 @@ internal static void Postfix_ShowNodePanel(RDController __instance, RDNode node) if (showCredit) { extraText += Localizer.Format("#rp0_UnlockCredit_NodeInfo", - UnlockCreditHandler.Instance.GetCreditAmount(node.tech.techID).ToString("N0")) + "\n"; + UnlockCreditHandler.Instance.TotalCredit.ToString("N0")) + "\n"; } else { diff --git a/Source/RP0/Harmony/RDPartList.cs b/Source/RP0/Harmony/RDPartList.cs index 7e308ae6130..5ed9f4fbd62 100644 --- a/Source/RP0/Harmony/RDPartList.cs +++ b/Source/RP0/Harmony/RDPartList.cs @@ -28,7 +28,7 @@ private static bool Prefix_AddPartListItem(RDPartList __instance, AvailablePart if (!cmq.CanAfford()) { // try again, with credit - cmq.AddPostDelta(CurrencyRP0.Funds, System.Math.Min(-cmq.GetTotal(CurrencyRP0.Funds, false), UnlockCreditHandler.Instance.GetCreditAmount(part.TechRequired)), true); + cmq.AddPostDelta(CurrencyRP0.Funds, System.Math.Min(-cmq.GetTotal(CurrencyRP0.Funds, false), UnlockCreditHandler.Instance.TotalCredit), true); if (!cmq.CanAfford()) { // still can't afford, so use the can't afford color @@ -75,7 +75,7 @@ private static bool Prefix_AddUpgradeListItem(RDPartList __instance, PartUpgrade // BUT if we can't afford normally, but can with credit let's fix the coloring. if (!cmq.CanAfford()) { - cmq.AddPostDelta(CurrencyRP0.Funds, System.Math.Min(-cmq.GetTotal(CurrencyRP0.Funds, false), UnlockCreditHandler.Instance.GetCreditAmount(upgrade.techRequired)), true); + cmq.AddPostDelta(CurrencyRP0.Funds, System.Math.Min(-cmq.GetTotal(CurrencyRP0.Funds, false), UnlockCreditHandler.Instance.TotalCredit), true); if (!cmq.CanAfford()) { text = cmq.GetCostLineOverride(true, false, true, true, false); diff --git a/Source/RP0/Harmony/RealFuels.cs b/Source/RP0/Harmony/RealFuels.cs index 105767add96..9ba913721b9 100644 --- a/Source/RP0/Harmony/RealFuels.cs +++ b/Source/RP0/Harmony/RealFuels.cs @@ -111,7 +111,7 @@ internal static bool PatchedPurchaseConfig(RealFuels.EntryCostManager __instance var cmq = CurrencyModifierQueryRP0.RunQuery(TransactionReasonsRP0.PartOrUpgradeUnlock, -cfgCost, 0d, 0d); double postCMQcost = -cmq.GetTotal(CurrencyRP0.Funds, false); double invertCMQop = cfgCost / postCMQcost; - double credit = UnlockCreditHandler.Instance.GetCreditAmount(techNode); + double credit = UnlockCreditHandler.Instance.TotalCredit; // we don't bother with Min() because we're never touching this cmq again. cmq.AddPostDelta(CurrencyRP0.Funds, credit, true); if (!cmq.CanAfford()) @@ -119,7 +119,7 @@ internal static bool PatchedPurchaseConfig(RealFuels.EntryCostManager __instance return false; } - double excessCost = UnlockCreditHandler.Instance.SpendCredit(techNode, postCMQcost); + double excessCost = UnlockCreditHandler.Instance.SpendCredit(postCMQcost); if (excessCost > 0d) { Funding.Instance.AddFunds(-excessCost * invertCMQop, TransactionReasonsRP0.PartOrUpgradeUnlock.Stock()); diff --git a/Source/RP0/ScenarioModules/FirstStart.cs b/Source/RP0/ScenarioModules/FirstStart.cs index dd1c3d416d6..452518296e9 100644 --- a/Source/RP0/ScenarioModules/FirstStart.cs +++ b/Source/RP0/ScenarioModules/FirstStart.cs @@ -30,7 +30,7 @@ private void Start() ScienceUtils.MarkExperimentsAsDone(Database.StartCompletedExperiments); CopyCraftFiles(); - UnlockCreditHandler.Instance.IncrementCredit("start", HighLogic.CurrentGame.Parameters.CustomParams().StartingUnlockCredit); + UnlockCreditHandler.Instance.IncrementCredit(HighLogic.CurrentGame.Parameters.CustomParams().StartingUnlockCredit); HighLogic.CurrentGame.CrewRoster.Update(Planetarium.GetUniversalTime()); } diff --git a/Source/RP0/ScenarioModules/UnlockCreditHandler.cs b/Source/RP0/ScenarioModules/UnlockCreditHandler.cs index c52224e2590..73a17163c4b 100644 --- a/Source/RP0/ScenarioModules/UnlockCreditHandler.cs +++ b/Source/RP0/ScenarioModules/UnlockCreditHandler.cs @@ -39,22 +39,17 @@ public double CreditForTime(double UT) return sum * mult; } - public double GetCreditAmount(string tech) => _totalCredit; - public double GetCreditAmount(List partList) => _totalCredit; - /// /// Note this is CMQ-neutral. /// - /// /// - public void IncrementCreditTime(string tech, double UT) => IncrementCredit(tech, CreditForTime(UT)); + public void IncrementCreditTime(double UT) => IncrementCredit(CreditForTime(UT)); /// /// Note this is CMQ-neutral. /// - /// /// - public void IncrementCredit(string tech, double amount) + public void IncrementCredit(double amount) { // Will also catch NaN if (!(amount > 0)) @@ -128,8 +123,6 @@ public void SpendCreditAndCost(List parts) Funding.Instance.AddFunds(-excess * recipCMQMult, TransactionReasonsRP0.PartOrUpgradeUnlock.Stock()); } - public double SpendCredit(string tech, double cost) => SpendCredit(cost); - public double SpendCredit(double cost) { if (_totalCredit == 0d) @@ -153,18 +146,18 @@ public double SpendCredit(double cost) return excessCost; } - public CurrencyModifierQueryRP0 GetCMQ(double cost, string tech, TransactionReasonsRP0 reason) + public CurrencyModifierQueryRP0 GetCMQ(double cost, TransactionReasonsRP0 reason) { var cmq = CurrencyModifierQueryRP0.RunQuery(reason, -cost, 0d, 0d); - cmq.AddPostDelta(CurrencyRP0.Funds, Math.Min(-cmq.GetTotal(CurrencyRP0.Funds, true), GetCreditAmount(tech)), true); + cmq.AddPostDelta(CurrencyRP0.Funds, Math.Min(-cmq.GetTotal(CurrencyRP0.Funds, true), TotalCredit), true); return cmq; } - public CurrencyModifierQueryRP0 GetPrePostCostAndAffordability(double cost, string tech, TransactionReasonsRP0 reason, out double preCreditCost, out double postCreditCost, out double credit, out bool canAfford) + public CurrencyModifierQueryRP0 GetPrePostCostAndAffordability(double cost, TransactionReasonsRP0 reason, out double preCreditCost, out double postCreditCost, out double credit, out bool canAfford) { var cmq = CurrencyModifierQueryRP0.RunQuery(reason, -cost, 0d, 0d); preCreditCost = -cmq.GetTotal(CurrencyRP0.Funds, false); - credit = Math.Min(preCreditCost, GetCreditAmount(tech)); + credit = Math.Min(preCreditCost, TotalCredit); cmq.AddPostDelta(CurrencyRP0.Funds, credit, true); postCreditCost = -cmq.GetTotal(CurrencyRP0.Funds, true); canAfford = cmq.CanAfford(); @@ -172,7 +165,7 @@ public CurrencyModifierQueryRP0 GetPrePostCostAndAffordability(double cost, stri return cmq; } - public void ProcessCredit(double cost, string tech, TransactionReasonsRP0 reason) + public void ProcessCredit(double cost, TransactionReasonsRP0 reason) { var cmq = CurrencyModifierQueryRP0.RunQuery(reason, -cost, 0d, 0d); double postCMQCost = -cmq.GetTotal(CurrencyRP0.Funds, true); @@ -185,9 +178,8 @@ public void ProcessCredit(double cost, string tech, TransactionReasonsRP0 reason /// and returns remaining (unsubsidized) cost /// /// - /// /// - private float ProcessCredit(float entryCost, string tech) + private float ProcessCredit(float entryCost) { if (entryCost == 0f) return 0f; @@ -220,7 +212,7 @@ private void OnPartPurchased(AvailablePart ap) UnlockCreditUtility.StoredPartEntryCost = ap.entryCost; if (ap.costsFunds) { - int remainingCost = (int)ProcessCredit(ap.entryCost, ap.TechRequired); + int remainingCost = (int)ProcessCredit(ap.entryCost); ap.SetEntryCost(remainingCost); if(HighLogic.LoadedSceneIsEditor) SpaceCenterManagement.Instance.IsEditorRecalcuationRequired = true; @@ -230,7 +222,7 @@ private void OnPartPurchased(AvailablePart ap) private void OnPartUpgradePurchased(PartUpgradeHandler.Upgrade up) { UnlockCreditUtility.StoredUpgradeEntryCost = up.entryCost; - float remainingCost = ProcessCredit(up.entryCost, up.techRequired); + float remainingCost = ProcessCredit(up.entryCost); up.entryCost = remainingCost; if (HighLogic.LoadedSceneIsEditor) SpaceCenterManagement.Instance.IsEditorRecalcuationRequired = true; diff --git a/Source/RP0/SpaceCenter/Projects/ResearchProject.cs b/Source/RP0/SpaceCenter/Projects/ResearchProject.cs index 3b46c8bd254..eebe06b51ac 100644 --- a/Source/RP0/SpaceCenter/Projects/ResearchProject.cs +++ b/Source/RP0/SpaceCenter/Projects/ResearchProject.cs @@ -288,11 +288,11 @@ public double IncrementProgress(double UTDiff) SpaceCenterManagement.Instance.RecalculateBuildRates(); // this might change other rates double portion = toGo / increment; - UnlockCreditHandler.Instance.IncrementCreditTime(techID, portion * UTDiff); + UnlockCreditHandler.Instance.IncrementCreditTime(portion * UTDiff); return (1d - portion) * UTDiff; } - UnlockCreditHandler.Instance.IncrementCreditTime(techID, UTDiff); + UnlockCreditHandler.Instance.IncrementCreditTime(UTDiff); return 0d; } diff --git a/Source/RP0/SpaceCenter/VesselBuildValidator.cs b/Source/RP0/SpaceCenter/VesselBuildValidator.cs index 34d73604949..7395fe9f18c 100644 --- a/Source/RP0/SpaceCenter/VesselBuildValidator.cs +++ b/Source/RP0/SpaceCenter/VesselBuildValidator.cs @@ -186,9 +186,7 @@ private void ProcessPartAvailability(VesselProject vp) var cmq = CurrencyModifierQueryRP0.RunQuery(TransactionReasonsRP0.PartOrUpgradeUnlock, -unlockCost, 0d, 0d); double postCMQUnlockCost = -cmq.GetTotal(CurrencyRP0.Funds, false); - double credit = UnlockCreditHandler.Instance.GetCreditAmount(partList); - - double spentCredit = Math.Min(postCMQUnlockCost, credit); + double spentCredit = Math.Min(postCMQUnlockCost, UnlockCreditHandler.Instance.TotalCredit); cmq.AddPostDelta(CurrencyRP0.Funds, spentCredit, true); int partCount = partList.Count; @@ -455,7 +453,7 @@ private DialogGUIBase[] ConstructPartConfigErrorsUI(Dictionary toolingColl, bool i { using (new CareerEventScope(CareerEventType.Tooling)) { - UnlockCreditHandler.Instance.ProcessCredit(totalCost, string.Empty, TransactionReasonsRP0.ToolingPurchase); + UnlockCreditHandler.Instance.ProcessCredit(totalCost, TransactionReasonsRP0.ToolingPurchase); } } } diff --git a/Source/RP0/UI/ProceduralAvionicsWindow.cs b/Source/RP0/UI/ProceduralAvionicsWindow.cs index 692ac600fd3..a19b0915e21 100644 --- a/Source/RP0/UI/ProceduralAvionicsWindow.cs +++ b/Source/RP0/UI/ProceduralAvionicsWindow.cs @@ -340,7 +340,7 @@ private bool DrawUnlockButton(string curCfgName, ProceduralAvionicsTechNode tech if (unlockCost <= 0) return switchedConfig; var cmq = CurrencyModifierQueryRP0.RunQuery(TransactionReasonsRP0.PartOrUpgradeUnlock, -unlockCost, 0d, 0d); double trueCost = -cmq.GetTotal(CurrencyRP0.Funds, false); - double creditToUse = Math.Min(trueCost, UnlockCreditHandler.Instance.GetCreditAmount(techNode.TechNodeName)); + double creditToUse = Math.Min(trueCost, UnlockCreditHandler.Instance.TotalCredit); cmq.AddPostDelta(CurrencyRP0.Funds, creditToUse, true); GUI.enabled = techNode.IsAvailable && cmq.CanAfford(); _gc.text = $"Unlock ({BuildCostString(Math.Max(0d, trueCost - creditToUse), trueCost)})"; diff --git a/Source/RP0/UI/ToolingGUI.cs b/Source/RP0/UI/ToolingGUI.cs index b0f41ecd679..497bc3c7bda 100644 --- a/Source/RP0/UI/ToolingGUI.cs +++ b/Source/RP0/UI/ToolingGUI.cs @@ -139,7 +139,7 @@ private static void RenderToolAllButton() if (GUILayout.Button("Tool All", HighLogic.Skin.button)) { GetUntooledPartsAndCost(out List untooledParts, out float toolingCost); - var cmq = UnlockCreditHandler.Instance.GetPrePostCostAndAffordability(toolingCost, string.Empty, TransactionReasonsRP0.ToolingPurchase, out double preCost, out double postCost, out double credit, out bool canAfford); + var cmq = UnlockCreditHandler.Instance.GetPrePostCostAndAffordability(toolingCost, TransactionReasonsRP0.ToolingPurchase, out double preCost, out double postCost, out double credit, out bool canAfford); string buttonText = canAfford ? "Purchase All Toolings" : "Can't Afford"; string costline = cmq.GetCostLineOverride(true, false, true, true); if (string.IsNullOrEmpty(costline)) @@ -169,7 +169,7 @@ private static void ToolAll() { GetUntooledPartsAndCost(out List untooledParts, out float toolingCost); - UnlockCreditHandler.Instance.GetPrePostCostAndAffordability(toolingCost, string.Empty, TransactionReasonsRP0.ToolingPurchase, out _, out _, out _, out bool canAfford); + UnlockCreditHandler.Instance.GetPrePostCostAndAffordability(toolingCost, TransactionReasonsRP0.ToolingPurchase, out _, out _, out _, out bool canAfford); if (canAfford) { ModuleTooling.PurchaseToolingBatch(untooledParts);