Welcome to Schneider / Amstrad CPC Forum. Please login or sign up.

29. March 2024, 03:25:13

Login with username, password and session length

Shoutbox

TFM

2024-01-15, 17:06:57
Momentan billige Farbbänder auf Ebay für PCW

Devilmarkus

2023-07-09, 10:37:40
Zweiter 👋😂🤣

TFM

2023-06-13, 14:21:49
Sommerloch!

TFM

2023-05-30, 17:00:20
Erster ;-)

Recent

Members
Stats
  • Total Posts: 11,655
  • Total Topics: 1,329
  • Online today: 109
  • Online ever: 1,724
  • (16. January 2020, 00:18:45)
Users Online
Users: 0
Guests: 113
Total: 113

113 Guests, 0 Users

Textadventure: Mandelprison - Free Benoit!

Started by marcm200, 15. May 2022, 14:49:13

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

marcm200

Ein Textadventure im Stile der Thor-Trilogie der 80er.

Es geht drum, Benoit Mandelbrot aus seiner Zelle zu befreien, denn Fraktalo hat ihn entführt, um die Mathematik in ein dunkles Zeitalter zu stürzen.

Programmiert noch jemand diese Art von "Alles-im-Kopf"-Spiele?

Hier war es sehr interessant, die Unterschiede der Sprachen zu sehen. Eigentlich programmiere ich in C++ (Klassenpolymorphismus, lokale Variablen, Funktionsparameter, Speicher kein Problem) und nun im alten BASIC (nur ein globaler Gültigkeitsbereich, keine direkten Funktionen, und "memory full", so dass ich die Variablennamen kürzen musste).

Aber die BASIC-Versionen werden automatisch aus dem C++-Objektbaum generiert, so dass ich mir da zum Glück nur einmal beim Schreiben des Konverters Gedanken machen musste.


HAL6128

Das Programm wurde tatsächlich in C++ geschrieben und nach Locomotive BASIC konvertiert? Wie kann man sich so etwas vorstellen?

eto

Quote from: HAL6128 on 15. May 2022, 20:42:09
Das Programm wurde tatsächlich in C++ geschrieben und nach Locomotive BASIC konvertiert? Wie kann man sich so etwas vorstellen?

Neben dem WIE interessiert mich auch das Wofür. Also wofür konvertiert man das nach Basic? Hat das irgendwelche Vorteile? Oder just for fun?


marcm200

zum Warum nach BASIC: Ich mache mit meiner Freundin einen kleinen Podcast über Hörspiele der 80er. Von Hörspielen war es dann nicht weit bis zu meinem ersten Computer und Thor (Llywnhuf und der Spiegel waren meine Erinnerungen). Da ich in den 80ern auch ein kleines Programm für die Schule geschrieben hatte - ein Frosch-Identifikationstool in BASIC, das auf Frage/Antwort basiert, wollte ich alles zusammenwerfen, und habe ein kleines Textadventure programmiert mit Fragen zur Mathematik, dann öffnen sich Kisten.

Wenn ich was neues programmiere, nehme ich C++, da ich mich da am besten auskenne, allerdings wirken die RetroComputing-Dinge erst im richtigen Setting, und das wäre hier dann BASIC. Was mich dabei am meisten interessierte, war, was ich alles von C++ nach BASIC bekomme, also wie "mächtig" der Schneider bereits in den 80ern war. Einen programmiertechnischen Vorteil hat BASIC hier nicht m.E.

zum Wie nach BASIC: Das C++-Spiel besteht im wesenlichen aus einer Hauptschleife, in der der Nutzer seine Befehle eingibt und der Ausgabe, was er sieht, sowie der Reaktion des Spieles. Das Spiel selbst (die "Räume") sind alles C++-Objekte, die wiederum Dinge im Raum in sich als lokale Variablen tragen (polymrorphe Objekte mit Befehlshandlern), das ergibt dann schlussendlich den Objektbaum. Zum Konvertieren wandle ich nun jeden Raum in eine Sequenz an Programmzeilen um und füge die adäquaten GOTOs ein, je nachdem in welche Richtung der Nutzer geht, sowie die entsprechenden Fragen. Ein paar globale Variablen am Anfang auf Initialwerte setzen, und fertig. 

Eines meiner Lieblingshörspiele ist "Captain Blitz - Falsch programmiert". Da gibt es den Satz "Ich lass das mal den Computer machen" - insofern lasse ich den Computer hier die Konvertierung machen :) Ich glaube sogar, dass das für mich schlussendlich zeitlich schneller war, als das Spiel direkt in BASIC zu programmieren.



HAL6128

Diese "Konvertierungsgeschichten" und Ansätze finde ich recht interessant zu hören. Ich arbeite zum Beispiel an einen Tilegenerator (in EXCEL / VisualBASIC, haha), der mir ein komplett gemaltes Pixelbild (im GIF Format) in Tiles zerlegt (> nach BMPs) und daraus entsprechende Daten-Statements ausgibt, die für einen C-Code genutzt werden (SDCC). Der Code selbst wird von einem Freund (Shining) programmiert und daraus entsteht z.B. ein Spiel. Ich liefere nur die Bild- / Sprite-Daten. Der Workflow oder Schuss ist sozusagen "von hinten durch die Brust ins Auge". :) Excel bzw. VisualBASIC ist hier total langsam, aber das einzige, was ich an modernen Programmiersprachen kann.
In welchen Format konvertiert Du die Daten? ASCII-Textdatei oder BASIC-Token-RAMsnaphot?

