Einfache TextRPGs skripten in Python

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
ArneBab
User
Beiträge: 9
Registriert: Montag 4. Februar 2008, 09:19
Wohnort: Heidelberg, Germany
Kontaktdaten:

Hi,

Ich habe ein paar Hilfsfunktionen geschrieben, mit denen TextRPGs in reinem Python geschrieben werden können.

Die Skripte sind dabei so nah wie möglich an Skripten für Theaterstücke und trotzdem noch Python.

Im Hintergrund bindet es eine vollständige RPG Bibliothek ein, die auf einem freien (d.h. frei lizensierten) Pen-and-Paper Regelwerk aufbaut ( http://1w6.org ).

Ihr könnt es den Code bisher auf http://freehg.org/u/ArneBab/textrpg finden.

Ein Skript sieht dann zum Beispiel so aus (gerade ad-hoc geschrieben):

Code: Alles auswählen

#!/usr/bin/env python
# encoding: utf-8

from rpg_lib.textrpg import *

hero = Char() # a generic human :)
peasant = Char(template=True) # A random human with random name. 
enemy = Char() # another generic human :)

story("""Welcome to the world of easy RPG scripting. 

I hope you enjoy your stay!
""")

hero.say("""And welcome from me, too!

I hope we'll be able to go adventuring, soon!

besides: I'm Darjad Merejn.""")

hero.name = "Darjad Merejn"

hero.say("""So now you know my name. Would you tell me yours?""")

name = ask("Your name:")

player = Char(source="tag:1w6.org,2008:" + name)

hero.say("So this time in style: Welcome " + player.name + "!")

enemy.say("""How nice to see you. I hope you enjoy your glee. 

It won't last too long.
""")

hero.say("""How dare you come here! 

I'll splatter your guts, Granash Barn!""")

enemy.name = "Granash Barn"

enemy.say("""Well well, try it!""")

hero.attack = 18 # A quite formidable fighter. 
enemy.attack = 18 # Same goes for him

peasant.attack = 6 # Knows not to grab a dagger from the wrong side. 

peasant.act("tries to get out of the way of " + enemy.name)

story(enemy.name + " attacks " + peasant.name)

won = enemy.fight_round(peasant)[0]
if won: 
   peasant.say("""Aaargh!""")
else: enemy.say("""Damn peasant.""")

hero.say("""How dare you! I'll taste your blood!""")

hero.act("attacks " + enemy.name)

while hero.active and enemy.active: 
   hero.fight_round(enemy)

if hero.active: 
   hero.act("""won.""")
   hero.say("""That's what they call a villain these days. 

So now to you. You look kinda sorry for him. 

Seems I'll have to kill you, too.""")
   won = player.battle(hero)
   if not won: 
       story("""And so the adventure of """ + player.name + """ended quite early.""")
else: 
   enemy.act("""won.""")
   enemy.say("""So much for heroes. 

I hope you didn't stand with that bastard. I'm leaving. 

Want to come with me?""")

   join_the_enemy = ask("""Come with him? (Yes, no)""")

   if join_the_enemy.lower() in ["yes", "y", ""]: 
      enemy.say("""A wise decision. Now carry my bag.""")
   else: 
      enemy.say("""That's too bad. Good luck for your future. 

And don't trust the heroes.

Do you want to fight me, then?""")

if player.active: 
   fight = ask("Fight him? (Yes, no)")
else:
   fight = "No"
if fight.lower() in ["yes", "y", ""]:
   won = player.battle(enemy)
   if not won:
      story("Sorry, you lost.")
else:
   enemy.say("""A good fight.""")

exit()
Da das alles reines Python ist, kann man damit auch noch verschiedenstes anderes machen, z.B. Wanderungen durch Irrgärten (gibt es in branching_story.py) uvm.

Und ich hoffe, dass ich das Design sauber genug bekommen habe, dass es möglich ist, es so umzustellen, dass mit einem einfachen
from rpg_lib.graphic_rpg import *
das gleiche Skript eine GUI Umgebung nutzen kann (bzw. dass es einfach ist, ein graphic_rpg Modul zu schreiben, das das Skript ausliest).

Für einfache Nutzung habe ich die ersten zwei Kapitel eines Tutorials geschrieben (auch als TextRPG :) ):
- http://freehg.org/u/ArneBab/textrpg

