Die Gemäuer von Kalawaum (90s Classic, Rework)

Spiele, Demos, Grafikzeug und anderes unterhaltendes.
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Die Gemäuer von Kalawaum (90s Classic, Rework)

Beitrag von diceman »

Bild


UPDATE:

Der Teil der Editor-Programmierung, vor dem es mir am meisten gegraust hat, ist geschafft! :coderselixir: :coderselixir: :coderselixir:
Jetzt ist es möglich, alle Felder mittels simpler Point&Click-Interaktion mit anderen Feldern zu verlinken, in dem man zunächst eine Source-Koordinate setzt, und anschließend eine Target-Koordinate; sobald beide Koordinaten gesetzt sind, wird ein Link-Actor() "erschaffen". Eine Target-Koordinate kann sich auch auf einer anderen Map befinden - so kann man später im Spiel zwischen Maps hin- und hergehen (in dem man z.B. Link-Actors() auf Türen platziert), oder Teleporter kreieren (ein dafür passendes Tile existiert ebenfalls).
Bewegt man im Editor die Maus auf ein solches Link-Tile, wird ein roter Faden zur Partner-Koordinate gezogen - befindet sich diese auf einer anderen Map, zieht der Faden stattdessen in die untere rechte oder linke Ecke, je nachdem ob sich das Partner-Tile auf einer Map vor oder hinter der aktuellen befindet. Die genauen Koordinaten werden ebenfalls angezeigt.
Ein Rechts-Klick auf entweder Source- oder Target-Koordinate im Link-Mode löscht den zugehörige Link-Akteur.
Das war eine relativ komplexe Angelegenheit, da mit einer solchen Mechanik Tür&Tor für NullPointer()-Exceptions geöffnet werden, welche alle abgefangen und gefixt werden müssen. Einige besondere Edge-Cases, Interaktion der Link-Akteure mit anderen Actors(), mußten ich ebenfalls berücksichtigen.
Sind Source und Target-Koordinate übrigens gleich, bekommt man eine Teleport-Trap! Diese kann auch von Monstern genutzt werden: bewegt man sich auf ein solches Tile, wird man auf ein zufälliges freies Tile irgendwo in der aktuellen Map teleportiert.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Die Gemäuer von Kalawaum (90s Classic, Rework)

Beitrag von diceman »

Bild

Wie findet ihr meinen Schnabel-Doktor? <)
Habe mich für ein Dark Fantasy-Szenario mit Lovecraft-Monstern entschieden, da passt so ein Charakter ganz gut, habe ich mir gedacht. Komme auch mit der 16x16 Pixel-Art mittlerweile ganz gut zurecht. Die Sprites werden auf 32x32 hochskaliert - später dann, mit mobilem Viewport, gehe ich wahrscheinlich auf 48x48 hoch.

Auch die Editor UI is soweit fertig ...
Speichern, laden, Actor-Subtypen browsen, Maps adden und löschen, editieren, Tile-Verlinkung, Testen, etc. funktioniert mittlerweile wie am Schnürchen. Es fehlen nur noch einige Tile-Subtypen, wie zum Beispiel Säulen, Schreine, Waffen, Steintafeln mit Innschriften und Schilde.
Generell kann man sagen, daß jetzt der Fun-Part des Projektes beginnt! :allright:

Bild
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Die Gemäuer von Kalawaum (90s Classic, Rework)

Beitrag von diceman »

Bild

