Spielereien vom diceman

Heißer Scheiß von übermorgen oder liebenswerte Goldies von vorvorgestern: Alles willkommen!
Antworten
Benutzeravatar
diceman
Beiträge: 8994
Registriert: Mo 7. Mai 2012, 21:21
Kontaktdaten:

Re: Spielereien vom diceman

Beitrag von diceman » Di 1. Dez 2020, 21:21

Kleines Update:
Habe in den letzten Wochen prokrastiniert und mich auf den bislang erreichten Erfolgen ausgeruht. Zwischendurch in den Code geschaut habe ich aber immer mal wieder, und habe angefangen, ein Modul zu erstellen, welches bislang 3 Maps umfasst. In den letzten Tagen war ich aber wieder fleißger, habe am Balancing geschraubt, diverse Mechaniken getweaked, und thematische Texte hinzugefügt. Außerdem wurde die Funktionalität des "World Seeds" erweitert, welcher bei wiederholtem Neustart für subtile Deja-vû Erlebnisse verantwortlich ist. Und wenn man wahnsinng wird, sieht man jetzt alle Monster als Kopie von einem selbst, als "Shadow Twin". :wtf:

Bestes neues Feature: wann immer ein Monster auf einem Schlüssel spawnt, wird dieser dem Inventar des Monsters zugefügt, und man erhält ihn erst, wenn man das Monster besiegt hat, bzw. auf eine SpikeTrap lockt (dann wird er gedroppt). Fällt das entsprechende Monster allerdings in ein Loch, ist der Schlüssel verloren (das ist ganz schön fies, aber keine Katastrophe, da der Spieler mit dem gewaltsamen Öffnen von Türen eine Alternative bekommen hat, welche es im Original noch nicht gab).

Ich bin definitiv über den Berg, das Ziel ist in Sicht, und werde noch in dieser Woche den letzten Gameplay-Meilenstein angehen, die Schrein-Effekte!

Einige geplante Features habe ich auf Eis gelegt, und auf "after release" verschoben, da sie lediglich nice-to-have, und nicht relevant fürs Core-Gameplay sind, als da wären:

- ein neues Hebel-Element, mit dem man eine Geheimtür auf einer Map öffnen kann, sobald man alle gefunden hat (prozedural adaptierte Verteilung)
- ein zweites Set von Magic Doors, welche über einen seperaten Trigger gesteuert werden und so diffiziler ausgeklügelte Rätsel-Elemente ermöglichen
- ein interessantes, thematisches Objective

Fürs erste soll ein allgemeines, leicht verständliches Ziel genügen: finde und töte 85% aller Monster ... :shifty:

Clipboard56.png
"Ja, Junge, da kann man mal sehen, wie schlecht du denken kannst."
• Jean-Luc Picard

Benutzeravatar
diceman
Beiträge: 8994
Registriert: Mo 7. Mai 2012, 21:21
Kontaktdaten:

Re: Spielereien vom diceman

Beitrag von diceman » Do 24. Dez 2020, 02:07

Wollte kurz vor Jahresende nochmal ein Update geben, nicht daß jemand auf den Gedanken käme, ich hätte aufgegeben ... :oops:
Ich befinde mich weiterhin auf der Zielgeraden, da schmeißt man nicht das Handtuch; habe endlich angefangen, die Schrein-Effekte zu designen! Davon gibts eine ganze Hand voll, und die müssen einzeln hardgecodet werden, da jeder Effekt auf einer bestimmten vorhandenen Mechanik aufbaut und diese modifiziert oder sich Parameter für ein entsprechendes Ereignis "ausleiht" - da kann man wenig abstrahieren, von extern einlesen und unifizieren ... ist allerdings mehr Schreib- als Denkarbeit.

Clipboard57.png
"Ja, Junge, da kann man mal sehen, wie schlecht du denken kannst."
• Jean-Luc Picard

Benutzeravatar
diceman
Beiträge: 8994
Registriert: Mo 7. Mai 2012, 21:21
Kontaktdaten:

Re: Spielereien vom diceman