(Liegt alles in einem Mercurial repository - Versionsverwaltungssystem in Python).

Ich würde mich über Rückmeldungen freuen! :)
Unpolitisch sein
heißt politisch sein
ohne es zu merken.
- http://draketo.de
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Ich finds gut! :]

Aber die Kommentare und Variablennamen, etc sollte Englisch sein :o
ArneBab
User
Beiträge: 9
Registriert: Montag 4. Februar 2008, 09:19
Wohnort: Heidelberg, Germany
Kontaktdaten:

Freut mich!

Das Beispielskript habe ich gerade extra hier für's Forum geschrieben und während dem Schreiben lokal getestet :)

Meinst du die Variablen im Tutorial?

Lieben Gruß
Unpolitisch sein
heißt politisch sein
ohne es zu merken.
- http://draketo.de
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Ne, ich meine die im Modul.
Dort ist einiges an Doku nur auch Deutsch und die Modulnamen wie z.B. "Namensgrammatik" sollten auch Englisch sein.
ArneBab
User
Beiträge: 9
Registriert: Montag 4. Februar 2008, 09:19
Wohnort: Heidelberg, Germany
Kontaktdaten:

In dem Modul sind noch einige "Altlasten" aus der Zeit als ich gerade mit Python angefangen habe, v.a. in "amov", das erste wirkliche Python Modul (bzw. Package), das ich geschrieben habe, und zu der Zeit fiel mir Programmieren mit deutschen Variablen und Kommentaren um einiges leichter.

Inzwischen habe ich eine Übersetzung der Sachen im amov größtenteils vorbereitet, aber noch nicht durchgeführt.

Gerade bei den Charakterblättern (yaml Dokumenten mit allen relevanten Charakterinformationen) ist noch etwas Arbeit nötig, um sie transparent in verschiedenen Sprachen nutzen zu können, so dass eine Komplettübersetzung wohl noch etwas dauern wird (sie wird wohl kommen, wenn ich das darunter liegende Regelwerk auf Englisch übersetze).

Im textrpg_1d6 package werden dann die deutschen Variablen transparent ersetzt. Bei einigen Charakterdaten werden in Rückgabewerten allerdings noch die deutschen Begriffe angezeigt.
Unpolitisch sein
heißt politisch sein
ohne es zu merken.
- http://draketo.de
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Hm, ich hatte mich mal vor Jahren mit der Realisierung von RPGs und Textadventures beschäftigt und kam da zu dem Schluss, dass ein konsequent objektorientierter Ansatz, wie man ihn damals derweilen bei MUDs sah, das beste wäre. Ich bin mir nicht sicher, wie gut der lineare "storyboard"-Ansatz funktioniert, wenn das ganze komplizierter wird.

Ich würde also Orte, Personen und Gegenstände modellieren und dann gemäß der Regeln interagieren lassen. Gespräche, allgemein die Story wäre für ich ein Wechselspiel aus Aktion und Reaktion, was ich auch über entsprechende "trigger" realisieren würde. Quasi eine große "wenn-dann-Maschine".

Die Idee, quasi eine DSL für Rollenspiele zu bauen, finde ich gut.

PS: Das Spielsystem von 1W6 ist zugegeben einfach und vielleicht für derartige Script-Umsetzungen gut geeignet, aber leider nicht mein Geschmack, was traditionelles P&P-Rollenspiel angeht. Aber ich mag auch Fudge nicht und GURPS ist mir wiederum mit seinen vielen Skills zu kompliziert...

Stefan
ArneBab
User
Beiträge: 9
Registriert: Montag 4. Februar 2008, 09:19
Wohnort: Heidelberg, Germany
Kontaktdaten:

Hi Stefan,
sma hat geschrieben:Ich bin mir nicht sicher, wie gut der lineare "storyboard"-Ansatz funktioniert, wenn das ganze komplizierter wird.
Meine Gründe dafür, es so zu probieren sind:
- Es bietet einen schönen Lernweg: Erst einfach erzählen, dann einfache "wenn dann" Abfragen, dann Interaktionen, dann volle state-machines (eine sehr eifnache Version davon ist branching_story.py).
- Es ist einfach Python, d.h. es objektorientiert zu machen ist recht leicht möglich (durch die Charaktere ist es das teils schon).
- Es soll eine extrem einfache Grund-API für Benutzerinteraktionen bieten: story(...) zum Erzählen und ask(...) zum Abfragen (die auch von allen sonstigen Kommandos genutzt werden). Beide können auch in GUIs realisiert werden.

