Archiv für den Monat: September 2023

Diskurse werden als Landschaften erlebt

Selbstverständlich sind Diskurse am Ende der Tage die Gewichtungen unserer Neuronen und Synapsen, das heisst deren Konzepte (Syntagma) und deren Verknüpfung (Paradigma). Umgesetzt in eine Erfahrung sind sie vermutlich Landschaften (Defiktionalisierung) und deren Körper-Landschafts-Mechanik.

Weit akzeptierte Diskurse sind ausgetretene breite Täler, in denen man sich einfach bewegen kann. Die Motivationsmechanik ist simpel: Will ich von A nach B komme ich hier schnell vorwärts. Es gibt auch hier viele andere, die unterwegs sind und so bin ich auch nie alleine.

Schwieriger wird es, wenn es den Berg hochgeht. Hier spielt sehr schnell die Ermüdung der Körper eine Rolle. Es gibt auch wenige Personen, die helfend beistehen.

Dabei ist diese Landschaft auch dynamisch. Je mehr eine Route begangen oder eher benutzt wird, ums ausgetretener wird sie und umso tiefer und breiter wird das Tal, während andere Wege eingehen, wieder zu Pässen werden.

Defiktionalisiert wurden Diskurs schon länger etwa durch Googles Suchmaschine. Hier liefert(e) Google ja vorallem tiefe breite Täler als Antwort (Gute Verlinkung). Einen Schritt weiter gehen letztlich an Massentexten trainierte (ausgelesene) Neuronale Netze. Sie bewegen sich sogar selbst entlang dieser Täler und Wahrscheinlichkeiten von Bezügen oder Wahrscheinlichkeiten von komplexeren Bezügen. Sie bewegen sich letztlich genau entlang dieser Diskurs-Topographien.

// ToDo: Visualisierung etwa von Diskursen am Beispiel von Technologie, 80er Jahre etc. Eventuell auch möglich mit einer KI zu machen.

Inventar oder die Frage des Textmodes bei 160x200px

Erst beim Designen etwa eines Adventures auf einem Homecomputer mit Auflösungen von 160x200px (etwa dem C64 in Multicolormode) wird einem klar: Die Grafiken sind nicht besonders Aussage kräftig. Ein Beispiel im Folgenden sieht man das Inventar des in Entwicklung befindlichen Spiels „Züri brännt“ in Vergrösserung. Dabei ist es fast nicht zu erkennnen, das es sich um eine Hand, ein Apfel und ein Kruzifix handelt bzw. es wird klar, wenn man es weiss. Sicherlich könnten die Objekte schöner designed sein oder man würde im Design Monochrom vorziehen, um den Informationsgehalt und die Ikonografie zu erhöhen. Dennoch bleiben die Grafiken ambigue. Helfen könnte da etwa ein Booklet.

Interessanterweise greifen die Entwickler aber sehr oft zum Text und nutzen den Textmode, um das Inventar darzustellen und das ist auch konsequent. Es ist technisch weniger aufwändig, es ist klar und braucht relativ wenig Platz auf dem Bildschirm und eine Ikonografie muss nicht entwickelt und kommuniziert werden. Bekanntestes Beispiel ist hier sicherlich ManicMansion (wo auch noch das ganze Interface Text ist).

Hier noch ein Beispiel mit einem Block-Grafik-Text.

Dies ändert sich so die These radikal mit den 16bit und 320*200 Auflösungen.

// Suche nach Beispielen, Statistiken.

Visualität – historische Adäquatheit als Grundveraussetzung für die Bewertung von Grafiken/Wirkung von Homecomputerspielen

Eine der grössten Probleme im Retrogaming ist die visuelle Adäquatheit von Spielen. Meist werden heutige Spiele auf TFTs gespielt, die aus einzelnen ‚Pixeln‘ bestehen. Diese bilden in keiner Weise die Realität des Visuellen Outputs des Gamings der Homecomputerzeit ab.

Weiterlesen

Nomeklatur: Neo-8bit & Neo16bit etc

