implement scaling rewards per wave completed in combat mode
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -274,7 +274,7 @@ namespace KernelPanic.Meta
|
||||
return currencyType switch
|
||||
{
|
||||
GachaCurrencyType.LimitedPull => "Compute Credits",
|
||||
_ => "Commits"
|
||||
_ => "Bandwidth"
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user