Die Gemäuer von Kalawaum: Wer kennt es?

Alle Spiele, egal ob am PC, auf der Konsole oder dem Handheld werden hier diskutiert.

Beitrag » 30. Jul 2020 16:36 #51

Benutzeravatar
diceman
Beiträge: 40

Re: Die Gemäuer von Kalawaum: Wer kennt es?

Beitrag von diceman »

The Gravedagokck hat geschrieben:
30. Jul 2020 15:41
Ich finde, du ersetzt die altbackenen Features gut durch neue, die man ja auch aus anderen Roguelikes kennt, finde ich gut. :) Zum Riss in der Mauer: ganz oben, wo die Mauer ihren ersten Knick macht (bissle weiter rechts als links) in der Mitte des ersten Knicks. :D
Die wesentlichen Änderungen und Komfort-Features werden sich tatsächlich auf den Editor beziehen. Das Gameplay selbst will ich so wenig wie möglich anfassen, das ist unkaputtbar - eventuell hier und da besseres Balancing, damit vor allem der Einstieg ins Spiel ETWAS freundlicher vonstatten geht; - wie du schon erkannt hast, im Grunde ist das ein Roguelike, ein recht simples, und da gehört eben auch ein bißchen dazu, daß einem eine Verkettung unglücklicher Zufälle die Session versauen kann. Das macht andererseits den Wiederspielwert aus, da es trotz weitgehend fixer Architektur ausreichend prozedurale Elemente gibt, die für Abwechslung sorgen.
Wenn ich aber daran denke, daß du beim Editor damals keinerlei (oder bestenfalls minimale) Mausunterstützung hattest ... da mußtest du tatsächlich mit den Pfeiltasten einen Cursor auf ein Tile bewegen, dann einen Hotkey drücken, dann mit den Pfeiltasten den Raum (oder den Gang) "aufziehen", und dann wieder mit Hotkey die Veränderung an der Architektur bestätigen. Und die Items wurden ebenso platziert. Und ab einer bestimmten Anzahl an Maps mußtest du beten, daß dir das Programm nicht abschmiert.
Mit Maus UND Hotkey-Support habe ich einen kompletten Dungeon innerhalb weniger Minuten gezeichnet und im selben Zeitraum bereits dreimal getestet - ob dieser funktional ist und Spaß macht, steht natürlich auf einem anderen Blatt. :uff:
Mit dem Zufügen neuer Features bin ich SEHR vorsichtig - wie weiter oben mal erwähnt, bin ich kein kompletter Noob auf dieser Schiene, dies ist bereits der 5te Versuch etwas Rogueiges auf die Beine zu stellen - alle vorherigen Projekte sind eingeschlafen, aus unterschiedlichen Gründen. Einmal ist mir die Programmiersprache unter den Händen weggestorben (RIP, BlizBasic), die anderen beiden Male hatte ich kein klares Konzept wo ich mal hinwill außer "Ich mach jetzt ein Roguelike", das vierte Projekt war eine GameJam-Fingerübung, wo man ohne Schwert eine 50% Chance hatte, das Monster zu besiegen, mit Schwert 100%. :ugly:
Dieses Mal habe ich das erste Mal tatsächlich einen absehbaren Scope, ein einigermaßen absehbares Ziel worauf ich hinarbeiten kann.
Und vielen Dank für euer doch überraschend reges Interesse an diesem Nischenprojekt, ist sehr motivierend für mich - scheint, als hätte ich mir das richtige Forum ausgesucht. Und mit ein bißchen Glück guckt Runkel a.k.a. Horst Werner auch nochmal vorbei ... würde ihn gerne mal zu einem Bier einladen und wäre sogar bereit, dafür > 100 km zu fahren - der Mann ist schließlich der Held meiner Jugend. :bier:
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.

Beitrag » 31. Jul 2020 21:49 #52

Benutzeravatar
diceman
Beiträge: 40

Re: Die Gemäuer von Kalawaum: Wer kennt es?

Beitrag von diceman »

Clipboard08.jpg

UPDATE:

Der Teil der Editor-Programmierung, vor dem es mir am meisten gegraust hat, ist geschafft! :kaffee: :kaffee: :kaffee:
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.

Beitrag » 1. Aug 2020 06:07 #53

Benutzeravatar
diceman
Beiträge: 40

Re: Die Gemäuer von Kalawaum: Wer kennt es?

Beitrag von diceman »

Clipboard09.png
Clipboard09.png (8.81 KiB) 848 mal betrachtet

Wie findet ihr meinen Schnabel-Doktor? :uff:
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! :hoch:

Clipboard10.png
Clipboard10.png (3.69 KiB) 848 mal betrachtet
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.

Beitrag » 1. Aug 2020 10:44 #54

Benutzeravatar
The Gravedagokck
Wiesenchronist
Moderator
Beiträge: 42283
Kontaktdaten:

Re: Die Gemäuer von Kalawaum: Wer kennt es?

Beitrag von The Gravedagokck »

Sehr vorbildlich, der Protagonist (in diesem Fall) trägt Maske. :D Du kommst echt flott voran, finde ich! :hoch:
Got to be who you are in this world
Never walk out on your own story
But if you ever need me again
You know that I'll be, I'll be around.

Beitrag » 1. Aug 2020 16:18 #55

Benutzeravatar
diceman
Beiträge: 40

Re: Die Gemäuer von Kalawaum: Wer kennt es?

Beitrag von diceman »

Goldene Programmier-Regel: 80% Code entstehen in 20% der Zeit ... :ugly:
Maske ist Ehrensache. Allerdings hier im Spiel ausnahmsweise tatsächlich nur zum Eigenschutz - Kultisten und Shoggothen kriegt man mit Corona nicht kaputt.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.

Beitrag » 2. Aug 2020 23:25 #56

Benutzeravatar
diceman
Beiträge: 40

Re: Die Gemäuer von Kalawaum: Wer kennt es?

Beitrag von diceman »

Clipboard11.png
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? :confused:
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.

Beitrag » 3. Aug 2020 10:06 #57

Benutzeravatar
The Gravedagokck
Wiesenchronist
Moderator
Beiträge: 42283
Kontaktdaten:

Re: Die Gemäuer von Kalawaum: Wer kennt es?

Beitrag von The Gravedagokck »

Ich muss zugeben, ich sehe die Löcher gar nicht. :D Was sind denn die Speerfallen? Die, die so aussehen wie eine römische 2 oder die, die aussehen wie ein Pfeil?
Got to be who you are in this world
Never walk out on your own story
But if you ever need me again
You know that I'll be, I'll be around.

Beitrag » 3. Aug 2020 16:18 #58

Benutzeravatar
diceman
Beiträge: 40

Re: Die Gemäuer von Kalawaum: Wer kennt es?

Beitrag von diceman »

