Nacharbeiten aus M1d für die nächsten Pläne #11

Open
opened 2026-10-02 12:50:13 +00:00 by steven · 0 comments
Owner

Die Gesamtprüfung von M1d (#10) hat die Stilproben mit Korrekturen für zusammenführbar erklärt. Die Korrekturen sind im Branch erledigt. Diese Punkte wurden bewusst verschoben: Nach dem Probelauf fallen zwei der drei Stile weg, und der dritte wird angepasst. Anderes wird erst mit den nächsten Plänen wichtig oder ist nur eine Kleinigkeit. Jeder Plan übernimmt seine Punkte in seine Tasks. Die offenen Punkte aus #2, #5 und #8 gelten weiter.

Für M2

  • Der Kern meldet eine Änderung des Geländes (TileChanged) ohne Ursache. Die Hülle hält deshalb jede Änderung, die nicht auf einen eigenen Schlag folgt, für den brechenden Schlag eines anderen Spielers und zeigt Splitter. Sobald M2 das Gelände aus anderen Gründen ändert, etwa durch lebendigen Boden, fliegen bei jeder Änderung Splitter. Der Kern muss die Ursache melden.
    • Dann wird auch die Zählung eigener Schläge (_own_hits in main.gd) einfacher. Heute bleibt ein Eintrag stehen, wenn der Kern einen Schlag nie meldet (volles Inventar beim brechenden Schlag, ein gehaltener Schlag eines Gastes, den ein neuerer ersetzt). Nach einer Neusynchronisierung geht die Zählung verloren. Im schlimmsten Fall fehlt ein Splitterbild oder erscheint doppelt.
  • Figuren nach ihrer Höhe auf dem Bildschirm sortieren. Heute liegt die eigene Figur immer über den anderen (Reihenfolge in main.gd: Karte, Markierung, Figuren, eigene Figur). Bei 24 Pixel hohen Figuren erscheint ein Mitspieler, der eine Kachel südlich von dir steht, hinter dir.
  • Bevor Dinge aus der Vitrine ins Spiel kommen:
    • _vine in pixel_style.gd: Der Schlüssel im Zwischenspeicher übergeht den Ursprung, und das Band wird nur entlang y dicker.
    • Die Vitrine zeigt GROUND, CRACKS, HIT und MARKER nicht; toter Boden steht dort für den Boden.
    • Knopfreihe und Titel der Vitrine haben feste Positionen (für 1280 × 720). In Fenstern unter etwa 700 Pixel Höhe verlassen die Knöpfe den Bildschirm. Besser in _layout() setzen.
    • draw_scene berechnet in jedem Bild 400 Masken und 200 Dictionaries neu, obwohl das Raster feststeht. Sie ließen sich in _read_grid vorberechnen.
    • Showcase._unhandled_input markiert Ereignisse nicht als behandelt.
    • Scheitert die Verbindung eines Gastes, während die Vitrine offen ist, steht der Grund unter der Vitrine. Man sieht ihn erst nach „Zurück“.
    • Kommentare:
      • Der Kommentar zu ZOOM in showcase.gd ist verkehrt herum: Es sind Bildschirmpixel pro Pixel der Szene.
      • „the middle of their foot“ widerspricht _tile_rect.
      • draw_scene prüft art == null, während _ready art.styles ohne Prüfung liest.
      • In art.gd steht, die Vitrine gehe IDS durch. Das tut sie nicht.
    • Testlücken:
      • Die Tasten der Vitrine (1 bis 3, F2, Esc), _redraw_art und die Tastenbelegung sind nicht getestet.
      • Die Schleife über die Beschriftungen besteht auch, wenn caption_keys() leer ist.
      • Der erste Knopfdruck im Test wählt den schon gewählten Stil. Dass die anderen Knöpfe wieder frei werden, prüft kein Test.

Nach dem Probelauf (Grafikstil)

Zwei Stile fallen weg, einer wird angepasst. Danach lohnt sich:

  • Splitter fliegen bei jedem eigenen Schlag auf Fels, auch auf harten Fels und Grundgestein, die die Steinspitzhacke nicht brechen kann. In M1c zeigte so ein Schlag nichts. Die Regel der Werkzeugstufe gehört nicht in die Hülle. Nach dem Probelauf entscheiden; der Fragebogen weist darauf hin.
    • Risse und Splitter haben außerdem immer die Farben des weichen Felses, auch auf hartem Fels, weil CRACKS und HIT die Felsart nicht kennen.
  • Getönte Umrisse (Pastell):
    • _ink() dunkelt die Füllung ab, aber Pixels.outline übergeht die Farbe bei getönten Umrissen. Der Zweig ist tot.
    • Die Ränder von Fels und Rissen nehmen immer die eine Umrissfarbe, obwohl tinted_outlines einen dunkleren Ton verspricht.
  • Glimmen: Die Funken im Gras werden mit put in einer durchscheinenden Farbe gesetzt statt mit shade, deshalb scheint der Boden durch.
  • Toter und lebendiger Boden:
    • Die Risse des toten Bodens werden nach dem Schlagschatten gemalt und sind im Schatten hell.
    • _dead_soil wiederholt zwei Zeilen von _ground.
    • _living_soil gibt _ground kein solid mit, also hat Gras unter Fels keinen Schatten.
  • Untere Umrisse:
    • Die Stiefel füllen Zeile 23 der Figur, ihr unterer Umriss (Zeile 24) fällt in jedem Bild weg. Es flackert nicht und ist vielleicht gewollt.
    • Beim Lebensmoos reichen zwei Polster bis in die unterste Zeile des Bildes (Zeile 12). Dort fehlt der untere Umriss über einige Pixel. Links und rechts hat das Moos seit der Korrekturwelle Platz für seinen Umriss.
  • _rock malt unter jeden Fels eine ganze Bodenkachel, auch im Inneren, wo sie nie zu sehen ist. Bei 64 × 64 Kacheln hat das keine Folgen. Nötig ist sie nur unter Masken mit runder Ecke.
  • Code:
    • pixel_style.gd hat rund 800 Zeilen; Pixels könnte in ein eigenes Skript.
    • Pixels.outline speichert Positionen als Vector3i mit z = 0 statt als Vector2i.
    • Eine Schleifenvariable hat keinen Typ (for leg in [...]).
    • Zwei Kommentare stimmen nicht: Die Ranke heißt „two pixels thick“, ist aber drei Zeilen hoch. Die Pflanze neigt sich laut Kommentar um lean Pixel, oben aber um bis zu zwei.
    • PixelStyle.TILE wiederholt GridMotion.TILE_SIZE, ohne dass ein Test beide verbindet.
  • Tests:
    • Die Stiltests prüfen tinted_outlines, glow und die acht Spielerfarben nicht.
    • Die Farbtests von Pastell und Glimmen wiederholen den von Warm; eine Schleife über alle Stile reicht.
    • Es fehlen Tests für die Figur (Bild, Blickrichtung, Farbe), für Risse, Splitter und Markierung, für harten Fels und Grundgestein und für die Schatten nach Westen und Nordwesten.
    • Es fehlen Tests für die Zweige mit getönten Umrissen und mit Glimmen.
    • Es fehlen Tests für die Dinge der Vitrine: Wachstumsstufe, Neigung, Funkeln, Moos, Ranke, Stein, Ruine und eine gemischte Maske mit lebendigem Boden.

Wenn Bilder von Künstlern kommen (M6)

  • Ein Bild, das eine Zeichnung ersetzt, übergeht den Zustand: das Alter eines Schlags, ob die Markierung erreichbar ist, Blickrichtung und Farbe der Figur, die Punkte der Ranke. Entweder festlegen, welche Kennungen ein Bild ersetzen kann, oder den Zustand beim Zeichnen anwenden.
  • ArtStyle.along() liest points[-1] auch bei einer leeren Liste.
  • Kein Test prüft, dass ein Bild die Zeichnung wirklich ersetzt. Keiner prüft, dass select_next() changed sendet.

Robustheit

Heute ist hier kein Fehler erreichbar, aber jeder Punkt ist billig:

  • Art.style lässt sich setzen, ohne dass changed kommt; ein Test tut das. Ein Setter oder ein Hinweis im Kommentar hilft.
  • Der Platzhalter ArtStyle.player_color kennt zwei Farben, die echten Stile acht.
  • test_tile_shape.gd prüft nur die Nachbarn N, NO, W und SO. Ein Fall mit O, S, SW und NW fehlt.
  • MapView:
    • _burst_layer kommt erst in _ready in den Baum. Ein reload() davor oder das Freigeben einer nie eingefügten Karte geht schief. Besser in _init().
    • Unbekannte Geländecodes erscheinen als Boden statt auffällig wie früher in Magenta.
    • Die Regel, was fest ist, steht zweimal: in map_view.gd und in TileShape.flags.
    • mask_at prüft die Grenzen nicht. Nur Tests nutzen die Funktion.
  • avatar.player wird ohne queue_redraw() gesetzt; ein Setter wäre robuster.
  • Kein Test prüft, dass ein Schlag auf Boden keine Splitter zeigt.
  • Stil speichern:
    • Gespeichert wird bei jedem Art.changed. Wer den schon aktiven Stil wählt, speichert nichts.
    • Ein später zur Laufzeit geladenes Bild würde einen Stil von der Befehlszeile speichern.
    • Es fehlen Tests, dass die Befehlszeile vor dem gespeicherten Stil kommt und dass ein unbekannter gespeicherter Wert zu Warm führt.
    • test_main.gd wiederholt _start_main zweimal von Hand, um die Befehlszeile zu setzen.
  • tools/screenshot.gd:
    • Das Werkzeug nimmt jedes unbekannte Argument als Pfad der Datei, ein vertippter Schalter wird also zum Pfad.
    • Die zweite Figur nutzt die Nummer des eigenen Spielers. Deshalb zeigen die Kartenbilder beide Figuren in derselben Farbe. Eine zweite Farbe bräuchte einen zweiten echten Spieler in der Sitzung.
  • CLAUDE.md sollte sagen, dass der Pfad für das Bildschirmfoto absolut sein muss; sonst landet die Datei unter game/. Die Untergrenze von 5 Sekunden, ab der ENet eine stille Verbindung trennen kann, gehört zu #8.
Die Gesamtprüfung von M1d (#10) hat die Stilproben mit Korrekturen für zusammenführbar erklärt. Die Korrekturen sind im Branch erledigt. Diese Punkte wurden bewusst verschoben: Nach dem Probelauf fallen zwei der drei Stile weg, und der dritte wird angepasst. Anderes wird erst mit den nächsten Plänen wichtig oder ist nur eine Kleinigkeit. Jeder Plan übernimmt seine Punkte in seine Tasks. Die offenen Punkte aus #2, #5 und #8 gelten weiter. ### Für M2 - [ ] Der Kern meldet eine Änderung des Geländes (`TileChanged`) ohne Ursache. Die Hülle hält deshalb jede Änderung, die nicht auf einen eigenen Schlag folgt, für den brechenden Schlag eines anderen Spielers und zeigt Splitter. Sobald M2 das Gelände aus anderen Gründen ändert, etwa durch lebendigen Boden, fliegen bei jeder Änderung Splitter. Der Kern muss die Ursache melden. - Dann wird auch die Zählung eigener Schläge (`_own_hits` in `main.gd`) einfacher. Heute bleibt ein Eintrag stehen, wenn der Kern einen Schlag nie meldet (volles Inventar beim brechenden Schlag, ein gehaltener Schlag eines Gastes, den ein neuerer ersetzt). Nach einer Neusynchronisierung geht die Zählung verloren. Im schlimmsten Fall fehlt ein Splitterbild oder erscheint doppelt. - [ ] Figuren nach ihrer Höhe auf dem Bildschirm sortieren. Heute liegt die eigene Figur immer über den anderen (Reihenfolge in `main.gd`: Karte, Markierung, Figuren, eigene Figur). Bei 24 Pixel hohen Figuren erscheint ein Mitspieler, der eine Kachel südlich von dir steht, hinter dir. - [ ] Bevor Dinge aus der Vitrine ins Spiel kommen: - `_vine` in `pixel_style.gd`: Der Schlüssel im Zwischenspeicher übergeht den Ursprung, und das Band wird nur entlang y dicker. - Die Vitrine zeigt `GROUND`, `CRACKS`, `HIT` und `MARKER` nicht; toter Boden steht dort für den Boden. - Knopfreihe und Titel der Vitrine haben feste Positionen (für 1280 × 720). In Fenstern unter etwa 700 Pixel Höhe verlassen die Knöpfe den Bildschirm. Besser in `_layout()` setzen. - `draw_scene` berechnet in jedem Bild 400 Masken und 200 Dictionaries neu, obwohl das Raster feststeht. Sie ließen sich in `_read_grid` vorberechnen. - `Showcase._unhandled_input` markiert Ereignisse nicht als behandelt. - Scheitert die Verbindung eines Gastes, während die Vitrine offen ist, steht der Grund unter der Vitrine. Man sieht ihn erst nach „Zurück“. - Kommentare: - Der Kommentar zu `ZOOM` in `showcase.gd` ist verkehrt herum: Es sind Bildschirmpixel pro Pixel der Szene. - „the middle of their foot“ widerspricht `_tile_rect`. - `draw_scene` prüft `art == null`, während `_ready` `art.styles` ohne Prüfung liest. - In `art.gd` steht, die Vitrine gehe `IDS` durch. Das tut sie nicht. - Testlücken: - Die Tasten der Vitrine (1 bis 3, F2, Esc), `_redraw_art` und die Tastenbelegung sind nicht getestet. - Die Schleife über die Beschriftungen besteht auch, wenn `caption_keys()` leer ist. - Der erste Knopfdruck im Test wählt den schon gewählten Stil. Dass die anderen Knöpfe wieder frei werden, prüft kein Test. ### Nach dem Probelauf (Grafikstil) Zwei Stile fallen weg, einer wird angepasst. Danach lohnt sich: - [ ] Splitter fliegen bei jedem eigenen Schlag auf Fels, auch auf harten Fels und Grundgestein, die die Steinspitzhacke nicht brechen kann. In M1c zeigte so ein Schlag nichts. Die Regel der Werkzeugstufe gehört nicht in die Hülle. Nach dem Probelauf entscheiden; der Fragebogen weist darauf hin. - Risse und Splitter haben außerdem immer die Farben des weichen Felses, auch auf hartem Fels, weil `CRACKS` und `HIT` die Felsart nicht kennen. - [ ] Getönte Umrisse (Pastell): - `_ink()` dunkelt die Füllung ab, aber `Pixels.outline` übergeht die Farbe bei getönten Umrissen. Der Zweig ist tot. - Die Ränder von Fels und Rissen nehmen immer die eine Umrissfarbe, obwohl `tinted_outlines` einen dunkleren Ton verspricht. - [ ] Glimmen: Die Funken im Gras werden mit `put` in einer durchscheinenden Farbe gesetzt statt mit `shade`, deshalb scheint der Boden durch. - [ ] Toter und lebendiger Boden: - Die Risse des toten Bodens werden nach dem Schlagschatten gemalt und sind im Schatten hell. - `_dead_soil` wiederholt zwei Zeilen von `_ground`. - `_living_soil` gibt `_ground` kein `solid` mit, also hat Gras unter Fels keinen Schatten. - [ ] Untere Umrisse: - Die Stiefel füllen Zeile 23 der Figur, ihr unterer Umriss (Zeile 24) fällt in jedem Bild weg. Es flackert nicht und ist vielleicht gewollt. - Beim Lebensmoos reichen zwei Polster bis in die unterste Zeile des Bildes (Zeile 12). Dort fehlt der untere Umriss über einige Pixel. Links und rechts hat das Moos seit der Korrekturwelle Platz für seinen Umriss. - [ ] `_rock` malt unter jeden Fels eine ganze Bodenkachel, auch im Inneren, wo sie nie zu sehen ist. Bei 64 × 64 Kacheln hat das keine Folgen. Nötig ist sie nur unter Masken mit runder Ecke. - [ ] Code: - `pixel_style.gd` hat rund 800 Zeilen; `Pixels` könnte in ein eigenes Skript. - `Pixels.outline` speichert Positionen als `Vector3i` mit z = 0 statt als `Vector2i`. - Eine Schleifenvariable hat keinen Typ (`for leg in [...]`). - Zwei Kommentare stimmen nicht: Die Ranke heißt „two pixels thick“, ist aber drei Zeilen hoch. Die Pflanze neigt sich laut Kommentar um `lean` Pixel, oben aber um bis zu zwei. - `PixelStyle.TILE` wiederholt `GridMotion.TILE_SIZE`, ohne dass ein Test beide verbindet. - [ ] Tests: - Die Stiltests prüfen `tinted_outlines`, `glow` und die acht Spielerfarben nicht. - Die Farbtests von Pastell und Glimmen wiederholen den von Warm; eine Schleife über alle Stile reicht. - Es fehlen Tests für die Figur (Bild, Blickrichtung, Farbe), für Risse, Splitter und Markierung, für harten Fels und Grundgestein und für die Schatten nach Westen und Nordwesten. - Es fehlen Tests für die Zweige mit getönten Umrissen und mit Glimmen. - Es fehlen Tests für die Dinge der Vitrine: Wachstumsstufe, Neigung, Funkeln, Moos, Ranke, Stein, Ruine und eine gemischte Maske mit lebendigem Boden. ### Wenn Bilder von Künstlern kommen (M6) - [ ] Ein Bild, das eine Zeichnung ersetzt, übergeht den Zustand: das Alter eines Schlags, ob die Markierung erreichbar ist, Blickrichtung und Farbe der Figur, die Punkte der Ranke. Entweder festlegen, welche Kennungen ein Bild ersetzen kann, oder den Zustand beim Zeichnen anwenden. - [ ] `ArtStyle.along()` liest `points[-1]` auch bei einer leeren Liste. - [ ] Kein Test prüft, dass ein Bild die Zeichnung wirklich ersetzt. Keiner prüft, dass `select_next()` `changed` sendet. ### Robustheit Heute ist hier kein Fehler erreichbar, aber jeder Punkt ist billig: - [ ] `Art.style` lässt sich setzen, ohne dass `changed` kommt; ein Test tut das. Ein Setter oder ein Hinweis im Kommentar hilft. - [ ] Der Platzhalter `ArtStyle.player_color` kennt zwei Farben, die echten Stile acht. - [ ] `test_tile_shape.gd` prüft nur die Nachbarn N, NO, W und SO. Ein Fall mit O, S, SW und NW fehlt. - [ ] `MapView`: - `_burst_layer` kommt erst in `_ready` in den Baum. Ein `reload()` davor oder das Freigeben einer nie eingefügten Karte geht schief. Besser in `_init()`. - Unbekannte Geländecodes erscheinen als Boden statt auffällig wie früher in Magenta. - Die Regel, was fest ist, steht zweimal: in `map_view.gd` und in `TileShape.flags`. - `mask_at` prüft die Grenzen nicht. Nur Tests nutzen die Funktion. - [ ] `avatar.player` wird ohne `queue_redraw()` gesetzt; ein Setter wäre robuster. - [ ] Kein Test prüft, dass ein Schlag auf Boden keine Splitter zeigt. - [ ] Stil speichern: - Gespeichert wird bei jedem `Art.changed`. Wer den schon aktiven Stil wählt, speichert nichts. - Ein später zur Laufzeit geladenes Bild würde einen Stil von der Befehlszeile speichern. - Es fehlen Tests, dass die Befehlszeile vor dem gespeicherten Stil kommt und dass ein unbekannter gespeicherter Wert zu Warm führt. - `test_main.gd` wiederholt `_start_main` zweimal von Hand, um die Befehlszeile zu setzen. - [ ] `tools/screenshot.gd`: - Das Werkzeug nimmt jedes unbekannte Argument als Pfad der Datei, ein vertippter Schalter wird also zum Pfad. - Die zweite Figur nutzt die Nummer des eigenen Spielers. Deshalb zeigen die Kartenbilder beide Figuren in derselben Farbe. Eine zweite Farbe bräuchte einen zweiten echten Spieler in der Sitzung. - [ ] `CLAUDE.md` sollte sagen, dass der Pfad für das Bildschirmfoto absolut sein muss; sonst landet die Datei unter `game/`. Die Untergrenze von 5 Sekunden, ab der ENet eine stille Verbindung trennen kann, gehört zu #8.
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: steven/Grovewright#11