restructure packages (it looks shit)

This commit is contained in:
2026-07-09 10:28:07 +02:00
parent 844e81488c
commit d0722c6bf9
3 changed files with 135 additions and 181 deletions
+39 -17
View File
@@ -666,16 +666,25 @@ namespace KernelPanic.UI
SaveData saveData = _getSaveData?.Invoke();
int cache = Math.Max(0, saveData?.cacheBalance ?? 0);
int bandwidth = Math.Max(0, saveData?.bandwidthBalance ?? 0);
target.Add(BuildDetailLine("wallet", $"Cache={cache} Bandwidth={bandwidth}"));
AddPackageSlotSummaryRow(target, unit, PackageSlot.Kernel);
AddPackageSlotSummaryRow(target, unit, PackageSlot.Runtime);
AddPackageSlotSummaryRow(target, unit, PackageSlot.Daemon);
_packagePickerSlot ??= PackageSlot.Kernel;
if (_packagePickerSlot.HasValue)
{
AddSelectedPackageSlotActions(target, unit, _packagePickerSlot.Value, cache, bandwidth);
AddPackagePicker(target, unit, _packagePickerSlot.Value);
}
VisualElement layout = new();
layout.AddToClassList("packages-master-detail");
VisualElement slots = new();
slots.AddToClassList("packages-slot-list");
slots.Add(BuildDetailLine("wallet", $"Cache={cache} Bandwidth={bandwidth}"));
AddPackageSlotSummaryRow(slots, unit, PackageSlot.Kernel);
AddPackageSlotSummaryRow(slots, unit, PackageSlot.Runtime);
AddPackageSlotSummaryRow(slots, unit, PackageSlot.Daemon);
layout.Add(slots);
VisualElement detail = new();
detail.AddToClassList("packages-detail-panel");
AddSelectedPackageSlotActions(detail, unit, _packagePickerSlot.Value, cache, bandwidth);
AddPackagePicker(detail, unit, _packagePickerSlot.Value);
layout.Add(detail);
target.Add(layout);
}
private void AddPackageSlotSummaryRow(VisualElement target, DistroDefinition unit, PackageSlot slot)
@@ -684,6 +693,7 @@ namespace KernelPanic.UI
OwnedPackageInstance owned = equipped == null ? null : _playerCollection.GetOwnedPackage(equipped.Id);
VisualElement row = new();
row.AddToClassList("package-slot-row");
row.EnableInClassList("selected", _packagePickerSlot == slot);
row.RegisterCallback<ClickEvent>(_ =>
{
_packagePickerSlot = slot;
@@ -733,12 +743,13 @@ namespace KernelPanic.UI
if (owned == null || equipped == null)
{
target.Add(BuildDetailLine("equipped", "empty"));
target.Add(BuildDetailLine("status", "empty slot"));
target.Add(BuildDetailLine("equip", "select an owned package below"));
return;
}
target.Add(BuildDetailLine("equipped", $"{PackageName(equipped)} Lv {owned.UpgradeLevel}/{PackageTuning.MaxPackageLevel}"));
target.Add(BuildDetailLine("effect", FormatPackageEffect(equipped, owned.UpgradeLevel, unit.Id)));
target.Add(BuildDetailLine("level", $"Lv {owned.UpgradeLevel}/{PackageTuning.MaxPackageLevel}"));
target.Add(BuildDetailLine("current", FormatPackageEffect(equipped, owned.UpgradeLevel, unit.Id)));
int nextLevel = owned.UpgradeLevel + 1;
bool maxLevel = owned.UpgradeLevel >= PackageTuning.MaxPackageLevel;
@@ -746,6 +757,10 @@ namespace KernelPanic.UI
int bandwidthCost = maxLevel ? 0 : PackageTuning.GetUpgradeBandwidthCost(nextLevel, equipped.Rarity);
bool canUpgrade = !maxLevel && cache >= cacheCost && bandwidth >= bandwidthCost && _tryUpgradePackage != null;
string upgradeState = maxLevel ? "max level" : cache < cacheCost ? "insufficient cache" : bandwidth < bandwidthCost ? "insufficient bandwidth" : "ready";
string nextPreview = maxLevel
? "max level reached"
: $"{FormatPackageEffect(equipped, owned.UpgradeLevel, unit.Id)} -> {FormatPackageEffect(equipped, nextLevel, unit.Id)}";
target.Add(BuildDetailLine("next", nextPreview));
target.Add(BuildCompactUpgradeCommand($"> make upgrade (Cache {cacheCost} / Bandwidth {bandwidthCost})", upgradeState, canUpgrade, () => UpgradePackage(owned)));
}
@@ -1425,10 +1440,13 @@ namespace KernelPanic.UI
return "--";
}
PackageEffectData effect = PackageEffectScaling.Scale(package.EffectFor(distroId), upgradeLevel);
return string.IsNullOrWhiteSpace(package.Description)
? $"{effect.Kind} +{Math.Max(0, effect.Amount)}"
: $"{package.Description} current: {effect.Kind} +{Math.Max(0, effect.Amount)}";
string summary = FormatEffectSummary(package.EffectFor(distroId), upgradeLevel);
if (!string.IsNullOrWhiteSpace(summary))
{
return summary;
}
return string.IsNullOrWhiteSpace(package.Description) ? "--" : package.Description;
}
private static string OneLineEffect(PackageDefinition package, int upgradeLevel, string distroId)
@@ -1468,8 +1486,10 @@ namespace KernelPanic.UI
PackageEffectKind.FirstTurnFirstWaveDraw => $"draw {amount} on first turn",
PackageEffectKind.WaveDraw => $"draw {amount} at wave start",
PackageEffectKind.FirstTurnEachWaveCycle => $"+{amount} Cycle on first turn",
PackageEffectKind.WaveGenerateBasicCard => $"generate {amount} basic card(s) at wave start",
PackageEffectKind.FirstCardEachWaveCostReduction => $"first card each wave costs {amount} less",
PackageEffectKind.FirstCardsEachTurnCostReduction => $"first card each turn costs {amount} less",
PackageEffectKind.ThirdCardEachTurnGenerate => $"third card each turn generates {amount} card(s)",
PackageEffectKind.FirstNativeCardEachWaveFlatDamage => $"first Native card +{amount} damage",
PackageEffectKind.ExhaustShield => $"+{amount} Shield when exhausting",
PackageEffectKind.EveryNthTurnShield => $"+{amount} Shield every {effect.Threshold} turns",
@@ -1480,7 +1500,9 @@ namespace KernelPanic.UI
PackageEffectKind.EveryNthCardEachWaveCycle => $"+{amount} Cycle every {effect.Threshold} cards",
PackageEffectKind.StartTurnNoDebuffShield => $"+{amount} Shield if no debuffs",
PackageEffectKind.JavaScriptFlatDamage => $"+{amount} JavaScript damage",
_ => $"{effect.Kind} +{amount}"
PackageEffectKind.WaveThresholdRestore => $"restore {amount} Uptime after wave {effect.Threshold}",
PackageEffectKind.DnfFedoraPassive => "Fedora passive can trigger twice",
_ => amount > 0 ? $"+{amount} package effect" : "package effect"
};
}
+40 -8
View File
@@ -1166,6 +1166,33 @@ Button {
border-top-color: var(--kp-border);
}
.packages-master-detail {
flex-grow: 1;
min-height: 0;
flex-direction: row;
}
.packages-slot-list {
width: 46%;
min-width: 0;
margin-right: 14px;
}
.packages-detail-panel {
flex-grow: 1;
min-width: 0;
padding: 10px;
border-left-width: 1px;
border-right-width: 1px;
border-top-width: 1px;
border-bottom-width: 1px;
border-left-color: var(--kp-border);
border-right-color: var(--kp-border);
border-top-color: var(--kp-border);
border-bottom-color: var(--kp-border);
background-color: var(--kp-bg-solid);
}
.package-slot-row {
min-height: 42px;
flex-direction: row;
@@ -1184,16 +1211,21 @@ Button {
background-color: var(--kp-hover);
}
.package-slot-row.selected {
border-left-color: var(--kp-primary);
background-color: var(--kp-hover);
}
.package-slot-label {
width: 92px;
min-width: 92px;
width: 76px;
min-width: 76px;
color: var(--kp-muted);
font-size: 12px;
}
.package-slot-name {
width: 190px;
min-width: 150px;
width: 128px;
min-width: 95px;
color: var(--kp-primary);
white-space: nowrap;
overflow: hidden;
@@ -1201,14 +1233,14 @@ Button {
}
.package-slot-rarity {
width: 52px;
min-width: 52px;
width: 40px;
min-width: 40px;
-unity-text-align: middle-center;
}
.package-slot-level {
width: 70px;
min-width: 70px;
width: 58px;
min-width: 58px;
color: var(--kp-amber);
font-size: 12px;
-unity-text-align: middle-center;