Skip to content

feat(ui): eine Ressourcenleiste für Aetherium, Decke und Strom (#137) - #139

Merged
cubetribe merged 1 commit into
mainfrom
feat/s23-hud
Aug 31, 2026
Merged

feat(ui): eine Ressourcenleiste für Aetherium, Decke und Strom (#137)#139
cubetribe merged 1 commit into
mainfrom
feat/s23-hud

Conversation

@cubetribe

Copy link
Copy Markdown
Collaborator

Warum

Aus der Proberunde des Inhabers vom 31.08.2026 auf Build 97e5459:

„Mir fehlt ein globales Overlay, in dem man sieht, wie viel Strom man hat, vor allem auch wie viel Lagerplatz man noch hat."

Fixes #137

Bisher erfuhr der Spieler seinen Zustand nur an Stellen, die dafür nicht gemacht sind: den Kontostand in der Baukarte, wo er Knöpfe sperrt; Strom und Lagerdecke ausschließlich in der DebugHud, teils erst hinter F3 — einem Entwicklerwerkzeug. Die Lagerdecke stand nirgends im Spiel-UI.

Damit waren drei Regeln unsichtbar, die aktiv in die Partie eingreifen:

  • der Verfall über der Decke (D-024) — der Grund, warum in derselben Runde Material vernichtet wurde, ohne dass es jemand sehen konnte (#136)
  • der Strommangel — halbiert die Reparaturrate und schaltet den Radar ab (16.6/C4); ohne Anzeige ist eine langsamere Reparatur ein Rätsel
  • das Startguthaben über der Decke (#131)

Was die Leiste zeigt

  • Aetherium: Bestand und Decke. 2.318 / 3.000 liest sich sofort als „darüber"; 2.318 allein sagt nichts. Die Decke kommt immer aus CapacityFor — nirgends steht eine Zahl fest, denn sie wächst mit jedem Lager und fällt, wenn eines zerstört wird.
  • Strom: Erzeugung gegen Verbrauch mit erkennbarem Mangelzustand.
  • Ein Warnzustand, wenn die Decke erreicht ist — der Moment, in dem der Spieler handeln muss, und der einzige, in dem eine Zahl allein nicht reicht.

Wie es gebaut ist

Die Formatier- und Zustandslogik liegt in Gameplay/UI/ResourceBarPresenter als reine, Unity-freie Funktionen, die Presentation/UI/ResourceBarHud nur noch zeichnet. Dasselbe Muster, das Paket 21.5 mit CommandCardPresenter etabliert hat: was in OnGUI hängt, kann niemand testen; was daneben liegt, schon. 19 neue EditMode-Tests decken den Presenter ab.

Die Leiste steht bewusst nicht in IsPointerOverHud: sie ist eine reine Anzeige und schluckt keine Klicks. Die Entscheidung samt Begründung steht im Docstring, nicht nur hier.

Im Szenengenerator wird sie als letzte Komponente hinzugefügt — die AddComponent-Reihenfolge ist die OnGUI-Malreihenfolge, sie zeichnet also über der Debug-Statuszeile statt darunter.

Nachweis — erstmals in Unity gefahren

Das ist der Teil, der bei den letzten Paketen offen bleiben musste:

  • Unity EditMode: 648/648 grün, null Kompilierfehler. 629 vorher plus die 19 neuen. Die HUD-Komponente kompiliert also wirklich, nicht nur „gelesen und für gut befunden".
  • dotnet test tools/Nova.SimRunner.Tests: 739/739 grün, unverändert — diese Kette kompiliert Presentation/ gar nicht mit und belegt hier nur, dass nichts in die Simulation durchgeschlagen ist.
  • Die Bootstrap-Szene ist neu erzeugt, sonst erscheint die Leiste in keinem Build.

Nicht belegt und nur am Bildschirm zu klären: wie die Leiste aussieht und ob sie sich mit anderen Flächen beißt. Bekannte Nachbarschaft, bewusst in Kauf genommen: bei geöffnetem F3-Panel und sehr schmalem Fenster und zwei gleichzeitigen Warnungen kann sie das Debug-Panel überlappen. F3 ist Entwicklersicht; die Leiste weicht dafür keiner Spiel-Fläche aus.

Zwei Nebenwirkungen der Szenenerzeugung

  • MAP_Glutrinne.asset bekommt 10 Zeilen dazu. Das ist die Wirkung von Paket 22.3: seit #125 liest der Generator die Feldlage aus MatchBootstrap statt sie zu wiederholen — das Asset trägt jetzt die 15 Vorkommen statt der alten 5. Der erste Beleg, dass die Korrektur greift.
  • UniversalRenderPipelineGlobalSettings.asset wurde bewusst zurückgesetzt. Unity hat die Datei beim Frischimport neu serialisiert und dabei eine Laufzeitliste geleert. Das hat mit diesem PR nichts zu tun und könnte das Rendering ändern — es gehört nicht heimlich mit hinein.

Herkunft

Erarbeitet von Kimi K3 als delegiertem Worker (Presenter, HUD, Tests). Verdrahtung im Szenengenerator, Szenenerzeugung und der Unity-Testlauf vom Orchestrator.

@cubetribe
cubetribe merged commit 4cb9145 into main Aug 31, 2026
6 checks passed
@cubetribe
cubetribe deleted the feat/s23-hud branch August 31, 2026 08:24
cubetribe added a commit that referenced this pull request Aug 31, 2026
…ägt das Startguthaben (#136, #131) (#141)

## Warum

Aus der Proberunde des Inhabers vom 31.08.2026 auf Build `97e5459`:

> „Ich hatte den Fall, dass das Lager voll ist, aber die Sammler fahren weiter. Die ernten ab, bringen das zur Raffinerie, aber das erhöht den Kontostand nicht. Das vernichtet Material."

Fixes #136
Fixes #131

## #136 — gebremst wird beim Aufnehmen, nicht beim Abliefern

Genau so war es implementiert, und die Einzahlungsdeckelung ist gewollt (D-024, „Überschuss verfällt"). Was die Regel nicht vorsah: dass der Sammler trotzdem weiterfährt. Seit die Vorkommen endlich sind (#80) ging dabei nicht nur die Fahrt verloren, sondern **der Rohstoff selbst** — das Feld hatte die Menge bereits abgegeben, unwiederbringlich, während der Spieler zusah und es für Fortschritt hielt.

Der Sammler hält jetzt **beim Aufnehmen** an, nicht erst beim Abliefern. Das ist die ehrlichere Stelle: was nie abgebaut wurde, ist nicht verloren. Er behält Auftrag und Ladung, und nimmt die Arbeit von selbst wieder auf, sobald Platz ist — durch ein neues Lager oder schlicht durch Ausgeben. Drei Tests pinnen den Halt, **beide** Wege der Wiederaufnahme und die Grenze „1 AE Platz heißt arbeiten"; ein Sammler, der nach dem Lagerbau nicht wieder anfängt, wäre schlimmer als das Problem.

**Was ausdrücklich bleibt:** dass der Überschuss verfällt. Das ist D-024. Geändert hat sich nur, ob überhaupt noch abgebaut wird.

## #131 — die Decke trägt wieder, was das Spiel austeilt

`HqBaseCapacityAE` steigt von 2.000 auf 3.000 AE.

Die Herkunft ist die eigentliche Geschichte: die 3.000 AE Startguthaben kamen mit **D-077** als bewusst gesetzter Eröffnungspuffer, die 2.000er-Decke erst viel später mit **D-024 / Sprint 16.4**. Beide Konstanten taten genau, was ihre Entscheidung sagte — nur hob die zweite die erste auf, und niemandem fiel es auf. Ein Drittel des Startguthabens verdampfte in den ersten fünfzehn Sekunden jeder Partie.

Bewusst in Kauf genommen: das Lagergebäude wird früh weniger wertvoll, weil man erst ab 3.000 eines braucht.

**Der eigentliche Ertrag ist der Test, den es bis heute nicht gab.** Kein Test sah Startguthaben und Decke zusammen — genau deshalb blieb der Widerspruch drei Wochen stehen. Er ist jetzt da.

## Die nachgezogenen Pins — jeder einzeln begründet

| Pin | alt → neu | warum |
|---|---|---|
| `SellStorage_…` | 4000 → **4050** | Mit der höheren Decke passt die ganze 150-AE-Rückerstattung, vorher nur 100 davon |
| `SellStorage_…` Verfall | 3500 → **3788** | Der Überschuss nach dem Verkauf ist 1.050 statt 2.000 |
| `CurrentRulesHash_MovesPastRevisionTwo…` | `0x05CCA847…` → **`0xD1B68383…`** | `HqBaseCapacityAE` ist eine gehashte Regelkonstante — die Bewegung ist der Zweck |
| `RulesRevisionOneAndTwo…` (Rev 1 + 2) | siehe unten | **Das ist keine gewöhnliche Neusetzung** |
| `CanonicalAiMatch_DecidesOnThePinnedTick…` | `0x10B83E94…` → **`0x4A861D9F…`** | **Arns Datei**, siehe unten |
| `StartField_…` (4 Tests) | Werte **unverändert** | Die Fixture war kaputt, nicht die Messung |

### Die Startfeld-Messung: Fixture repariert, Zahlen unverändert

Die vier 21.3-Tests schlugen mit „field not exhausted after 20000 ticks" fehl — das Feld wurde **nie** leer. Grund: `CapacityFor` liefert für einen Slot **ohne fertiges HQ** eine Decke von **null**, und die Fixture spawnte nur eine Raffinerie. Seit #136 heißt das „permanent voll", also rührte sich kein Sammler mehr.

Die Fixture bekommt deshalb ein HQ und einen Verbraucher, der das Konto jeden Tick leert. Beides stellt her, was sie immer zu messen behauptete: wie lange das **Feld** bei reiner Ernterate trägt, mit der Lagerdecke bewusst aus der Frage heraus. **Die gepinnten Tickzahlen sind unverändert** (4527 / 2263 / 1509) — die Erntedynamik hat sich nie geändert, nur die Bedingung, unter der sie pausiert.

### Die Revision-Pins überstreichen einen bekannten Defekt

`RulesRevisionOneAndTwo_GoldenHashesRemainByteStable` sichert zu, dass die **historischen** Regel-Revisionen eingefroren sind. Eine Änderung an einer **heutigen** Konstante hat sie bewegt — weil `ComputeRulesHash64` für jede Revision die heutigen Konstanten hasht und nur die Feldzahl historisch ist. Das ist [#138](#138).

Die Neusetzung macht den Test grün. **Sie macht die Zusicherung nicht wieder wahr.** Damit das der nächste Leser nicht übersieht, steht der Verweis auf #138 jetzt als Kommentar direkt an der Zusicherung — ein sauberer grüner Test an dieser Stelle wäre irreführend.

### Der gepinnte KI-Ausgang gehört dem Einheitenstrang

`CanonicalAiOutcomeTests` ist **Arns Datei**. Die Wirtschaftsänderung bewegt die kanonische Partie, und das ist exakt Risiko **R-3** aus Sprint 21, das hier eintritt. Der Pin ist nachgezogen, damit die Kette grün ist — **das Merge-Fenster, das ihn bewegt hat, ist dieses hier.** Wer den alten Wert sucht: `0x10B83E94F86F2E55`.

## Nachweis

- `dotnet test tools/Nova.SimRunner.Tests -c Release`: **754/754 grün**, vom Orchestrator gefahren
- Keine der vier vom `baseline-guard` geschützten Golden-Byte-Dateien ist berührt — kein `baseline-reset-approved` nötig. Alle Bewegungen sind Erwartungswerte, und der Wächter sagt in seinem eigenen Kommentar, dass eine Testanpassung für sich keine Verhaltensänderung ist
- **Nicht belegt:** die EditMode-Spiegel sind mitgezogen, aber nicht gelaufen — und wie sich der pausierende Sammler anfühlt, kann kein Test sagen. Er braucht die Sichtbarkeit aus [#139](#139), die dafür schon auf `main` liegt

## Herkunft

Erarbeitet von **Kimi K3** als delegiertem Worker; die acht roten Tests hat er gemeldet statt grün gemacht, mit alten und neuen Werten. Die Pins, die Fixture-Reparatur und der #138-Vermerk stammen vom Orchestrator.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Kein globales Overlay für Strom und Lagerplatz — drei wirksame Regeln sind für den Spieler unsichtbar

1 participant