implement scaling rewards per wave completed in combat mode

This commit is contained in:
2026-07-07 12:56:02 +02:00
parent 28486bff8c
commit 30db1e1108
7 changed files with 155 additions and 67 deletions
+33 -6
View File
@@ -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
+2 -2
View File
@@ -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);
+1 -1
View File
@@ -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);
}