diff --git a/.idea/.idea.linuxdistrosbuttheyarebreedable/.idea/workspace.xml b/.idea/.idea.linuxdistrosbuttheyarebreedable/.idea/workspace.xml index 0a03c97..61508cc 100644 --- a/.idea/.idea.linuxdistrosbuttheyarebreedable/.idea/workspace.xml +++ b/.idea/.idea.linuxdistrosbuttheyarebreedable/.idea/workspace.xml @@ -11,9 +11,13 @@ - - - + + + + + + + - @@ -45,12 +49,15 @@ } } + + + {} { @@ -63,61 +70,61 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + { @@ -206,6 +213,7 @@ + - @@ -348,7 +364,8 @@ - diff --git a/Assets/Scripts/Combat/CombatTuning.cs b/Assets/Scripts/Combat/CombatTuning.cs index 5eb3001..5b0d6ef 100644 --- a/Assets/Scripts/Combat/CombatTuning.cs +++ b/Assets/Scripts/Combat/CombatTuning.cs @@ -32,6 +32,10 @@ namespace KernelPanic.Combat public const int NewCardOfferCost = 2; public const int UpgradeOfferCost = 2; public const int StatUpgradeCost = 3; + public const int BandwidthBase = 10; + public const int BandwidthPerWaveStep = 5; + public const int EntropyStartWave = 5; + public const int EntropyPerWave = 3; public const int StatUpgradeMaxCycles = 1; public const int StatUpgradeMaxUptime = 4; public const int StatUpgradeHeal = 5; diff --git a/Assets/Scripts/Meta/GachaService.cs b/Assets/Scripts/Meta/GachaService.cs index fef40ec..6759f37 100644 --- a/Assets/Scripts/Meta/GachaService.cs +++ b/Assets/Scripts/Meta/GachaService.cs @@ -274,7 +274,7 @@ namespace KernelPanic.Meta return currencyType switch { GachaCurrencyType.LimitedPull => "Compute Credits", - _ => "Commits" + _ => "Bandwidth" }; } diff --git a/Assets/Scripts/Run/RunManager.cs b/Assets/Scripts/Run/RunManager.cs index 74f5906..06c7d27 100644 --- a/Assets/Scripts/Run/RunManager.cs +++ b/Assets/Scripts/Run/RunManager.cs @@ -26,7 +26,11 @@ namespace KernelPanic.Run private int maxUptimeBonus; private int maxCyclesBonus; private int ramBonus; + private int wavesCleared; + private int accruedBandwidth; + private int accruedEntropy; private bool repositoryVisitActive; + private bool rewardsSettled; public int CurrentWaveNumber => currentWaveNumber; public bool IsRunActive => isRunActive; @@ -40,6 +44,10 @@ namespace KernelPanic.Run public int MaxUptimeBonus => maxUptimeBonus; public int MaxCyclesBonus => maxCyclesBonus; public int RamBonus => ramBonus; + public int WavesCleared => wavesCleared; + public int AccruedBandwidth => accruedBandwidth; + public int AccruedEntropy => accruedEntropy; + public bool RewardsSettled => rewardsSettled; public event Action RepositoryChanged; @@ -66,6 +74,10 @@ namespace KernelPanic.Run maxUptimeBonus = 0; maxCyclesBonus = 0; ramBonus = 0; + wavesCleared = 0; + accruedBandwidth = 0; + accruedEntropy = 0; + rewardsSettled = false; InitializeRunDeck(config); StartCombat(); } @@ -172,8 +184,25 @@ namespace KernelPanic.Run return Mathf.Max(1, (CurrentConfig?.Distro?.BaseCyclesPerTurn ?? 1) + maxCyclesBonus); } + public bool TrySettleRunRewards(out int bandwidth, out int entropy) + { + bandwidth = accruedBandwidth; + entropy = accruedEntropy; + if (rewardsSettled) + { + return false; + } + + rewardsSettled = true; + return bandwidth > 0 || entropy > 0; + } + private void HandleWaveCleared(WaveClearedEvent payload) { + int clearedWave = Mathf.Max(1, payload.WaveNumber); + wavesCleared = Mathf.Max(wavesCleared, clearedWave); + accruedBandwidth += CalculateBandwidthReward(clearedWave); + accruedEntropy += CalculateEntropyReward(clearedWave); currentWaveNumber = Mathf.Max(currentWaveNumber + 1, payload.WaveNumber + 1); repositoryOffers.Clear(); rerollsThisVisit = 0; @@ -196,6 +225,17 @@ namespace KernelPanic.Run RepositoryChanged?.Invoke(); } + private static int CalculateBandwidthReward(int waveNumber) + { + int safeWave = Mathf.Max(1, waveNumber); + return Mathf.Max(0, CombatTuning.BandwidthBase + ((safeWave - 1) * CombatTuning.BandwidthPerWaveStep)); + } + + private static int CalculateEntropyReward(int waveNumber) + { + return waveNumber >= CombatTuning.EntropyStartWave ? Mathf.Max(0, CombatTuning.EntropyPerWave) : 0; + } + private void InitializeRunDeck(RunConfig config) { runDeck.Clear(); diff --git a/Assets/Scripts/UI/CombatSceneController.cs b/Assets/Scripts/UI/CombatSceneController.cs index cac4fe6..2f8c961 100644 --- a/Assets/Scripts/UI/CombatSceneController.cs +++ b/Assets/Scripts/UI/CombatSceneController.cs @@ -37,7 +37,7 @@ namespace KernelPanic.UI private Label phaseLabel; private Label entropyLabel; private Label bitsLabel; - private Label commitsLabel; + private Label bandwidthLabel; private Label computeCreditsLabel; private Label seedLabel; private VisualElement playerPanel; @@ -97,6 +97,7 @@ namespace KernelPanic.UI private void OnDisable() { + SettleRunRewardsIfNeeded(); combatManager.StateChanged -= Refresh; combatManager.CombatLog -= HandleCombatLog; runManager.RepositoryChanged -= Refresh; @@ -253,7 +254,7 @@ namespace KernelPanic.UI phaseLabel = AddStatusReadout(bar, "phase", "--", true); bitsLabel = AddStatusReadout(bar, "bits", "0", false); entropyLabel = AddStatusReadout(bar, "entropy", "0", false); - commitsLabel = AddStatusReadout(bar, "commits", "0", false); + bandwidthLabel = AddStatusReadout(bar, "bandwidth", "0", false); computeCreditsLabel = AddStatusReadout(bar, "compute credits", "TODO", false); VisualElement spacer = new(); @@ -326,8 +327,8 @@ namespace KernelPanic.UI waveLabel.text = runManager.CurrentWaveNumber.ToString(); phaseLabel.text = PhaseText(combatManager.CurrentPhase); bitsLabel.text = runManager.Bits.ToString(); - entropyLabel.text = data.entropyBalance.ToString(); - commitsLabel.text = data.standardPullCurrency.ToString(); + entropyLabel.text = FormatWalletWithAccrual(data.entropyBalance, runManager.AccruedEntropy); + bandwidthLabel.text = FormatWalletWithAccrual(data.standardPullCurrency, runManager.AccruedBandwidth); computeCreditsLabel.text = "TODO"; seedLabel.text = $"seed {config?.RunSeed ?? 0}"; } @@ -423,11 +424,14 @@ namespace KernelPanic.UI overlay.Clear(); if (combatManager.RunLost) { + SettleRunRewardsIfNeeded(); overlay.style.display = DisplayStyle.Flex; overlay.Add(OverlayTitle("kernel panic")); overlay.Add(OverlayLine("fatal: player uptime reached 0")); - overlay.Add(OverlayLine($"wave {runManager.CurrentWaveNumber} seed {runManager.CurrentConfig?.RunSeed ?? 0}")); - overlay.Add(OverlayLine("TODO: entropy/commits payout on death.")); + overlay.Add(OverlayLine($"wave {runManager.CurrentWaveNumber} reached seed {runManager.CurrentConfig?.RunSeed ?? 0}")); + overlay.Add(OverlayLine($"waves cleared: {runManager.WavesCleared}")); + overlay.Add(OverlayLine($"+{runManager.AccruedBandwidth} bandwidth")); + overlay.Add(OverlayLine($"+{runManager.AccruedEntropy} entropy")); Button returnButton = new(SceneLoader.LoadMainMenu) { text = "> return to menu" }; returnButton.AddToClassList("primary-action"); overlay.Add(returnButton); @@ -450,6 +454,24 @@ namespace KernelPanic.UI overlay.style.display = DisplayStyle.None; } + private void SettleRunRewardsIfNeeded() + { + if (runManager == null || saveService == null) + { + return; + } + + if (!runManager.TrySettleRunRewards(out int bandwidth, out int entropy)) + { + return; + } + + SaveData data = saveService.Load(); + data.standardPullCurrency = Math.Max(0, data.standardPullCurrency) + bandwidth; + data.entropyBalance = Math.Max(0, data.entropyBalance) + entropy; + saveService.Save(data); + } + private VisualElement BuildRepositoryView() { VisualElement repo = new(); @@ -1009,6 +1031,11 @@ namespace KernelPanic.UI }; } + private static string FormatWalletWithAccrual(int walletAmount, int accruedAmount) + { + return accruedAmount > 0 ? $"{walletAmount} (+{accruedAmount})" : walletAmount.ToString(); + } + private static string TrackText(ResolutionTrack track) { return track switch diff --git a/Assets/Scripts/UI/GachaScreenController.cs b/Assets/Scripts/UI/GachaScreenController.cs index af1d05c..482459f 100644 --- a/Assets/Scripts/UI/GachaScreenController.cs +++ b/Assets/Scripts/UI/GachaScreenController.cs @@ -157,7 +157,7 @@ namespace KernelPanic.UI _bannerDetail.Add(BuildInfoLine("entropy", _wallet == null ? "--" : _wallet.Balance.ToString())); _bannerDetail.Add(BuildInfoLine("pulls", $"{state.totalPulls}/{GachaService.BeginnerMaxPulls}")); _bannerDetail.Add(BuildInfoLine("4-star pity", $"{state.pityCounter}/{GachaService.FourStarHardPity}")); - _bannerDetail.Add(BuildInfoLine("ten pull", $"{GachaService.BeginnerTenPullCost} Commits for 10 pulls")); + _bannerDetail.Add(BuildInfoLine("ten pull", $"{GachaService.BeginnerTenPullCost} Bandwidth for 10 pulls")); _bannerDetail.Add(BuildInfoLine("guarantees", FormatBeginnerGuarantees())); Label rules = new("Base result is a 3-star equipment cache. A 4-star equipment cache or starter distro can appear early, with one 4-star+ result guaranteed every 10 pulls."); @@ -317,7 +317,7 @@ namespace KernelPanic.UI prompt.AddToClassList("gacha-entropy-prompt"); int entropyCost = _pendingMissingTokens * GachaService.EntropyPerPullToken; - Label copy = new($"missing {_pendingMissingTokens} Commits. spend {entropyCost} entropy to complete git pull?"); + Label copy = new($"missing {_pendingMissingTokens} Bandwidth. spend {entropyCost} entropy to complete git pull?"); copy.AddToClassList("gacha-result"); prompt.Add(copy); diff --git a/Assets/Scripts/UI/MainMenuController.cs b/Assets/Scripts/UI/MainMenuController.cs index ed512d5..dd3f386 100644 --- a/Assets/Scripts/UI/MainMenuController.cs +++ b/Assets/Scripts/UI/MainMenuController.cs @@ -708,7 +708,7 @@ namespace KernelPanic.UI _rootCreditsToEntropyButton?.SetEnabled(true); bool showPullTokens = IsGachaVisible(); _pullTokensLabel.text = showPullTokens - ? $"commits={_gachaService.PullTokens} compute-credits={_gachaService.LimitedPullTokens}" + ? $"bandwidth={_gachaService.PullTokens} compute-credits={_gachaService.LimitedPullTokens}" : string.Empty; _pullTokensLabel.EnableInClassList(HiddenClassName, !showPullTokens); }