Beitrag von diceman » Mi 27. Jan 2021, 15:52

KLEINES UPDATE:

Ich habe die Arbeit wieder aufgenommen. :)
Es ist nicht mehr viel zu tun - ein Hinweis darauf ist, daß ich mittlerweile in der Lage bin, immer krasseren Scheiß mit immer weniger Code zu implementieren, da ich den Code soweit abstrahiert habe, daß ich diverse Checks und Mechaniken mit relativ wenig Aufwand "remixen", und so komplett neue Effekte und Mechaniken kreieren kann.
Die kleine Pause hat es mir ermöglicht, einige Gameplay-Aspekte zu überdenken ...



• 8 der insgesamt rund 30 geplanten Schrein-Effekte sind fertiggestellt.

• Bug ausgemerzt, wo im Try-Mode (welcher diverse prozedurale Elemente ausklammert) Items auf Spike-Traps spawnen konnten.

• Neue Monster-Ability #canRage, welche Monstern die Fähigkeit verleiht, kritisch zu treffen (Cultist/Netherhound), der Spieler bekommt allerdings einen visuellen Cue und wenn man aufmerksam ist, kann man den Schaden fast immer komplett vermeiden.

• Neue Monster-Ability #canTeleport für den Netherhound: sobald die Lebenspunkte auf unter 50% sinken, teleportiert sich der Netherhound zu einem zufälligen Punkt der aktuellen Map und hinterlässt ein "instabiles Portal", durch welches der Spieler im nächsten Zug dem Netherhound folgen kann; tut er dies nicht, verschwindet das Portal so oder so nach dem nächsten Zug, und wenn man dem Netherhound erneut begegnet, hat dieser ausreichend Hitpoints generiert, daß er die Fähigkeit erneut nutzen kann. Diese Idee kam mir, nachdem ich einen Monat lang in DAUNTLESS reingeschaut hatte, und dort auf ein Monster getroffen bin, welches frenetisch zwischen Portalen hin und herhüpfte, und man konnte ihm in eine Parallelwelt folgen. Das ist mit einer der coolsten Effekte, die ich bislang implementiert habe, da er mit relativ wenig Aufwand viel Potential für emergent Gameplay bereitstellt (auch im Hinblick auf den Exploration-Appeal), und den Spieler mit einer Entscheidung konfrontiert.
Clipboard58.png
In dem Codeschnipsel oben wird lediglich der Portal-Link kreiert, und ein *pointer auf das entsprechende Element in der Monster-Liste gesetzt ... am Ende des Monster-Zuges wird dann (wenn *pointer <> #Null) die bereits vorhandene Routine checkStep() aufgerufen, welche Potential für einen Teleport-Move erkennt und triggert. Der isUnstable-Tag wird am Ende des Spielerzuges heruntergezählt, und wenn er bei 0 ist (effektiv nach dem nächsten Spielerzug), wird das Portal aus der Liste entfernt.

• Ich habe mich von dem geplanten Feature verabschiedet, "Unique Monsters" zu implementieren, welche sich Abilities von anderen Monstern "ausleihen" können ... schlichtweg weil ich den distinktiven Fuhrpark, den ich aufgebaut habe, nicht verwässern möchte: es ist ein schönes Gefühl, wenn man einem Monster begegnet über das man ausreichend Informationen gesammelt hat, so daß man in etwa abschätzen kann, was einen erwartet. Abgesehen davon sind die Mechaniken nicht komplex genug (wie z.B. bei DIABLO), als daß hier sonderlich viel Mehrwert entsteht, außer daß Monster in ihrer Individualität einbüßen.

• Beim Erstellen einer neuen Session besteht eine 50% Chance, daß eine zufällige offene Schlüsseltür abgeschlossen wird, eine 50% Chance, daß eine zufällige geschlossene Schlüsseltür geöffnet wird, sowie eine 50% Chance, daß eine zufällige Schlüsseltür (egal ob offen oder abgeschlossen) in einen anderen Türtypen vom selben Subtypen umgewandelt wird. Last but not least, eine 50% Chance, daß ein zufälliger Schlüssel auf einen anderen zufälligen Tile der Map verlegt wird. Diese Informationen werden im WorldSeed-File hinterlegt, bleiben also von Session zu Session konstant (solange bis der WorldSeed neu ausgewürfelt wird).
"Ja, Junge, da kann man mal sehen, wie schlecht du denken kannst."
• Jean-Luc Picard

Benutzeravatar
diceman
Beiträge: 8994
Registriert: Mo 7. Mai 2012, 21:21
Kontaktdaten:

Re: Spielereien vom diceman

Beitrag von diceman » Sa 30. Jan 2021, 22:37

UPDATE:

Clipboard59.jpg

Ja, ich muß stark bleiben. Bin aber stolz auf mich, heute war ein produktiver Tag, und, nein, kein neues Monster, sondern jede Menge dringende Baustellen gefixt und einen weiteren großen Schritt in Richtung Fertigstellung gemacht:



• Komplettes Rework der Sanity-Mechanik: Sanity ist jetzt ein fixer Wert und kann nicht mehr gelevelt werden. Es war immer ein problematischer Stat, da er effektiv nicht mit Hitpoints konkurrieren konnte, welche den ausschlaggebenden Faktor in Kämpfen geben. Außerdem war das Scaling ein Alptraum. Sanity hat jetzt den Default-Wert = 7. Consumables, die im Inventar getragen werden, steigern diesen bis auf 13 (=Maximum). Ist man wahnsinnig, ist der Default-Wert = 0 (bzw. 1-6, je nach ausgerüstetem Consumable). Monster haben weiterhin eine fixe Horrorklasse (0-3), welche unter bestimmten Voraussetzungen gegen den Sanity-Wert des Spielers gewürfelt werden und so dafür sorgen, daß der Spieler wahnsinnig werden kann; die Horror-Klasse wird nicht länger angezeigt, viel mehr lernt man mit der Zeit intuitiv, welche Monster einen eher wahnsinnig werden lassen, und wessen Anblick eher zu ertragen ist. Wahnsinnig zu sein ist jetzt ein reines Meta-Game, welches sich durch das ganze Spiel zieht, und es gibt verschiedene Möglichkeiten, damit klar zu kommen. Indem man die Welt erkundet und Feuerstellen anzündet, baut man aber kontinuierlich ein passives Polster auf, welches einen im Laufe des Spielers immer resistenter gegen den Insanity-Effekt werden lässt.



• Bug gefixt, bei dem Feuerstellen auf Geheimgängen spawnen konnten



Covenants (die Zugehörigkeit der Schreine zu einem bestimmten Orden) werden jetzt via HashMap verwaltet ... da jeder Schrein eine covenantID besitzt, kann man diesen als Key nutzen, um das zugehörige Covenant-Objekt herauszusuchen, welches dann alle Informationen geordnet bereitstellt, z.B. die ID des jeweiligen Gottes, welche Effekte möglich sind, welche Wahrscheinlichkeit jeder Effekt hat, etc. Vorher hatte ich das alles mit mehrdimensionalen Arrays verwaltet, das war aber messy af.



• Jeder Covenant kann entweder 2 oder 3 Effekte bereithalten, die Wahrscheinlichkeit für jeden Effekt wird zufällig ausgewürfelt. Effektiv hat jeder Covenant 3 Effekte, aber bei den 2-Effekt-Schreinen hat der letzte Effekt immer die Wahrscheinlichkeit von 0, während die Summe aller Wahrscheinlichkeiten innerhalb eines Covenants immer 100 ergibt. Definiert wird das initial wie folgt:
Clipboard60.png
Für das Auswürfeln eines Effektes hilft mir meine selbstgeschriebene Routine weightedNumbers(), welche gemäß übermittelter Probability-Values einen zufälligen, gewichteten Index zurückgibt:
Clipboard61.png
"Ja, Junge, da kann man mal sehen, wie schlecht du denken kannst."
• Jean-Luc Picard

Benutzeravatar
diceman
Beiträge: 8994
Registriert: Mo 7. Mai 2012, 21:21
Kontaktdaten:

Re: Spielereien vom diceman

Beitrag von diceman » So 7. Feb 2021, 10:03

UPDATE

• 10 von geplanten 29 Schrein-Effekten sind fertiggestellt!

• Alle Lichtquellen (Feuerstellen, Kerzenleuchter, Fackel im Inventar) haben eine 2-phasige Flacker-Animation bekommen. Das hört sich nicht nach viel an, macht aber atmosphärisch einiges her.

• Hits, welche den Gegner töten, haben jetzt immer einen "Crit-Kicker"-Effekt.

• Mein Experiment mit den zufälligen Türen und Schlüsseln habe ich gecancelt ... also daß beim Erstellen eines Dungeons der Generator einen Override triggern konnte, und so fixe Elemente ändern durfte, z.B. Status einer Tür switchen (offen/verschlossen) oder Schlüssel in andere Bereiche der Map verlegen, etc. Einige der Ergebnisse waren schlicht zu wild und frustrierend, als daß man sie einem Gelegenheitsspieler (an welche sich mein Design definitiv richtet) zumuten könnte. Aber auch ohne diesen Effekt hat das Spiel immer noch mehr prozeduralen Content zu bieten, als das Original-KALAWAUM! :)

