Implement many UX improvements, packages and their assets and a UI overhaul in collection

This commit is contained in:
2026-07-09 10:18:24 +02:00
parent 61030d84b7
commit 844e81488c
111 changed files with 4480 additions and 258 deletions
+34 -2
View File
@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using KernelPanic.Core;
using KernelPanic.Data;
@@ -10,21 +11,32 @@ namespace KernelPanic.Run
public sealed class RunConfig
{
public RunConfig(DistroDefinition distro, Language primaryLanguage, Language secondaryLanguage, IReadOnlyList<CardDefinition> startingDeck)
: this(distro, primaryLanguage, secondaryLanguage, startingDeck, 0, 1)
: this(distro, primaryLanguage, secondaryLanguage, startingDeck, Array.Empty<PackageDefinition>(), 0, 1)
{
}
public RunConfig(DistroDefinition distro, Language primaryLanguage, Language secondaryLanguage, IReadOnlyList<CardDefinition> startingDeck, int runSeed)
: this(distro, primaryLanguage, secondaryLanguage, startingDeck, runSeed, 1)
: this(distro, primaryLanguage, secondaryLanguage, startingDeck, Array.Empty<PackageDefinition>(), runSeed, 1)
{
}
public RunConfig(DistroDefinition distro, Language primaryLanguage, Language secondaryLanguage, IReadOnlyList<CardDefinition> startingDeck, int runSeed, int distroVersion)
: this(distro, primaryLanguage, secondaryLanguage, startingDeck, Array.Empty<PackageDefinition>(), runSeed, distroVersion)
{
}
public RunConfig(DistroDefinition distro, Language primaryLanguage, Language secondaryLanguage, IReadOnlyList<CardDefinition> startingDeck, IReadOnlyList<PackageDefinition> equippedPackages, int runSeed, int distroVersion)
: this(distro, primaryLanguage, secondaryLanguage, startingDeck, ToInstances(equippedPackages), runSeed, distroVersion)
{
}
public RunConfig(DistroDefinition distro, Language primaryLanguage, Language secondaryLanguage, IReadOnlyList<CardDefinition> startingDeck, IReadOnlyList<PackageInstance> equippedPackages, int runSeed, int distroVersion)
{
Distro = distro;
PrimaryLanguage = primaryLanguage;
SecondaryLanguage = secondaryLanguage;
StartingDeck = startingDeck;
EquippedPackages = equippedPackages ?? Array.Empty<PackageInstance>();
RunSeed = runSeed;
DistroVersion = UnityEngine.Mathf.Clamp(distroVersion, 1, KernelPanic.Meta.GachaTuning.MaxVersion);
}
@@ -33,7 +45,27 @@ namespace KernelPanic.Run
public Language PrimaryLanguage { get; }
public Language SecondaryLanguage { get; }
public IReadOnlyList<CardDefinition> StartingDeck { get; }
public IReadOnlyList<PackageInstance> EquippedPackages { get; }
public int RunSeed { get; }
public int DistroVersion { get; }
private static IReadOnlyList<PackageInstance> ToInstances(IReadOnlyList<PackageDefinition> packages)
{
if (packages == null)
{
return Array.Empty<PackageInstance>();
}
List<PackageInstance> instances = new();
for (int i = 0; i < packages.Count; i++)
{
if (packages[i] != null)
{
instances.Add(new PackageInstance(packages[i], 0));
}
}
return instances;
}
}
}
+47 -4
View File
@@ -18,12 +18,22 @@ namespace KernelPanic.Run
public static void Set(DistroDefinition distro, IReadOnlyList<CardDefinition> equippedCards, Language primaryLanguage, Language secondaryLanguage)
{
Set(distro, equippedCards, primaryLanguage, secondaryLanguage, 1);
Set(distro, equippedCards, Array.Empty<PackageDefinition>(), primaryLanguage, secondaryLanguage, 1);
}
public static void Set(DistroDefinition distro, IReadOnlyList<CardDefinition> equippedCards, Language primaryLanguage, Language secondaryLanguage, int distroVersion)
{
pendingRun = new PendingRun(distro, equippedCards, primaryLanguage, secondaryLanguage, Environment.TickCount, distroVersion);
Set(distro, equippedCards, Array.Empty<PackageDefinition>(), primaryLanguage, secondaryLanguage, distroVersion);
}
public static void Set(DistroDefinition distro, IReadOnlyList<CardDefinition> equippedCards, IReadOnlyList<PackageDefinition> equippedPackages, Language primaryLanguage, Language secondaryLanguage, int distroVersion)
{
pendingRun = new PendingRun(distro, equippedCards, ToInstances(equippedPackages), primaryLanguage, secondaryLanguage, Environment.TickCount, distroVersion);
}
public static void Set(DistroDefinition distro, IReadOnlyList<CardDefinition> equippedCards, IReadOnlyList<PackageInstance> equippedPackages, Language primaryLanguage, Language secondaryLanguage, int distroVersion)
{
pendingRun = new PendingRun(distro, equippedCards, equippedPackages, primaryLanguage, secondaryLanguage, Environment.TickCount, distroVersion);
}
public static bool TryCreateRunConfig(LanguageDeckDatabase languageDeckDatabase, out RunConfig config)
@@ -43,12 +53,13 @@ namespace KernelPanic.Run
{
private readonly DistroDefinition distro;
private readonly List<CardDefinition> equippedCards = new();
private readonly List<PackageInstance> equippedPackages = new();
private readonly Language primaryLanguage;
private readonly Language secondaryLanguage;
private readonly int runSeed;
private readonly int distroVersion;
public PendingRun(DistroDefinition distro, IReadOnlyList<CardDefinition> cards, Language primaryLanguage, Language secondaryLanguage, int runSeed, int distroVersion)
public PendingRun(DistroDefinition distro, IReadOnlyList<CardDefinition> cards, IReadOnlyList<PackageInstance> packages, Language primaryLanguage, Language secondaryLanguage, int runSeed, int distroVersion)
{
this.distro = distro;
this.primaryLanguage = primaryLanguage;
@@ -68,6 +79,19 @@ namespace KernelPanic.Run
equippedCards.Add(cards[i]);
}
}
if (packages == null)
{
return;
}
for (int i = 0; i < packages.Count; i++)
{
if (packages[i]?.Definition != null)
{
equippedPackages.Add(packages[i]);
}
}
}
public DistroDefinition Distro => distro;
@@ -77,7 +101,7 @@ namespace KernelPanic.Run
List<CardDefinition> startingDeck = new(equippedCards);
AddLanguageDeck(languageDeckDatabase, primaryLanguage, startingDeck);
AddLanguageDeck(languageDeckDatabase, secondaryLanguage, startingDeck);
return new RunConfig(distro, primaryLanguage, secondaryLanguage, startingDeck, runSeed, distroVersion);
return new RunConfig(distro, primaryLanguage, secondaryLanguage, startingDeck, equippedPackages, runSeed, distroVersion);
}
private static void AddLanguageDeck(LanguageDeckDatabase languageDeckDatabase, Language language, List<CardDefinition> target)
@@ -101,5 +125,24 @@ namespace KernelPanic.Run
}
}
}
private static IReadOnlyList<PackageInstance> ToInstances(IReadOnlyList<PackageDefinition> packages)
{
if (packages == null)
{
return Array.Empty<PackageInstance>();
}
List<PackageInstance> instances = new();
for (int i = 0; i < packages.Count; i++)
{
if (packages[i] != null)
{
instances.Add(new PackageInstance(packages[i], 0));
}
}
return instances;
}
}
}
+41 -3
View File
@@ -26,6 +26,9 @@ namespace KernelPanic.Run
private int maxUptimeBonus;
private int maxCyclesBonus;
private int ramBonus;
private int packageMaxUptimeBonus;
private int packageMaxCyclesBonus;
private int packageRamBonus;
private int wavesCleared;
private int accruedBandwidth;
private int accruedEntropy;
@@ -74,10 +77,14 @@ namespace KernelPanic.Run
maxUptimeBonus = 0;
maxCyclesBonus = 0;
ramBonus = 0;
packageMaxUptimeBonus = 0;
packageMaxCyclesBonus = 0;
packageRamBonus = 0;
wavesCleared = 0;
accruedBandwidth = 0;
accruedEntropy = 0;
rewardsSettled = false;
ApplyKernelPackageBonuses(config);
InitializeRunDeck(config);
StartCombat();
}
@@ -171,17 +178,48 @@ namespace KernelPanic.Run
public int EffectiveMaxUptime()
{
return Mathf.Max(1, (CurrentConfig?.Distro?.BaseUptime ?? 1) + maxUptimeBonus);
return Mathf.Max(1, (CurrentConfig?.Distro?.BaseUptime ?? 1) + maxUptimeBonus + packageMaxUptimeBonus);
}
public int EffectiveRam()
{
return Mathf.Max(1, (CurrentConfig?.Distro?.BaseRam ?? 1) + ramBonus);
return Mathf.Max(1, (CurrentConfig?.Distro?.BaseRam ?? 1) + ramBonus + packageRamBonus);
}
public int EffectiveMaxCycles()
{
return Mathf.Max(1, (CurrentConfig?.Distro?.BaseCyclesPerTurn ?? 1) + maxCyclesBonus);
return Mathf.Max(1, (CurrentConfig?.Distro?.BaseCyclesPerTurn ?? 1) + maxCyclesBonus + packageMaxCyclesBonus);
}
private void ApplyKernelPackageBonuses(RunConfig config)
{
if (config?.EquippedPackages == null)
{
return;
}
for (int i = 0; i < config.EquippedPackages.Count; i++)
{
PackageInstance package = config.EquippedPackages[i];
if (package?.Definition == null || package.Definition.Slot != PackageSlot.Kernel)
{
continue;
}
PackageEffectData effect = package.EffectFor(config.Distro?.Id);
switch (effect.Kind)
{
case PackageEffectKind.MaxUptime:
packageMaxUptimeBonus += Mathf.Max(0, effect.Amount);
break;
case PackageEffectKind.MaxCycles:
packageMaxCyclesBonus += Mathf.Max(0, effect.Amount);
break;
case PackageEffectKind.MaxRam:
packageRamBonus += Mathf.Max(0, effect.Amount);
break;
}
}
}
public bool TrySettleRunRewards(out int bandwidth, out int entropy)