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 @@
-
-
-
+
+
+
+
+
+
+
@@ -21,7 +25,7 @@
-
+
@@ -45,12 +49,15 @@
}
}
+
+
+
{}
{
@@ -63,61 +70,61 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{
@@ -206,6 +213,7 @@
+
@@ -319,7 +327,15 @@
1783373303668
-
+
+
+ 1783417593908
+
+
+
+ 1783417593908
+
+
@@ -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);
}