• Bislang gab es auf jeder Map zwei Feuerstellen: eine, welche die Umgebung erhellte und einen Lichtradius-Bonus gab, und eine, welche beim Anzünden einen zusätzlichen "Sprint"-Credit gab. Letztere werden jetzt zufällig verteilt, das heißt es ist nicht mehr garantiert, daß auf einer Map eine Feuerstelle vom Typ zwei auftaucht. Die Anzahl der "Sprint"-Feuerstellen wird bei Erststart eines Moduls einmalig ausgewürfelt und als fixer Parameter in der "worldSeed"-Datei hinterlegt, aber auf welchen Maps diese letztendlich auftauchen, wird für jede Session zufällig bestimmt.

• Dem Generator mehr Möglichkeiten eingeräumt, legitime Locations für Feuerstellen zu finden.

• Bug im Editor gefixt: Man kann im FloodFill-Modus auf eine Tür klicken, um Mauern unter allen Türfeldern der aktuellen Map auf den neuen Typ zu setzen ... bislang konnte dieser Schritt nicht rückgängig gemacht werden (anders als gewöhnliche FloodFill-Operationen); das funktioniert jetzt!

• Wenn der Spieler stirbt, spawnt ein Blutfleck unter seinem Grabstein.

• Wenn man zum ersten Mal einen Schrein aktiviert, wird der Fog of War rund um den Schrein aufgedeckt (Feuerstellen funktionieren genauso).