Retro wird zum zweiten verwendet auch für die Nutzung von Visuals und Mechaniken, die meist auch technologisch bedingt waren, in der nicht orginalen Entstehungszeit dieser Visuals, Sounds und Mechaniken.

Demgegenüber soll das Präfeix Neo verwendet werden, es signalisiert die Entwicklung neuer Hardware, Software inklusive Spiele heute mit Technologien, die nicht mehr State-Of-The-Art sind. Darunter fallen etwa neue Spiele auf 8bit oder 16bit Computern oder Consolen. So kann man einfach beschreiben, was ein Neo-C64-Spiel in etwa ist.

Wie sieht ein C64 Bild tatsächlich in Sachen Ressourcen/Technischer Komplexität aus?

Der OppCheck gibt Einblick (siehe Aesprite-Blog-Eintrag): Grüne Blocke sind Hintergrundfarbe, bestehen also aus 3*8* 1-#0-Byte. Blaue Blöcke haben zwei Farben: Hintergrund und eine Farbe. Orange, 3 Farben (1+2) und Schwarze 4 Farben (1+3). Damit wird auch die Komplexittät des Bildes zumindest in Sachen Farbe darstellbar..

These: Neoneffekte – 16Bit+

Neoneffekte sind eigentlich nur schön designbar, wenn man schöne Farbverläufe kreieren kann. Einige der 8Bit System (nicht alle) waren sehr eingeschränkt, was die Farbwahl betrifft – etwa der C64. Hier sind oft viele Graustufen vorhanden – dies lässt sich gut für technische Dinge wie ‚Raumschiffe‘ und Mauern brauchen, aber diese leuchten selbst bekanntlich nicht wirklich. Dadurch lassen sich relativ wenige Neonfarbeneffekte (Glanz, leuchten) darstellen (selbstverständlich Flackern schon etc).

Mit den 16Bit – so die These – ändert sich das radikal. Das Auswählen der Farben ermöglicht es einen Teil der Farben gerade dafür zu verwenden und eben auch (neben ‚gebaktem‘ 3D mit Licht und Schatten) Neoneffekte darzustellen – sowohl in Pixelngrafiken wie auch in Rastergesteuerten Grafiken/Effekten. Das schliesst natürlich auch alle Effekte von Graffiti mit ein (Farbverläufe). Damit nimmt auch die Computerszene letztlich mit Farbverläufen die damals aktuelle Popkultur auf (vgl. Mami Vice) und führt die Computergrafik weiter zum Mainstream (oder einen Teil davon) bis hin zu Vaporwave (auch in Computerwerbungen).

// Recherche, Beitrag dazu mit Beat Suter


Selbstentwickeltes Spiel auf Orginal-C64-Hardware

Es ist eine Sache Software/Games für alte Systeme auf Emulatoren zu entwickeln und eine andere sie dann lauffähig zu machen auf Orginalhardware. Die Unterschiede sind schnell erklärt: Viele Emulationen ’simulieren‘ über Probleme hinüber (Werte sind meist geleert oder null gesetzt, Hardware ist doch leicht anders etc).

Am Besten sieht man das etwa bei sehr spezialisierter Hardware wie der Vectrex (Beispiel VecZ). Beim Simulator gibt es kein Flimmern, keine Hardware am Anschlag, keinen Kathodenstrahl, der kondensiert die gesamte Helligkeit abbildet etc.

Aus diesen Gründen war es interessant zu sehen, ob das Spiel TheHolyCube einfach so läuft auf einem Orginal C64.

Das Spiel kann per FlashCard und einem SD2iEC (Simuliert ein C64-Diskettenlaufwerk – Karte und Stecker zum C64-Laufwerk) relativ leicht als .PRG ‚aufgespielt‘ werden.

Das Resultat: Es läuft – in den ersten Test ohne Probleme. Selbstverständlich ist der Screen ein modernes TFT und dadurch erscheinen die Pixel als Pixel und sind nicht verschwommen wie bei einem Orginal CRT. Dies muss als nächstes getestet werden, um dem ursprünglichen Phänomen und der Wirkung gerecht zu werden..