Die römische 2 soll eine Säule sein. Soviel zu meinen künstlerischen Ambitionen ... :uff:
Es gibt 2 Löcher, eins im grünen Streifen nördlich der oberen Tür, das andere im nordöstlichen Raum des Indoor-Bereichs. Wenn man weiß, wo nach man gucken muß, finde ich es eigentlich recht eindeutig. :uglycafe:
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.

Beitrag » 3. Aug 2020 23:27 #59

Benutzeravatar
diceman
Beiträge: 40

Re: Die Gemäuer von Kalawaum: Wer kennt es?

Beitrag von diceman »

Clipboard12.png

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 ... :uff: :uff:
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.

Beitrag » 5. Aug 2020 22:29 #60

Benutzeravatar
diceman
Beiträge: 40

Re: Die Gemäuer von Kalawaum: Wer kennt es?

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 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. Theoretisch ist es so möglich, ein Modul mit 1000 und mehr Maps laufen zu lassen ohne daß die CPU einknickt - irgendwann wird natürlich der Arbeitsspeicher knapp. :ugly: 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. :uff:
John Carmack wäre wahrscheinlich trotzdem stolz auf mich. :D

- 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 von "PureBasic": 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 öffent 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.

- 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.

Clipboard14.png
Clipboard14.png (4.84 KiB) 683 mal betrachtet
Clipboard13.png
Clipboard13.png (5.3 KiB) 683 mal betrachtet

- 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.

Beitrag » 6. Aug 2020 23:46 #61

Benutzeravatar
diceman
Beiträge: 40

Re: Die Gemäuer von Kalawaum: Wer kennt es?

Beitrag von diceman »

So langsam tut sich was im Dungeon ...
Das Message-System ist implementiert! :) :uff:
In "PureBasic" gibt den den tollen Befehl RegisterFont(), damit lassen sich 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.

Clipboard15.png

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.

Beitrag » 7. Aug 2020 23:04 #62

Benutzeravatar
diceman
Beiträge: 40

Re: Die Gemäuer von Kalawaum: Wer kennt es?

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:

Clipboard16.png

- 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 ... :)

Clipboard17.png
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.

Beitrag » 8. Aug 2020 15:31 #63

Benutzeravatar
diceman
Beiträge: 40

Re: Die Gemäuer von Kalawaum: Wer kennt es?

Beitrag von diceman »

Clipboard18.png
Clipboard19.png

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. :uff: :uff: 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! :hoch:

Clipboard20.png
Clipboard20.png (11.09 KiB) 620 mal betrachtet
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.

Beitrag » 8. Aug 2020 23:01 #64

Benutzeravatar
diceman
Beiträge: 40

Re: Die Gemäuer von Kalawaum: Wer kennt es?

Beitrag von diceman »

Clipboard21.png

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. :hoch:

Clipboard23.png
Clipboard23.png (6.01 KiB) 613 mal betrachtet
Clipboard22.png
Clipboard22.png (6.01 KiB) 613 mal betrachtet

- 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.

Beitrag » 9. Aug 2020 17:13 #65

Benutzeravatar
The Gravedagokck
Wiesenchronist
Moderator
Beiträge: 42283
Kontaktdaten:

Re: Die Gemäuer von Kalawaum: Wer kennt es?

Beitrag von The Gravedagokck »

Ui, da ist man einmal ne Woche weg und schon ist wieder einiges passiert, sehr schön. :D :hoch:
Got to be who you are in this world
Never walk out on your own story
But if you ever need me again
You know that I'll be, I'll be around.

Beitrag » 9. Aug 2020 19:20 #66

Benutzeravatar
diceman
Beiträge: 40

Re: Die Gemäuer von Kalawaum: Wer kennt es?

Beitrag von diceman »

Vielen Dank fürs Reinschauen. So ab und zu ein aufmunterndes Wort, das ist alles was ich brauche :uff:
Großes Update auch in diesem Post ...

Clipboard24.jpg

"Ladies and Gentleman, the first Monster has just entered the dungeon ..."
Das war eine Aufgabe für die ganze Nacht ... habe bis morgens früh um 5:00 durchprogrammiert, bis das alles so funktionierte wie gedacht (NullPointer-Exceptions, Array Index out of Bounds-Meldungen, etc.), aber jetzt habe ich die komplette Monster-Navigation fertig. :kaffee: :kaffee:
Monster haben verschiedene states: wenn sie "geboren" werden, schlafen sie, bis der Spieler sie aufweckt (wenn er ein Feld neben ihnen betritt). Dann bekommt das Monster den Zustand "aufgewacht", der Spieler hat also die Wahl ob er direkt draufhauen, oder weglaufen will. Im nächsten Schritt wechseln Monster in den Verfolger-Modus ... die KI und Wegfindung ist rudimentär, leistet aber ihren Zweck, und viel mehr hatte das Original auch nicht zu bieten - Ich habe das so gelöst:

Monster suchen die 8 umliegenden Felder ab, und geben jedem Feld einen Wichtungsfaktor, abhängig von der Distanz jedes Feldes zum Spieler im kartesischen Koordinatensystem (Satz des Pythagors, anyone?). Die Formel hierfür lautet:

Sqr(Pow(x-targetX, 2) + Pow(y-targetY, 2))

Für jedes Feld wird ein dummy()-Element angelegt, welches die Koordinaten enthält, sowie den Wichtungsfaktor. Dann werden alle Elemente herausgeschmissen, für welche Distanz > Minimum. Von den verbleibenden Feldern (in der Regel 1-2) sucht das Monster eines zufällig heraus und bewegt sich dorthin. Das reicht, um dem Spieler auf den Fersen zu bleiben, aber hat man es einmal abgeschüttelt, ist es in der Regel in seiner Ecke gefangen, solange bis man im großen Bogen zurückkommt.

Und da kommt der nächste monster()\state ins Spiel, der "Such"-Modus: Sobald nämlich das Monster mindestens 2 Felder weit entfernt vom Spieler ist, werden bei der Umgebungssuche die letzten 4 besuchten Felder mit einem abnehmenden Penalty-Wert belegt. Mit dem feinen Trick habe ich natürlich keine Skynet-KI geschaffen, aber die Monster sind jetzt mitunter in der Lage weiträumiger nach Umgehungen zu suchen, anstatt nur mit dem Kopf vor die Wand zu laufen. Der "dumme" Verfolger-Modus bei unmittelbarer Distanz hat aber auch seinen taktischen Zweck - würde man hier die KI "einschalten" würde das Monster, wenn man um ein Hinternis herumläuft, immer nur stupide in einer Richtung hinterherlaufen, ohne die Richtung abzuwechseln.

Und wenn man das Verfahren umdreht, also die kurzen Distanzen filtert, hat man einen Flucht-Modus. :)

Puh, weitere Tweaks:

Es gibt eine Variable maxActiveMonsters, welche vorgibt, wieviele Monster gleichzeitig aktiv sein dürfen. Zu Beginn des Spiels ist dies immer 1. Also wenn man vor einem Monster wegläuft, und man weckt ein weiteres auf, wird das erste Monster in den Zustand "Lauern" versetzt (Lauern ist effektiv wie schlafen, aber die Monster wissen bereits vom Spieler), und das neu aufgeweckte Monster "übernimmt". Und jetzt kommt das große Aha: wenn ein Monster stirbt, wird automatisch gecheckt, ob sich auf der Map Monster im "Lauern"-Modus befinden, und wenn ja, werden von denen soviele aufgeweckt wie die maxActiveMonsters-Variable erlaubt. Also zu Beginn nur eines.
Mit maxActiveMonsters (etwas ähnliches gab es auch im Originalspiel, aber mein System ist deutlich elaborierter) lässt sich prima die Gefährlichkeit des Dungeons an den gegenwärtigen Power-Level des Spielers anpassen: jede Map hat eine min/max-Range wie stark die Monster mindestens sind, und sein können. Und da der Spieler effektiv auch nur ein Monster ist, und somit irgendwo auf dieser Skala zu finden ist, kann man den maxActiveMonster-Wert dynamisch anpassen. maxActiveMonsters wird einmal gecheckt, wenn man eine Map neu betritt, und dann jedesmal aktualisiert, wenn ein Monster stirbt.

Verlässt man eine Map, werden alle Monster, deren\state >= #monsterStateLurking ist, in den Zustand "Lauern" versetzt. Also man kann die Monster so vorübergehend "abschalten", und hat beim Neu-Betreten der Map auch erstmal seine Ruhe, bis man ein Monster erfolgreich besiegt - dann wachen unter Umständen eines oder mehrere (abhängig von maxActiveMonsters) lauernde Monster auf, um ihren Kameraden zu rächen.

Monster haben eine Animation beim Laufen (also keine wirkliche Animation im Sinne von Gliedmaßen bewegen, duh), aber das Sprite bewegt sich halt kontinuierlich aufs nächste Feld. Animationen werden nur ausgeführt, wenn auf entsprechenden Feldern der Fog of War aufgedeckt ist; also wenn man kein Monster sieht, werden für diese auch keine Animations-Berechnungen ausgeführt. Für den Spieler habe ich die Bewegungsanimation ohnehin deaktiviert - der bewegt sich statisch von Tile zu Tile, das fühlt sich besser, flotter und in jeder Hinsicht "knuspriger" an.

Bislang ist es nur möglich, Monster in Fallen zu locken (dies funktioniert hervorragend, inklusive Animation) - Monster teleportieren sich auch munter durch die Gegend, wenn sie auf eine Teleport-Falle treten - also meine Vorarbeit in dieser Richtung hat sich voll ausgezahlt.
Im nächsten Schritt werde ich das Kampf-System entwickeln.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.

Beitrag » 10. Aug 2020 15:36 #67

Benutzeravatar
Lord Helmchen
Fuck everyone and Run
Beiträge: 11319

Re: Die Gemäuer von Kalawaum: Wer kennt es?

Beitrag von Lord Helmchen »

Cooles Projekt. Erinnert mich an mein Studium Beginn der 90er wo wir Assembler programieren durften (mussten) :hoch:
Laufchallenge (in km):
2011: 933,7
2012: 1.171,6
2013: 1.157,8
2014: 1.075,9
2015: 1.167,9
2016: 1.173,3
2017: 1.459,3
2018: 793,8
2019: 724,04
2020: 924,53

Beitrag » 10. Aug 2020 23:28 #68

Benutzeravatar
diceman
Beiträge: 40

Re: Die Gemäuer von Kalawaum: Wer kennt es?

Beitrag von diceman »

Clipboard25.png
Clipboard25.png (5.26 KiB) 552 mal betrachtet

UPDATE:

- Das wichtigste zuerst (warum hat mich eigentlich keiner darauf angesprochen?), DER DUNKELDÜRRE HAT NUR EINEN FLÜGEL!!1!
Ist jetzt zum Glück gefixt!

- Das "Bump"-System ist voll entwickelt! Das heißt, das Spiel registriert, wenn der Spieler in ein Monster rennt (und vice versa). Damit zusammenhängend hatte ich ein schönes Erlebnis bezüglich emergent behavior: ich hatte die Kollisions-Abfrage für das monsterMap()-Array herausgenommen, damit Kollisionen mit Monstern überhaupt als solche erkannt werden; hatte aber nicht bedacht, daß das Array nicht zwischen Monstern und Spielern unterscheidet, also begannen die Monster munter sich gegenseitig anzugreifen im Versuch, auf die entsprechenden Felder zu gelangen. Komplett mit allem was dazugehört: Schaden austeilen, Blut-Animation, Sterben, XP für den Spieler. Das sind solche raren Momente, da fühlt man sich so:
8884777495.jpg
auch wenn es nicht beabsichtig war, und ich es wieder deaktiviert habe.

- Blutgrafik zugefügt, wenn ein Charakter Schaden nimmt.

- Monster haben kleine Healthpoint-Bars! Der Spieler benötigt Feedback, wieviel Schaden er anrichtet, und das antiquierte Text-Message-System des Originals ("Du hast so und soviel Schaden gemacht, das Monster hat jetzt noch so und soviel Kraftpunkte") ist, nun ja, antiquiert. Die Frage war, wie ich das umsetze, also ob jedes Monster sein eigenes HUD-Element hat, wie ich die Prozentanzeige aktualisiere, etc. Habe mich letztendlich für die bequemste und schnellste Möglichkeit entschieden: 20 Healthbar-Sprites werden vorgerendert, mit Anzeige in 5%-Abständen, und in der drawScreen()-Routine, wenn durch die Monster iteriert wird, kann mit (hp*100)/hpMax/5 bequem und schnell der Index des korrekten Sprites herausgesucht und angezeigt werden. Bei so kleinen Grafiken die korrekte Prozentanzeige jedesmal "in Echtzeit" nachzujustieren, wäre Design-Overkill - die festen 5% Stufen sind absolut ausreichend um anschaulich zu vermitteln, wie effektiv der eigene Angriff war. Später, in der Polish-Phase, kommen noch Floating Numbers hinzu. :hoch:

- Die Healthbar-Anzeige wird dynamisch angezeigt, das heißt, nur bei aktiven Monstern ist sie zu sehen, und nachdem ein Monster 5 Schritte gelaufen ist, wird sie ausgeblendet. Sobald ein Monster angreift, oder der Spieler ein Monster, oder ein Monster geweckt wird, wird die jeweilige Anzeigen-Abfrage wieder auf #True gesetzt, und der Schritt-Counter resettet.

- Außerdem habe ich das Kampf-System grob entwickelt. Man kann zwar noch keine Waffen und Schilde aufsammeln, die entsprechende Funktionalität ist aber implementiert und ich kann Monster und Spieler virtuell via hardcoding ausrüsten. An den Zahlen werde ich noch schrauben müssen, da gibt es einige Rädchen an denen man drehen kann, aber fürs erste fühlt es sich ganz gut an (wie gesagt, ich habe keinen Quellcode des Originals, muß mich also auf Beobachtungs-Gabe und Einfallsreichtum verlassen, um ein ähnliches Erlebnis zu re-kreieren).