• Bug gefixt, bei dem Monster, nachdem sie einen Teleporter genutzt haben und weniger als 4 Schritte weit teleportiert wurden, nicht erneut denselben Teleporter betreten wollten. Der Grund war eine AI-Komponente, die dafür sorgt, daß Monster sich stets an ihre 4 zuletzt gemachten Schritte "erinnern" - entsprechende Tiles werden bei der Pfadsuche mit einem abnehmenden Penalty-Value belegt, so können Monster bei größeren Entfernungen weiträumiger nach dem Spieler "suchen". Wenn ein Monster flieht, bzw. aus dem Fluchtmodus zurück in den normalen "Chasing"-Modus wechselt, wird einmal resetSearchPenalty() aufgerufen, damit das Monster in der Lage ist, sofort umzudrehen; dieser Aufruf findet jetzt auch nach Teleportation statt.

• Schilde gebufft.

• Komplettes Hitpoint/Damage Re-Balancing. Auf den kleinsten Nenner runtergebrochen haben Monster zwei Stats: Hitpoints und Schaden. Die Variable healthRange beschreibt, in welchem Prozent-Abschnitt des gegenwärtigen Level-Scalings das Monster seine Hitpoints auswürfeln darf. Schaden ist immer eine prozentuale Range innerhalb der Hitpoint-Range des Monsters, also je gesünder ein Monster (oder der Spieler) ist, umso mehr Schaden kann er austeilen. Das war schon immer so. Jetzt gibt es für Monster nur noch maximal 4 Parameter für jeden Stat (vorher 5). So unterscheiden sich Monster deutlicher voneinander, und ich habe Design-Space für 16 unterschiedliche Gegnertypen (13 sind derzeit im Spiel, einer wird wohl noch kommen).