Effektiv: Einfaches soll einfach aussehen, aber es soll Autoren alle Möglichkeiten offen lassen, selbst die, die ich mir selbst noch nicht vorstellen kann.
Die Idee, quasi eine DSL für Rollenspiele zu bauen, finde ich gut.
(Ich habe gerade die Bedeutung von DSL nachgelesen... daher das spezifischere :) )

Soweit ich es bisher weiß, wurden bisher "externe DSL" geschrieben, also Sprachen, die alles selbst machen.

Ich mit dem TextRPG stattdessen eine "interne DSL" (Domain Specific Language) schreiben, mit der die Nutzer gleich Python nutzen können.

Sie zeigt dann gleichzeitig eine der Sachen, die ich an Python mag: Es ist verdammt lesbar :)
PS: Das Spielsystem von 1W6 ist zugegeben einfach und vielleicht für derartige Script-Umsetzungen gut geeignet, aber leider nicht mein Geschmack, was traditionelles P&P-Rollenspiel angeht. Aber ich mag auch Fudge nicht und GURPS ist mir wiederum mit seinen vielen Skills zu kompliziert...
Rollenspielsysteme sind Geschmackssache, und das ist gut so.

Meiner Erfahrung nach bringt jedes Regelwerk sein eigenes Spielgefühl mit, und auch wenn das "Ein Würfel System" (das RPG dahinter) entworfen wurde, um es leicht zu machen, das Spielgefühl auf verschiedene Welten anzupassen, bringt schon alleine die Tatsache, dass nur ein einzelner W6 verwendet wird, ein eigenes Spielgefühl (auch wenn ich (offline) auch dafür schon zwei Alternativsysteme zur Hand habe).

Effektiv ist es ein Mittelweg zwischen Gurps® und Fudge™. In Kurzform:
- Fudge™ hat zu wenig detaillierte Chars erlaubt und stückweise Charaktersteigerung war nicht möglich (zu große Schritte).
- Gurps® war zu Realitätsfixiert und es mussten zu viele Fertigkeiten aufgeschrieben werden. Außerdem hat es vier Grundeigenschaften festgeschrieben.
- Beide haben tolle Ideen, sind aber inkompatibel.

Das "Ein Würfel System" hat nun einen Wertebereich wie Gurps®, so dass die riesige Gurps® Vor- und Nachteilsliste genutzt werden kann. Gleichzeitig bietet es die Flexibilität von Fudge™ und ermöglicht die Nutzung der vielen kreativen Ideen, die um Fudge™ herum entstanden sind.
Dazu löst es das Fertigkeitenchaos durch die Einführung von Beruf und Hintergrund als Sammlungen von Fertigkeiten auf.

Und es ist echt frei lizensiert :)

Und jetzt genug des Werbetextes ;)

Und hin zu wichtigen Fragen: Meinst du, dass als grundlegende Nutzerinteraktionen für die Sprachsyntax story() und ask() genügen (wie auch immer sie dann effektiv implementiert werden)?
Unpolitisch sein
heißt politisch sein
ohne es zu merken.
- http://draketo.de
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

ArneBab hat geschrieben:Und hin zu wichtigen Fragen: Meinst du, dass als grundlegende Nutzerinteraktionen für die Sprachsyntax story() und ask() genügen (wie auch immer sie dann effektiv implementiert werden)?
Sind Spieler (und damit ihre Charaktere) aus deiner Sicht eher aktiv oder passiv? Vor vielen Jahren gab es mal so Solo-Rollenspielbücher, wo man kurze nummerierte Abschnitte lesen konnte, dann eine Entscheidung treffen musste und dann bei einem anderen Abschnitt weiterlesen musste:
42. Du kommst an eine Brücke, unter der sich etwas regt. Ein Brückentroll! Er versperrt dir den Weg. Willst du ihn bestechen (lies weiter bei 54) Angreifen (lies weiter bei 102)? Oder umkehren (weiter bei 43)?

43. Du riskierst keine Auseinandersetzung mit dem Troll, sondern suchst lieber nach einer Furt flussaufwärts, auch wenn dies länger dauert...
Hier bei ist der Spieler extrem passiv, kann nur reagieren und nicht agieren, dafür lässt sich das problemlos mit story() und ask() realisieren. Ich kenne auch Spielleiter und Rollenspiel-Abenteuer, die einen derartigen Spielstil bevorzugen.

