(RPGs) Drop Table Design

18

Ich denke, diese Frage betrifft mehr Spiele wie MMO und Diablo-ähnliche Spiele.

Was sind die üblichen Entwürfe für die Implementierung einer Ablagetabelle, bei der ein Monster je nach Prozentsatz verschiedene Arten von Gegenständen ablegen kann? Ich schätze, der einfachste Weg besteht darin, ein Wörterbuch der 'prozentualen Gewichtung' von Gegenstandsarten zu haben, aber dies ist schwierig zu erweitern, wenn wir neue Gegenstandsarten einführen möchten (zum Beispiel, wenn die D2-Erweiterung Runen und neue Klassengegenstände enthält).

Extrakun
quelle
4
Warum ist es schwierig, Prozentwörterbücher zu erweitern, wenn neue Elemente hinzugefügt werden? Ich meine, wenn Sie nicht alle Prozentsätze benötigen, um eine Summe von 100% zu erhalten (und dies ist nur dann der Fall, wenn Sie möchten, dass ein Monster immer einen einzelnen Gegenstand fallen lässt, was für mich ziemlich seltsam ist), sehe ich keinen Problem.
30.
1
Sagen Sie Ork => {'Dolch', 'Schwert' 'Rüstung'} und ich habe einen neuen Gegenstandstyp, sagen Sie Rune; Ich muss alle Wörterbücher, die mit jedem Monstertyp verknüpft sind, direkt aktualisieren. Natürlich ist dies nichts, was eine andere Indirektionsebene nicht lösen kann. Die Frage ist also, wie sieht diese Ebene aus?
Extrakun 30.11.10
Ich bin mir nicht sicher, warum Sie die Aktualisierung eines Wörterbuchs für schwierig halten. In Python wird das Erweitern eines Wörterbuchs mit neuen Werten beispielsweise mit einer einzigen Methode ausgeführt. Können Sie klarstellen, wo Ihrer Meinung nach die Schwierigkeit liegt?
Kylotan
2
Extrakun, wenn Sie sich meine Antwort unten ansehen, gibt es eine Antwort auf Ihre Frage "Eine weitere Ebene der Indirektion". Anstatt Tropfen als flache Tabelle zu behandeln, können Sie sie aus verschachtelten Ausdrücken erstellen. Wenn Sie benannte Makros (dh Funktionen) zulassen, können Sie Teile einer Ablagetabelle für verschiedene Entitäten wiederverwenden.
Munificent
2
Sie sind gerade auf den „Haken“ der Spieleentwicklung gestoßen. Sicher, Sie können ein Spiel in zwei Tagen erstellen, aber dann kommen die fünf Jahre des Hinzufügens von Inhalten. Und das Hinzufügen von Inhalten ist Mahlen. MAHLEN.
Tor Valamo

Antworten:

22

Für ein Roguelike, an dem ich arbeitete, implementierte ich ein ziemlich flexibles datengesteuertes System zum Erzeugen von Tropfen. Ich habe es hier dokumentiert . Es ist im Wesentlichen ein wenig DSL für die Auswahl einer Reihe von zufällig ausgewählten Elementen.

Ein einfacher Tropfen sieht so aus:

1-10 copper coin

Es heißt nur, eine zufällige Anzahl von Kupfermünzen zwischen 1 und 10 fallen zu lassen. Die Dinge werden flexibler, wenn Sie Zweige hinzufügen:

one of
    turquoise stone (50%)
    onyx stone (25%)
    malachite stone (15%)
    jade stone (10%)

Ein "Eins von" wählt einen seiner untergeordneten Zweige basierend auf den angegebenen Wahrscheinlichkeiten aus und wertet diesen dann aus. Tropfen können mehr als einen Gegenstand fallen lassen:

any of
    turquoise stone (50%)
    onyx stone (25%)
    malachite stone (15%)
    jade stone (10%)

Dies wertet alle Unterzweige aus und lässt sie fallen, wenn ein Wurf gegen ihre Wahrscheinlichkeit abläuft. Es gibt auch einige andere Zweige, um einen Gegenstand basierend auf dem Dungeon und dem Level des Spielers auszuwählen.

Da diese komplex werden können, können Sie auch benannte Makros definieren, im Wesentlichen Funktionen, die einen Verzweigungsausdruck erweitern und in mehreren Ablagen wiederverwendet werden können. Wenn zum Beispiel alle Zwerge dieselbe Art von Beute ablegen, können Sie dafür ein einziges Makro erstellen und dieses für alle Monstertypen verwenden, anstatt große Ablagetabellen zu kopieren und einzufügen.

Ein Beispiel für einen Monstertropfen :

:: ancient dragon
    glyph   = D
    groups  = dragon
    drops
        (coins)
        2-3(1:8) one of
            (any-weapon)
            (any-armor)

Hier (coins), (any-weapon)und (any-armor)sind alle Makroaufrufe:

(any-armor)
    one of
        (shield)
        (helm)
        (boots)
        (gloves)
        (cloak)
        (robe)
        (soft-armor)
        (hard-armor)

was wiederum Dinge wie nennt:

(cloak)
    one near level
        cloak (10)
        velvet cloak (20)
        fur-lined cloak (50)

Sie können Drop-Ausdrücke wie eine echte Programmiersprache beliebig tief verschachteln. Dies gibt Ihnen die Kompositionsfähigkeit, die ein einfacher tabellenbasierter Ansatz nicht bietet.