• Diverse atmosphärische Texte zugefügt.

• Bislang war es so, daß man, wenn man wahnsinnig wurde, alle Monster als "Shadow Twin" (Kopie des Spieler-Sprites) wahrgenommen hat. Das in ein netter thematischer Effekt, andererseits fand ich's schade, daß so über lange Strecken indivduelle Designs unter den Tisch fielen, daher wird jetzt für jedes Monster eine 50% Chance ausgewürfelt, ob es sich "verwandelt".

• Kosten für Opfergaben an Schreinen erhöhen sich nach Gesetz des Kleinen Gauss (1...3...6...10...), allerdings nur, wenn ein Effekt eintritt. Wenn der jeweilige Große Alte schweigt, erhöhen sich die Kosten nur um +1.

Crystal Shard Loot-Drops gestreamlined: vorher existierte eine dedizierte Loot-Table, da war aber zuwenig Muster und System erkennbar, also droppt jetzt jedes Monster gleich, abhängig vom Level-Scaling der aktuellen Map.

• Bug gefixt, bei dem nicht gespeichert wurde, wenn man das Fenster der Anwendung via "X"-Button geschlossen hat, während eine ingame-Message noch aktiv war.

• Geheimtüren (und Geheimpfade) haben einen kleinen visuellen Cue, auf den man achten muß. Wenn man ein solches Tile jetzt betritt, verschwindet der Cue, also man muß sich ungefähr merken, wo sich die geheimen Durchgänge befinden.

• Einige subtile "Hidden Mechanics" eingebaut für ein besseres "FirstPlay"-Experience.

• Die Monster-Abilitiy #canMoveTwiceInFog entfernt, mit der Rat-Things, solange sie sich im Fog of War befanden, zwei Schritte gehen durften. Der Effekt hatte wenig bis gar keine spielerische Relevanz, war höchstens irritierend. Dafür haben Rat-Things jetzt die #canSteal-Ability bekommen: mit jedem Treffer stehlen sie dem Spieler Crystal Shards und fügen sie dem eigenen Inventory zu. Diese werden gedroppt, sobald man das Monster besiegt ... also aufpassen, daß das Vieh in der Zwischenzeit nicht in ein Loch läuft ... :twisted:

Mi-Go können jetzt Löcher UND SpikeTraps ignorieren, dafür wurde die #canHover-Chance erhöht, mit der Mi-Gos im Schwebezustand verharren können (also effektiv eine Bewegung aussetzen). So bleibt die taktische Option, sie abzuhängen.

• Bug gefixt, wo Fragmente des Monster-Sprites nach einer Bewegung in den Fog of War scheinbar zufällig aufblitzten. Kein schlimmer Bug, aber gewurmt hat's mich die ganze Zeit über, und erst jetzt habe ich den Grund gefunden: wenn Monster still stehen, haben sie eine simple Idle-Animation, welche in Intervallen die xMicro/yMicro-Parameter mit zufälligen Werten überschreibt und so das Monster "schaukeln" lässt. Dieser xMicro/yMicro-Parameter wurden erst nach der Bewegung auf Null gesetzt, also konnte es vorkommen, daß ein Monster bei der Bewegung einen minimalen Location-Offset hatte, und so für ein paar Millisekunden hinter dem FogOfWar-Tile hervorlugte, bis seine Bewegung komplett abgeschlossen wurde. Der Fix war natürlich trivial: einfach VOR der Bewegung xMicro/yMicro auf Null setzen. :problem:

• Größte "sichtbare" Neuerung: ich habe alle Sprites und die ingame Farbpalette auf ein neues Color-Scheme umgestellt ... der Grund dafür war, daß ich meine Palette zu "safe" und langweilig fand, ich hatte Lust, kreativer mit Farben zu spielen, und da kam mir die Psygnosia-Palette (©Arne Niklas Jansson) mit ihrer schlammigen Ästhetik entgegen. Die wenigen grellen Farbakzente habe ich "gemutet" - so wurde zum Beispiel aus Pink ein mattes Rot für Blut. Insbesondere das #wood-Tileset profitiert von der neuen Palette, der ist düsterer und unheimlicher, und das #deep-Tileset wirkt regelrecht creepy.
Clipboard63.png
Clipboard65.png
Clipboard66.png
[+] Spoiler
Clipboard64.png
"Ja, Junge, da kann man mal sehen, wie schlecht du denken kannst."
• Jean-Luc Picard

Benutzeravatar
diceman
Beiträge: 8994
Registriert: Mo 7. Mai 2012, 21:21
Kontaktdaten:

Re: Spielereien vom diceman

Beitrag von diceman » So 7. Feb 2021, 13:17

Übrigens, wer mir beim Coden und Testen zugucken will ... ich streame meine Sessions auf Twitch:
https://www.twitch.tv/diceman1524
Erwartet aber keine Kommentare, ist mehr so'n Ding, daß mir hilft bei der Sache zu bleiben. :thumbup:
Die Playlist ist "Programming / Coding / Hacking music" (JimTV via Youtube).
"Ja, Junge, da kann man mal sehen, wie schlecht du denken kannst."
• Jean-Luc Picard

Benutzeravatar
diceman
Beiträge: 8994
Registriert: Mo 7. Mai 2012, 21:21
Kontaktdaten:

Re: Spielereien vom diceman

Beitrag von diceman » Fr 19. Feb 2021, 12:24

Ich bin jetzt auf Twitter mit meinem Projekt ...
https://twitter.com/erdbeerscherge

Das ist weniger Arbeit für mich, als diese wöchentlichen Wall-of-Textes, und ich habe mehr Gelegenheit, "Exposure" für mein Projekt zu bekommen; habe schon jeweils ein Like von DEM Tom Hall of Doom-Fame, und 'nem ehemaligen Lead Artist vong Ubisoft bekommen. :crazy: . Und auch wenns nur eine beiläufige nette Geste war, sowas motiviert natürlich RICHTIG. Wen das Projekt interessiert, ist herzlich eingeladen, mir da zu folgen. Posten tue ich da ausschließlich GameDev/Programming-related Themen.
#noCovid
"Ja, Junge, da kann man mal sehen, wie schlecht du denken kannst."
• Jean-Luc Picard

Benutzeravatar
H3LLXIII
Beiträge: 831
Registriert: Mo 14. Jan 2013, 13:24
Wohnort: Würzburg
Kontaktdaten:

Re: Spielereien vom diceman

Beitrag von H3LLXIII » Fr 19. Feb 2021, 22:32

Da folge ich doch gleich mal für so spannenden Content.
Mein Blog über Filme, Reisen und allerlei anderen Zeitvertreib

https://frankonianzombie.wordpress.com

Benutzeravatar
diceman
Beiträge: 8994
Registriert: Mo 7. Mai 2012, 21:21
Kontaktdaten:

Re: Spielereien vom diceman

Beitrag von diceman » Sa 17. Apr 2021, 14:23

Habe im Laufe der Woche einen Komponisten gefunden, der das Spiel mittels einer Handvoll originaler (Retro-) Kompositionen gehörig aufwerten wird.
Ein aktueller Screenshot:
Clipboard115.png
"Ja, Junge, da kann man mal sehen, wie schlecht du denken kannst."
• Jean-Luc Picard

Benutzeravatar
Savior
Beiträge: 13790
Registriert: Do 10. Mai 2012, 03:29
Kontaktdaten:

Re: Spielereien vom diceman

Beitrag von Savior » Sa 17. Apr 2021, 14:53

:o :clap:

Antworten