Farben haben per se keine Bedeutung, sie haben sie nur in einem System

Farben haben Bedeutung, weil sie an Regeln gehängt sind und daran hängt meist ein System und damit auch Wertungen. Und das gilt nicht nur für Games in denen solche Regeln/Werte definiert werden, um Spiele im ersten Moment schneller lesbar zu machen. Werte entstehen hier als Differenz zu anderen Farben und deren Anbindung.

Das macht ja gerade Spiele aus, dass sie ihre eigene Gewichtung/Werte zuordnen können und damit das mächtigere Medium sind, als unsere klassische Kultur. In der wir gewissen Farben gewisse Wertigkeiten zugestehen. Anders gesagt unsere kulturelle Welt ist ein Sonderfall von Spielen.

Der Umstieg – 8bit (C64…) zu 16/32bit (Atari ST, Amiga …) – Zahlen

Die Nachfolge der 8bit Computer brachte einen riesigen Shift, sowohl in Rechenleistung wie auch in RAM und damit auch im Bereich Screen/Farben. Die Fortschritte im Sound (Digitalsound) beim Amiga sind im Nachfolgenden nicht abgebildet.

8Bit (C64…)16/32Bit Atari ST16/32Bit Amiga
Screen160*200 in 4*8-Blöcken (je 1+3 Farben)320*200 1 Layer
16 wählbare Farben
320*200 3 Layer
32 wählbare Farben
Screen
(RAM)
8bit-c64: 40×25 * 3*8 = 24k
320×200 x 0.5b [16bit] = 32k
320×200 x 0.75b [16bit] = 48k
RAM/Screen65k/24k 512k/32k512k/48k(?)
Rechenleistung1 Mhz
1 mips 6510 C64 (0.4 mips? & 1 byte vs 0.2 zx81 etc vs 6802 0.5 mps) 
8 Mhz
8mio (1 mips) & 16/32bit | 2/4 byte
7.9 Mhz
7.9mio (1 mips) & 16/32bit | 2/4 byte
Rechenleistung/Frame40k/frame
(*1byte)
8*40k/frame
(*2byte?)
~8*40k/frame
(*2byte?)
Datenregister8bit32bit32bit
Bus8bit16bit16bit
Assemblerna jakomfortabelkomfortabel
Höhere Programmiersprachenvorallem Basic (Interpreter)vorhandenvorhanden
Kompilationssprachenvorhandenvorhanden

Mehr Infos finden sich hier:
http://www.knubbelmac.de/hardware/motorola-68000-serie.html
https://en.m.wikipedia.org/wiki/Instructions_per_second

Entwicklung der cry64engine – C64 GameEngine (CHLudens) [In Arbeit]

Nutzung der C64 Architektur für eine GameEngine in Assembler.



Prinzipiell stellt der C64 Bildschirminhalt (wie schon mehrfach beschrieben) im Textmode oder im Grafikmode dar. Es gibt verschiedenste Grafikmodi: 320*200 in 2 Farben oder 160*200 in 16 vordefinierten Farben (Multicolormode). Wobei nur 4 Farben pro 8*8 oder 4*8 Block gesetzt werden können: 3 jeweils wählbare neben der allgemeinen Hintergrundfarbe. Dabei lassen sich diese Modi wie beim inspirierenden System Atari 400 hin und herschalten anhand des Rasters und damit Mischen. Sichtbar in unendlich vielen Spielen und auch Grund für die Teilung des Screens bei ManicMansion.

Das Problem: C64

