Original-Spieldateien nach game/original/ verschoben
raw/ -> game/original/ (die Original-DOS-Dateien liegen jetzt neben dem Code, der sie liest). Bleibt gitignored -- ist das Original-Spiel selbst, gehoert nicht ins Repo. Nachgezogen: - Default-DAT-Pfad in game/intro.py, tools/dat_extract.py, tools/render_assets.py -> game/original/PCKELL.DAT (KELLOGG_DAT-Override unveraendert). - .gitignore: raw/ -> game/original/. - Docstrings (game/audio.py, game/__init__.py), dosbox/dosbox.conf-Mountpfad, README-Struktur/Verweise angepasst. tfmx_player: KEINE Aenderung -- der Quellcode ist bereits getrackt (benoetigt), nur das kompilierte Binary render_tfmx bleibt bewusst gitignored (plattform- spezifisch, wird von build.sh automatisch neu gebaut). Verifiziert: python -m game --once (headless) exit 0 mit neuem Pfad. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
327236e277
commit
4e4110b67b
+2
-2
@@ -1,11 +1,11 @@
|
|||||||
# Original-Spieldateien (copyrighted, gehoeren nicht ins Repo)
|
# Original-Spieldateien (copyrighted, gehoeren nicht ins Repo)
|
||||||
raw/
|
game/original/
|
||||||
extracted_pre/
|
extracted_pre/
|
||||||
extracted_dat/
|
extracted_dat/
|
||||||
*.ppm
|
*.ppm
|
||||||
|
|
||||||
# Gerenderte Original-Musik (TFMX->WAV) -- ist Original-Spielmaterial,
|
# Gerenderte Original-Musik (TFMX->WAV) -- ist Original-Spielmaterial,
|
||||||
# wird lokal gecacht, nicht committed (wie raw/extracted_dat)
|
# wird lokal gecacht, nicht committed (wie game/original/ und extracted_dat)
|
||||||
audio_cache/
|
audio_cache/
|
||||||
game/tfmx_player/render_tfmx
|
game/tfmx_player/render_tfmx
|
||||||
game/tfmx_player/*.o
|
game/tfmx_player/*.o
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ lauffähige Neuimplementierung auf modernem x64, ohne DOS/DOSBox/QEMU — das
|
|||||||
Original crasht in unserer FreeDOS-VM (RTM.EXE-Engine vs. QEMU-VGA-Emulation).
|
Original crasht in unserer FreeDOS-VM (RTM.EXE-Engine vs. QEMU-VGA-Emulation).
|
||||||
|
|
||||||
Das Remake liest die Grafiken, Sprites, Level und Musik **direkt aus den
|
Das Remake liest die Grafiken, Sprites, Level und Musik **direkt aus den
|
||||||
Original-Spieldateien** (`raw/PCKELL.DAT`) und dekodiert sie zur Laufzeit — es
|
Original-Spieldateien** (`game/original/PCKELL.DAT`) und dekodiert sie zur Laufzeit — es
|
||||||
werden keine vorab entpackten Assets benötigt.
|
werden keine vorab entpackten Assets benötigt.
|
||||||
|
|
||||||
## Status
|
## Status
|
||||||
@@ -26,8 +26,9 @@ Format-Details steht in [NOTES.md](NOTES.md).
|
|||||||
„Kellogg's Tony and Friends in Kellogg's Land" war ein kostenloses Werbespiel
|
„Kellogg's Tony and Friends in Kellogg's Land" war ein kostenloses Werbespiel
|
||||||
und ist innerhalb Deutschlands frei kopierbar. Die im Repo enthaltenen
|
und ist innerhalb Deutschlands frei kopierbar. Die im Repo enthaltenen
|
||||||
gerenderten Musik-WAVs (`audio/`) wurden lediglich aus den Original-Daten
|
gerenderten Musik-WAVs (`audio/`) wurden lediglich aus den Original-Daten
|
||||||
extrahiert. Die eigentlichen Original-Spieldateien (`raw/`) sind **nicht** im
|
extrahiert. Die eigentlichen Original-Spieldateien (`game/original/`) sind
|
||||||
Repo (siehe `.gitignore`) — sie werden lokal benötigt, um das Remake zu starten.
|
**nicht** im Repo (siehe `.gitignore`) — sie werden lokal benötigt, um das
|
||||||
|
Remake zu starten.
|
||||||
|
|
||||||
Der TFMX-Musik-Renderer unter [game/tfmx_player/](game/tfmx_player/) ist
|
Der TFMX-Musik-Renderer unter [game/tfmx_player/](game/tfmx_player/) ist
|
||||||
Fremdcode (MIT-Lizenz, © Peter Fors) und liegt mit seiner LICENSE bei. Die
|
Fremdcode (MIT-Lizenz, © Peter Fors) und liegt mit seiner LICENSE bei. Die
|
||||||
@@ -41,7 +42,7 @@ der Python-Code hier ist eine eigenständige Neuimplementierung.
|
|||||||
- `Pillow` (PCX-Dekodierung), `numpy` (optional, für den Scanline-Effekt im Intro)
|
- `Pillow` (PCX-Dekodierung), `numpy` (optional, für den Scanline-Effekt im Intro)
|
||||||
- `gcc` (einmalig, um den TFMX-Renderer zu bauen — passiert automatisch beim
|
- `gcc` (einmalig, um den TFMX-Renderer zu bauen — passiert automatisch beim
|
||||||
ersten Start)
|
ersten Start)
|
||||||
- Die Original-Datei `PCKELL.DAT` unter `raw/` (nicht im Repo)
|
- Die Original-Datei `PCKELL.DAT` unter `game/original/` (nicht im Repo)
|
||||||
|
|
||||||
```
|
```
|
||||||
sudo apt install python3-pygame python3-pil python3-numpy gcc
|
sudo apt install python3-pygame python3-pil python3-numpy gcc
|
||||||
@@ -71,6 +72,7 @@ game/ Das eigentliche Spiel (startbar per `python -m game`)
|
|||||||
audio.py Wrapper um den TFMX-Musik-Renderer (rendert & cached WAVs)
|
audio.py Wrapper um den TFMX-Musik-Renderer (rendert & cached WAVs)
|
||||||
intro.py Boot-/Intro-Sequenz
|
intro.py Boot-/Intro-Sequenz
|
||||||
tfmx_player/ MIT-lizenzierter C-Renderer für TFMX-Musik
|
tfmx_player/ MIT-lizenzierter C-Renderer für TFMX-Musik
|
||||||
|
original/ Original-DOS-Spieldateien (PCKELL.DAT etc.) — NICHT im Repo
|
||||||
tools/ Reine Dev-Werkzeuge (Assets auspacken / als PNG ansehen)
|
tools/ Reine Dev-Werkzeuge (Assets auspacken / als PNG ansehen)
|
||||||
dat_extract.py PCKELL.DAT → alle 178 Einzeldateien (nach extracted_dat/)
|
dat_extract.py PCKELL.DAT → alle 178 Einzeldateien (nach extracted_dat/)
|
||||||
pcc_to_png.py Eine PCC-Bilddatei → PNG
|
pcc_to_png.py Eine PCC-Bilddatei → PNG
|
||||||
@@ -80,7 +82,6 @@ preview/ Vorab gerenderte Assets zum Ansehen/Anhören (Archiv, KEIN
|
|||||||
png_out/ Vorab gerenderte PCC-Bilder
|
png_out/ Vorab gerenderte PCC-Bilder
|
||||||
render_out/ Vorab gerenderte BOB (Sprites) / ICO (Tiles) / MAP (Level)
|
render_out/ Vorab gerenderte BOB (Sprites) / ICO (Tiles) / MAP (Level)
|
||||||
audio/ Aus PCKELL.DAT gerenderte Musik-WAVs
|
audio/ Aus PCKELL.DAT gerenderte Musik-WAVs
|
||||||
raw/ Original-Spieldateien (PCKELL.DAT etc.) — NICHT im Repo
|
|
||||||
dosbox/ DOSBox-Konfiguration zum Laufenlassen des Originals (Referenz)
|
dosbox/ DOSBox-Konfiguration zum Laufenlassen des Originals (Referenz)
|
||||||
NOTES.md Vollständiges Reverse-Engineering-Log
|
NOTES.md Vollständiges Reverse-Engineering-Log
|
||||||
```
|
```
|
||||||
|
|||||||
+4
-1
@@ -10,6 +10,9 @@ dma=1
|
|||||||
hdma=5
|
hdma=5
|
||||||
|
|
||||||
[autoexec]
|
[autoexec]
|
||||||
mount c ~/kellogg_remake/raw
|
# Pfad zu den Original-DOS-Dateien (relativ zum Repo-Wurzelverzeichnis,
|
||||||
|
# also DOSBox aus dem Projektordner heraus starten). Bei Bedarf durch einen
|
||||||
|
# absoluten Pfad ersetzen.
|
||||||
|
mount c game/original
|
||||||
c:
|
c:
|
||||||
START.EXE
|
START.EXE
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
"""Tony & Friends in Kellogg's Land -- plattformunabhaengiges Remake.
|
"""Tony & Friends in Kellogg's Land -- plattformunabhaengiges Remake.
|
||||||
|
|
||||||
Laufzeit-Package des Spiels. Enthaelt:
|
Laufzeit-Package des Spiels. Enthaelt:
|
||||||
formats.py -- Parser/Decoder fuer die Original-Assets aus raw/PCKELL.DAT
|
formats.py -- Parser/Decoder fuer die Original-Assets aus original/PCKELL.DAT
|
||||||
(PCC-Bilder, BOB-Sprites, ICO-Tilesets, MAP-Level, Paletten).
|
(PCC-Bilder, BOB-Sprites, ICO-Tilesets, MAP-Level, Paletten).
|
||||||
audio.py -- Wrapper um den TFMX-Musik-Renderer (tfmx_player/).
|
audio.py -- Wrapper um den TFMX-Musik-Renderer (tfmx_player/).
|
||||||
intro.py -- die Boot-/Intro-Sequenz (Rauser -> Factor5 -> Kellogg's ->
|
intro.py -- die Boot-/Intro-Sequenz (Rauser -> Factor5 -> Kellogg's ->
|
||||||
|
|||||||
+1
-1
@@ -15,7 +15,7 @@ funktionierender, korrekt lizenzierter Renderer ist hier der pragmatische
|
|||||||
Weg statt TFMX in Python neu zu erfinden.
|
Weg statt TFMX in Python neu zu erfinden.
|
||||||
|
|
||||||
Gerenderte WAVs sind urheberrechtlich das Original-Spielmaterial (Musik),
|
Gerenderte WAVs sind urheberrechtlich das Original-Spielmaterial (Musik),
|
||||||
werden daher NICHT ins Git-Repo committed (wie raw/ und extracted_dat/) --
|
werden daher NICHT ins Git-Repo committed (wie game/original/ und extracted_dat/) --
|
||||||
liegen nur lokal im Cache-Verzeichnis.
|
liegen nur lokal im Cache-Verzeichnis.
|
||||||
|
|
||||||
MEHRERE SONGS PRO MODUL (Fund 22.07.2026 abends, Stefans Hinweis "das Spiel
|
MEHRERE SONGS PRO MODUL (Fund 22.07.2026 abends, Stefans Hinweis "das Spiel
|
||||||
|
|||||||
+1
-1
@@ -126,7 +126,7 @@ except ImportError:
|
|||||||
HAVE_NUMPY = False
|
HAVE_NUMPY = False
|
||||||
|
|
||||||
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
DAT_PATH = os.environ.get('KELLOGG_DAT', os.path.join(PROJECT_ROOT, 'raw', 'PCKELL.DAT'))
|
DAT_PATH = os.environ.get('KELLOGG_DAT', os.path.join(PROJECT_ROOT, 'game', 'original', 'PCKELL.DAT'))
|
||||||
|
|
||||||
WINDOW_W, WINDOW_H = 960, 720
|
WINDOW_W, WINDOW_H = 960, 720
|
||||||
BG_COLOR = (0, 0, 0)
|
BG_COLOR = (0, 0, 0)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import struct, os
|
|||||||
from collections import Counter
|
from collections import Counter
|
||||||
|
|
||||||
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
SRC = os.environ.get('KELLOGG_DAT', os.path.join(PROJECT_ROOT, 'raw', 'PCKELL.DAT'))
|
SRC = os.environ.get('KELLOGG_DAT', os.path.join(PROJECT_ROOT, 'game', 'original', 'PCKELL.DAT'))
|
||||||
OUT = os.environ.get('KELLOGG_EXTRACT_OUT', os.path.join(PROJECT_ROOT, 'extracted_dat'))
|
OUT = os.environ.get('KELLOGG_EXTRACT_OUT', os.path.join(PROJECT_ROOT, 'extracted_dat'))
|
||||||
os.makedirs(OUT, exist_ok=True)
|
os.makedirs(OUT, exist_ok=True)
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ from game.formats import DATContainer, get_bob_palette, get_world_palette, parse
|
|||||||
from PIL import Image
|
from PIL import Image
|
||||||
|
|
||||||
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
DAT_PATH = os.environ.get('KELLOGG_DAT', os.path.join(PROJECT_ROOT, 'raw', 'PCKELL.DAT'))
|
DAT_PATH = os.environ.get('KELLOGG_DAT', os.path.join(PROJECT_ROOT, 'game', 'original', 'PCKELL.DAT'))
|
||||||
OUT = os.environ.get('KELLOGG_RENDER_OUT', os.path.join(PROJECT_ROOT, 'preview', 'render_out'))
|
OUT = os.environ.get('KELLOGG_RENDER_OUT', os.path.join(PROJECT_ROOT, 'preview', 'render_out'))
|
||||||
os.makedirs(OUT, exist_ok=True)
|
os.makedirs(OUT, exist_ok=True)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user