Ce projet procède à l'ingénierie inverse du jeu classique ZX Spectrum 48K de Denton Designs, The Great Escape, à partir d'une image de bande du jeu original en un désassemblage HTML référencé et annoté et un code source d'assemblage complet, à l'aide de SkoolKit.
The Great Escape est un jeu d'évasion en 3D isométrique de 1986 pour le 48K ZX Spectrum dans lequel vous incarnez un prisonnier de guerre essayant de s'échapper d'un camp de prisonniers nazi. C'est l'un des jeux Spectrum les plus appréciés et je veux savoir comment les auteurs ont réussi à intégrer toute cette magie dans le 48K ZX Spectrum.
Lisez la version actuelle du démontage ici. Il ne s'agit pas seulement d'une liste d'assemblage : elle contient des graphiques de jeu, des personnages, des objets, des animations et divers autres détails décodés sur le fonctionnement du jeu.
Notez que le démontage peut être en retard par rapport à la tête de l'arborescence des sources : il se peut qu'il ne présente pas les toutes dernières modifications jusqu'à ce que je publie une version mise à jour.
Mon premier objectif est de construire un démontage entièrement documenté du jeu. SkoolKit nous permet de créer à la fois une liste d'assemblages annotée adaptée à la reconstruction d'une image exacte du jeu original et un démontage détaillé avec références croisées au format HTML.
La seconde consiste à transformer l'assembly annoté en code source C qui se comporte exactement comme le jeu original. Le projet de réimplémentation en cours réside dans ce référentiel et les deux projets se déroulent en tandem.
SkoolKit est la boîte à outils Python sans égal pour désassembler le logiciel ZX Spectrum écrit par Richard Dymond.
En plus de produire le désassemblage HTML avec références croisées, SkoolKit peut également produire une liste d'assemblage annotée. Nous pouvons l'utiliser pour réassembler le jeu dans un fichier .TAP que vous pouvez charger dans un émulateur. Vous pouvez l'utiliser pour modifier le jeu et corriger des bugs vieux de 30 ans !
git clone https://github.com/dpt/The-Great-Escape.git
cd <cloned repo>
make disasm
Si tout va bien, vous verrez un résultat comme :
$ make disasm
tap2sna.py --output-dir build @TheGreatEscape.t2s && mv build/TheGreatEscape.z80 build/TheGreatEscape.pristine.z80
Downloading http://www.worldofspectrum.org/pub/sinclair/games/g/GreatEscapeThe.tzx.zip
Extracting The Great Escape.tzx
Writing build/TheGreatEscape.z80
mkdir -p build
sna2skool.py --hex --sft TheGreatEscape.sft build/TheGreatEscape.pristine.z80 > TheGreatEscape.skool
Using skool file template: TheGreatEscape.sft
skool2html.py --hex --asm-labels --rebuild-images TheGreatEscape.skool
Using ref files: TheGreatEscape.ref, TheGreatEscapeBugs.ref, TheGreatEscapeChangelog.ref, TheGreatEscapeFacts.ref, TheGreatEscapeGame.ref, TheGreatEscapeGlossary.ref, TheGreatEscapeGraphics.ref
Parsing TheGreatEscape.skool
Output directory: build/TheGreatEscape
Copying /usr/local/lib/python3.7/site-packages/skoolkit/resources/skoolkit.css to skoolkit.css
Copying TheGreatEscape.css to TheGreatEscape.css
Copying static-images/BarbedWire.png to static-images/BarbedWire.png
Copying static-images/GameWindow.png to static-images/GameWindow.png
Copying static-images/JoystickControls.png to static-images/JoystickControls.png
Writing disassembly files in asm
Writing maps/all.html
Writing maps/routines.html
Writing maps/data.html
Writing maps/messages.html
Writing maps/unused.html
Writing buffers/gbuffer.html
Writing reference/bugs.html
Writing reference/changelog.html
Writing reference/facts.html
Writing reference/glossary.html
Writing graphics/glitches.html
Writing Intro.html
Writing Controls.html
Writing Completion.html
Writing Characters.html
Writing Items.html
Writing Masks.html
suggested width 17 > actual 16
Writing RoomObjects.html
Writing Rooms.html
Writing Map.html
Writing index.html
build/TheGreatEscape/index.html
dans votre navigateur et plongez-vous. make tap
va construire build/TheGreatEscape.tap
make z80
pour créer une image .z80 si vous préférez.Chacune des étapes ci-dessus appellera automatiquement son étape précédente.
make skool
-- pour construire le fichier .skoolTheGreatEscape.skool
make tap
build/TheGreatEscape.tap
dans votre émulateur Si les fichiers skool ne sont pas à votre goût et que vous préférez une liste d'assembly régulière : make asm
construira build/TheGreatEscape.asm
. Cela peut ensuite être transmis à Pasmo, par exemple, pour créer un binaire.
La rétro-ingénierie du jeu est désormais terminée, mais les travaux se poursuivront pour améliorer la précision et la lisibilité du démontage.
Voici les diapositives d'une présentation que j'ai faite à mes collègues sur le projet en janvier 2016.
Il existe également une version mise à jour plus récemment qui a été écrite pour une présentation du projet en 2020 au groupe d'utilisateurs Abug : http://abug.org.uk/index.php/2020/07/04/the-great-escape-risc -os-conversion-david-thomas/
En 2019, j'ai rédigé un gros article sur le projet sur mon site Web : http://www.davespace.co.uk/the.great.escape/