- Das Kampfsystem in "Kalawaum" ist so simpel wie genial: Die Hitpoints sind zugleich das Maximum an Schaden, die man theoretisch anrichten kann. Wieviel Schaden man macht, hängt von der ausgerüsteten Waffe ab (dahinter verbirgt sich eine prozentuale min/max-Range) - also je mehr Hitpoints ein Charakter verliert, umso näher ist er dem Tode, und umso weniger potentiellen Schaden kann er anrichten, da nützt die beste Waffe nichts. Wenn man herumläuft, regenerieren ALLE Charaktere (Monster wie Spieler) pro Spieler-Schritt einen Lebenspunkt. Das heißt, im Idealfall zwackt man einem Monster via Erstschlag soviele Hitpoints ab, daß es einem im Gegenschlag nicht mehr töten kann. Ansonsten ist taktisches Rumlaufen um Hindernisse angesagt, Monster abhängen indem man durch magische Türen geht, etc. nur um die Hitpoints wieder aufzufüllen. Alternativ kann man Monster auch in Fallen locken, dafür kriegt man jeweils nur 1 Erfahrungspunkt. So richtig XP regnet es nur, wenn man stärkere Monster (= mehr Hitpoints als man selbst) besiegt.

- Die XP-Anzeige gibt das Maximum an Hitpoints an, die man durch Rumlaufen erreichen kann - also es gibt kein Level-Up-System im herkömmlichen Sinne, dennoch wird man mit der Zeit kontinuierlich stärker.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.

Beitrag » 13. Aug 2020 14:58 #69

Benutzeravatar
diceman
Beiträge: 40

Re: Die Gemäuer von Kalawaum: Wer kennt es?

Beitrag von diceman »

Clipboard25.jpg

UPDATE:

Die Item-Grafiken sind fertig!
Es gibt, wie im originalen Kalawaum, 6 verschiedene Waffen mit ansteigendem Power-Level. Die Start-Waffe ist die Dämonenpeitsche (so heißt sie auch bei mir). Später kommt noch eine siebte Waffe hinzu, die Fackel, welche die Funktionalität des Zauberstabs im Original übernimmt.
inventoryWeapons.png
inventoryWeapons.png (1.37 KiB) 508 mal betrachtet
Von links nach rechts:
- Die Dämonenpeitsche (Demon Whip)
- Der geschwungene Ritualdolch (Curved Ritual Dagger)
- Das scharf geschliffene Beil (sharp-edged Hatchet)
- Die stattliche Sense (trusty Scythe)
- Der prächtige Krummsäbel (splendid Scimitar)
- Der mächtige Vorlader (mighty Blunderbuss)
- Die fremdartige Strahlenwaffe (alien Energy Coil)

inventoryShields.png
inventoryShields.png (1011 Bytes) 508 mal betrachtet
Schilde reduzieren Schaden. In "Kalawaum" gab es 4, bei mir gibt es 5. Von links nach rechts:
- schartiger Lederschild (worn Leather Shield)
- solider Holzschild (sturdy Buckler)
- wehrhafter Knochenschild (jagged Bone Shield)
- glänzender Metallschild (imposing Tower Shield)
- glühender Kometenschild (glowing Comet Shield)

Items haben ein generisches Icon in der Welt-Ansicht; erst wenn man auf das Feld läuft, weiß man genau, um was genau für eine Waffe oder ein Schild es sich handelte. Trägt man bereits ein entsprechendes Item, wird es fallengelassen und das neue Item wird ausgerüstet (Items können zerbrechen im Kampf, das ist einer der nächsten Schritte, die ich programmieren werde).


WEITERE UPDATES:
- Monster fliehen, wenn ihre Lebensenerge unter 10% des Maximalwertes sinkt. Steigt er wieder über 10%, wechseln sie zurück in den Verfolger-Modus (beim Originalspiel sind sie erst geflohen, wenn Hp < 10, absoluter Wert).
- Jegliche Schaden- und Schadensreduktionswürfe im Kampf werden im Spektrum der Gaußschen Normalverteilung ausgewürfelt, will heißen, es gibt einen Min und einen Max-Wert, und die effektive Spanne wird auf 2 Würfel aufgeteilt. So hat man mehr Konsistenz in der Zufallszahlen-Erzeugung, und bekommt ein besseres Gefühl, welches Item wie stark ist.
- Habe weiter an den Zahlen geschraubt, und nähere mich einem Wert an, der sich richtig gut anfühlt. Habe mich an einen GDC-Talk von einem Blizzard-Designer erinnert, über die "Make it overpowered"-Philosophie des Studios - nur mit drastischen Änderungen (in beiden Richtungen) kommt man dem Zahlenteufel beim Balancing auf der Schliche!
- Die XP-Funktion ist fertig. Man bekommt Erfahrungspunkte abhängig von der Stärke des Monsters, welches man besiegt hat: ein doppelt so starkes Monster (+100% Hp) gibt 8 Erfahrungspunkte, danach scaled der ganze Rest. Also wenn *player\hp = 20 und monster()\hp = 50, erhält man 12 Erfahrungspunkte. Das ist ein schönes, selbst regulierendes System, und existierte genauso im Original (if it ain't broke, don't fix it).

- Zufällige Monster-Verteilung wird dynamisch an maximal zulässige freie Felder angepasst. Die genaue Formel, die ich mir dafür ausgedacht habe, lautet:

percent = (Rnd(4,5) * countFree) /100
deviation = (Rnd(4,5) * percent) /100
monsterCount = percent + Rnd(-deviation, deviation)


- Dann habe ich eine erste grobe Scaling-Funktion geschrieben, welche im Laufe des Spiels kontinuierlich die Schwierigkeit erhöht. Der Difficulty-Level richtet sich primär nach den Monster-Stats (Hitpoints), es gibt eine Min-Max-Range, in welcher die Monster (entsprechend ihrem Subtyp) ihre Hitpoints auswürfeln dürfen. Diese Min-Max-Rage wird pro Map erhöht, und zwar als nicht-lineare Kurve:
Der jeweilige Difficulty-Level für eine beliebige Map errechnet sich nach folgender Formel:

Konstanten:
#hitpointsStart = 20 ;Kraftpunkte, mit denen der Spieler startet
#dungeonStrengthFactorFloor = 2
#dungeonStrengthFactorCeil = 3
#dungeonStrengthRange = 100


