Commit graph

16 commits

Author SHA1 Message Date
0396ec83c6 Features: Opacity, Angelhaken, Predation, wl-relative Positionen, Resize-Fix
- _write_all(): Partial-Write-Fix (O_NONBLOCK stdin → stdout in iTerm2 PTY)
- Canvas.put_sprite(): opaque-Modus — nur Interior-Spaces werden schwarz gemalt,
  Leading/Trailing-Spaces bleiben transparent (kein schwarzer Block hinter Tieren)
- Entity: opaque=True als Default; Wellen/Schloss/Seegras explizit opaque=False
- wl = max(3, rows//3 - 3): Wasserlinie 3 Zeilen höher
- Fischanzahl: max(6, underwater_rows * cols // 320)
- Oberflächenobjekte (Schiff, Wal, Nessi, Schwan) mit wl-relativem y — bleiben
  bei Resize auf der Wasseroberfläche
- add_fishhook(): neu als Frame-Animation (Schnur wächst/schrumpft per Frame);
  weißes Schnur-Mask + gelber Haken (default_color y)
- _check_fishing(): Haken erkennt Fisch-Kollision, springt zur Rückzugsphase,
  injiziert Fisch-Zeile in verbleibende Frames → Fisch hängt am Haken
- _check_predation(): Hai frisst immer (mit Blut); --bloody aktiviert big_fish
  als weiteren Räuber; --vegan = keine Räuber
- HookEntity entfernt (ersetzt durch Frame-Animation)
- big_fish: entity_type gesetzt für Kollisionserkennung
- Krabbe: y = gy+1 (eine Zeile tiefer)
- Canvas.render(): \033[K am Ende jeder Zeile — löscht letzte Spalte ohne
  Pending-Wrap; behebt Stale-Content nach Resize
- \033[r beim Start: Scroll-Region-Reset
- --ruler Flag für Diagnose
2026-03-29 18:39:12 +02:00
d87088eff0 Fix: Pending-Wrap-Kaskade in iTerm2 behoben
render() schrieb pro Nicht-Letzte-Zeile exakt self.cols Zeichen → Cursor
landet in Pending-Wrap-Zustand. In iTerm2 löscht ein Cursor-Positionierungs-
befehl (_go) diesen Zustand NICHT: das erste Zeichen der nächsten Zeile
triggert den Wrap → Zeile r+1 landet auf r+2 usw. → Kaskade.

Folgen: Zeilen ohne Überschreibung zeigen alte Zeichen (Fragmente oberhalb
der Wasserlinie), Unterwasserinhalt verschiebt sich aus dem sichtbaren
Bereich (nichts unter der Wasserlinie sichtbar).

Fix: letztes Zeichen jeder Zeile grundsätzlich auslassen (col_limit =
cols - 1, für alle Zeilen). Pending-Wrap tritt nie auf. Letzte Spalte
bleibt leer, was für die Animation völlig akzeptabel ist.
2026-03-29 15:34:31 +02:00
66671eda8b Fix: Wal springt nicht mehr, Farben korrekt
Alle 12 Frames normalisiert auf 8 Zeilen (3 Fontäne + 1 Separator + 4 Körper).
Vorher variierten die Frame-Höhen (6–8 Zeilen), sodass der Körper zwischen
Zeilen 2/3/4 sprang. Maske hatte 7 Zeilen → bei 8-Zeilen-Frames um 1 Zeile
versetzt → falsche Körperfarben.

- mask_r/l: leere Trennzeile zwischen Fontänen-Farben und Körper-Farben
- Fontänen-Zeilen auf genau 3 aufgefüllt (oben mit Leerstrings)
- Frames direkt als Listen gebaut statt über _p()-String-Konkatenation

Außerdem aus vorheriger Session:
- add_all_fish: Anzahl relativ zu wl (statt hardcodiert)
- main: Terminalgröße erst nach ALT_ON lesen (Split-Pane-Fix)
- --debug Flag
2026-03-29 15:20:18 +02:00
177e66c626 Fix: WRAP_OFF durch Last-Cell-Skip ersetzen
WRAP_OFF (ESC[?7l) verhinderte Scrollback, blockierte aber in iTerm2
die Darstellung der unteren Bildschirmhälfte.

Stattdessen: die allerletzte Zelle (Zeile rows-1, Spalte cols-1)
wird nicht beschrieben – ncurses-Standardansatz. Kein Auto-Wrap,
kein Scrollback, keine Darstellungsprobleme.
2026-03-29 11:28:14 +02:00
860fb7b3dd Fix: Wasseroberfläche proportional zur Terminalhöhe (rows//3)
Hardcodiertes wl=5 ließ bei kleinen Terminals (~10 Zeilen) nur
1-2 Zeilen Unterwasserraum. Wie im Perl-Original: wl=rows//3.

- add_environment: y=wl+i statt y=i+5
- Alle Spawn-y für Fische/Haie/Taucher usw.: wl+4 als Minimum
- Delfine: start_ys relativ zu wl
- Enten: y=wl statt y=5
- Castle nur bei rows>=20 (passt sonst nicht ins Terminal)
2026-03-29 11:20:12 +02:00
0ca2bf109d Fix: ESC[2J aus Frame-Rendering entfernt verhindert Scrollback
ESC[2J schiebt in iTerm2 den Bildschirminhalt bei jedem Aufruf
in den Scrollback-Puffer – 10x/Sekunde. Da render() ohnehin
jede Zelle überschreibt, genügt ESC[H (Cursor-Home).
2026-03-29 11:10:50 +02:00
7c1f401a9b Fix: Autowrap deaktivieren verhindert Scrollback-Overflow
Beim Beschreiben der letzten Spalte der untersten Terminal-Zeile
löst automatischer Zeilenumbruch ein Scroll-Event aus. Bei 10 fps
füllt sich der Scrollback-Puffer kontinuierlich.

WRAP_OFF (ESC[?7l) beim Start, WRAP_ON (ESC[?7h) beim Beenden.
2026-03-29 11:07:16 +02:00
46402b64f9 Fix: Delfine tauchen jetzt unter die Wasseroberfläche
start_ys=[8,2,5] ließ Delfine nur zwischen y=1 und y=8 pendeln –
genau an der Wasseroberfläche (Wellen bei y=5-8), nie darunter.

Neuer Bogen [10,4,7]: Amplitude ±7, Zentrum y=10.
Delfine spannen y=3 (über den Wellen) bis y=10 (unter Wasser)
und durchqueren die Oberfläche in beiden Phasen.
2026-03-29 11:02:09 +02:00
79f42a5f1e Fix: add_seaweed death_cb als Lambda statt gebundener Methode 2026-03-29 10:38:45 +02:00
0730afcb1c Fix: Screen-Clear vor jedem Frame, mehr Fische
- canvas.render() startet jetzt mit \033[2J um das gesamte Terminal zu löschen,
  nicht nur die Canvas-Breite (verhindert Trails bei breiten Terminals)
- add_all_fish(): min 8 Fische statt 1, dichtere Formel (//200 statt //350)
2026-03-29 10:37:59 +02:00
1f053822ff Krabbe: ASCII-only, weiter sichtbar; Taucher (Scuba-Diver) neu
- Krabben-Zeichen von '°' (non-ASCII, wide-char-Problem) auf '.' umgestellt
- steps_out 14→22: Krabbe läuft weiter aus dem Schloss heraus
- add_diver(): Scuba-Taucher mit 2-Frame-Animation, Sauerstoffblasen beim Tod
2026-03-29 10:19:34 +02:00
566bbd9d0e README: Installation, Parameter, Tiere, Unterschiede zum Perl-Original 2026-03-29 10:06:33 +02:00
72beb622bf Neue Features: --bloody, --vegan, --no-shark, --no-ship, --speed, --any-key, Seepferdchen, Tintenfisch, Krabbe am Schlosstor
- CLI-Parameter via argparse: --speed (TICK-basiert), --no-shark, --no-ship,
  --bloody (Hai frisst Fische mit Splat-Animation), --vegan (keine Räuber),
  --any-key (beliebige Taste beendet)
- Config-Dataclass: wird durch Aquarium durchgereicht, steuert random_fns
- CrabEntity: Krabbe läuft aus Schlosstor heraus und kehrt zurück
- Portcullis-Animation: Falltor öffnet/schließt sich vor/nach der Krabbe
- Neue Tiere: add_seahorse (Seepferdchen), add_squid (Tintenfisch)
- entity_type für Fish und Shark für Kollisionserkennung
2026-03-29 09:50:11 +02:00
7319d26129 fix whale direction and populate fish on-screen at startup
Whale body/spout-alignment logic was inverted (not going_right → wrong
direction). Initial fish population now starts distributed on-screen
instead of all off-screen edges, so the aquarium is immediately filled.
2026-03-29 09:26:18 +02:00
9f3f754921 asciiquarium-ng: rewrite as faithful 1:1 Python port of Perl original
Same sprites, same colors, same entity timing as the Perl source.
Replaces Curses with direct ANSI truecolor escapes using the same
RGB values as our Homebrew fix (xterm-256 slots 16-231).
2026-03-28 20:43:18 +01:00
cbfa1745b7 asciiquarium-ng: initial Python implementation with true RGB colors
Single-file animation engine: Canvas with per-cell true-color, ocean
gradient background, waves, castle, seaweed, fish, shark, jellyfish,
ship, bubbles. No Curses dependency — pure ANSI escape codes.
2026-03-28 20:24:30 +01:00