diff --git a/Assets/Art.meta b/Assets/Art.meta
new file mode 100644
index 0000000..68e0e03
--- /dev/null
+++ b/Assets/Art.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7b840cced864976439f43974b1e498d3
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Art/.gitkeep b/Assets/Art/.gitkeep
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/Assets/Art/.gitkeep
@@ -0,0 +1 @@
+
diff --git a/Assets/Data.meta b/Assets/Data.meta
new file mode 100644
index 0000000..3ef0d3d
--- /dev/null
+++ b/Assets/Data.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7ec233d275778bf44b6acde2fd9a0cc2
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Data/.gitkeep b/Assets/Data/.gitkeep
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/Assets/Data/.gitkeep
@@ -0,0 +1 @@
+
diff --git a/Assets/Prefabs.meta b/Assets/Prefabs.meta
new file mode 100644
index 0000000..44ef5d3
--- /dev/null
+++ b/Assets/Prefabs.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e9c67aa99a5854f4f9d58ccc64ed036c
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Prefabs/.gitkeep b/Assets/Prefabs/.gitkeep
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/Assets/Prefabs/.gitkeep
@@ -0,0 +1 @@
+
diff --git a/Assets/Scripts.meta b/Assets/Scripts.meta
new file mode 100644
index 0000000..a5599af
--- /dev/null
+++ b/Assets/Scripts.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: c51fb03ac0aab7a4aa1e2b0a87f051a9
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Combat.meta b/Assets/Scripts/Combat.meta
new file mode 100644
index 0000000..2ffcdf2
--- /dev/null
+++ b/Assets/Scripts/Combat.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 59b9870361cbdec4b9419c57a3ff71df
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Combat/CardInstance.cs b/Assets/Scripts/Combat/CardInstance.cs
new file mode 100644
index 0000000..60c7857
--- /dev/null
+++ b/Assets/Scripts/Combat/CardInstance.cs
@@ -0,0 +1,20 @@
+using KernelPanic.Data;
+
+namespace KernelPanic.Combat
+{
+ ///
+ /// Represents one runtime card and its per-combat mutable state.
+ ///
+ public sealed class CardInstance
+ {
+ public CardInstance(CardDefinition definition)
+ {
+ Definition = definition;
+ }
+
+ public CardDefinition Definition { get; }
+ public int TemporaryCostDelta { get; set; }
+ public bool IsBroken { get; set; }
+ public bool IsLocked { get; set; }
+ }
+}
diff --git a/Assets/Scripts/Combat/CardInstance.cs.meta b/Assets/Scripts/Combat/CardInstance.cs.meta
new file mode 100644
index 0000000..5d67f10
--- /dev/null
+++ b/Assets/Scripts/Combat/CardInstance.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: c05e61a09404ee046a6771f8ac75803c
\ No newline at end of file
diff --git a/Assets/Scripts/Combat/CombatContext.cs b/Assets/Scripts/Combat/CombatContext.cs
new file mode 100644
index 0000000..5b09b79
--- /dev/null
+++ b/Assets/Scripts/Combat/CombatContext.cs
@@ -0,0 +1,21 @@
+using System.Collections.Generic;
+
+namespace KernelPanic.Combat
+{
+ ///
+ /// Carries runtime combat references needed by card effects during resolution.
+ ///
+ public sealed class CombatContext
+ {
+ public CombatContext(CombatantState source, IReadOnlyList targets, CombatManager combatManager)
+ {
+ Source = source;
+ Targets = targets;
+ CombatManager = combatManager;
+ }
+
+ public CombatantState Source { get; }
+ public IReadOnlyList Targets { get; }
+ public CombatManager CombatManager { get; }
+ }
+}
diff --git a/Assets/Scripts/Combat/CombatContext.cs.meta b/Assets/Scripts/Combat/CombatContext.cs.meta
new file mode 100644
index 0000000..089a01f
--- /dev/null
+++ b/Assets/Scripts/Combat/CombatContext.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 2eed81ad20b42a447858691a49666804
\ No newline at end of file
diff --git a/Assets/Scripts/Combat/CombatManager.cs b/Assets/Scripts/Combat/CombatManager.cs
new file mode 100644
index 0000000..0ffd48a
--- /dev/null
+++ b/Assets/Scripts/Combat/CombatManager.cs
@@ -0,0 +1,56 @@
+using KernelPanic.Core;
+using UnityEngine;
+
+namespace KernelPanic.Combat
+{
+ ///
+ /// Owns the combat turn phase state machine and coordinates combat lifecycle transitions.
+ ///
+ public sealed class CombatManager : MonoBehaviour
+ {
+ [SerializeField] private TurnPhase currentPhase = TurnPhase.Boot;
+
+ public TurnPhase CurrentPhase => currentPhase;
+
+ public void StartCombat()
+ {
+ SetPhase(TurnPhase.Boot);
+ }
+
+ public void AdvancePhase()
+ {
+ TurnPhase nextPhase = GetNextPhase(currentPhase);
+ SetPhase(nextPhase);
+ }
+
+ public void EndPlayerTurn()
+ {
+ SetPhase(TurnPhase.Interpret);
+ }
+
+ private void SetPhase(TurnPhase nextPhase)
+ {
+ TurnPhase previousPhase = currentPhase;
+ currentPhase = nextPhase;
+ GameEvents.RaisePhaseChanged(new PhaseChangedEvent(previousPhase, nextPhase));
+ EnterPhase(nextPhase);
+ }
+
+ private static TurnPhase GetNextPhase(TurnPhase phase)
+ {
+ return phase switch
+ {
+ TurnPhase.Boot => TurnPhase.Allocate,
+ TurnPhase.Allocate => TurnPhase.Execute,
+ TurnPhase.Execute => TurnPhase.Interpret,
+ TurnPhase.Interpret => TurnPhase.EnemyProcess,
+ TurnPhase.EnemyProcess => TurnPhase.GarbageCollection,
+ _ => TurnPhase.Allocate
+ };
+ }
+
+ private void EnterPhase(TurnPhase phase)
+ {
+ }
+ }
+}
diff --git a/Assets/Scripts/Combat/CombatManager.cs.meta b/Assets/Scripts/Combat/CombatManager.cs.meta
new file mode 100644
index 0000000..65792ef
--- /dev/null
+++ b/Assets/Scripts/Combat/CombatManager.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 9f87432412de1ee46bf7d4c9c530d4c6
\ No newline at end of file
diff --git a/Assets/Scripts/Combat/CombatantState.cs b/Assets/Scripts/Combat/CombatantState.cs
new file mode 100644
index 0000000..0da3b16
--- /dev/null
+++ b/Assets/Scripts/Combat/CombatantState.cs
@@ -0,0 +1,28 @@
+using System.Collections.Generic;
+using KernelPanic.Core;
+
+namespace KernelPanic.Combat
+{
+ ///
+ /// Stores mutable combat stats and statuses for a player or enemy.
+ ///
+ public sealed class CombatantState
+ {
+ private readonly Dictionary activeStatuses = new();
+
+ public CombatantState(int maxUptime, int ram, int cycles)
+ {
+ MaxUptime = maxUptime;
+ CurrentUptime = maxUptime;
+ Ram = ram;
+ Cycles = cycles;
+ }
+
+ public int CurrentUptime { get; set; }
+ public int MaxUptime { get; set; }
+ public int Shield { get; set; }
+ public int Ram { get; set; }
+ public int Cycles { get; set; }
+ public IReadOnlyDictionary ActiveStatuses => activeStatuses;
+ }
+}
diff --git a/Assets/Scripts/Combat/CombatantState.cs.meta b/Assets/Scripts/Combat/CombatantState.cs.meta
new file mode 100644
index 0000000..6ce8109
--- /dev/null
+++ b/Assets/Scripts/Combat/CombatantState.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 93b1080022652b542903e204d36a64f8
\ No newline at end of file
diff --git a/Assets/Scripts/Combat/DeckController.cs b/Assets/Scripts/Combat/DeckController.cs
new file mode 100644
index 0000000..b64e029
--- /dev/null
+++ b/Assets/Scripts/Combat/DeckController.cs
@@ -0,0 +1,49 @@
+using System;
+using System.Collections.Generic;
+
+namespace KernelPanic.Combat
+{
+ ///
+ /// Manages draw, discard, and exhaust piles for a combat deck.
+ ///
+ public sealed class DeckController
+ {
+ private readonly List drawPile = new();
+ private readonly List discardPile = new();
+ private readonly List exhaustPile = new();
+
+ public IReadOnlyList DrawPile => drawPile;
+ public IReadOnlyList DiscardPile => discardPile;
+ public IReadOnlyList ExhaustPile => exhaustPile;
+
+ public void Initialize(IEnumerable cards)
+ {
+ throw new NotImplementedException();
+ }
+
+ public IReadOnlyList Draw(int count)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void Discard(CardInstance card)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void Exhaust(CardInstance card)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void ShuffleDrawPile()
+ {
+ throw new NotImplementedException();
+ }
+
+ public void ReshuffleDiscardIntoDraw()
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Assets/Scripts/Combat/DeckController.cs.meta b/Assets/Scripts/Combat/DeckController.cs.meta
new file mode 100644
index 0000000..c2f9ee8
--- /dev/null
+++ b/Assets/Scripts/Combat/DeckController.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 6683933e853af334ba19e658b13c878d
\ No newline at end of file
diff --git a/Assets/Scripts/Combat/HandController.cs b/Assets/Scripts/Combat/HandController.cs
new file mode 100644
index 0000000..e299a7d
--- /dev/null
+++ b/Assets/Scripts/Combat/HandController.cs
@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+
+namespace KernelPanic.Combat
+{
+ ///
+ /// Manages cards currently held in hand with a RAM-based capacity.
+ ///
+ public sealed class HandController
+ {
+ private readonly List cards = new();
+
+ public HandController(int ramCapacity)
+ {
+ RamCapacity = ramCapacity;
+ }
+
+ public int RamCapacity { get; private set; }
+ public IReadOnlyList Cards => cards;
+
+ public bool CanAdd(CardInstance card)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void Add(CardInstance card)
+ {
+ throw new NotImplementedException();
+ }
+
+ public bool Remove(CardInstance card)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void Clear()
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Assets/Scripts/Combat/HandController.cs.meta b/Assets/Scripts/Combat/HandController.cs.meta
new file mode 100644
index 0000000..bae4241
--- /dev/null
+++ b/Assets/Scripts/Combat/HandController.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: bece1c6fddc2c63489bf129bf6295a31
\ No newline at end of file
diff --git a/Assets/Scripts/Combat/ICardEffect.cs b/Assets/Scripts/Combat/ICardEffect.cs
new file mode 100644
index 0000000..dba76d3
--- /dev/null
+++ b/Assets/Scripts/Combat/ICardEffect.cs
@@ -0,0 +1,10 @@
+namespace KernelPanic.Combat
+{
+ ///
+ /// Represents a runtime card effect that can apply itself to a combat context.
+ ///
+ public interface ICardEffect
+ {
+ void Execute(CombatContext context);
+ }
+}
diff --git a/Assets/Scripts/Combat/ICardEffect.cs.meta b/Assets/Scripts/Combat/ICardEffect.cs.meta
new file mode 100644
index 0000000..743b679
--- /dev/null
+++ b/Assets/Scripts/Combat/ICardEffect.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 886be8d59396e5e488eea3ea58445fb4
\ No newline at end of file
diff --git a/Assets/Scripts/Combat/IResolutionTrack.cs b/Assets/Scripts/Combat/IResolutionTrack.cs
new file mode 100644
index 0000000..b88d81a
--- /dev/null
+++ b/Assets/Scripts/Combat/IResolutionTrack.cs
@@ -0,0 +1,11 @@
+namespace KernelPanic.Combat
+{
+ ///
+ /// Provides a common contract for card resolution tracks.
+ ///
+ public interface IResolutionTrack
+ {
+ void Enqueue(CardInstance card);
+ void Resolve(CombatContext context);
+ }
+}
diff --git a/Assets/Scripts/Combat/IResolutionTrack.cs.meta b/Assets/Scripts/Combat/IResolutionTrack.cs.meta
new file mode 100644
index 0000000..401a2f9
--- /dev/null
+++ b/Assets/Scripts/Combat/IResolutionTrack.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 5d296d1160df6d747adaeec9ef68c710
\ No newline at end of file
diff --git a/Assets/Scripts/Combat/InterpreterQueue.cs b/Assets/Scripts/Combat/InterpreterQueue.cs
new file mode 100644
index 0000000..3cf2d60
--- /dev/null
+++ b/Assets/Scripts/Combat/InterpreterQueue.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+
+namespace KernelPanic.Combat
+{
+ ///
+ /// Stores played cards in FIFO order for resolution during the Interpret phase.
+ ///
+ public sealed class InterpreterQueue : IResolutionTrack
+ {
+ private readonly Queue queuedCards = new();
+
+ public int Count => queuedCards.Count;
+
+ public void Enqueue(CardInstance card)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void Resolve(CombatContext context)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void Clear()
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Assets/Scripts/Combat/InterpreterQueue.cs.meta b/Assets/Scripts/Combat/InterpreterQueue.cs.meta
new file mode 100644
index 0000000..20fff14
--- /dev/null
+++ b/Assets/Scripts/Combat/InterpreterQueue.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 13c99cf765e7e8b48a58afbacc8a5440
\ No newline at end of file
diff --git a/Assets/Scripts/Combat/LazyStack.cs b/Assets/Scripts/Combat/LazyStack.cs
new file mode 100644
index 0000000..a99a5e6
--- /dev/null
+++ b/Assets/Scripts/Combat/LazyStack.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+
+namespace KernelPanic.Combat
+{
+ ///
+ /// Stores played cards in LIFO order until explicitly force-evaluated.
+ ///
+ public sealed class LazyStack : IResolutionTrack
+ {
+ private readonly Stack stackedCards = new();
+
+ public int Count => stackedCards.Count;
+
+ public void Enqueue(CardInstance card)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void Resolve(CombatContext context)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void ForceEvaluate(CombatContext context)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Assets/Scripts/Combat/LazyStack.cs.meta b/Assets/Scripts/Combat/LazyStack.cs.meta
new file mode 100644
index 0000000..a7e65da
--- /dev/null
+++ b/Assets/Scripts/Combat/LazyStack.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 556859e6fac10a24bb4a60165fd82157
\ No newline at end of file
diff --git a/Assets/Scripts/Combat/NativeTrack.cs b/Assets/Scripts/Combat/NativeTrack.cs
new file mode 100644
index 0000000..a3ed407
--- /dev/null
+++ b/Assets/Scripts/Combat/NativeTrack.cs
@@ -0,0 +1,20 @@
+using System;
+
+namespace KernelPanic.Combat
+{
+ ///
+ /// Resolves cards immediately when they are added to the native track.
+ ///
+ public sealed class NativeTrack : IResolutionTrack
+ {
+ public void Enqueue(CardInstance card)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void Resolve(CombatContext context)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Assets/Scripts/Combat/NativeTrack.cs.meta b/Assets/Scripts/Combat/NativeTrack.cs.meta
new file mode 100644
index 0000000..d15e847
--- /dev/null
+++ b/Assets/Scripts/Combat/NativeTrack.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: b662e4e1a38b1554084a063fd3d415e2
\ No newline at end of file
diff --git a/Assets/Scripts/Combat/StatusEffectController.cs b/Assets/Scripts/Combat/StatusEffectController.cs
new file mode 100644
index 0000000..b0290ee
--- /dev/null
+++ b/Assets/Scripts/Combat/StatusEffectController.cs
@@ -0,0 +1,26 @@
+using System;
+using KernelPanic.Core;
+
+namespace KernelPanic.Combat
+{
+ ///
+ /// Applies, ticks, and expires status effects on a combatant.
+ ///
+ public sealed class StatusEffectController
+ {
+ public void Apply(CombatantState target, StatusType statusType, int stacks)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void Tick(CombatantState target)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void Expire(CombatantState target, StatusType statusType)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Assets/Scripts/Combat/StatusEffectController.cs.meta b/Assets/Scripts/Combat/StatusEffectController.cs.meta
new file mode 100644
index 0000000..55dcde8
--- /dev/null
+++ b/Assets/Scripts/Combat/StatusEffectController.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 5f91b8d9171889f4996bb3106d97f1f6
\ No newline at end of file
diff --git a/Assets/Scripts/Core.meta b/Assets/Scripts/Core.meta
new file mode 100644
index 0000000..ac449c1
--- /dev/null
+++ b/Assets/Scripts/Core.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: d51c41fa71b1068438855f64f946cc57
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Core/GameEvents.cs b/Assets/Scripts/Core/GameEvents.cs
new file mode 100644
index 0000000..66050b5
--- /dev/null
+++ b/Assets/Scripts/Core/GameEvents.cs
@@ -0,0 +1,140 @@
+using System;
+using KernelPanic.Combat;
+
+namespace KernelPanic.Core
+{
+ ///
+ /// Provides runtime events for gameplay systems that need to observe combat and run milestones.
+ ///
+ public static class GameEvents
+ {
+ public static event Action CardPlayed;
+ public static event Action CardResolved;
+ public static event Action PhaseChanged;
+ public static event Action DamageDealt;
+ public static event Action WaveCleared;
+ public static event Action RunEnded;
+
+ public static void RaiseCardPlayed(CardPlayedEvent payload)
+ {
+ CardPlayed?.Invoke(payload);
+ }
+
+ public static void RaiseCardResolved(CardResolvedEvent payload)
+ {
+ CardResolved?.Invoke(payload);
+ }
+
+ public static void RaisePhaseChanged(PhaseChangedEvent payload)
+ {
+ PhaseChanged?.Invoke(payload);
+ }
+
+ public static void RaiseDamageDealt(DamageDealtEvent payload)
+ {
+ DamageDealt?.Invoke(payload);
+ }
+
+ public static void RaiseWaveCleared(WaveClearedEvent payload)
+ {
+ WaveCleared?.Invoke(payload);
+ }
+
+ public static void RaiseRunEnded(RunEndedEvent payload)
+ {
+ RunEnded?.Invoke(payload);
+ }
+ }
+
+ ///
+ /// Describes a card that entered a resolution track.
+ ///
+ public readonly struct CardPlayedEvent
+ {
+ public CardPlayedEvent(CardInstance card, ResolutionTrack track)
+ {
+ Card = card;
+ Track = track;
+ }
+
+ public CardInstance Card { get; }
+ public ResolutionTrack Track { get; }
+ }
+
+ ///
+ /// Describes a card whose effects finished resolving.
+ ///
+ public readonly struct CardResolvedEvent
+ {
+ public CardResolvedEvent(CardInstance card, ResolutionTrack track)
+ {
+ Card = card;
+ Track = track;
+ }
+
+ public CardInstance Card { get; }
+ public ResolutionTrack Track { get; }
+ }
+
+ ///
+ /// Describes a transition between combat phases.
+ ///
+ public readonly struct PhaseChangedEvent
+ {
+ public PhaseChangedEvent(TurnPhase previousPhase, TurnPhase nextPhase)
+ {
+ PreviousPhase = previousPhase;
+ NextPhase = nextPhase;
+ }
+
+ public TurnPhase PreviousPhase { get; }
+ public TurnPhase NextPhase { get; }
+ }
+
+ ///
+ /// Describes damage applied from one combatant to another.
+ ///
+ public readonly struct DamageDealtEvent
+ {
+ public DamageDealtEvent(CombatantState source, CombatantState target, int amount, Language language)
+ {
+ Source = source;
+ Target = target;
+ Amount = amount;
+ Language = language;
+ }
+
+ public CombatantState Source { get; }
+ public CombatantState Target { get; }
+ public int Amount { get; }
+ public Language Language { get; }
+ }
+
+ ///
+ /// Describes a completed enemy wave.
+ ///
+ public readonly struct WaveClearedEvent
+ {
+ public WaveClearedEvent(int waveNumber)
+ {
+ WaveNumber = waveNumber;
+ }
+
+ public int WaveNumber { get; }
+ }
+
+ ///
+ /// Describes the end of a run and its earned meta currency.
+ ///
+ public readonly struct RunEndedEvent
+ {
+ public RunEndedEvent(bool playerDied, int entropyEarned)
+ {
+ PlayerDied = playerDied;
+ EntropyEarned = entropyEarned;
+ }
+
+ public bool PlayerDied { get; }
+ public int EntropyEarned { get; }
+ }
+}
diff --git a/Assets/Scripts/Core/GameEvents.cs.meta b/Assets/Scripts/Core/GameEvents.cs.meta
new file mode 100644
index 0000000..a0e6246
--- /dev/null
+++ b/Assets/Scripts/Core/GameEvents.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: cf446c6fd7627294c9e2aa23c9b576e7
\ No newline at end of file
diff --git a/Assets/Scripts/Core/Language.cs b/Assets/Scripts/Core/Language.cs
new file mode 100644
index 0000000..55cdd08
--- /dev/null
+++ b/Assets/Scripts/Core/Language.cs
@@ -0,0 +1,21 @@
+namespace KernelPanic.Core
+{
+ ///
+ /// Identifies a programming language used as a card damage type.
+ ///
+ public enum Language
+ {
+ C,
+ CPlusPlus,
+ Rust,
+ Python,
+ JavaScript,
+ TypeScript,
+ Haskell,
+ Assembly,
+ Java,
+ Go,
+ Ruby,
+ PHP
+ }
+}
diff --git a/Assets/Scripts/Core/Language.cs.meta b/Assets/Scripts/Core/Language.cs.meta
new file mode 100644
index 0000000..03d1951
--- /dev/null
+++ b/Assets/Scripts/Core/Language.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: c06078e18f184c84cab3579c0e562dbe
\ No newline at end of file
diff --git a/Assets/Scripts/Core/Rarity.cs b/Assets/Scripts/Core/Rarity.cs
new file mode 100644
index 0000000..45ff11f
--- /dev/null
+++ b/Assets/Scripts/Core/Rarity.cs
@@ -0,0 +1,13 @@
+namespace KernelPanic.Core
+{
+ ///
+ /// Describes the rarity tier of cards and rewards.
+ ///
+ public enum Rarity
+ {
+ Common,
+ Rare,
+ Epic,
+ Legendary
+ }
+}
diff --git a/Assets/Scripts/Core/Rarity.cs.meta b/Assets/Scripts/Core/Rarity.cs.meta
new file mode 100644
index 0000000..c324b28
--- /dev/null
+++ b/Assets/Scripts/Core/Rarity.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 542a3f97e8074ed428fd7019177f221b
\ No newline at end of file
diff --git a/Assets/Scripts/Core/ResolutionTrack.cs b/Assets/Scripts/Core/ResolutionTrack.cs
new file mode 100644
index 0000000..fdd750d
--- /dev/null
+++ b/Assets/Scripts/Core/ResolutionTrack.cs
@@ -0,0 +1,12 @@
+namespace KernelPanic.Core
+{
+ ///
+ /// Identifies the combat resolution track a card uses when played.
+ ///
+ public enum ResolutionTrack
+ {
+ Native,
+ InterpreterQueue,
+ LazyStack
+ }
+}
diff --git a/Assets/Scripts/Core/ResolutionTrack.cs.meta b/Assets/Scripts/Core/ResolutionTrack.cs.meta
new file mode 100644
index 0000000..0560194
--- /dev/null
+++ b/Assets/Scripts/Core/ResolutionTrack.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 3b76dcac6b8cae447bb9079460692238
\ No newline at end of file
diff --git a/Assets/Scripts/Core/StatusType.cs b/Assets/Scripts/Core/StatusType.cs
new file mode 100644
index 0000000..f8a4dfb
--- /dev/null
+++ b/Assets/Scripts/Core/StatusType.cs
@@ -0,0 +1,15 @@
+namespace KernelPanic.Core
+{
+ ///
+ /// Identifies a combat status effect category.
+ ///
+ public enum StatusType
+ {
+ Segfault,
+ MemoryLeak,
+ RaceCondition,
+ Deprecated,
+ DependencyError,
+ Deadlock
+ }
+}
diff --git a/Assets/Scripts/Core/StatusType.cs.meta b/Assets/Scripts/Core/StatusType.cs.meta
new file mode 100644
index 0000000..4304e27
--- /dev/null
+++ b/Assets/Scripts/Core/StatusType.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: cbdd46dffec613346ae6191f18a94225
\ No newline at end of file
diff --git a/Assets/Scripts/Core/TurnPhase.cs b/Assets/Scripts/Core/TurnPhase.cs
new file mode 100644
index 0000000..605b060
--- /dev/null
+++ b/Assets/Scripts/Core/TurnPhase.cs
@@ -0,0 +1,15 @@
+namespace KernelPanic.Core
+{
+ ///
+ /// Describes the high-level phases of one combat turn.
+ ///
+ public enum TurnPhase
+ {
+ Boot,
+ Allocate,
+ Execute,
+ Interpret,
+ EnemyProcess,
+ GarbageCollection
+ }
+}
diff --git a/Assets/Scripts/Core/TurnPhase.cs.meta b/Assets/Scripts/Core/TurnPhase.cs.meta
new file mode 100644
index 0000000..0289dec
--- /dev/null
+++ b/Assets/Scripts/Core/TurnPhase.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: e1974726f936d0640943801549b4574e
\ No newline at end of file
diff --git a/Assets/Scripts/Data.meta b/Assets/Scripts/Data.meta
new file mode 100644
index 0000000..ede1e85
--- /dev/null
+++ b/Assets/Scripts/Data.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e0a39b97df9ee0641b2bbadf5bca417c
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Data/CardDefinition.cs b/Assets/Scripts/Data/CardDefinition.cs
new file mode 100644
index 0000000..e7a8a77
--- /dev/null
+++ b/Assets/Scripts/Data/CardDefinition.cs
@@ -0,0 +1,34 @@
+using System.Collections.Generic;
+using KernelPanic.Core;
+using UnityEngine;
+
+namespace KernelPanic.Data
+{
+ ///
+ /// Defines immutable card data used to create runtime card instances.
+ ///
+ public sealed class CardDefinition : ScriptableObject
+ {
+ [SerializeField] private string id;
+ [SerializeField] private string displayName;
+ [SerializeField] private string description;
+ [SerializeField] private Language language;
+ [SerializeField] private Rarity rarity;
+ [SerializeField] private int cycleCost;
+ [SerializeField] private ResolutionTrack resolutionTrack;
+ [SerializeField] private bool distroExclusive;
+ [SerializeField] private CardDefinition upgradeTarget;
+ [SerializeField] private List effects = new();
+
+ public string Id => id;
+ public string DisplayName => displayName;
+ public string Description => description;
+ public Language Language => language;
+ public Rarity Rarity => rarity;
+ public int CycleCost => cycleCost;
+ public ResolutionTrack ResolutionTrack => resolutionTrack;
+ public bool DistroExclusive => distroExclusive;
+ public CardDefinition UpgradeTarget => upgradeTarget;
+ public IReadOnlyList Effects => effects;
+ }
+}
diff --git a/Assets/Scripts/Data/CardDefinition.cs.meta b/Assets/Scripts/Data/CardDefinition.cs.meta
new file mode 100644
index 0000000..ade0308
--- /dev/null
+++ b/Assets/Scripts/Data/CardDefinition.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 5178747fac4dbfc448ff15d8a687e03c
\ No newline at end of file
diff --git a/Assets/Scripts/Data/CardEffectDefinition.cs b/Assets/Scripts/Data/CardEffectDefinition.cs
new file mode 100644
index 0000000..23dd6d1
--- /dev/null
+++ b/Assets/Scripts/Data/CardEffectDefinition.cs
@@ -0,0 +1,13 @@
+using KernelPanic.Combat;
+using UnityEngine;
+
+namespace KernelPanic.Data
+{
+ ///
+ /// Defines serialized card effect data that can create a runtime effect.
+ ///
+ public abstract class CardEffectDefinition : ScriptableObject
+ {
+ public abstract ICardEffect CreateRuntimeEffect();
+ }
+}
diff --git a/Assets/Scripts/Data/CardEffectDefinition.cs.meta b/Assets/Scripts/Data/CardEffectDefinition.cs.meta
new file mode 100644
index 0000000..d01f83e
--- /dev/null
+++ b/Assets/Scripts/Data/CardEffectDefinition.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: fdb3d58d94b76834598e408448e19d2a
\ No newline at end of file
diff --git a/Assets/Scripts/Data/DistroDefinition.cs b/Assets/Scripts/Data/DistroDefinition.cs
new file mode 100644
index 0000000..43e0a83
--- /dev/null
+++ b/Assets/Scripts/Data/DistroDefinition.cs
@@ -0,0 +1,30 @@
+using System.Collections.Generic;
+using KernelPanic.Core;
+using UnityEngine;
+
+namespace KernelPanic.Data
+{
+ ///
+ /// Defines a playable distro character and its starting combat constraints.
+ ///
+ public sealed class DistroDefinition : ScriptableObject
+ {
+ [SerializeField] private string id;
+ [SerializeField] private string displayName;
+ [SerializeField] private Language primaryLanguage;
+ [SerializeField] private Language secondaryLanguage;
+ [SerializeField] private int baseUptime;
+ [SerializeField] private int baseRam;
+ [SerializeField] private int baseCyclesPerTurn;
+ [SerializeField] private List exclusiveCards = new();
+
+ public string Id => id;
+ public string DisplayName => displayName;
+ public Language PrimaryLanguage => primaryLanguage;
+ public Language SecondaryLanguage => secondaryLanguage;
+ public int BaseUptime => baseUptime;
+ public int BaseRam => baseRam;
+ public int BaseCyclesPerTurn => baseCyclesPerTurn;
+ public IReadOnlyList ExclusiveCards => exclusiveCards;
+ }
+}
diff --git a/Assets/Scripts/Data/DistroDefinition.cs.meta b/Assets/Scripts/Data/DistroDefinition.cs.meta
new file mode 100644
index 0000000..e8037bd
--- /dev/null
+++ b/Assets/Scripts/Data/DistroDefinition.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: bd550368fd0c75d43a53aa4fb3b6541e
\ No newline at end of file
diff --git a/Assets/Scripts/Data/EnemyDefinition.cs b/Assets/Scripts/Data/EnemyDefinition.cs
new file mode 100644
index 0000000..c14cea0
--- /dev/null
+++ b/Assets/Scripts/Data/EnemyDefinition.cs
@@ -0,0 +1,26 @@
+using System.Collections.Generic;
+using KernelPanic.Core;
+using UnityEngine;
+
+namespace KernelPanic.Data
+{
+ ///
+ /// Defines enemy stats and language affinities for runtime combat setup.
+ ///
+ public sealed class EnemyDefinition : ScriptableObject
+ {
+ [SerializeField] private string id;
+ [SerializeField] private string displayName;
+ [SerializeField] private int baseUptime;
+ [SerializeField] private List resistedLanguages = new();
+ [SerializeField] private List weakLanguages = new();
+
+ public string Id => id;
+ public string DisplayName => displayName;
+ public int BaseUptime => baseUptime;
+ public IReadOnlyList ResistedLanguages => resistedLanguages;
+ public IReadOnlyList WeakLanguages => weakLanguages;
+
+ // TODO: Model enemy intents once combat actions are defined.
+ }
+}
diff --git a/Assets/Scripts/Data/EnemyDefinition.cs.meta b/Assets/Scripts/Data/EnemyDefinition.cs.meta
new file mode 100644
index 0000000..9c557ab
--- /dev/null
+++ b/Assets/Scripts/Data/EnemyDefinition.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 8b5b43b43c697c142b33fbfc5160cf90
\ No newline at end of file
diff --git a/Assets/Scripts/Data/StatusEffectDefinition.cs b/Assets/Scripts/Data/StatusEffectDefinition.cs
new file mode 100644
index 0000000..d45d0f6
--- /dev/null
+++ b/Assets/Scripts/Data/StatusEffectDefinition.cs
@@ -0,0 +1,17 @@
+using KernelPanic.Core;
+using UnityEngine;
+
+namespace KernelPanic.Data
+{
+ ///
+ /// Defines serialized status effect metadata and future stacking behavior.
+ ///
+ public sealed class StatusEffectDefinition : ScriptableObject
+ {
+ [SerializeField] private StatusType statusType;
+ [SerializeField] private string stackingBehavior;
+
+ public StatusType StatusType => statusType;
+ public string StackingBehavior => stackingBehavior;
+ }
+}
diff --git a/Assets/Scripts/Data/StatusEffectDefinition.cs.meta b/Assets/Scripts/Data/StatusEffectDefinition.cs.meta
new file mode 100644
index 0000000..150a317
--- /dev/null
+++ b/Assets/Scripts/Data/StatusEffectDefinition.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 1470a223647d6514f9439de7ded702c9
\ No newline at end of file
diff --git a/Assets/Scripts/KernelPanic.Runtime.asmdef b/Assets/Scripts/KernelPanic.Runtime.asmdef
new file mode 100644
index 0000000..0483c65
--- /dev/null
+++ b/Assets/Scripts/KernelPanic.Runtime.asmdef
@@ -0,0 +1,14 @@
+{
+ "name": "KernelPanic.Runtime",
+ "rootNamespace": "KernelPanic",
+ "references": [],
+ "includePlatforms": [],
+ "excludePlatforms": [],
+ "allowUnsafeCode": false,
+ "overrideReferences": false,
+ "precompiledReferences": [],
+ "autoReferenced": true,
+ "defineConstraints": [],
+ "versionDefines": [],
+ "noEngineReferences": false
+}
diff --git a/Assets/Scripts/KernelPanic.Runtime.asmdef.meta b/Assets/Scripts/KernelPanic.Runtime.asmdef.meta
new file mode 100644
index 0000000..667deb9
--- /dev/null
+++ b/Assets/Scripts/KernelPanic.Runtime.asmdef.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 6aad857173769044f861a0c6b1318032
+AssemblyDefinitionImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Meta.meta b/Assets/Scripts/Meta.meta
new file mode 100644
index 0000000..05e8c60
--- /dev/null
+++ b/Assets/Scripts/Meta.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ae19044bbccbb074da1d5e38b61e5657
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Meta/EntropyWallet.cs b/Assets/Scripts/Meta/EntropyWallet.cs
new file mode 100644
index 0000000..83aa4db
--- /dev/null
+++ b/Assets/Scripts/Meta/EntropyWallet.cs
@@ -0,0 +1,26 @@
+namespace KernelPanic.Meta
+{
+ ///
+ /// Tracks the player's persistent entropy currency balance.
+ ///
+ public sealed class EntropyWallet
+ {
+ public int Balance { get; private set; }
+
+ public void Add(int amount)
+ {
+ Balance += amount;
+ }
+
+ public bool Spend(int amount)
+ {
+ if (Balance < amount)
+ {
+ return false;
+ }
+
+ Balance -= amount;
+ return true;
+ }
+ }
+}
diff --git a/Assets/Scripts/Meta/EntropyWallet.cs.meta b/Assets/Scripts/Meta/EntropyWallet.cs.meta
new file mode 100644
index 0000000..fc4c673
--- /dev/null
+++ b/Assets/Scripts/Meta/EntropyWallet.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 8b77d0de67282ca4181a7c53feec4343
\ No newline at end of file
diff --git a/Assets/Scripts/Meta/GachaService.cs b/Assets/Scripts/Meta/GachaService.cs
new file mode 100644
index 0000000..ced3450
--- /dev/null
+++ b/Assets/Scripts/Meta/GachaService.cs
@@ -0,0 +1,30 @@
+using System;
+
+namespace KernelPanic.Meta
+{
+ ///
+ /// Provides the contract for spending entropy on persistent unlock pulls.
+ ///
+ public sealed class GachaService
+ {
+ public GachaPullResult PerformPull(EntropyWallet wallet, int cost)
+ {
+ throw new NotImplementedException();
+ }
+ }
+
+ ///
+ /// Represents the result of a persistent unlock pull.
+ ///
+ public readonly struct GachaPullResult
+ {
+ public GachaPullResult(bool success, string unlockId)
+ {
+ Success = success;
+ UnlockId = unlockId;
+ }
+
+ public bool Success { get; }
+ public string UnlockId { get; }
+ }
+}
diff --git a/Assets/Scripts/Meta/GachaService.cs.meta b/Assets/Scripts/Meta/GachaService.cs.meta
new file mode 100644
index 0000000..098ee49
--- /dev/null
+++ b/Assets/Scripts/Meta/GachaService.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: f62e697e985a8a44ca26ccb8e853ee66
\ No newline at end of file
diff --git a/Assets/Scripts/Meta/SaveService.cs b/Assets/Scripts/Meta/SaveService.cs
new file mode 100644
index 0000000..76fc6cf
--- /dev/null
+++ b/Assets/Scripts/Meta/SaveService.cs
@@ -0,0 +1,28 @@
+using System;
+
+namespace KernelPanic.Meta
+{
+ ///
+ /// Provides save and load contracts for persistent meta progression.
+ ///
+ public sealed class SaveService
+ {
+ public void Save(SaveData data)
+ {
+ throw new NotImplementedException();
+ }
+
+ public SaveData Load()
+ {
+ throw new NotImplementedException();
+ }
+ }
+
+ ///
+ /// Stores persistent progression data for serialization.
+ ///
+ public sealed class SaveData
+ {
+ public int EntropyBalance { get; set; }
+ }
+}
diff --git a/Assets/Scripts/Meta/SaveService.cs.meta b/Assets/Scripts/Meta/SaveService.cs.meta
new file mode 100644
index 0000000..aa82016
--- /dev/null
+++ b/Assets/Scripts/Meta/SaveService.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 752a83f338afd024b8e728a1921e38ee
\ No newline at end of file
diff --git a/Assets/Scripts/Run.meta b/Assets/Scripts/Run.meta
new file mode 100644
index 0000000..c0ea1d4
--- /dev/null
+++ b/Assets/Scripts/Run.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 9ae21840b594d4147a8f5497c992b4fa
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Run/RewardService.cs b/Assets/Scripts/Run/RewardService.cs
new file mode 100644
index 0000000..b96deb4
--- /dev/null
+++ b/Assets/Scripts/Run/RewardService.cs
@@ -0,0 +1,42 @@
+using System;
+using System.Collections.Generic;
+using KernelPanic.Data;
+
+namespace KernelPanic.Run
+{
+ ///
+ /// Provides post-wave reward choice generation contracts.
+ ///
+ public sealed class RewardService
+ {
+ public IReadOnlyList GeneratePostWaveChoices(RunConfig runConfig, int waveNumber)
+ {
+ throw new NotImplementedException();
+ }
+ }
+
+ ///
+ /// Represents one selectable reward option after clearing a wave.
+ ///
+ public readonly struct RewardChoice
+ {
+ public RewardChoice(RewardChoiceType type, CardDefinition card)
+ {
+ Type = type;
+ Card = card;
+ }
+
+ public RewardChoiceType Type { get; }
+ public CardDefinition Card { get; }
+ }
+
+ ///
+ /// Identifies the type of reward choice offered after a wave.
+ ///
+ public enum RewardChoiceType
+ {
+ AddCard,
+ UpgradeCard,
+ Skip
+ }
+}
diff --git a/Assets/Scripts/Run/RewardService.cs.meta b/Assets/Scripts/Run/RewardService.cs.meta
new file mode 100644
index 0000000..7277a39
--- /dev/null
+++ b/Assets/Scripts/Run/RewardService.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: a06eada6fbafd6e44ae1d21238a64750
\ No newline at end of file
diff --git a/Assets/Scripts/Run/RunConfig.cs b/Assets/Scripts/Run/RunConfig.cs
new file mode 100644
index 0000000..2edc5e8
--- /dev/null
+++ b/Assets/Scripts/Run/RunConfig.cs
@@ -0,0 +1,25 @@
+using System.Collections.Generic;
+using KernelPanic.Core;
+using KernelPanic.Data;
+
+namespace KernelPanic.Run
+{
+ ///
+ /// Describes the player choices and starting deck used to begin a run.
+ ///
+ public sealed class RunConfig
+ {
+ public RunConfig(DistroDefinition distro, Language primaryLanguage, Language secondaryLanguage, IReadOnlyList startingDeck)
+ {
+ Distro = distro;
+ PrimaryLanguage = primaryLanguage;
+ SecondaryLanguage = secondaryLanguage;
+ StartingDeck = startingDeck;
+ }
+
+ public DistroDefinition Distro { get; }
+ public Language PrimaryLanguage { get; }
+ public Language SecondaryLanguage { get; }
+ public IReadOnlyList StartingDeck { get; }
+ }
+}
diff --git a/Assets/Scripts/Run/RunConfig.cs.meta b/Assets/Scripts/Run/RunConfig.cs.meta
new file mode 100644
index 0000000..c8b050b
--- /dev/null
+++ b/Assets/Scripts/Run/RunConfig.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 0c3d34a2ce0e53b4b8f9a77feb60fb95
\ No newline at end of file
diff --git a/Assets/Scripts/Run/RunManager.cs b/Assets/Scripts/Run/RunManager.cs
new file mode 100644
index 0000000..8de8559
--- /dev/null
+++ b/Assets/Scripts/Run/RunManager.cs
@@ -0,0 +1,56 @@
+using KernelPanic.Combat;
+using KernelPanic.Core;
+using UnityEngine;
+
+namespace KernelPanic.Run
+{
+ ///
+ /// Coordinates run lifecycle, wave progression, and run-level event handling.
+ ///
+ public sealed class RunManager : MonoBehaviour
+ {
+ [SerializeField] private CombatManager combatManager;
+ [SerializeField] private int currentWaveNumber;
+ [SerializeField] private bool isRunActive;
+ [SerializeField] private bool isPlayerDead;
+
+ public int CurrentWaveNumber => currentWaveNumber;
+ public bool IsRunActive => isRunActive;
+ public bool IsPlayerDead => isPlayerDead;
+
+ private void OnEnable()
+ {
+ GameEvents.WaveCleared += HandleWaveCleared;
+ GameEvents.RunEnded += HandleRunEnded;
+ }
+
+ private void OnDisable()
+ {
+ GameEvents.WaveCleared -= HandleWaveCleared;
+ GameEvents.RunEnded -= HandleRunEnded;
+ }
+
+ public void StartRun(RunConfig config)
+ {
+ isRunActive = true;
+ isPlayerDead = false;
+ currentWaveNumber = 1;
+ StartCombat();
+ }
+
+ public void StartCombat()
+ {
+ combatManager?.StartCombat();
+ }
+
+ private void HandleWaveCleared(WaveClearedEvent payload)
+ {
+ }
+
+ private void HandleRunEnded(RunEndedEvent payload)
+ {
+ isRunActive = false;
+ isPlayerDead = payload.PlayerDied;
+ }
+ }
+}
diff --git a/Assets/Scripts/Run/RunManager.cs.meta b/Assets/Scripts/Run/RunManager.cs.meta
new file mode 100644
index 0000000..304b6b9
--- /dev/null
+++ b/Assets/Scripts/Run/RunManager.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 234cc6c5ca577b64ea44020f5514cebe
\ No newline at end of file
diff --git a/Assets/Settings/UniversalRP.asset b/Assets/Settings/UniversalRP.asset
index fccfdda..898a05e 100644
--- a/Assets/Settings/UniversalRP.asset
+++ b/Assets/Settings/UniversalRP.asset
@@ -12,8 +12,8 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3}
m_Name: UniversalRP
m_EditorClassIdentifier:
- k_AssetVersion: 12
- k_AssetPreviousVersion: 12
+ k_AssetVersion: 13
+ k_AssetPreviousVersion: 13
m_RendererType: 1
m_RendererData: {fileID: 0}
m_RendererDataList:
@@ -53,6 +53,7 @@ MonoBehaviour:
m_AdditionalLightsShadowResolutionTierHigh: 2048
m_ReflectionProbeBlending: 0
m_ReflectionProbeBoxProjection: 0
+ m_ReflectionProbeAtlas: 1
m_ShadowDistance: 50
m_ShadowCascadeCount: 1
m_Cascade2Split: 0.25
@@ -78,6 +79,7 @@ MonoBehaviour:
m_UseAdaptivePerformance: 1
m_ColorGradingMode: 0
m_ColorGradingLutSize: 32
+ m_AllowPostProcessAlphaOutput: 0
m_UseFastSRGBLinearConversion: 0
m_SupportDataDrivenLensFlare: 1
m_SupportScreenSpaceLensFlare: 1
@@ -108,6 +110,7 @@ MonoBehaviour:
m_PrefilterDebugKeywords: 0
m_PrefilterWriteRenderingLayers: 0
m_PrefilterHDROutput: 0
+ m_PrefilterAlphaOutput: 0
m_PrefilterSSAODepthNormals: 0
m_PrefilterSSAOSourceDepthLow: 0
m_PrefilterSSAOSourceDepthMedium: 0
@@ -125,8 +128,15 @@ MonoBehaviour:
m_PrefilterSoftShadowsQualityHigh: 0
m_PrefilterSoftShadows: 0
m_PrefilterScreenCoord: 0
+ m_PrefilterScreenSpaceIrradiance: 0
m_PrefilterNativeRenderPass: 0
m_PrefilterUseLegacyLightmaps: 0
+ m_PrefilterBicubicLightmapSampling: 0
+ m_PrefilterReflectionProbeRotation: 0
+ m_PrefilterReflectionProbeBlending: 0
+ m_PrefilterReflectionProbeBoxProjection: 0
+ m_PrefilterReflectionProbeAtlas: 0
+ m_PrefilterPointSamplingUpsampling: 0
m_ShaderVariantLogLevel: 0
m_ShadowCascades: 0
m_Textures:
diff --git a/Assets/UniversalRenderPipelineGlobalSettings.asset b/Assets/UniversalRenderPipelineGlobalSettings.asset
index 7c1f633..f3ba00c 100644
--- a/Assets/UniversalRenderPipelineGlobalSettings.asset
+++ b/Assets/UniversalRenderPipelineGlobalSettings.asset
@@ -29,7 +29,6 @@ MonoBehaviour:
m_StripUnusedVariants: 1
m_StripScreenCoordOverrideVariants: 1
supportRuntimeDebugDisplay: 0
- m_EnableRenderGraph: 0
m_Settings:
m_SettingsList:
m_List:
@@ -57,9 +56,20 @@ MonoBehaviour:
- rid: 3114554777721110528
- rid: 3114554777721110529
- rid: 3114554777721110530
+ - rid: 8545822260705886208
+ - rid: 8545822260705886209
+ - rid: 8545822260705886210
+ - rid: 8545822260705886211
+ - rid: 8545822260705886212
+ - rid: 8545822260705886213
+ - rid: 8545822260705886214
+ - rid: 8545822260705886215
+ - rid: 8545822260705886216
+ - rid: 8545822260705886217
+ - rid: 8545822260705886218
m_RuntimeSettings:
m_List: []
- m_AssetVersion: 8
+ m_AssetVersion: 10
m_ObsoleteDefaultVolumeProfile: {fileID: 0}
m_RenderingLayerNames:
- Default
@@ -135,20 +145,17 @@ MonoBehaviour:
m_SpriteUnshadowShader: {fileID: 4800000, guid: de02b375720b5c445afe83cd483bedf3, type: 3}
m_GeometryShadowShader: {fileID: 4800000, guid: 19349a0f9a7ed4c48a27445bcf92e5e1, type: 3}
m_GeometryUnshadowShader: {fileID: 4800000, guid: 77774d9009bb81447b048c907d4c6273, type: 3}
- m_FallOffLookup: {fileID: 2800000, guid: 5688ab254e4c0634f8d6c8e0792331ca, type: 3}
m_CopyDepthPS: {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3}
m_DefaultLitMaterial: {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2}
m_DefaultUnlitMaterial: {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, type: 2}
m_DefaultMaskMaterial: {fileID: 2100000, guid: 15d0c3709176029428a0da2f8cecf0b5, type: 2}
+ m_DefaultMesh2DLitMaterial: {fileID: 2100000, guid: 9452ae1262a74094f8a68013fbcd1834, type: 2}
- rid: 7752762179098771458
type: {class: UniversalRenderPipelineEditorShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
data:
m_AutodeskInteractive: {fileID: 4800000, guid: 0e9d5a909a1f7e84882a534d0d11e49f, type: 3}
m_AutodeskInteractiveTransparent: {fileID: 4800000, guid: 5c81372d981403744adbdda4433c9c11, type: 3}
m_AutodeskInteractiveMasked: {fileID: 4800000, guid: 80aa867ac363ac043847b06ad71604cd, type: 3}
- m_TerrainDetailLit: {fileID: 4800000, guid: f6783ab646d374f94b199774402a5144, type: 3}
- m_TerrainDetailGrassBillboard: {fileID: 4800000, guid: 29868e73b638e48ca99a19ea58c48d90, type: 3}
- m_TerrainDetailGrass: {fileID: 4800000, guid: e507fdfead5ca47e8b9a768b51c291a1, type: 3}
m_DefaultSpeedTree7Shader: {fileID: 4800000, guid: 0f4122b9a743b744abe2fb6a0a88868b, type: 3}
m_DefaultSpeedTree8Shader: {fileID: -6465566751694194690, guid: 9920c1f1781549a46ba081a2a15a16ec, type: 3}
m_DefaultSpeedTree9Shader: {fileID: -6465566751694194690, guid: cbd3e1cc4ae141c42a30e33b4d666a61, type: 3}
@@ -168,7 +175,6 @@ MonoBehaviour:
type: {class: RenderGraphSettings, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
data:
m_Version: 0
- m_EnableRenderCompatibilityMode: 0
- rid: 7752762179098771462
type: {class: UniversalRenderPipelineDebugShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
data:
@@ -209,6 +215,9 @@ MonoBehaviour:
m_CoreBlitPS: {fileID: 4800000, guid: 93446b5c5339d4f00b85c159e1159b7c, type: 3}
m_CoreBlitColorAndDepthPS: {fileID: 4800000, guid: d104b2fc1ca6445babb8e90b0758136b, type: 3}
m_SamplingPS: {fileID: 4800000, guid: 04c410c9937594faa893a11dceb85f7e, type: 3}
+ m_TerrainDetailLit: {fileID: 0}
+ m_TerrainDetailGrassBillboard: {fileID: 0}
+ m_TerrainDetailGrass: {fileID: 0}
- rid: 7752762179098771467
type: {class: GPUResidentDrawerResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.GPUDriven.Runtime}
data:
@@ -288,3 +297,140 @@ MonoBehaviour:
m_ExportShaderVariants: 1
m_ShaderVariantLogLevel: 0
m_StripRuntimeDebugShaders: 1
+ - rid: 8545822260705886208
+ type: {class: RayTracingRenderPipelineResources, ns: UnityEngine.Rendering.UnifiedRayTracing, asm: Unity.UnifiedRayTracing.Runtime}
+ data:
+ m_Version: 1
+ m_GeometryPoolKernels: {fileID: 7200000, guid: 98e3d58cae7210c4786f67f504c9e899, type: 3}
+ m_CopyBuffer: {fileID: 7200000, guid: 1b95b5dcf48d1914c9e1e7405c7660e3, type: 3}
+ m_CopyPositions: {fileID: 7200000, guid: 1ad53a96b58d3c3488dde4f14db1aaeb, type: 3}
+ m_BitHistogram: {fileID: 7200000, guid: 8670f7ce4b60cef43bed36148aa1b0a2, type: 3}
+ m_BlockReducePart: {fileID: 7200000, guid: 4e034cc8ea2635c4e9f063e5ddc7ea7a, type: 3}
+ m_BlockScan: {fileID: 7200000, guid: 4d6d5de35fa45ef4a92119397a045cc9, type: 3}
+ m_BuildHlbvh: {fileID: 7200000, guid: 2d70cd6be91bd7843a39a54b51c15b13, type: 3}
+ m_RestructureBvh: {fileID: 7200000, guid: 56641cb88dcb31a4398a4997ef7a7a8c, type: 3}
+ m_Scatter: {fileID: 7200000, guid: a2eaeefdac4637a44b734e85b7be9186, type: 3}
+ - rid: 8545822260705886209
+ type: {class: PostProcessData/ShaderResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
+ data:
+ stopNanPS: {fileID: 4800000, guid: 1121bb4e615ca3c48b214e79e841e823, type: 3}
+ subpixelMorphologicalAntialiasingPS: {fileID: 4800000, guid: 63eaba0ebfb82cc43bde059b4a8c65f6, type: 3}
+ gaussianDepthOfFieldPS: {fileID: 4800000, guid: 5e7134d6e63e0bc47a1dd2669cedb379, type: 3}
+ bokehDepthOfFieldPS: {fileID: 4800000, guid: 2aed67ad60045d54ba3a00c91e2d2631, type: 3}
+ cameraMotionBlurPS: {fileID: 4800000, guid: 1edcd131364091c46a17cbff0b1de97a, type: 3}
+ paniniProjectionPS: {fileID: 4800000, guid: a15b78cf8ca26ca4fb2090293153c62c, type: 3}
+ lutBuilderLdrPS: {fileID: 4800000, guid: 65df88701913c224d95fc554db28381a, type: 3}
+ lutBuilderHdrPS: {fileID: 4800000, guid: ec9fec698a3456d4fb18cf8bacb7a2bc, type: 3}
+ bloomPS: {fileID: 4800000, guid: 5f1864addb451f54bae8c86d230f736e, type: 3}
+ temporalAntialiasingPS: {fileID: 4800000, guid: 9c70c1a35ff15f340b38ea84842358bf, type: 3}
+ LensFlareDataDrivenPS: {fileID: 4800000, guid: 6cda457ac28612740adb23da5d39ea92, type: 3}
+ LensFlareScreenSpacePS: {fileID: 4800000, guid: 701880fecb344ea4c9cd0db3407ab287, type: 3}
+ scalingSetupPS: {fileID: 4800000, guid: e8ee25143a34b8c4388709ea947055d1, type: 3}
+ easuPS: {fileID: 4800000, guid: 562b7ae4f629f144aa97780546fce7c6, type: 3}
+ uberPostPS: {fileID: 4800000, guid: e7857e9d0c934dc4f83f270f8447b006, type: 3}
+ finalPostPassPS: {fileID: 4800000, guid: c49e63ed1bbcb334780a3bd19dfed403, type: 3}
+ m_ShaderResourcesVersion: 0
+ - rid: 8545822260705886210
+ type: {class: PostProcessData/TextureResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
+ data:
+ blueNoise16LTex:
+ - {fileID: 2800000, guid: 81200413a40918d4d8702e94db29911c, type: 3}
+ - {fileID: 2800000, guid: d50c5e07c9911a74982bddf7f3075e7b, type: 3}
+ - {fileID: 2800000, guid: 1134690bf9216164dbc75050e35b7900, type: 3}
+ - {fileID: 2800000, guid: 7ce2118f74614a94aa8a0cdf2e6062c3, type: 3}
+ - {fileID: 2800000, guid: 2ca97df9d1801e84a8a8f2c53cb744f0, type: 3}
+ - {fileID: 2800000, guid: e63eef8f54aa9dc4da9a5ac094b503b5, type: 3}
+ - {fileID: 2800000, guid: 39451254daebd6d40b52899c1f1c0c1b, type: 3}
+ - {fileID: 2800000, guid: c94ad916058dff743b0f1c969ddbe660, type: 3}
+ - {fileID: 2800000, guid: ed5ea7ce59ca8ec4f9f14bf470a30f35, type: 3}
+ - {fileID: 2800000, guid: 071e954febf155243a6c81e48f452644, type: 3}
+ - {fileID: 2800000, guid: 96aaab9cc247d0b4c98132159688c1af, type: 3}
+ - {fileID: 2800000, guid: fc3fa8f108657e14486697c9a84ccfc5, type: 3}
+ - {fileID: 2800000, guid: bfed3e498947fcb4890b7f40f54d85b9, type: 3}
+ - {fileID: 2800000, guid: d512512f4af60a442ab3458489412954, type: 3}
+ - {fileID: 2800000, guid: 47a45908f6db0cb44a0d5e961143afec, type: 3}
+ - {fileID: 2800000, guid: 4dcc0502f8586f941b5c4a66717205e8, type: 3}
+ - {fileID: 2800000, guid: 9d92991794bb5864c8085468b97aa067, type: 3}
+ - {fileID: 2800000, guid: 14381521ff11cb74abe3fe65401c23be, type: 3}
+ - {fileID: 2800000, guid: d36f0fe53425e08499a2333cf423634c, type: 3}
+ - {fileID: 2800000, guid: d4044ea2490d63b43aa1765f8efbf8a9, type: 3}
+ - {fileID: 2800000, guid: c9bd74624d8070f429e3f46d161f9204, type: 3}
+ - {fileID: 2800000, guid: d5c9b274310e5524ebe32a4e4da3df1f, type: 3}
+ - {fileID: 2800000, guid: f69770e54f2823f43badf77916acad83, type: 3}
+ - {fileID: 2800000, guid: 10b6c6d22e73dea46a8ab36b6eebd629, type: 3}
+ - {fileID: 2800000, guid: a2ec5cbf5a9b64345ad3fab0912ddf7b, type: 3}
+ - {fileID: 2800000, guid: 1c3c6d69a645b804fa232004b96b7ad3, type: 3}
+ - {fileID: 2800000, guid: d18a24d7b4ed50f4387993566d9d3ae2, type: 3}
+ - {fileID: 2800000, guid: c989e1ed85cf7154caa922fec53e6af6, type: 3}
+ - {fileID: 2800000, guid: ff47e5a0f105eb34883b973e51f4db62, type: 3}
+ - {fileID: 2800000, guid: fa042edbfc40fbd4bad0ab9d505b1223, type: 3}
+ - {fileID: 2800000, guid: 896d9004736809c4fb5973b7c12eb8b9, type: 3}
+ - {fileID: 2800000, guid: 179f794063d2a66478e6e726f84a65bc, type: 3}
+ filmGrainTex:
+ - {fileID: 2800000, guid: 654c582f7f8a5a14dbd7d119cbde215d, type: 3}
+ - {fileID: 2800000, guid: dd77ffd079630404e879388999033049, type: 3}
+ - {fileID: 2800000, guid: 1097e90e1306e26439701489f391a6c0, type: 3}
+ - {fileID: 2800000, guid: f0b67500f7fad3b4c9f2b13e8f41ba6e, type: 3}
+ - {fileID: 2800000, guid: 9930fb4528622b34687b00bbe6883de7, type: 3}
+ - {fileID: 2800000, guid: bd9e8c758250ef449a4b4bfaad7a2133, type: 3}
+ - {fileID: 2800000, guid: 510a2f57334933e4a8dbabe4c30204e4, type: 3}
+ - {fileID: 2800000, guid: b4db8180660810945bf8d55ab44352ad, type: 3}
+ - {fileID: 2800000, guid: fd2fd78b392986e42a12df2177d3b89c, type: 3}
+ - {fileID: 2800000, guid: 5cdee82a77d13994f83b8fdabed7c301, type: 3}
+ smaaAreaTex: {fileID: 2800000, guid: d1f1048909d55cd4fa1126ab998f617e, type: 3}
+ smaaSearchTex: {fileID: 2800000, guid: 51eee22c2a633ef4aada830eed57c3fd, type: 3}
+ m_TexturesResourcesVersion: 0
+ - rid: 8545822260705886211
+ type: {class: OnTilePostProcessResource, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
+ data:
+ m_Version: 0
+ m_UberPostShader: {fileID: 4800000, guid: fe4f13c1004a07d4ea1e30bfd0326d9e, type: 3}
+ - rid: 8545822260705886212
+ type: {class: UniversalRenderPipelineRuntimeTerrainShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
+ data:
+ m_Version: 0
+ m_TerrainDetailLit: {fileID: 4800000, guid: f6783ab646d374f94b199774402a5144, type: 3}
+ m_TerrainDetailGrassBillboard: {fileID: 4800000, guid: 29868e73b638e48ca99a19ea58c48d90, type: 3}
+ m_TerrainDetailGrass: {fileID: 4800000, guid: e507fdfead5ca47e8b9a768b51c291a1, type: 3}
+ - rid: 8545822260705886213
+ type: {class: URPReflectionProbeSettings, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Universal.Runtime}
+ data:
+ version: 1
+ useReflectionProbeRotation: 0
+ - rid: 8545822260705886214
+ type: {class: ScreenSpaceAmbientOcclusionDynamicResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
+ data:
+ m_BlueNoise256Textures:
+ - {fileID: 2800000, guid: 36f118343fc974119bee3d09e2111500, type: 3}
+ - {fileID: 2800000, guid: 4b7b083e6b6734e8bb2838b0b50a0bc8, type: 3}
+ - {fileID: 2800000, guid: c06cc21c692f94f5fb5206247191eeee, type: 3}
+ - {fileID: 2800000, guid: cb76dd40fa7654f9587f6a344f125c9a, type: 3}
+ - {fileID: 2800000, guid: e32226222ff144b24bf3a5a451de54bc, type: 3}
+ - {fileID: 2800000, guid: 3302065f671a8450b82c9ddf07426f3a, type: 3}
+ - {fileID: 2800000, guid: 56a77a3e8d64f47b6afe9e3c95cb57d5, type: 3}
+ m_Version: 0
+ - rid: 8545822260705886215
+ type: {class: ScreenSpaceAmbientOcclusionPersistentResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
+ data:
+ m_Shader: {fileID: 4800000, guid: 0849e84e3d62649e8882e9d6f056a017, type: 3}
+ m_Version: 0
+ - rid: 8545822260705886216
+ type: {class: URPTerrainShaderSetting, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
+ data:
+ m_Version: 0
+ m_IncludeTerrainShaders: 1
+ - rid: 8545822260705886217
+ type: {class: RenderingDebuggerRuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime}
+ data:
+ m_version: 0
+ - rid: 8545822260705886218
+ type: {class: WorldRenderPipelineResources, ns: UnityEngine.PathTracing.Core, asm: Unity.PathTracing.Runtime}
+ data:
+ _version: 3
+ _blitCubemap: {fileID: 7200000, guid: 5a992812cb320d146a66cc600200cce7, type: 3}
+ _blitGrayScaleCookie: {fileID: 7200000, guid: 557fa399e33bf7647bda5697c5c158df, type: 3}
+ _setAlphaChannelShader: {fileID: 7200000, guid: 5efaea0e81c66334aa9d062d6573e6fd, type: 3}
+ _environmentImportanceSamplingBuild: {fileID: 7200000, guid: 5bb2534d2411d344cbc54f880232640f, type: 3}
+ _skyBoxMesh: {fileID: 4300000, guid: 0529e6c5f6dea8c4a8c2835ed7de57cb, type: 2}
+ _sixFaceSkyBoxMesh: {fileID: 4300000, guid: a80925ceebd011741b42509226cefc74, type: 2}
+ _buildLightGridShader: {fileID: 7200000, guid: 16e47c1641bd0104e92b624601457bb0, type: 3}
diff --git a/ProjectSettings/GraphicsSettings.asset b/ProjectSettings/GraphicsSettings.asset
index 37ed363..573e08b 100644
--- a/ProjectSettings/GraphicsSettings.asset
+++ b/ProjectSettings/GraphicsSettings.asset
@@ -59,6 +59,8 @@ GraphicsSettings:
m_AlbedoSwatchInfos: []
m_RenderPipelineGlobalSettingsMap:
UnityEngine.Rendering.Universal.UniversalRenderPipeline: {fileID: 11400000, guid: 93b439a37f63240aca3dd4e01d978a9f, type: 2}
+ m_ShaderBuildSettings:
+ keywordDeclarationOverrides: []
m_LightsUseLinearIntensity: 1
m_LightsUseColorTemperature: 1
m_LogWhenShaderIsCompiled: 0
diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset
index 9648f4b..1c256ee 100644
--- a/ProjectSettings/ProjectSettings.asset
+++ b/ProjectSettings/ProjectSettings.asset
@@ -681,11 +681,11 @@ PlayerSettings:
activeInputHandler: 1
windowsGamepadBackendHint: 0
enableDirectStorage: 0
- cloudProjectId:
+ cloudProjectId: f53bdd3c-833a-46a8-ad19-0180dc4af0dd
framebufferDepthMemorylessMode: 0
qualitySettingsNames: []
- projectName:
- organizationId:
+ projectName: My project 2026-07-03_09-07-05
+ organizationId: daefee08
cloudEnabled: 0
legacyClampBlendShapeWeights: 0
hmiLoadingImage: {fileID: 0}
diff --git a/ProjectSettings/ShaderGraphSettings.asset b/ProjectSettings/ShaderGraphSettings.asset
index 10b82f0..0421697 100644
--- a/ProjectSettings/ShaderGraphSettings.asset
+++ b/ProjectSettings/ShaderGraphSettings.asset
@@ -13,6 +13,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
shaderVariantLimit: 128
+ overrideShaderVariantLimit: 0
customInterpolatorErrorThreshold: 32
customInterpolatorWarningThreshold: 16
customHeatmapValues: {fileID: 0}
diff --git a/ProjectSettings/URPProjectSettings.asset b/ProjectSettings/URPProjectSettings.asset
index 08faf03..6ad5631 100644
--- a/ProjectSettings/URPProjectSettings.asset
+++ b/ProjectSettings/URPProjectSettings.asset
@@ -12,4 +12,5 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 247994e1f5a72c2419c26a37e9334c01, type: 3}
m_Name:
m_EditorClassIdentifier:
- m_LastMaterialVersion: 9
+ m_LastMaterialVersion: 10
+ m_ProjectSettingFolderPath: URPDefaultResources