Ich bevorzuge es, wenn die Spieler der aktive Part ist und dann die Welt auf ihre Aktionen reagiert. Dies ist mehr die Idee einen "Quellenbuchs", also einer Weltbeschreibung, die den Rahmen setzt und nicht die eines (mehr oder weniger linearen) vorgeschriebenen Abenteuers.

Im letzteren Fall müsste es möglich sein, Dinge wie "im Wald, da sind die Räuber" ;) auszudrücken, damit es dann - jedenfalls wenn der Charakter aus Sicht dieser Räuber ein lohnendes und schwaches Ziel abgibt - zu einem Überfall kommt, wenn der Spielercharakter irgendwann den Wald betritt.

Vielleicht willst du aber eher die klassischen Textadventures (interaktive fiction) nachahmen während ich eher etwas wie Hack, Bard's Tale oder Baldur's Gate im Hinterkopf habe. Für Textadventures sollte dein Ansatz denke ich funktionieren. Man kann ihn ja dank Python beliebig ausbauen.

Übrigens, kennst du BUS, PUB und POO?

Stefan
lunar

sma hat geschrieben:Vielleicht willst du aber eher die klassischen Textadventures (interaktive fiction) nachahmen während ich eher etwas wie Hack, Bard's Tale oder Baldur's Gate im Hinterkopf habe.
Ich glaube nicht, dass man D&D Rollenspiele wie Baldur's Gate als klassisches Text-RPG umsetzen kann. Um die Komplexität der Regeln für den User verständlich umzusetzen, braucht es ein richtiges UI, also im mindesten Curses.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

D&D ist sowieso zu kompliziert :) Mir ging es bei der BG-Referenz weniger konkret um eine D20-Umsetzung als um die Art der Spiele, dem Spieler (wenigstens gefühlt) die Kontrolle zu überlassen.

Im "normalen" Rollenspiel am Tisch schaue ich auch nicht laufend auf den Charakterbogen. Ich konzentriere mich da auf die Interaktion. Ich glaube daher, es wäre möglich. Ich hatte mal ein Konzept für "Linear Hack" ausgearbeitet, das nur mit einer Kommandozeile wie ein Textadventure auskommen könnte. Sicherlich nicht die ideale Interaktionsform, mehr ein Gedankenexperiment, ob's gehen könnte. Im Prinzip ein Dialog mit dem Computer, wie mit einem menschlichen Spielleiter.

Ein passendes Regelsystem hat möglicherweise Forgotten Futures mit nur drei Basiseigenschaften BODY, MIND und SOUL, die einen Charakter beschreiben. Diese Werte zusammen mit dem Gesundheitsstatus kann man auch noch im Kopf behalten. Dazu kommen zwei dutzend Fertigkeiten, von denen ein Charaktere eh nur ein paar hat. Die kann man sich auf Eingabe von "stats" oder so auch schnell listen lassen.

Stefan
lunar

sma hat geschrieben:D&D ist sowieso zu kompliziert :) Mir ging es bei der BG-Referenz weniger konkret um eine D20-Umsetzung als um die Art der Spiele, dem Spieler (wenigstens gefühlt) die Kontrolle zu überlassen.
Ach so, dann habe ich dich missverstanden ;)
Im "normalen" Rollenspiel am Tisch schaue ich auch nicht laufend auf den Charakterbogen. Ich konzentriere mich da auf die Interaktion.
Ich finde, dass kann man nur bedingt vergleichen. Am Tisch rechnest du händisch aus, was Treffer- und Rettungswürfe angeht. Nach dem zehnten Kampf kennst du die Werte deiner Charaktere zwangsläufig auswendig.
Und bei weniger häufigen Werten muss man auch da nachschauen.

Am PC, wenn alles automatisch gerechnet wird, merke ich mir das gar nicht. Und wenn ein Kampf gegen irgendein Giftvieh ansteht, dann muss ich immer erst in den Charakterbogen schauen, um das geeignetste "Frontschwein" auszuwählen (e.g. der mit dem besten Rettungswurf gegen Gift).

Das muss ein Text-Interface unterstützen, und bei einem simplen Eingabe-Interface wird das schwierig.