Betrachtet man die Spiele, die mit dem C64 entstanden sind, ist man einigermassen fasziniert, da wirklich alles aus dieser ursprünglich als Gameconsole konzipierten Maschine rausgeholt wurde. Dabei ist der C64 alles andere als ein Paradies für Entwickler. Angefangen von den Text/Grafikmodis, über die Repräsentation des Bildschirms als RAM in Blöcken. Dann die maximale Auflösung von 320*200, die völlig überdimenstioniert ist für den Prozessor, der nur 8Bit ist (650x). Die Hardware und der Prozessor sind dabei eigentlich nicht aufeinanderabgestimmt und vieles ist einfach möglich günstig gelöst. Als Entwickler* hat man zu keinem Zeitpunkt das Gefühl, dass auch nur einen Moment an die Entwickler* gedacht wurde. So fehlen elementarste Dinge für Gamedevs – etwa (und das haben alle Consolen natürlich eingebaut) die Möglichkeit Text in den Grafikmode zu rendern. Hier soll allen Ernstes mit Modis umgeschaltet werden. Dies führt dann auch zu der immer künstlichen Trennung von Bild und Text in C64 Games. Die Sprites können von 0-386(?) in X und 0-300 (?) gesetzt werden. Dadurch können sehr schön Sprites reinhuschen in den Screen, dafür ist es die „Hölle“, die Sprites zu verwalten, da der Prozessor nur von 0-255 rechnet. Dann muss ein LowerByte hin. Wer dann auch noch eine eigene Kollisionsabfrage will, ja der hat viel „Spass“. Anders gesagt: Der C64 ist ein Bolide mit einem schwachen Herz. Zu erst sieht der Prozessor ja einigermassen schnell aus, bis man die Taktrate und die möglichen Instruktionen runterrechnet auf eine Frame. Dann zeigt sich dann sehr schnell, dass ohne die Zuatz-Hardware für Sprites, Scrolling oder die Zusatzmöglicheiten des SIDs, der C64 recht langsam ist. Es ist dann auch verständlich warum, der Apple II leider nie zum Gamecomputer avanzieren konnte in die Breite. Selbst mit den grosszügigen 64KB RAM stösst man sehr schnell auf Probleme bei der Entwicklung und es wird schnell klar, warum viele Spiel auf dem C64 so sind, wie sie sind..

Man mag Jack Tramiel danken für sein „Computer to the masses and not classes“, aber dass darum die Programmier* dabei Unterklasse werden, das bleibt im Dunkeln und wird auch fast nicht thematisiert, wenn man* so gemütlich ein C64 Spiel spielt.

GameEngine: ‚Philosophie‚ (Designrules)

In der entwickelten GameEngine wurde versucht aus diesem „Ungetüm C64“ etwas zu machen, das keine Herausforderung in der Nutzung ist, sondern den Entwicklern* hilft. Es ist eine TopDown-Entwicklung. Die Engine wurde auch so entwickelt, dass sie für verschiedene Genres genutzt werden kann. Nicht implementiert sollte Scrolling werden, da dies immer eine je eigene Entwicklung benötigt (Playfieldgrösse, vertikale oder horizontale Ausrichtung etc) und schwer abstrahierbar ist.

// ToDo: Vergleiche mit real entwickelten Spielen in jener Zeit und deren Ansatz – je eine eigene Engine für jedes Spiel oder eine Metaengine

Technologie: KickAssembler

Als Sprache wurde KickAssembler benutzt. Dies ist ein scriptbare Assembler in Java mit der Möglichkeit klassische C/Java-Kommentare zu machen // & /* */. Zusätzlich gibt es vordefinierte Scripts. Durch Java als Grundsprache läuft der Assembler auf allen Systemen. Eine Anforderung, die wichtig ist, weil Entwickeln auch auf Mac ein Goal des Projektes ist. Die meisten anderen Tools laufen vor allem auf Windows bzw. sind Plugins im Universum von Microsofts VisualStudio.

Das Compilieren ist (nach Installation von Java und dem Wechseln in den Ordner) simple:

java -jar KickAss.jar game.asm

Das generierte game.prg lässt sich dann in jedem Emulator ausprobieren. Oft wurde in der Entwicklung aber der folgende Online-Emulator verwendet.
https://c64emulator.111mb.de/index.php?site=pp_javascript&lang=en&group=c64