dungeonStrengthMin = #hitpointsStart+1
dungeonStrengthMax = dungeonStrengthMin + #dungeonStrengthRange
For a = 0 To currentStage
.... dungeonStrengthMin + (#dungeonStrengthFactorFloor * a)
.... dungeonStrengthMax + (#dungeonStrengthFactorCeil * a)
Next


Also die erste Map (Index 0) hat eine Difficulty-Range von 21-121
Die zweite Map (Index 1) hat eine Difficulty-Range von 23-124
Die dritte Map (Index 2 hat eine Difficulty-Range von 27-130
Die vierte Map (Index 3) hat eine Difficulty-Range von 33-139
... usw.
So mal als grobe Demonstration, wie so etwas funktionieren könnte!
An den finalen Werten werde ich aber sicher noch schrauben müssen. :uff:

- Und als letzten kleinen Tweak habe ich den Monster Social Distancing beigebracht - wenn eine neue Map aufgebaut wird, muß initial um den Spieler herum ein Sicherheitsradius von 2 Tiles in allen Richtungen (effektiv also 5x5 Felder) eingehalten werden - so wird vermieden, daß Monster direkt neben dem Spieler spawnen.



Das wars erstmal. :)
Zuletzt geändert von diceman am 13. Aug 2020 15:11, insgesamt 1-mal geändert.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.

Beitrag » 13. Aug 2020 15:06 #70

Benutzeravatar
The Gravedagokck
Wiesenchronist
Moderator
Beiträge: 42283
Kontaktdaten:

Re: Die Gemäuer von Kalawaum: Wer kennt es?

Beitrag von The Gravedagokck »

Von der Technik habe ich keine Ahnung (ich spreche keine Programmiersprachen), aber der Fortschritt liest sich sehr gut. Da es ja ein Roguelike ist, habe ich die Frage: was ist eigentlich das Spielziel? Gibt es einen Endboss oder ähnliches? Und kann man, nach Erreichen des Endes, den Grad der Schwierigkeit für folgende Runs erhöhen? Das einzige Roguelike, das mich bisher gefesselt hat, ist "Slay the Spire" und das liegt an seiner recht steilen Erfolgskurve, aber dem schweren Erreichen des Ziels (easy to learn, hard to master), wo man nach dem Ziel (Beenden der 3./4. Ebene) eine sogenannten "Ascension"-Modus freischaltet, der einem mehr und mehr Steine in den Weg legt. :)
Got to be who you are in this world
Never walk out on your own story
But if you ever need me again
You know that I'll be, I'll be around.

Beitrag » 13. Aug 2020 22:36 #71

Benutzeravatar
diceman
Beiträge: 40

Re: Die Gemäuer von Kalawaum: Wer kennt es?

Beitrag von diceman »

Heyho,
Im weiteren Sinne ist das natürlich ein Roguelike, wenn auch nicht gemäß der ganz strengen Klassifikationen, dafür müßte das Spiel prozedurale Generierung der Level-Architektur bieten. Die Art, wie "Kalawaum"-Maps designt sind, sind jedoch äußerst schwer prozedural zu generieren, damit sie stets lösbar bleiben UND eine Herausforderung bieten; das Spiel besitzt jedoch, trotz weitgehend statischen Aufbau, jede Menge zufälliger Elemente, welche ausreichend Abwechslung gererieren.
Wenn ich eine Test-Version online stelle, werde ich selbstverständlich ein kleines Modul erstellen um zu zeigen, was mit dem Editor möglich ist - vor allem ist er weitaus komfortabler zu bedienen als der Editor des Originals, und man kann schon in wenigen Minuten eine komplette Map designen und testen. Und, ja, es wird eine kleine Hintergrundgeschichte mit definiertem Spielziel geben - nix großes, aber die Modul-basierte Architektur des Spiels läuft geradezu zwangsläufig darauf hinaus, daß es ein Ende geben muß. Aber ein NewGame+ zu implementieren dürfte nicht besonders schwer sein, vielen Dank für die Idee, also man fängt wieder von vorne an, behält seine Stats, seine Waffe, Schild und Schlüssel, und die Dungeons scalen einfach immer weiter.
SLAY THE SPIRE kenne ich (fands aber nach fluffigem Einstieg irgendwann zu streng und zu schwer).
Ich finde das Genre "Roguelike" ungemein faszinierend - das Seltsame ist nur, ich kenne kaum eines, welches mir wirklich Spaß macht, bzw. mir genug Anreiz bietet dranzubleiben. Diese ganze ASCII-Dinger wirken ungemein abschreckend auf mich, und an solche Design-Monster wie DWARF FORTRESS, ANGBAND und NETHACK habe ich mich nie herangetraut, da ich keine Geduld und Muße habe, mich in derart ausladend komplexe Mechanismen reinzufuchsen; "Kalawaum" (bzw. "Calaworm" :p ) habe ich immer als eine Roguelike gesehen, für Leute, die eigentlich keine Roguelikes mögen. Es gibt Taktiken, die sich organisch aus den reduzierten Mechaniken ergeben, und die Haupt-Herausforderung war es nie, irgendwelche obskure Mechaniken und Interaktionen zu lernen, sondern einfach nur aufmerksam zu sein: wissen, wo die Fallen sind, beobachten, wie die Monster-KI funktioniert, zu lernen ob es sich lohnt ein Monster anzugreifen, oder ob man es lieber in eine Falle "cheesed", und wenn ich unbekanntes Terrain erkunde, mir möglichst einen Rückzugsweg freizuhalten.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.

Beitrag » 16. Aug 2020 16:14 #72

Benutzeravatar
diceman
Beiträge: 40

Re: Die Gemäuer von Kalawaum: Wer kennt es?

Beitrag von diceman »

boromirRogue.jpg

Ich weiß, sowas sagt man nicht, aber ich nähere mich dem Ende. :huh: :huh: :uff: :uff:
Sicherlich werde ich einige Wochen/Monate hiermit verbringen, aber momentan sieht es gut aus, daß ich bis Ende August etwas Spielbares vorzeigen kann. Die Mechaniken sind fast alle implementiert und funktionieren, die Updates in den letzten Tagen haben dem Projekt endlich den notwendigen Charakter gegeben - es fühlt sich wie ein "Spiel" an!


UPDATE:

-Items (Waffen, Schilde, Schlüssel) können abgelegt werden. Insbesondere das Ablegen von Schlüsseln hatte in "Kalawaum" einen taktischen Nutzen, da man automatisch offene Türen beim Durchschreiten abschließt, sofern man den entsprechenden Schlüssel im Inventar trägt.
Ursprünglich hatte ich streng kontrolliert, welche Felder zulässig für Item-Ablage sind - diese Abfrage-Routinen habe ich nun weitgehend entfernt, weil ich mir gedacht habe: what the heck, lass den Spieler doch Items auf Teleporter ablegen, wenn er mag!
Dazu mußte ich die checkStep()-Logik, welche nach jedem Schritt überprüft, ob ein Event getriggert wurde, umstellen, damit multiple Ereignisse methodisch abgearbeitet werden können, und Fallen weiterhin so tödlich bleiben wie zuvor. Das Ergebnis ist ein super-modales System, bei dem man, wenn man auf einen Teleporter tritt auf dem zugleich ein Item liegt, zunächst das Item aufsammelt, und dann direkt wegteleportiert wird, UND dann kann man noch ein Monster am Zielort aufwecken. Lediglich für das Zielfeld wird kein Check ausgeführt - also wenn dort auch ein Item liegt, muß man sich erst wegbewegen und dann erneut das Feld betreten.
Theoretisch kann einen ein Teleporter mit fixer Zieladresse auf ein Feld mit Monster schicken - das ist aber nicht weiter tragisch, das Programm kommt gut klar damit, und wenn man es einfach "Ambush" nennt, hat man sogar ein Feature anstelle eines Bugs: :P - je nachdem, wer am Zug ist (Monster oder Spieler - letzterer, wenn er das Monster gerade aufgeweckt hat), muß das Feld verlassen, und wird dann wahrscheinlich im nächsten Zug direkt angegriffen. Und da dies eine Ausnahmesituation darstellt, da bei Monster-Erstellung Zieladressen von statischen Teleportern ohnehin aus dem Pool an zulässigen Tiles herausgenommen werden, handelt es sich um einen edge case, dessen Konsequenzen gut tragbar sind.

- Waffen und Schilde können zerbrechen! Hier habe ich einiges getweaked und verschiedene Systeme ausprobiert. Im ersten Draft hatte jedes Item einen durability-Stat, und wenn dieser einen festgelegten Breaking Point erreicht hat, ist das Item zerbrochen. Das funktionierte, aber fühlte sich nicht wirklich gut an. Dadurch bekommt der Item-Verschleiß einen unangenehm deterministischen Charakter, also quasi jedes Item, was man aufsammelt, ist letztendlich zum Zerbrechen verurteilt.
Also back to the drawing board ... in der finalen Routine gibt es jetzt einen Threshhold-Wert, welcher für Waffen variiert, wie stark man damit zugeschlagen hat. Dieser Wert wird durch eine Prozentangabe beschrieben, wo genau in der Range der Waffe sich der gewürfelte Schaden befindet (1-100). Gegen diesen Wert wird mit Random(5000, 1) gewürfelt (5000 ist die Breaking-Point-Konstante), und wenn das Ergebnis kleiner/gleich dem ermittelten Threshhold-Value ist, zerbricht das Item. Also effektiv, je nachdem wie stark zugeschlagen wurde, gibt es eine 0.02 - 2.0 % Chance, daß ein Item zerbricht). Für Schilde existiert derselbe Breaking-Point, allerdings werden hier 2 Threshhold-Values aufaddiert, bevor dagegen gewürfelt wird: wie stark der Gegner zugeschlagen hat, und wieviel % Schaden reduziert wurden. Effektiv haben Schilde also einen etwas höheren Verschleiß. Das fühlt sich richtig gut an, und scheint ähnlich im Originalspiel ähnlich abzulaufen - da konnte auch ein Langschwert beim ersten Schlag zerbrechen ( :mad: ) - ich glaube sogar, daß mein System ETWAS freundlicher ist.