Aber eine D&D Umsetzung mit ncurses wäre sicherlich cool :D
Ein passendes Regelsystem hat möglicherweise Forgotten Futures mit nur drei Basiseigenschaften BODY, MIND und SOUL, die einen Charakter beschreiben. Diese Werte zusammen mit dem Gesundheitsstatus kann man auch noch im Kopf behalten. Dazu kommen zwei dutzend Fertigkeiten, von denen ein Charaktere eh nur ein paar hat. Die kann man sich auf Eingabe von "stats" oder so auch schnell listen lassen.
Zumindest in Kämpfen könnte man sich überlegen, wichtige Werte vor der Frage auszugeben. Ich kenne Forgotten Futures nicht, aber bei D&D-Regelsystemen wären das beispielsweise der Status des Charakters (gelähmt, vergiftet, geblendet, etc.) oder seine Gesundheit.
ArneBab
User
Beiträge: 9
Registriert: Montag 4. Februar 2008, 09:19
Wohnort: Heidelberg, Germany
Kontaktdaten:

Gibt es beim aktiven Spiel irgendeine direkte Interaktion, die sich nicht mit story() und ask() realisieren lässt? D.h. sind story() und ask() eine ausreichende Grundlage für komplexere Interaktionen?

Die ersten, die ich vorhabe zu ermöglichen sind einfache TextRPGs, weil die am leichtesten zu implementieren sind.

"Im Wald da sind Räuber" sollte ja im Endeffekt auf "ask('where do you want to go'); if target == 'wood' and chars.weaker_than(enemies): story('there are enemies in the wood')" runterzubrechen sein.

Ich will aber darauf achten, dass das System vollständig erweiterbar ist (dafür habe ich zum Beispiel story() und ask() vor kurzem auf wrapper für Klassenfunktionen umgestellt. Erst können sie von Modulen mit recht wenig Aufwand vollständig uminterpretiert werden).

Ich bin noch nicht ganz sicher, wie ich ein GUI RPG realisieren kann, das mit einem einfachen "from graphic_rpg import *" in eine Story eingebunden wird (bin da noch etwas auf unischerem Grund).

POO und PUB sehen übrigens klasse aus!
(Ist BUS wirklich eher ein schwächeres PUB, oder komplett anders realisiert?)

Ich bin am überlegen, ob ich die vielleicht mit einbinden kann, o.ä.. Sie könnten direkt komplexe Geschichten und Eingabeerkennung liefern (nicht zu vergessen, Netzwerkunterstützung uvm.).

Danke für die Links!
Unpolitisch sein
heißt politisch sein
ohne es zu merken.
- http://draketo.de
lunar

ArneBab hat geschrieben:Gibt es beim aktiven Spiel irgendeine direkte Interaktion, die sich nicht mit story() und ask() realisieren lässt? D.h. sind story() und ask() eine ausreichende Grundlage für komplexere Interaktionen?
Solange die Story linear ist, schon.
"Im Wald da sind Räuber" sollte ja im Endeffekt auf "ask('where do you want to go'); if target == 'wood' and chars.weaker_than(enemies): story('there are enemies in the wood')" runterzubrechen sein.
Das ist nur dann einfach, wenn die Story linear verläuft, sprich, es nur wenige klar definierte Punkte gibt, an denen der Wald betreten werden kann.

Ein RPG sollte aber – und darauf wollte sma imho auch hinaus – eine nicht-lineare Story verfolgen, bei der der Charakter zu jedem bestimmten Zeitpunkt (bis auf wenige Ausnahmen wie Quest-Dungeons) überall alles tun kann, funktioniert das nicht mehr, wenn du dich nicht mit if-Abfragen tot-programmieren und DRY einhalten willst.

Für nicht-lineare Stories, die dem Spieler weitgehende Handlungsfreiheit einräumen, musst du das System umgestalten. Der Wald (und jedes andere Gebiet) darf dann nicht mehr durch den String "wood" definiert werden, ebenso wenig wie Charaktere unabhängig "im Raum schweben dürfen". Stattdessen musst du jedes Gebiet als Objekt modifizieren und jedem NPC und jedem Monster einen Aufenthaltsort zuweisen. Ein Player-Charakter könnte dann eine "move" Methode haben, die die "leave" Methode des aktuellen Aufenthaltsorts aufruft, eine Reisezeit in die Spielzeit einkalkuliert und anschließend die "enter" Methode des Gebiets aufrufen. Diese "enter" und "leave"-Methoden würden dann jeweils die Trigger auslösen. Ein Monster könnte dann eine "check_attack" Methode besitzen. Die "check_attack" Methode der Räuber wäre dann als Trigger registriert, so dass die Räuber den Charakter eventuell angreifen würden.
ArneBab
User
Beiträge: 9
Registriert: Montag 4. Februar 2008, 09:19
Wohnort: Heidelberg, Germany
Kontaktdaten:

lunar hat geschrieben:
Im "normalen" Rollenspiel am Tisch schaue ich auch nicht laufend auf den Charakterbogen. Ich konzentriere mich da auf die Interaktion.
Ich finde, dass kann man nur bedingt vergleichen. Am Tisch rechnest du händisch aus, was Treffer- und Rettungswürfe angeht. Nach dem zehnten Kampf kennst du die Werte deiner Charaktere zwangsläufig auswendig.
Und bei weniger häufigen Werten muss man auch da nachschauen.
Ich arbeite mit einem Regelwerk, bei dem für einen Charakter nur die Werte aufgeschrieben (und damit ausgegeben) werden, die ihn von der Masse abheben.

D.h. was dann ausgegeben würde sind
- etwa 3 Eigenschaften (Stark, schnell, schön, Charismatisch, ... jeweils mit Zahl und einfacherer Darstellung, die für Spieler direkt klar sein sollte (Bsp: sehr gut ist +, überragend ist ++)
- etwa 3 Fertigkeiten und ein Beruf: Was der Char gelernt hat.
- Besonderheiten wie die Spezies des Char, "einarmig" oder "photographisches Gedächtnis".

Dazu Waffe (mit Fertigkeitswert und Schaden), Rüstung (mit Schutz), Wunden und vll. Trefferpunkte (sind nicht unbedingt nötig zu sehen, Wunden sind wichtiger).

Und das kann man auch gut als Text ausgeben, bzw. für bestimmte Situationen nur relevante Werte ausgeben (beim Bequatschen einer Wache bringt mir Schadensresistenz wenig, also warum es anzeigen?).

Außerdem kann man sich "was kann er" da auch leichter merken, bzw. eine kompaktere rein textbasierte Darstellung wählen wie

--- --- --- --- --- ---
Brok
° Große Stärke
° Überragende Konstitution
° Schwache Intelligenz

* Gut im Nahkampf
* Exzellent im Trinken
** Guter Schmied

| Waffe: Dolch (+, 3) # Fertigkeitswert, Schaden
| Rüstung: Straßenkleidung (1)
--- --- --- --- --- ---

(jede einzelne Beschreibung entspricht direkt einem Wert)

Bzw. wirklich komprimiert (und nur "wo gut, wo schwach", nicht die direkten Werte):
--- --- --- --- --- ---
Brok:
+ Stärke, Konstitution
- Intelligenz
* Fertigkeiten: Nahkampf (+), Trinken (++)
* Beruf: Schmied (+)
| Ausrüstung: Dolch (3), Straßenkleidung (1)
--- --- --- --- --- ---

So sind die Chars dann auch leicht zu merken (und als SL bringt es auch große Vorteile, Werte für weniger wichtige NSCs schnell aus dem Ärmel schütteln zu können :) ).

Die kompakten Werte sind eine Vereinfachung des Wertes dahinter (z.B. sind 14, 15 und 16 gerade "+"; wieviele + ein Wert hat wird auch zur Bestimmung der Kosten einer Steigerung genutzt) und zeigen Spielern direkt, wie gut sie im Vergleich zu anderen sind.
Unpolitisch sein
heißt politisch sein
ohne es zu merken.
- http://draketo.de
ArneBab
User
Beiträge: 9
Registriert: Montag 4. Februar 2008, 09:19
Wohnort: Heidelberg, Germany
Kontaktdaten:

lunar hat geschrieben:Für nicht-lineare Stories, die dem Spieler weitgehende Handlungsfreiheit einräumen, musst du das System umgestalten. Der Wald (und jedes andere Gebiet) darf dann nicht mehr durch den String "wood" definiert werden, ebenso wenig wie Charaktere unabhängig "im Raum schweben dürfen". Stattdessen musst du jedes Gebiet als Objekt modifizieren und jedem NPC und jedem Monster einen Aufenthaltsort zuweisen. Ein Player-Charakter könnte dann eine "move" Methode haben, die die "leave" Methode des aktuellen Aufenthaltsorts aufruft, eine Reisezeit in die Spielzeit einkalkuliert und anschließend die "enter" Methode des Gebiets aufrufen. Diese "enter" und "leave"-Methoden würden dann jeweils die Trigger auslösen. Ein Monster könnte dann eine "check_attack" Methode besitzen. Die "check_attack" Methode der Räuber wäre dann als Trigger registriert, so dass die Räuber den Charakter eventuell angreifen würden.
Kann ich die "move" Methode nicht einfach durch
ask("What do you want to do?") -> "move to wood" ausdrücken?

Sieht für mich einfach nur nach "Antworten intelligent/flexibel parsen" aus.

Was das System darunter kann, lässt sich anpassen. Wichtig ist für mich zu wissen, ob ask() und story() die gesamte Interaktion erfassen kann.

Gibt es bei grundlegender Interaktion noch etwas anderes als dem Spieler etwas sagen und eine Eingabe des Spielers anfordern?

ask() gibt den eingegebenen Textstring zurück, nicht nur ja/nein.
Bsp. für eine etwas komplexere Nutzung: http://freehg.org/u/ArneBab/textrpg/fil ... g_story.py

Wenn ask() und story() alles erfassen können, kann das System nämlich ask() und story() in verschiedenen Modulen unterschiedlich definieren und damit die Ausgabe anpassen, ohne das die Geschichte neu geschrieben werden muss.

Anmerkung:
Für ein Graphisches RPG wäre z.B. auch story(background_image = "environment.png") oder ask(answer_type="arrow_keys") eine Möglichkeit.

Alles in der story-Funktion zu schreiben halte ich für sinnvoll, weil dann das Anzeigemodul entscheiden kann, in welcher Reihenfolge es welche Teile der Story umsetzen will (und der Autor nicht darüber nachdenken muss). Mit einzelnen Aufrufen kann ein Autor natürlich immernoch eine bestimmte Reihenfolge erzwingen.
Unpolitisch sein
heißt politisch sein
ohne es zu merken.
- http://draketo.de
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

ArneBab hat geschrieben: Kann ich die "move" Methode nicht einfach durch
ask("What do you want to do?") -> "move to wood" ausdrücken?

Sieht für mich einfach nur nach "Antworten intelligent/flexibel parsen" aus.
Hm ... aber dann brauchst Du ja doch noch eine Möglichkeit eine Art Spielwelt-Graph zu speichern und die Frage (bzw. die Auswertung) an den aktuellen Standort zu binden. Und dann wäre es wohl sinnvoller mit speziellen Klassen zu arbeiten, die gezielte Aktionen des Spielers ermöglichen.

Aber generell ist das schon mal nen klasse Ansatz - allerdings weiß ich nicht so genau, wie es bei längeren Stories so aussieht. Aber was kurzes muss ich damit auch mal probieren.

@sma: Hast Du noch was interessantes aus Deiner Schaffensphase zum angucken?
ArneBab
User
Beiträge: 9
Registriert: Montag 4. Februar 2008, 09:19
Wohnort: Heidelberg, Germany
Kontaktdaten:

Hyperion hat geschrieben:Hm ... aber dann brauchst Du ja doch noch eine Möglichkeit eine Art Spielwelt-Graph zu speichern und die Frage (bzw. die Auswertung) an den aktuellen Standort zu binden. Und dann wäre es wohl sinnvoller mit speziellen Klassen zu arbeiten, die gezielte Aktionen des Spielers ermöglichen.
Jupp.

Ein Beispiel dafür ist die Path Klasse in branching story, mit der sich sehr einfach rechteckige 2D Irrgärten/Pfade realisieren lassen.

Bzw. alles, in dem sich der Spieler in die vier Himmelsrichtungen bewegt.
Aber generell ist das schon mal nen klasse Ansatz - allerdings weiß ich nicht so genau, wie es bei längeren Stories so aussieht. Aber was kurzes muss ich damit auch mal probieren.
Wenn du es verbreiten willst, kannst du einfach den Ordner rpg_lib dazulegen, und es sollte zumindest auf GNU/Linux und OSX per Doppelklick zu starten sein.