marcm200

Ich konvertiere nach simplen Text-ASCII-Dateien. Zum Reinladen (in den Emulator) schalte ich dann die Echtzeitsimulation aus, da ich die Programmzeilen nicht sortiert ausgebe, sondern  so, wie es gerade passt. Ich laufe einmal über den Objektbaum, sammle die globalen Variablen auf, und gebe diesen Code dann ganz am Ende aus (zeittechnisch kann man es natürlich auch anders machen, selbst tausende Läufe über den Baum kosten kaum Zeit, aber so funktioniert es gerade). Und so habe ich dann auch gelernt, dass eine Zeilen-sortierte BASIC-Datei auch im Echtzeitmodus sehr schnell eingelesen wird.

Aber interessant, wie Du Deine Sprites machst. Ich mache fast dasselbe für meine Räume hier. Ein Bild mit einer Apfelmännchen-Komponente, ein Gridmuster drüberlegen, manuell ein paar Quadrate markieren (gelbe Punkte reinsetzen), und dieses Bild wird dann automatisch in Code umgesetzt, so dass ich mich nicht darum kümmern muss, dass, wenn es eine Tür nach rechts gibt, vom Zielraum dann auch eine nach links geben muss. Mein Workflow hier ist also C++ (Bild erzeugen), Bitmap (in MSPaint manuell markieren), C++ (Code erzeugen).

Ist Deine Datengenerierung wirklich so langsam - und sind es Sekunden oder Minuten, die Du warten musst, bis Deine Bitmaps erzeugt sind? Für mein Textadventure ist weder der C++- noch der BASIC-Code zeitlich optimiert.


prodatron

Interessant, Du hast die Datenstrukturen und deren Handhabung also einfach umgewandelt in ausgerollten Code.

Auf CPC Seite müssen dadurch keine komplexeren Datenstrukturen mehr gehandhabt werden. Dafür kommt aber fast identischer Code zigmal hintereinander vor. Somit spult der CPC also auf für ihn recht einfache Weise quasi vorcompilierten Code ab. Diesen Ansatz habe ich so bei Basic noch nicht gesehen, wohl aber bei Assembler.

Sicherlich wäre man auch in Locomotive Basic in der Lage, über Arrays usw. die Objekte und Eigenschaften abzubilden und mit einer einzigen generischen Engine zu verarbeiten. Das hätte natürlich für mehr Arbeit auf CPC-Seite gesorgt, allerdings wäre das Ergebnis wesentlich kompakter und auch auf CPC-Seite wartbar.

Auf jeden Fall cool, so einen Ansatz mal zu sehen!
Übrigens ein ziemlich krasses Hardcore-Mathe-Freak-Adventure! :)

GRAPHICAL Z80 MULTITASKING OPERATING SYSTEM

HAL6128

Quote from: marcm200 on 16. May 2022, 13:43:57
Ist Deine Datengenerierung wirklich so langsam - und sind es Sekunden oder Minuten, die Du warten musst, bis Deine Bitmaps erzeugt sind?
Ehrlich gesagt ist das recht unterschiedlich. Manchmal sind das wenige Minuten (2-3), manchmal auch 15 - 20 Minuten. Ich vermute mal, das hängt stark von "tagesaktuellen Excel-Laune" ab und was so im Hintergrund läuft. :)

Und ja... Hardcore-Mathe. Ziemlich interessant, musste bisher einige Stellen im Internet nachlesen. :)

marcm200

@prodatron: Du hast völlig recht. Der Code ist recht redundant, die Räume sehen qualitativ im Code recht ähnlich aus. Deshalb musste ich auch die 3 Level getrennt als Dateien erzeugen, sonst hätte der Speicher bei weitem nicht ausgereicht. Da ich nur eine vorab bekannte Anzahl an C++-Objekten und Objektarten habe, hatte ich am Anfang der Konvertierung versucht, die C++-Objekte mittels DATA-Zeilen zu repräsentieren. Das wurde aber schnell sehr abstrakt, so dass ich mich für die lokale Variante (ein Objekt anschauen, der Rest ist nicht relevant) entschieden habe. Nur beim Befehlsparser habe ich die DATA-Zeilen-Methodik beibehalten, da dieser so leicht erweiterbar ist, wenn ich neue Verben, Präpositionen und Objekte (hier jetzt Kiste, Tisch, Notiz etc) einbauen möchte. Die fehlende Wartbarkeit des BASIC-Codes spielt für mich keine Rolle, da die BASIC-Version nur zum Ausführen gedacht ist, geändert wird nur im C++-Code.

Was die Mathematik angeht, so ist sie das Ergebnis von 3 Jahren Artikel lesen in meiner Freizeit, herausziehen, was mich gerade interessiert hat und ich zumindest teilweise verstanden habe, und den Rest überspringen ("Mut zur Lücke :) Aber bei der Beantwortung (und beim Testen) hilft der magische Zauberspruich dann.

TFM

Hier die Dateien als .DSK bereits in BASIC umgewandelt und damit kleiner.
TFM of FutureSoft
http://www.futureos.de --> Das Betriebssystem FutureOS (Update: 20.12.2023)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 26.12.2021)