Grafisch und Spielmechanisch hat sich nicht allzuviel geändert, dennoch für mich ein wichtiges Update, in dem unter der Oberfläche viel passiert ist. Bei rund 3000 Zeilen Code ist es z.B. angebracht, aufzuräumen und zu strukturieren. Habe hardgecodeten Mist ausgelagert, abstrahiert und flexibel umformuliert. Zum Beispiel gibt es keine FloorSprites und WallSprites mehr, sondern nur noch BaseSprites (beschrieben durch die #actorBase-Klasse). Die Base-Klasse verfügt über die Subtypen Wall und Floor, welche nur noch virtuell existieren und hauptsächlich dazu da sind, daß ich in Arrays schnell abfragen kann, welche Beschaffenheit ein Floor- oder Wall-Tile hat.

WEITERE UPDATES:
- Langsam kristallisiert sich eine finale Palette mit 16 Farben heraus (ich arbeite mit "Aseprite" und indexierter Palette, so kann ich auch bei Anpassungen stets alle Sprites farblich konsistent halten)
- Die Obstacle-Klasse wurde um den Pillar-Subtypen erweitert.
- Animations-Prozedur initialisiert - die kann zwar bislang nur einen Delay abspielen, muß auch später nicht sonderlich viel leisten, trotzdem gibt es einige Ereignisse (wie z.B. das Fallen in Löcher und Kämpfe), welche Bewegung benötigen um atmosphärisch zu überzeugen.
- Editor-Funktionen weiter verfeinert (z.B. wird jetzt beim Speichern grundsätzlich ein File-Requester geöffnet, wo man seinem .mod-File einen Namen geben kann, und der gewählte Pfad wird in defaultMod$ gespeichert, so können nicht länger versehentlich Daten überschrieben werden, und beim Testen weiß das Programm sofort, welche Daten zu laden sind.
- Es gibt Fallen: Löcher und Speerfallen. Beide sind für Monster wie Spieler tödlich - Speerfallen sind leichter zu erkennen, sind aber, nachdem man ein Monster hineingelockt hat, verschwunden. Löcher sind unendlich tief und schwerer zu erkennen; die Positionen von Fallen bleiben von Spiel zu Spiel fix, hat man also ihre Location verinnerlicht, wird es zunehmend leichter den Dungeon zu navigieren.
- Die Pentagram-Shades haben zwei Zustände, rot und lila (deren Zustand - nicht die magischen Türen! - wird für jeden Shade initial ausgewürfelt). Rote Pentagramme kann NUR der Spieler betreten, auf violette dürfen AUCH Monster, und da Monster und Spieler derselben Klasse angehören, können Monster jetzt auch Pentagram-Schalter betätigen - das ist eine Neuerung gegenüber dem Originalspiel, ein simpler Tweak, aber ich kann mir vorstellen, daß damit einiges an emergent complexity erzeugt wird. :uff:

Wer entdeckt alle Löcher auf dem Screenshot? :twisted:
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Die Gemäuer von Kalawaum (90s Classic, Rework)

Beitrag von diceman »

Bild


UPDATE:

- Nicht allzuviel passiert heute, aber es gibt jetzt Schreine!
Da ich das originale "Kalawaum" niemals durchgespielt habe, weiß ich nicht ob es da überhaupt ein Ziel gab, außer irgendwann zu sterben und dann mit seinem bis dahin gesammelten Gold in die Highschore-Annalen einzugehen ... bei mir jedenfalls wird es ein thematisches Objective geben, und dafür sind die Schreine notwendig; z.B. kann man hier den Großen Alten Blutopfer darbringen und um ihre Gunst bitten ... jede Map muß mindestens zwei Schrein-Objekte besitzen - wenn man mehr platziert (was man machen sollte!), werden für die letztendliche Session 0-2 ausgewürfelt, die anderen werden gelöscht. So kommt Abwechslung in jedes Spiel. Und damit das Objective funktioniert, wird natürlich gewährleistet, daß das dafür notwendige Minimum an Schreinen im gesamten Modul vorhanden ist.
Schreine gabs im originalen "Kalawaum", waren da aber fix platziert, und nicht essentiell fürs Vorwärtskommen, die Möglichkeit, die Götter anzurufen (mit unterschiedlichen Erfolgschancen) gab es dort aber auch.

- Auch neu, Spawn-Traps (die gabs auch im originalen Spiel): Spawn-Traps dürfen im Editor platziert werden, können aber auch zufällig erscheinen. Wenn man auf eine solche Falle tritt, wird ein zufälliges Monster in die aktuelle Map teleportiert, welches dann auch sogleich Jagd auf den Spieler macht. Ich habe die Funktionalität für die Monster-Klasse allgemein ausgebaut - sprich, die lieben Kleinen sind selbst in der Lage, die Spawn-Traps zu betätigen ... :twisted:
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Die Gemäuer von Kalawaum (90s Classic, Rework)

Beitrag von diceman »

UPDATE:

- Habe eine Möglichkeit gefunden, in allen Verarbeitungs- und Darstellungs-Routinen nur diejenigen Objekte durchzuiterieren, welche in der jeweiligen Map vorhanden sind, ohne dafür die Objekte in eine globale und lokale Liste aufsplitten zu müssen (das würde spätestens, wenn Objekte während des Spiels gelöscht/kreiert werden, extrem messy werden) - der essentielle Trick war, bei Betreten einer neuen Map den stage-Parameter aller Objekte der aktuellen Map auf -1 zu setzen, dann die Liste mit

Code: Alles auswählen

SortStructuredList(listName(), #PB_Sort_Ascending, OffsetOf(STRUCTURE\stage), TypeOf(STRUCTURE\stage))
nach Größe des stage-Index zu sortieren, und anschließend alle -1 Paramter zurück auf den Index der aktuellen Map setzen .... Voila, alle Objekte der aktuellen Map befindet sich am Anfang der Liste, und in den jeweiligen Verarbeitungsroutinen kann ich nun, sobald ein stageIndex <> currentMap auftaucht, die ForEach/Next-Schleife vorzeitig canceln. Diesen Schritt muß man einmalig beim Betreten einer neuen Map ausführen, und ich darf ab sofort nicht mehr vergessen, Objekte, die innerhalb des Spiels erzeugt werden, umgehend mit MoveElement() an den Anfang der Liste zu schieben, damit sie sich im gegenwärtigen Verarbeitungskreislauf befinden. /:->
John Carmack wäre wahrscheinlich trotzdem stolz auf mich. :lol:

- Neu sind Wegsteine, die man über einen Text-Button mit einer Inschrift versehen kann - wichtig für Atmosphäre und den Adventure-Charakter des Spiels! Das ging überraschend elegant mit den Gadget-Routinen: ein neues Fenster öffnet sich, in dem man seinen Text schreiben kann, und sobald das Fenster geschlossen wird, werden die ersten 5 Zeilen per GetGadgetItemText() ausgelesen und als String im zugehörigen inscription()-Objekt gespeichert. Editieren geht auch: einfach einen beschriebenen Wegstein mit dem Text-Tool anklicken, und das Bearbeitungs-Fenster öffnet sich wieder. Inschriften sind verlinkt mit den Steinen, also wenn man einen Stein löscht, verschwindet auch die Inschrift.
Und wenn man im Editor mit dem Maus auf einem beschriebenen Wegstein zeigt, wird, falls vorhanden, der zugehörige Text in einer Vorschau eingeblendet.


Bild
Bild

- Was jetzt noch fehlt, ist ein Message-System, mit dem man dem Spieler WÄHREND dem Spiel Informationen und Nachrichten zukommen lassen kann ... die schönsten Wegsteine nutzen nichts, wenn man sie nicht lesen kann ... das geschieht im nächsten Schritt, und dafür muß ich mich auf die Suche nach einem schicken Bitmap-Font machen.

- Habe die Säulen-Grafiken überarbeitet - mit 16x16 Bildpunkten kannst nur soviel anstellen, aber es sieht jetzt besser aus, finde ich. Habe mich bewußt eingeschränkt, da ich so auch als Nicht-Grafik-Profi relativ schnell brauchbare Ergebnisse erziele und es so leichter ist, einen konsistenten Stil aufrechtzuerhalten. Grundsätzlich macht mir der Design-Aspekte, trotz kleiner, bescheidenen Möglichkeiten, sogar Spaß.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Die Gemäuer von Kalawaum (90s Classic, Rework)

Beitrag von diceman »

So langsam tut sich was im Dungeon ...
Das Message-System ist implementiert! :coderselixir:
Ich nutze den tollen Befehl RegisterFont() um Fonts spezifisch für das Projekt initialisieren, ohne daß der Endnutzer diese installieren muß. Sie werden lediglich für die Anwendung "registriert".
Ich habe es maximal modal gecodet - also der Routine createMessage() wird lediglich die entsprechenden Zeilen-Strings mitgeteilt, und aus den übermittelten Daten wird abhängig von Zeilenlänge, Anzahl und gewähltem Schriftfont die korrekte Höhe und Breite der Message-Box ermittelt - sollte sich später der Schriftfont ändern, muß ich an der Routine nichts mehr herumfuckeln - "it just works". Die Message-Box wird zudem "intelligent" platziert: ist der Spieler in der oberen Hälfte des Screens, wird die Box zu seinen Füßen angezeigt, befindet er sich unterhalb der Screen-Mitte, wird sie über ihm angezeigt.


Bild


WEITERE UPDATES:
- Einen letzter Obstacle-Akteur zugefügt: ein Kerzenleuchter.
- Im Editor platzierte Teleport-Traps haben im kompilierten Modul keine absolute Location. Es werden lediglich beim Initialisieren der Map alle vorhandenen Teleport-Traps gezählt, dann werden sie gelöscht, und zufällig neu verteilt. Die einzige Regel ist, daß lediglich in diagonalen Richtungen blockierende- und Special-Tiles angrenzen dürfen (Special = begehbar, mit Effekt; z.B. offene Türen werden auch als Special-Tile gewertet). So bleibt eine 100% Navigation gewährleistet.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Die Gemäuer von Kalawaum (90s Classic, Rework)

Beitrag von diceman »

UPDATE:
- Habe meine 16 Farben als konstanten Datensatz im Programmcode hinterlegt, so daß sich jegliche Grafik-Operationen (inklusive Text-Darstellung) stets kohärent zur Palette extern eingelesener Sprites verhalten.
- Jeglicher Ingame-Text, der nicht individuell im Editor als Inschrift "designt" wurde (HUD-Infos, Eigennamen, generische Interaktionen, etc.) wird zu Beginn des Spiels in dimensionierten Strings eingelesen, in einer Data-Sektion, welche zudem die Funktionalität für verschiedene Sprachen unterstützt. Die Sektion funktioniert autonom und leicht zu warten - eventuell kann man die Strings auch später über eine seperate .txt-Datei einlesen:


Bild


- Die Outdoor-Tiles werden nicht länger als obstacle()-Akteure geführt, sondern gehören der Base-Klasse an, funktionieren also intern wie ein weiteres Wall-.Tileset Damit zusammenhängend mußte ich ein paar Ausnahmen coden, z.B. haben Bäume keine perspektivische Frontansicht, und der Grass-Untergrund ist als Backgroundgrafik fix gesetzt. Außerdem funktionieren "Geheimgänge" etwas anders: jeder actor() hat jetzt ein individuelles Alpha-Flag, und geheime Durchgänge im Wald sind ein kleines bißchen transparent ... wie bei den regulären Geheimgängen muß man aber auch hier genauer hinschauen um sie zu entdecken ... :)


Bild
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Die Gemäuer von Kalawaum (90s Classic, Rework)

Beitrag von diceman »

Bild
Bild


UPDATE:
Erweiterte interaktive Message-Funktionen sind fertig!
Diese sind fester Systembestandteil für diverse Gameplay-Mechaniken (Türen mit Gewalt öffnen/Schrein-Interaktion) und können nicht im Editor erstellt werden. Die Routine nutzt jedoch dieselben Bausteine der Standard-Message-Funktion, ist also maximal modal designt. Die displayMessage()-Routine erkennt, ob sie eine reine Text-Message wiedergibt, oder eine mit interaktiven Elementen, und ist somit in der Lage einen Wert an den Requester zurückzugeben, ob und welche Option ausgewählt wurde.
- Blutsplitter sind die Währung im Spiel - man kann sie im Dungeon finden, und sie werden von besiegten Monstern gedroppt. Mit ihnen kann man sich die Gunst der Götter erkaufen, sie dienen aber auch als Punkte-Elemente (mit der Option "Inschriften entziffern" kann man sich die Highscore-Liste anzeigenlassen).
- Da mein erklärtes Ziel weiterhin darin besteht, das originale "Kalawaum" zu re-designen, wird an Schreinen zunächst nur die "Inschriften entziffern" und die "Opfer darbringen"-Option angeboten. Der Rest ist Design-Space für eigene Ideen um das Gameplay aufzupeppen. Das soll jetzt aber erstmal nicht der Fokus sein.
- Ich habe einen Datensatz an Alten Göttern eingelesen - für jede Session werden 4 zufällig ausgewählt, von denen Schreine im Spiel zu finden sein werden. Götter sind unterschiedlich gut (oder schlecht) gelaunt - während einer Session bleibt die Stimmung eines Gottes immerhin konsistent, also man muß in jedem Spiel neu lernen, welcher Gott wie drauf ist. :twisted: Meine Idee für ein besonderes, an Schreine gekoppelte Objective werde ich aber ebenfalls zurückstellen, und stattdessen mit Hochdruck an der Fertigstellung eines spielbaren Prototypen werkeln ... wenn alles weiter so gut läuft, vielleicht schon Ende August, aber spätestens September! :allright:


Bild
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Die Gemäuer von Kalawaum (90s Classic, Rework)

Beitrag von diceman »

UPDATE:

Meine Animations-Routine ist fertig!
Bislang kann sie zwar nur das Hinabstürzen in Löcher darstellen und einen Delay abspielen, aber jetzt, wo die grobe Architektur steht, kann ich ihr leicht neue Aufgaben zuteilen. Und viel komplexer als der Sturz in ein Loch wird es auch nicht - das war schon mit der aufwendigste Task, und die Hauptarbeit bestand hier auch nicht in der Darstellung, sondern im korrekten Konfigurieren der Sprites (jedes Monster-Sprite bekommt bei Erstellung eine prozedural erstellte Fall-Animation zugeteilt).
Es war in sofern wichtig, daß ich mich der Aufgabe zuwende, da ich nun im nächsten Schritt das erste Monster in den Dungeon einführen werde. Da der Spieler auch der Monsterklasse angehört, können prinzipiell alle Aktionen und Effekte, welche auf den Spieler wirken, auch auf Monster-Objekte angewendet werden - und um hier sicherzustellen, daß alles reibungslos funktioniert, kann ich mit dem Schritt nicht zu lange warten, da er von allen Aspekten des Spiels das weiteste Interaktions-Potential mit diversen Routinen und Gameplay-Mechaniken besitzt.
Da muß alles reibungslos laufen, bevor ich weiteren autonomen Content hinzufüge. :allright:


Bild
Bild


- Außerdem kleiner Tweak: da ich in einem für die jeweils aktuelle Map lokal angelegten monsterMap()-Array stehts Buch darüber führe, welche Felder durch Monster besetzt sind, kann ich easy und schnell Akteure, welche sich auf denselben Feldern wie Monster befinden (z.B. Pentagramm-Schalter und Items), mittels Alpha-Value teil-transparent machen - kostet quasi keine Zeit, sieht cleaner aus, und Hintergrund und Monster-Sprite verschwimmen nicht zu einem Pixelwust.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Antworten