Könnte dann ähnlich wie das hier aussehen (allerdings nur mit einer Datei und dem rpg_lib Ordner):
http://draketo.de/dateien/textrpg-0.4.2.zip
Unpolitisch sein
heißt politisch sein
ohne es zu merken.
- http://draketo.de
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

PUB und BUS sind ähnlich aufgebaut. POO ist anders. Ich hatte mir die Dinger vor vielen Jahren angeschaut und sehe erst jetzt, dass aus BUS wohl ein Sourceforge-Projekt geworden ist, das bis 2006 überlebt hat.

Beide bilden ein objektorientiertes Grundgerüst für das Modellieren von Textadventures, eben in dem sie wie ich auch versucht hatte zu erklären, die Welt modellieren. Ein mögliches Modell wäre das folgende: Die Welt besteht aus miteinander über Ausgänge (Exit) verbundenen Orten (Location), in denen sich Gegenstände (Item) oder Kreaturen (Creature) befinden. Gegenstände können andere Gegenstände enthalten (etwa eine Kisten ein Goldschatz) und Kreeaturen können Gegenstände tragen, vielleicht sogar benutzen, in dem Sinne das etwa eine benutze Rüstung eine Kreatur schwerer verwundbar macht. Nun muss man sich Interaktionen überlegen. Das Spiel entsteht dann in der komplexen Interaktion all dieser Objekte.

Anderes Thema: Man, das letzte Mal, dass ich ein Rollenspiel gespielt hatte, wo es Schutzwürfe gegen Gift gab, ist mehr als 10 Jahre her ;) Ich bevorzuge eher einfache Systeme ohne ausgefeilte Kampfregeln. Daher finde ich GURPS auch nicht (mehr) gut. Für einen Computer liegt die Situation aber anders. Hier muss alles geregelt sein, da kein mitdenkender Spielleiter da ist, der spontan eine Situation nach Gutdünken anders regelt.

@Hyperion: Konkret vorweisen kann ich leider nichts, da es eher Überlegungen von vor vielen Jahren, meist auf Papier sind. Kann kann mich in der Regeln nicht dazu durchringen, eine Idee, wenn ich sie verstanden habe, dann auch zu realisieren. Mir reicht (als Theoretiker) das Wissen, dass es möglich wäre ;)

Stefan
ArneBab
User
Beiträge: 9
Registriert: Montag 4. Februar 2008, 09:19
Wohnort: Heidelberg, Germany
Kontaktdaten:

Hi Stefan,
sma hat geschrieben:PUB und BUS sind ähnlich aufgebaut. POO ist anders. Ich hatte mir die Dinger vor vielen Jahren angeschaut und sehe erst jetzt, dass aus BUS wohl ein Sourceforge-Projekt geworden ist, das bis 2006 überlebt hat.
Kannst du mir den Link schicken?

Ich habe nur py-universe.sf.net gefunden (pub).
Beide bilden ein objektorientiertes Grundgerüst für das Modellieren von Textadventures, eben in dem sie wie ich auch versucht hatte zu erklären, die Welt modellieren.
Das ist etwas, das ich sehr gerne als Backend benutzen würde :)
Anderes Thema: Man, das letzte Mal, dass ich ein Rollenspiel gespielt hatte, wo es Schutzwürfe gegen Gift gab, ist mehr als 10 Jahre her ;) Ich bevorzuge eher einfache Systeme ohne ausgefeilte Kampfregeln. Daher finde ich GURPS auch nicht (mehr) gut. Für einen Computer liegt die Situation aber anders. Hier muss alles geregelt sein, da kein mitdenkender Spielleiter da ist, der spontan eine Situation nach Gutdünken anders regelt.
Den Gedanken hatte ich zwar nicht im Hinterkopf, als ich angefangen habe das System zu schreiben, aber ich hatte nicht vor, das Rad neu zu erfinden, und habe deswegen darauf geachtet, dass die Wertebereiche sowohl Gurps- and auch Fudgekompatibel sind (bei Fudge: einfach verdreifachen, bei Gurps: Wurfmodifikatoren können einfach übernommen werden).

Dadurch gibt es als Quellenmaterial bereits so gut wie alle Gurps Bände und damit Modifikatoren für fast alles (nicht zu vergessen riesige Mengen von Vor- und Nachteilen), wenn man sie will :)
Unpolitisch sein
heißt politisch sein
ohne es zu merken.
- http://draketo.de
Antworten