Er funktioniert einfach mit Drag&Drop, lädt sehr schnell, die Joysticks etc sind Standard mässig installiert. Dinge die gerade beim Platzhirsch VICE (https://vice-emu.sourceforge.io) konfiguriert werden muss.

EngineArchitektur

Die Architektur der Engine orientiert sich an frühen Engines (keine Eventengine) und basiert auf einem oder mehreren Loops (die linear angeordnet sind). Hier sind es: Titelbild-Loop, Menuloop, Submenloops und der Gameloop.

In der Organisation und Bewirschaftung der Daten wird auf die Eigenheiten/Verteilung durch die Hardware eingeganen. Das heisst, es gibt nicht nur eine Klasse GameObjekte (wie etwa in Unity), die alles abbildet sondern zwei Teilsysteme:

Diese zwei Objektkategorien sind bei Consolen und auch beim C64 als eigene Hardware/Teilsysteme abgebildet.

Dies führt dann auch zu verschiedenen Interaktionen/Events zusammen.


Auflösung und Playfield

(Viele 8Bit-Consolen nutzen Playfields für den Background bzw. die Umgebung/Architektur vgl. Intellivsion Ausnahmen natürlich Atari 2600 und Vectrex)

Für die entwickelte Engine wurde der Multicolormode genutzt. Damit lässt sich am meisten rausholen aus den Grafikmöglichkeiten (Die meisten Games verwenden auch diesen Mode). Anstelle des vermutlich gedachten Playgrounds mit einem Multicolorzeichensatz verwendet die Engine 8*16 Pixel grosse Blöcke. Das sind pro Block 4 Blöcke des C64 Grafiksystems.

Die Nutzung eines so „Niedrig“ aufgelösten Rasters erlaubt es, dass das Playfield eine Liste von 0-255 Feldern ist und so leicht manipuliert und abgespeichert werden kann.

Die Engine nutzt dabei eine Liste mit den Blöcken (Blocks) und ein aktuelles Playfield. Dieses kann gerendert werden in den Screen. Einzelne Blöcken lassen sich updaten. Es gibt ein System zu Animationen der Blöcke (synchron) für Gameplay wichtige Animation und ein System, das asynchron Animation bietet.

Die Menuszenen wie auch die einzelnen Szenen (alias Levels) sind als Levels im Speicher abgelegt. Dadurch muss nur ein System betreut werden und auch in Menuscenen kann etwa das Animationssystem benutzt werden.

Block & Playfieldtool

Um dies nicht nur im Code nutzen zu können, wurde ein Tool entwickelt in Processing. Dieses Tool ist zum einen ein Designtool für die Blöcke und zum Anderen ein Tool zum Gestalten der Playfielder (Levels).

Das Tool speichert die Daten als „rohe“ JSON Daten bei den Blocks und einzelne Levels. Gleichzeitig werden die Daten per .asm File gespeichert und können dann eingezogen (include) werden.

Das Tool ist so aufgebaut, dass man jeweils nach links Blocks designed und nach rechts die Levels. Im Bereich des Blockdesigns müssen die Farben nicht ausgelesen werden, sondern werden automatisch aus den benutzten selektiert. Dies macht es einfacher zu designen. Eine farblich angeordnete Palette macht das Pixeln einfacher.

// ToDo: Welche Spiele nutzten Leveleditoren und wer arbeitet Hardcore in den Listen/Tables oder nutzte einfach Files? Zumindest für die 16Bit Generation lassen sich Leveleditoren nachweisen (Bsp. WAR HELI) und sind sogar in die Games (KRACKOUT) eingebaut.

Gestaltung von Blocks/Szenen

Das Gestalten von Blocks zur nachfolgenden Mehrfachverwendung ist eine Designsparte für sich. So müssen die Blöcke zwar unique aussehen, dürfen aber auch nicht zu unique aussehen, damit sie nicht zu fest ausfallen. Das Umgekehrte gilt für den Hintergrund, dieser muss Regelmässig aber nicht zu regelmässig aussehen.
Die Limitation des C64 pro Tile/Segment nur 4 Farben (Hintergrund nicht wählbar und 3 Vordergrundfarben) machen es sehr schwierig interessante Dinge zu gesalten. Erschwerend kommt die wirklich schwierige (weil einfach seltsame Farben) Farbpalette hinzu. Zu guter letzt ist erst auf dem C64 laufend, dann klar, wie es wirklich aussieht. Da liegen dann die eine oder andere Farbe schon gar eng beieinander.

In die Blocks gehört auch ein Alphabet und Zahlen. So lassen sich Strings mit Zahlen ausgeben in der Grafik. Zusätzlich verfügt die Engine über die Möglichkeite 1/4 Blocks, klassische Tiles/Blöckchen zu zeichnen. Dadurch lassen sich normale Texte in 4×8 Pixeln rendern.

Gestaltung von Levels/Szenen



Levels besitzen wie Blöcke eine spielmechanische wie auch visuelle Funktion. Um Levels zu gesalten gibt es besondere „Commandsblöcke“, diese Spawnen etwa den „Spieler“ oder den Gegner etc. Diese werden dann umgewandelt in normale etwa Hintergrundblöcke.

Die visuellen Designregeln transportieren die Mechanik, dürfen aber auch nicht zu statisch sein und sollten irgendwie leben. Siehe dazu anderen Blogbeitrag.

Einige Beispiele:

Menuscene ohne Menupunkte


Ein Level mit Spielerspwanpunkt und Enemyspawnpunkt

GameObject bzw. Sprites



Das problematischste Element ist die GameObject/Spriteverwaltung. Diese besteht aus einer Liste von GameObjekten, die auch gerade Sprites abbilden.

Ein Objekt hat jeweils die Länge von 17 Bytes:

01234565678910111213141516
xxshiftyyshiftwhstatestatesubargbehaviouranimtodoanimindexminamaxaanimtypeanimeoden

Positionen

Die Sprites können in zwei Modis genutzt werden. Von 0-255 im Boxmode. Hier endet die Darstellung nach 256 Pixeln oder im 320 Pixel-Mode: Hier rechnet die Engine intern mit 2 Pixeln und dem Offset. 270 Pixel in X Richtung sind: 135 Pixel (x). Möchte man das Sprite auf 271 Pixel bewegen, so gibt es dafür eine ShiftNumber (x-shift). Da der C64 einen Rahmen von 20 px und 50 px hat, muss dies jeweils abgezogen werden für Vergleich oder Kollisionen mit dem Playfield.

320 Pixel-Mode (0-160, 0-250):



Animationssystem

Das Animationssystem ist simpel. Jedes Gameobject hat einen Animationstyp (Endlos,einmal,einmal&destroy). Per MinAnimation und MaxAnimation definiert man die Animation. Und los geht es.

GameObject-GameObject-Collision

Die Engine führt eine Kollision von jedem Objekt mit jedem anderen durch. Kollisionen können in der Schleife abgefragt werden.



Avatar-Playground-Collision



Die Engine prüft per Default Avatar-Playground-Kollisionen und ist damit in der Lage Objekte aufzunehmen. Objekte können dadurch einfach Objekte ‚auflesen‘ aus dem Playfield.


Spritetool


Das SpriteTool arbeitet ähnlich wie das Blockeditor-Tool. Geht aber auf die Eigenheiten von Sprites ein. Das heisst es können zwei Grundfarben ausgewählt werden und dann pro Sprite jeweils eine Zeichenfarbe.

Anwendung

Die GameEngine wurde bis anhin in 3 Projekten angewendet:
Squarez – ein einfaches Spiel, das im Rahmen des CHLudens-Projekts durch die Geschichte der Computer nachprogrammiert wird.
TheHolyCube – eine OneButtonSpiel von la1n ein OneButton JumpAndRun mit Animationen und vielen Levels
– ‚Züri brännt‘ – ein einfaches Adventure im Rahmen des CHLudens-Projektes zur Frage der Machbarkeit und Einschränkungen der Hardware/Medium: Game(HardwareC64) (In Entwicklung)

Fazit

Die GameEngine umfasst die meisten genutzten Funktionalitäten in Spielen mit Ausnahme des Scrollings und des Sounds.

Files

Engine (TheHolyCube.asm, alle Json-Files etc)

Processing-Editoren:


// ToDo: Thematisierung des RAM Problems etc.