- Türen können mit Gewalt geöffnet werden. Diese Option wird einem angeboten, wenn man versucht, eine Tür zu öffnen und keinen passenden Schlüssel besitzt UND wenn man mindestens eine Waffe und/oder einen Schild ausgerüstet hat (mit der Dämonenpeitsche = Startwaffe kann man keine Türen öffnen). Dazu wird einmal gegen jedes ausgerüstete Item-Wertigkeit gewürfelt (Random(5, 1) für Schilde, und Random(6, 1) für Waffen ), und wenn mindestens einer der beiden Würfe <= der Item-Wertigkeit, wird die Tür erfolgreich aufgebrochen. Anschließend wird für jedes ausgerüstete Item gewürfelt, ob es zerbricht (33%-Chance bei Mißerfolg, 66%-Chance bei Erfolg). Also wenn man Waffe UND Schild ausgerüstet hat, hat man eine höhere Chance auf Erfolg, riskiert aber auch, daß evtl. beide Items kaputt gehen.
Sowieso sollte dies nicht die bevorzugte Art und Weise sein, Türen zu öffnen, aber da im Originalspiel es immer wieder zu unglücklichen Situationen kommen konnte, in denen man sich eingeschlossen hat, habe ich diese Option als letzten Strohhalm eingebaut.

- Bestimmte Events haben atmosphärische Text-Nachrichten bekommen. Je nach ausgewählter Sprache in deutsch oder englisch (kein großer Akt, da ich jeglichen ingame-Text vorab als dimensionierte Strings einlese):

Clipboard26.png

- Da das Spiel über Lovecraft-Thematik verfügt, und somit geistige Gesundheit des Protagonisten eine Rolle spielt, habe ich mir eine "Sanity"-Mechanik ausgedacht - diese ist recht simpel, gibt aber dem Gameplay-Loop mehr Atmosphäre und taktischen Pfiff:
Man startet mit Sanity = 5. Im endgültigen Spiel wird es 10 verschiedene Monster geben, die Hälfte hat ab sofort die Fähigkeit, dem Spieler Geistige Gesundheit zu rauben (Tiefe Wesen, Dunkeldürre, Shogotten, Phantome und Sternengezüchte) ... und zwar nicht durch Angriffe, sondern passiv, alleine dadurch, daß der Spieler am Ende seines Zuges neben einem Monster steht. Dieser Monster-Skill ist Prozent-basiert, gibt mir somit einen größeren Design Space, da sich Monster nun auch durch andere Werte definieren, als nur Kraftpunkte und Schadenspotential. Also wenn man wegläuft vor Monstern um seine Kraftpunkte wieder aufzuladen, muß man nun zusätzlich seine Sanity-Anzeige im Blick haben
Geistige Gesundheit lädt sich wieder auf, wenn man herumläuft, und kein Monster neben sich stehen hat. Zusätzlich gibt jeglicher physische Schaden, der ausgeteilt wird, egal ob durch Spieler oder Monster, +1 Sanity-Punkt zurück. Dies ist ungemein thematisch, da man nun, bei niedriger Sanity + getriggerter Aggro, sich zwischendurch immer Schmerzen zufügen muß, um nicht wahnsinnig zu werden. :ugly:
Der letzte entscheidende taktische Kniff bei dem System: Für jedes im Kampf besiegte Monster (nicht durch Fallen), ganz egal wie stark, erhöht sich die maximale Geistige Gesundheit um +1. Man hat nun ein sinnvolles Entscheidungsgefälle im Umgang mit schwächeren Monstern: cheesed man sie lediglich in eine Falle, kriegt man zwar +1 XP, aber levelt keine Sanity. Andersrum riskiert man natürlich daß Waffe oder Schilde zerbrechen, und man bekommt keine XP, aber man erhöht dauerhaft seine Geistige Gesundheit. Und Sanity ist später, wenn man gefährlicheren Monstern wie Shogotten und Sternengezüchten begegnet, kein zu unterschätzender Stat.