Wie bei allen datengesteuerten Systemen können Sie sich selbst überwältigen, indem Sie undurchdringlich komplexe Tropfen erstellen, aber dies erfüllt meine Ziele:

  1. Geben Sie an, welche Elemente vollständig außerhalb des Codes abgelegt werden.
  2. Einfach, das Kernsystem in Code zu implementieren.
  3. Stelle fest, welche Monster fallen gelassen werden, damit der Spieler zielgerichtete Erkundungen durchführen kann. ("Ich brauche eine Halskette. Ich werde nach Zwergen suchen, da sie dazu neigen, sie fallen zu lassen.")

Der C # -Code, der dies implementiert, ist hier .

herrlich
quelle
Dies ist eine Implementierung, die ich vorher nicht gesehen habe. Vielen Dank!
Extrakun
12

In Stendhal sind unsere Beutetabellen Listen. Jeder Eintrag enthält den Namen des Artikels, eine minimale und maximale Menge und die Wahrscheinlichkeit. Die interne Struktur ist sehr ähnlich zu dem, was wir auf dem anzeigen Webseite Kreatur .

Für uns ist es wichtig, dass Spieledesigner, die ein großes Wissen über die Welt haben, solche Dinge definieren können. Das heißt, ohne komplexe Logik auf Programmcodeebene zu verstehen. Wir haben also keine Definitionen von Kreaturen und Gegenständen im Programmcode, sondern haben sie in XML-Dateien wie elves.xml oder verschoben club.xml verschoben . Wir haben einen GUI-Editor für sie, aber die meisten Spieleentwickler ändern die XML-Datei direkt.

Um Kreaturen und Gegenstände einfach erweiterbar zu machen, verwenden wir ein Bausteinsystem: Es gibt keine Programmklasse für "Elfen" oder "Bogenschützenelfen". Es gibt jedoch eine Reihe verhaltensbezogener Klassen wie "Feigling", "Patrouille", "Aggressiv", "Bogenschütze", "Heiler". Designer können neue Kreaturen definieren, indem sie diese Verhaltensweisen auswählen, ohne Programmcode zu schreiben: Um beispielsweise einen "Bogenschützen-Elfen" zu erstellen, zeichnen Sie ein Elfen-Sprite mit einem Bogen und definieren es als "Offensive", "Bogenschütze". Definiere dann Level- und ähnliche Attribute und füge einige Elfen-Gegenstände zur Beutetabelle hinzu.

Für Elemente haben wir einen ähnlichen Ansatz, der jedoch derzeit auf ein Verhalten beschränkt ist: Ein Designer kann ein neues Element hinzufügen und ein Verhalten wie "ConsumableItem", "KeyItem" oder "AttackItem", "Spell", "Scroll" ohne "definieren Logik programmieren zu müssen.

Hendrik Brummermann
quelle
8

Beim D & D-Tabletop-Gaming gibt es ein Konzept von Beutetypen. Die meisten Monster fallen von einer oder mehreren Tabellen ab und diese Tabellen sind das, was Sie in Ihrer Erweiterung aktualisieren würden. Die Monster ließen immer noch "65% Common, 10% Gems, 15% Art, 10% Tools" fallen, aber Sie würden aktualisieren, was in jeder dieser Tabellen war.

zB Gems enthält Slots mit zufälligen Bereichen, die "1 Gem (25%) 2 Gems (50%) 5 Gems (75%) 100 Gems" zurückgeben. und wenn Sie spezielle Runensteine ​​hinzufügen möchten, aktualisieren Sie die Tabelle auf "1 Edelstein (25%) 2 Edelsteine ​​(50%) 5 Edelsteine ​​(75%) 100 Edelsteine ​​(95%) 1 Runenstein".

Wenn Sie jedoch bereits eine prozentuale Gewichtung haben, aktualisieren Sie doch einfach alle Monstertabellen in Ihrer Erweiterung. Sicherlich sind solche Tabellen im Vergleich zu Texturen und Netzen eine kleine Nutzlast. Außerdem müssen Sie die Prozentsätze auch nicht auf 100 halten. Dies ist nur eine Annahme, die Sie zu Beginn getroffen haben, und Sie können die reale Summe zusammenzählen, bevor Sie Ihren Zufallswert generieren. Wenn sich die Gewichtungen zu 120 addieren, generieren Sie einfach einen Wert von 1 bis 120 anstelle von 1 bis 100.

Richard Fabian
quelle
3

Oberflächlich betrachtet scheint dies dasselbe zu sein wie das Problem der "gewichteten zufälligen Auswahl".

Algorithmus zur Bestimmung zufälliger Ereignisse

Ordnen Sie jedem Ereignis relative Wahrscheinlichkeiten zu, addieren Sie sie und wählen Sie dann eine Zufallszahl innerhalb dieses Bereichs aus, um zu entscheiden, welches Ereignis Sie möchten.

Selbst wenn Sie lieber Prozentsätze verwenden - dies ist dasselbe System, nur auf 100 skaliert -, überschätzen Sie, wie schwierig es ist, Daten hinzuzufügen. Wenn Sie 100% haben und dann 20% zu einer Erweiterung hinzufügen, dividieren Sie einfach alle Werte durch (120/100) und Sie sind wieder auf 100% gesunken.

Kylotan
quelle