Ich weiß, sowas sagt man nicht, aber ich komme dem Ende zu.
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:
- 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 (
) - 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):
- 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.
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:
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
).
- 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!