- Items, die im Editor platziert werden, haben ab sofort nur noch eine relative Position. Das Programm liest die Koordinaten aller platzierter Items aus und wendet eine "FloodFill"-Routine auf das entsprechende Tile an, um angrenzende, ebenfalls zulässige Tiles zu erkennen und in einer Liste zu speichern. Ab sofort können Items also in variablen Position gefunden werden - innerhalb der natürlichen Begrenzung ihrer Start-Areale, also kein Item, welches im Editor vor einer Tür platziert wurde (egal ob diese offen oder zu ist), wird sich im Spiel auf einmal dahinter befinden!
Das war eine kleine, aber effektive Maßnahme, welche den Adventure- und Exploration-Fokus des Spiels gehörig aufwertet.
Und auf die "FloodFill"-Routine bin ich besonders stolz:

Clipboard27.png

In Kombination mit dem neuen, eleganteren event-Handling ist nun Potential für tolle emergent gameplay-Situationen gegeben: da initial platzierte Items nun auch auf Teleport-Feldern und Spawn-Traps (welche ebenfalls zufällig verteilt werden) landen können, muß man nun Konsequenzen abwägen, wenn man das daraufliegende Item aufsammeln möchte (tödliche Fallen bleiben natürlich tabu für Item-Placement - so ein Arschloch bin ich dann doch nicht :confused: ).

- Last but not least habe ich Funktionalität für einen Screen Shake implementiert. Damit lassen sich prima "Event"-Treffer, also wenn man Monster besiegt, Items kaputt gehen, oder eine Tür aufbricht, visuell hervorheben.
Fühlt sich einfach gut an! :hoch:
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.

Beitrag » 19. Aug 2020 14:08 #73

Benutzeravatar
diceman
Beiträge: 40

Re: Die Gemäuer von Kalawaum: Wer kennt es?

Beitrag von diceman »

Clipboard28.png

UPDATE:

Ich habe das Sanity-System weiter getweaked und poliert. Es gibt einen zusätzlichen Item-Typ im Spiel zu finden, die "Consumables". Da ich das Kern-Spielprinzip von "Kalawaum" nicht verwässern möchte, und weiterhin einen flotten Gameplay-Loop anstrebe, den man ohne Number-Crunching aus dem Bauch heraus spielen kann, sind das weitestgehend auch nur Items mit passivem Effekt ... Consumables helfen Geistige Gesundheit zu wahren, und wieder aufzufüllen: trägt man eines bei sich, wird das Sanity-Check-Value des Monsters, welches einen verfolgt, je nach Item-Wertigkeit ein wenig reduziert; desweiteren geben Consumables, wenn man physischen Schaden zufügt oder erleidet, jeweils eine Chance auf +1 Bonus Sanity-Gain (auch abhängig von der Wertigkeit des Items).
Es gibt 5 Consumables:

Clipboard31.png
Clipboard31.png (1.07 KiB) 435 mal betrachtet

- eine Phiole mit Weihwasser
- eine Dose mit Tabakhalmen :ugly:
- eine Flasche Whisky
- einige Zauberpilze
- einen Schuss Mohn-Serum

Consumables haben, wie Schilde und Waffen, eine Chance zerstört (sprich: "aufgebraucht") zu werden, jedesmal, wenn ein Monster einem erfolgreich Geistige Gesundheit abzieht. Consumables können auch abgelegt werden - hier öffnet sich zusätzlich ein Dialog, ob man das Item ablegen, oder in Notfällen gar komplett konsumieren möchte, für einen signifikanten einmaligen "Oh Shit"-Prozent-basierten Boost auf Geistige Gesundheit. Danach ist es ganz aus dem Inventar verschwunden.

Ich habe die UI fertiggestellt: für jeweils Hitpoints und Sanity gibt es ein Herz- (anatomisch korrekt, selbstverständlich), bzw. ein Gehirn-Symbol, welche den Wert prozentual visualisiert. Nimmt einer der Werte ab, "leert" sich auch das entsprechende Symbol:

Clipboard29.png
Clipboard29.png (1.64 KiB) 438 mal betrachtet

Das Währungs-System ist fertiggestellt: Monster, sofern man sie im Kampf besiegt, droppen "Kristallscherben" (Crystal Shards). Gesammelte Kristallscherben sind einerseits Punkte für die Highscore-Liste (werden bei Spielende oder Ableben mit dem Erfahrungslevel = hitpointsMax multipliziert), man kann mit ihnen aber auch die Gunst der Götter bezahlen, und an Schreinen (sofern man dem jeweiligen Orden beigetreten ist), ein Bindungsritual ausführen - dahinter verbirgt sich eine "True Save"-Funktion, also eine zweite Chance. Hat man ein solches Ritual abgehalten, und man stirbt, wird der Spielstand an den Moment zurückversetzt, an dem das Ritual abgehalten wurde. Dieses Ritual kann man aber nur einmal pro Schrein ausführen ... Das Spiel verlassen und später an derselben Stelle fortsetzen, ist selbstverständlich immer möglich!

Ab sofort besteht bei erstmaligem Betreten einer Map eine Chance, daß zusätzlich zu den im Editor platzierten ausrüstbaren Items (Waffen/Schilde/Consumables) ein zufälliges Bonus-Item spawnt, bzw. ein vorhandenes Item gelöscht wird.

Ich habe gemerkt, daß ich den ganz dunklen Grünton aus meiner 16-Farben-Palette so gut wie gar nicht benutzt habe - der ist jetzt raus, und wurde durch ein sickes, dreckiges Gelb ersetzt, welches mir mehr Design-Space gibt; z.B. haben die Dunkeldürren jetzt Klauen, und das letzte Waffen-Item, welches in diesem Update ebenfalls neu dabei ist, sieht so auch hübscher aus:

Clipboard30.png
Clipboard30.png (1.01 KiB) 438 mal betrachtet

Mit der Fackel kann man keinen Schaden zufügen, aber Monster in die Flucht schlagen. Sie hat eine virtuelle Damage-Range von 1-100, und je nachdem welcher Wert gewürfelt wurde (Gaußsche Bell-Curve), flieht das Monster weiter oder weniger weit, bevor es wieder in den Suchen-und-Verfolgen-Modus wechselt. Weil das ein recht mächtiges Item ist, hat es auch eine höhere Chance beim Schlag zu zerbrechen.

Und weil ich so gut vorankomme, habe ich beschlossen, jedem Monster eine kleine Spezialfähigkeit zu geben, um den jeweiligen Charakter und die zugehörige Fantasy zu betonen. Das werden keine Game-Changer sein (siehe erster Absatz, soviel gibt das gestreamlinete Design nicht her), aber kleine individuelle Tweaks, z.B dürfen die Dunkeldürren im Fluchtmodus zwei Felder weit laufen (macht sie herrlich evasive, und passt zum Design mit den Flügeln).

...

So, das war's in diesem Update.
Wenn ich mich wieder melde, habe ich restlichen Monster fertig. :hoch:
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.

Beitrag » 22. Aug 2020 19:16 #74

Benutzeravatar
diceman
Beiträge: 40

Re: Die Gemäuer von Kalawaum: Wer kennt es?

Beitrag von diceman »

Clipboard33.png

Das zweite Monster ist fertig, ein "Rat-Thing", bzw. ein "Rättling".
Das ist von den Stats her das schwächste Monster, es saugt auch keine geistige Gesundheit ab, aber wenn der Rättling nach seinem ersten Zug auf einem "dunklen" Bodenfeld stehenbleibt, darf er eine 50% Chance auf einen zweiten Zug würfeln. Wenn man den Rättling nicht sieht, also solange er sich im Fog of War bewegt, bewegt er sich IMMER zwei Felder. Rättlinge können Geheimgänge nutzen, und sind immun gegen Pfeilfallen.

Clipboard34.png
Clipboard34.png (316 Bytes) 402 mal betrachtet

Außerdem im Bild zu sehen: die Kristallscherben (Währung im Spiel) gibt es jetzt auch als Pick-Ups zum Aufsammeln. Man kann sie im Editor platzieren (der letzendliche Wert pro Item ist zufällig (Gauß'sche Wichtung gen 1), auch die endgültige Location wird - wie bei anderen Items -innerhalb der Schranken des initialen Areals randomisiert), außerdem werden, abhängig von der Anzahl der Maps in einem Modul, eine randomisierte Menge an Kristallscherben in allen Maps verteilt.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.

Beitrag » 27. Aug 2020 22:35 #75

Benutzeravatar
diceman
Beiträge: 40

Re: Die Gemäuer von Kalawaum: Wer kennt es?

Beitrag von diceman »

Clipboard36.png

GROßES UPDATE:

Ich habe den deutschen Sprachsatz rausgeschmissen. Es war ursprünglich eine Challenge, wie man Lokalisationen effektiv und elegant einbinden kann, es hat funktioniert, aber ich hatte keine Lust mehr auf Nominativ und Akkusativ-Edge Cases, die man alle seperat als Data-Files einlesen und berücksichtigen muß. Englisch ist in dieser Hinsicht weesentlich pflegeleichter, und sonderlich textlastig ist das Spiel sowieso nicht - Feedback kriegt der Spieler primär über die visuelle Schiene.

Das voraussichtlich letzte Tileset ist fertiggestellt, die Wasserfelder. Im Wasser kommt man schwerer vorwärts, deswegen gibt es besondere Interaktionen: per Default haben Charaktere auf Wasserfeldern eine 25% Chance, einen Bewegungsbefehl zu ignorieren. Angreifen kann man aber immer. Und der Spieler regeneriert auf Wasserfeldern 2 Hitpoints, anstatt nur einem. Einige Monster, zum Beispiel die Nightgaunts, haben Angst vor Wasser, das heißt es gibt eine 75% Chance, wenn sie auf einem Feld <> Wasser stehen, daß bei der Pfadsuche Vorschläge mit Wasserfeldern mit einem Penalty-Wert belegt werden.

Statt spezifische Eigenschaften von Monstern einzeln abzufragen, habe ich ein modales "Ability-System" geschrieben, welches in der Lage ist, jedes Monster mit jeder beliebigen Eigenschaft auszustatten. Dies können positiv konnotierte Fähigkeiten, aber auch negative, thematische Traits sein. Ich kann nun, wie im Baukasten, mir Monster zusammenbasteln - dies öffnet Tür und Tor für die aus ARPGs bekannten Features wie den "einzigartigen Monstern", welche zufällige Eigenschaften zugeteilt bekommen (dergleichen werde ich aber - wenn überhaupt - sehr viel später implementieren):

Clipboard37.png

Weitere visuelle Tweaks zugefügt: eine Teleport-Animation, eine Idle-Animation für Monster, und semi-permanente Blutflecken, die nach und nach verblassen.

Komfort-Features für den Editor: Wenn man Türen platziert, wird direkt das gegenwärtig aktive Mauer-Tile mitplatziert, respektive beim Löschen durch das primär selektierte Boden-Tile ersetzt. Und im FloodFill-Mode kann man nun auf Türen klicken, um alle anderen Türen auf derselben Map mit dem ausgewählten Mauer-Tile zu ersetzen.

"Spawning" implementiert: wenn Spieler oder Monster auf eine Spawn-Trap treten, wird ein zufälliges Monster irgendwo auf ein freies Tile in die Map teleportiert.Die entsprechende Funktion ist modal designt, sie kommt bei der Summon-Ability der Deep Ones zum Einsatz, und wenn Kultisten mutieren.

Neue Fähigkeit für den Nightgaunt: sie können den Spieler "wegtragen", ("tickle into Submission" - um es mit den Worten von H.P. Lovecraft auszudrücken): bei einem erfolgreichen Angriff gibt es eine 50% Chance, daß ein Nightgaunt mit dem Spieler den Platz tauscht. Das hört sich simpel an, war aber programmiertechnisch eine Herausforderung, da an der Aktion eine Kette an Design-Entscheidungen hing - letztendlich habe ich es so gelöst, daß der Switch effektiv als ferngesteuerter Spieler-Move funktioniert - so werden automatisch alle Effekte für das Betreten des neuen Feldes mit ausgeführt, zum Beispiel aufsammeln von Gegenständen, oder Ausführen von Teleports. :uff:

Erstes neues Monster: The Cultist
Der Kultist ist ein recht schwaches Monster, vergleichbar mit dem Rat-Thing; er hat keine besonderen Fähigkeiten - wenn er aber von einem beliebigen Bodenfeld auf ein Wasserfeld tritt, hat er eine 66% Chance zu einem Deep One (einem "Tiefen Wesen") zu mutieren:

Clipboard38.png
Clipboard38.png (335 Bytes) 391 mal betrachtet

Zweites neues Monster: The Deep One (Tiefes Wesen)
Deep Ones sind für sich gesehen nicht wahnsinnig stark, haben aber ein recht komplexes Set an Fähigkeiten, welches sie unter Umständen sehr gefährlich machen kann: zunächst mal ziehen sie Geistige Gesundheit, wenn sie den Spieler verfolgen. Dann können sie sich ungehindert auf Wasser bewegen; im Wasser sind sie tauchend unterwegs, das heißt, man sieht sie nur als Kringel auf der Wasseroberfläche, und ihren Lebenspunkte-Balken sieht man auch nicht (allerdings wird jedes Monster bei erster Begegnung vorgestellt - man weiß in der Regel, wie stark ein Monster initial ist - und eins der nächsten Updates wird Floating Numbers einführen, für direkteres Feedback, wieviel Schaden man macht).
Last but not least haben Deep Ones eine Summon-Ability: wenn sie sterben, gibt es eine 75% Chance, daß einem zufällig ausgewürfelten Schrein-Objekt auf der Map ein weiteres Monster herbeigerufen wird ... 50% Chance auf einen Subtypen der eigenen Klasse, 50% ein Kultist:

Clipboard39.png
Clipboard39.png (362 Bytes) 391 mal betrachtet
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.

Antworten

Wer ist online?

Mitglieder in diesem Forum: Semrush [Bot] und 5 Gäste