Lohnt es sich, Spielmechaniken / -regeln getrennt vom Hauptcode zu implementieren?


25

Ich bin mir nicht sicher, ob es in den Bereich dieser Community passt oder ob ich stattdessen Stackoverflow verwenden soll.

Nehmen wir an, ich möchte, dass mein Spiel in seinem Kern einfach erweiterbar ist, dh, dass viele Leute, auch ohne gute Programmierkenntnisse, nicht nur vorhandene Regeln ändern, sondern sogar eine völlig neue Spielmechanik hinzufügen können. Ich bin selbst kein guter Programmierer, aber ich bin bereit zu lernen, ich brauche nur ein paar Anweisungen und die Gewissheit, dass es getan werden kann.

Ich habe darüber nachgedacht, ob es möglich / machbar ist, Spielmechaniken getrennt vom Hauptdienstprogrammcode zu implementieren . Ich meine, für Tabletop-Spiele haben wir die Regelbücher, die nicht die tatsächlichen Algorithmen aller Aktionen enthalten, sondern einige Protokolle und Grenzen beschreiben, wobei der Kontext eines jeden solchen Gegenstands stark referenziert wird. Ist es möglich, etwas Ähnliches für PC-Spiele zu tun, wie alle Regeln in einem sehr hohen Level zu beschreiben, leicht lesbar (und änderbar) durch eine menschliche Programmiersprache, die dann vom Utility-Code in eine "konsumiert" und analysiert wird funktionierende Instanz der Spielmechanik?

Das scheint wirklich so, als müsste ich meine eigene Sprache und einen Compiler dafür schreiben.)) Das kann ich natürlich nicht. Aber gibt es vielleicht eine einfachere Herangehensweise an das Problem?

Zu Ihrer Information: Meine bevorzugte Sprache für den Utility-Code wird Python 3.x sein


Da Sie unerfahren sind und als einzelner Entwickler arbeiten, sollten Sie nicht versuchen, alles selbst zu implementieren. Die Verwendung der SDL2-Bibliotheken kann in vielen Bereichen sehr hilfreich sein. Sie verfügen über Python-Bindungen, sodass Sie in der Sprache arbeiten können, in der Sie sich auskennen. Um das zu erreichen, was Sie anstreben, sollte das Design Ihrer Architektur sehr, sehr sorgfältig durchgeführt werden, und ich würde sogar für ein erfahrenes Team mindestens eine vollständige Neufassung erwarten. Außerdem ist Python nicht wirklich so einfach zu lernen wie jede andere Sprache und meiner Meinung nach hat es große Probleme in der Mittelstufe.
ttbek

Das Konzept, nach dem Sie suchen, ist außerhalb der Spieleentwicklung weit verbreitet. Es gibt eine Reihe von Software-Tools, die als Business Rules Engines bezeichnet werden und genau dies tun sollen. Im Spielentwickler können Sie diese Tools auch nutzen. Das GameplayKit von Apple enthielt beispielsweise die Klassen GKRuleSystem und GKRule für einen ähnlichen Zweck. Es würde einige Mühe kosten, diese zu erweitern, um eine externe Bearbeitung zu ermöglichen, könnte jedoch so strukturiert werden, dass das Verhalten geändert wird, ohne dass der Code neu kompiliert werden muss.
Sandy Chapman

Antworten:


34

Im Allgemeinen hängt die Einfachheit, mit der ein System erweitert werden kann, davon ab, inwieweit seine Subsysteme eng oder locker gekoppelt sind . Je lockerer die Subsysteme gekoppelt sind, desto einfacher ist es normalerweise, sie zu modifizieren, da sie isoliert sind und nicht unbedingt ein vollständiges Verständnis des gesamten Systems erfordern.

Nichts ist kostenlos - ein solches System erfordert in der Regel mehr Ressourcen (verschiedene Kombinationen aus Zeit, Geld und Fähigkeiten), um es zu erstellen. Der Grad der Erweiterbarkeit, den Sie beschrieben haben, steht in direktem Widerspruch zu der Fähigkeit, die Sie sich selbst zugeschrieben haben. Es könnte getan werden, aber das Entwickeln von Software, wie Sie es beschrieben haben, ist ein sehr herausforderndes Unterfangen.

Die nächsten Dinge, die mir bekannt sind, sind Vassal (das viel programmatischer ist, als Sie beschrieben haben) oder die Modifikation für Tabletop Simulator (die hauptsächlich von der menschlichen Interaktion abhängt, um Spielregeln zu interpretieren und durchzusetzen).


Solide Beratung. Ich versuche, meinen Code so locker wie möglich zu halten, um die Erweiterbarkeit zu vereinfachen, aber es gibt immer Fälle, in denen es so viel einfacher ist, etwas fest zu codieren / zu koppeln. Auch als professioneller Entwickler keine leichte Aufgabe, und definitiv nicht unerfahren freundlich.
Angarg12

TTS unterstützt jetzt Lua und die Durchsetzung von Regeln ist den menschlichen Interaktionen nicht mehr völlig gewachsen.
Ave

17

Ich habe darüber nachgedacht, ob es möglich / machbar ist, Spielmechaniken getrennt vom Hauptdienstprogrammcode zu implementieren.

Das ist absolut möglich. Eine Möglichkeit, die beim Spielen häufig verwendet wird, ist Lua-Scripting .

Aus dem verlinkten Artikel:

Lua wurde ursprünglich 1993 als Sprache für die Erweiterung von Softwareanwendungen entwickelt, um dem damals wachsenden Bedarf an Anpassungen gerecht zu werden.

Viele Spiele verwenden Lua. (Ich würde verlinken, aber der Ruf eines neuen Benutzers schränkt meine Linkanzahl ein.)

Lua-Skripte können zur Laufzeit kompiliert werden. Dies bedeutet, dass es sich beispielsweise um Textdateien handeln kann, die sich im "Skript" -Verzeichnis Ihres Spiels befinden und von einem Modder leicht bearbeitet werden können. Ihr Spiel lädt sie und führt sie aus.

Ich habe gesehen, wie Lua-Skripte die Eigenschaften von Einheiten im Spiel definieren. Hier ist ein zufälliges Beispiel von TA Spring.

Aber Sie möchten "alle Regeln beschreiben". Theoretisch ist dies möglich, da Lua eine vollständige Sprache ist. Das Problem ist jedoch, dass Sie vorausschauend genug sind, um den Kern des Spielcodes zu kennen und nach Skripten zu suchen, mit denen das Verhalten erweitert werden kann.

Zum Beispiel könnten Sie ein Kartenspiel entwickeln, das in einem "scripts / cards" -Verzeichnis nach Karten sucht. Dies ist ideal, um neue Karten hinzuzufügen oder vorhandene Karten zu bearbeiten. Aber wenn Sie Ihr Spiel später erweitern möchten, um Miniaturen in ein Raster aufzunehmen, müssen Sie den Kerncode bearbeiten - keine Menge Lua-Geigen bringt Sie von alleine dorthin.

Bitte beachten Sie: Ich rufe Lua auf, weil ich weiß, dass es sowohl für Spiele als auch für Software zur Anpassung verwendet wird. Ich schlage nicht vor, dass es die einzige oder die beste Lösung für die Bedürfnisse des Fragestellers ist.


7
Diese Antwort impliziert, dass Lua die einzige Skriptsprache ist, die auf diese Weise verwendet wird. Es gibt viele andere Skriptsprachen, die in Spiele-Engines eingebettet werden können. Einige Engines gehen auch eigene Wege und implementieren ihre eigene domänenspezifische Skriptsprache. Ich würde das normalerweise nicht empfehlen (weil das Bauen einer Sprache eine Menge Arbeit ist), aber es sollte erwähnt werden.
Philipp

3

Es gibt ein Kontinuum von Ansätzen, und ob sich einer von ihnen lohnt, hängt davon ab, was Sie genau versuchen. Wie viel Kontrolle möchten Sie dem Tweaker bieten?

Am äußersten Ende der Kontrolle können Sie den Tweaker einfach den Code des gesamten Spiels ändern lassen. Zu diesem Zeitpunkt würden Sie im Wesentlichen den Dienstprogrammcode und mindestens ein Beispiel für dessen Verwendung veröffentlichen. Ein Tweaker kann so viel oder so wenig Code verwenden, wie er möchte.

Ein Ansatz, der etwas weniger Kontrolle bietet, besteht darin, den Utility-Code einzufrieren (z. B. durch vorheriges Kompilieren) und Tweakers nur bestimmte Funktionen (Rückrufe) ausfüllen zu lassen, um die Möglichkeiten einzuschränken. Je nachdem, was Sie tun möchten, kann dieser Ansatz viele Formen annehmen. Eine gebräuchliche Methode wäre, den gesamten Anzeigeteil in den Dienstprogramm- / Hauptcode und die gesamte Mechanik in den optimierbaren Teil einzufügen. Oder Sie möchten vielleicht einige Mechaniken im "eingefrorenen" Teil belassen, weil es unwahrscheinlich ist, dass Spieler sie ändern möchten, oder weil es zu kompliziert ist, sie änderbar zu machen.

Am unteren Ende des Kontinuums können Tweakers nur Werte innerhalb eines festgelegten Bereichs ändern. Ein Beispiel wäre eine Datendatei, mit der Sie die Farben der Dinge im Spiel auswählen können. Sie können diesen Ansatz jedoch verwenden und dennoch viele Anpassungen vornehmen. Es wäre möglich, eine Auswahl von Funktionen zu definieren und Tweakers zu erlauben, diese zusammenzustellen, um die Rückrufe aus dem vorherigen Ansatz zu erstellen, aber ihnen nicht zu erlauben, neue Funktionen zu definieren. Oder überspringen Sie den Kompositionsteil und bieten nur eine begrenzte Auswahl an.

Die Details all dieser Ansätze und welche für Ihren Anwendungsfall geeignet sind, hängen davon ab, welche Art von Basisspiel Sie erstellen und wie viel Kontrolle Sie aufgeben möchten. Beachten Sie, dass kommerzielle Spiele im Allgemeinen nur die zweite und dritte Methode verwenden, da die Spieler bei der ersten Methode völlig getrennte Spiele erstellen können, was zu komplizierten Lizenzierungsproblemen führt. Da diese Ansätze ein Kontinuum bilden, kann der zweite Ansatz diese Probleme ebenfalls einführen.


Open Source zu machen ist eigentlich mein Ziel. Was ich als Problem sehe, ist, wie diese Erweiterbarkeit auf einfachste Weise implementiert werden kann, damit andere Spieler des Spiels (bei dem es sich übrigens um ein MP-Spiel handelt) ihre eigenen Erweiterungen des grundlegenden Regelsatzes erstellen und diese für jeden freigeben können andere, irgendwie Konflikte gleichzeitig zu vermeiden. Wenn also ein Benutzer eine Erweiterung entwickelt, die bestimmte Regeln außer Kraft setzt, und ein anderer eine andere Erweiterung, wie kann sichergestellt werden, dass der dritte Benutzer, der beide in seinen Spielen verwenden möchte, keine Kompatibilitätsprobleme hat? Abgesehen davon, dass sie gezwungen werden, eng zusammenzuarbeiten.
tis

..und es so zu implementieren, dass keine Änderungen am Utility-Code und damit zu viel Programmierwissen erforderlich sind.
tis

1
Ich glaube nicht, dass es eine Möglichkeit gibt, Kompatibilitätsprobleme zu vermeiden (selbst das Einstellen der Farbe kann dazu führen!). Ich denke, das Beste, was Sie tun können, ist, mögliche Kompatibilitätsprobleme zu erkennen und einen guten Weg für die Benutzer zu finden Antworten. Abhängig vom Design der Utility-Code-Schnittstelle und den fraglichen Erweiterungen kann es eine Möglichkeit geben, Rückrufe usw. zu bestellen, die das gewünschte Ergebnis liefern. Andererseits könnte es nicht sein. Den Benutzer darauf aufmerksam zu machen, dass es Probleme geben könnte und warum dies eine bessere Benutzererfahrung zu sein scheint als Dinge, die ohne Erklärung brechen.
Ryan1729

2

Es ist absolut möglich, die Regeln des Systems von dem Code zu trennen, der diese Regeln anwendet. Ich bevorzuge es, meinen Code für komplexe Projekte so zu strukturieren, da es einfacher ist, neue Regeln hinzuzufügen oder die Regeln später zu ändern, ohne Fehler in das zugrunde liegende System einzufügen. Und Bugs in einer Rules-Engine werden schneller gefunden als Bugs in einem System, in dem die Rules und der andere Code higgledy-piggledy miteinander vermischt sind, da dieselbe Rules-Engine von jeder Regel immer wieder verwendet wird.

Ob es sich lohnt, hängt von der Komplexität des Systems ab. Als würde ich mich nicht um Pac-Man kümmern, aber ich könnte mir nicht vorstellen, Dwarf Fortress anders zu schreiben.


Vielen Dank, @Robyn. Irgendwelche Lesehinweise für jemanden, der nicht einmal weiß, wie er dieses Design richtig angehen soll? Gibt es einige gut etablierte Entwurfsmuster für solche Anwendungen? Gibt es Bücher zum Thema?
tis

Keine Bücher, sorry. Die Grundidee einer einfachen Regelengine lautet jedoch: Erstellen Sie eine Regelklasse, die eine Eigenschaft für jede Information enthält, die Sie zur Beschreibung einer Regel benötigen. Wenn einige dieser Eigenschaften Lambda-Funktionen enthalten, können Sie ihnen komplexe Verhalten zuweisen. Erstellen Sie eine Klasse, die eine Liste von Regeln instanziiert, sodass sich alle Ihre Regeln an einem Ort befinden. Erstellen Sie eine weitere Klasse mit einer Methode, die eine Liste von Regeln als Eingabe verwendet und auf das System anwendet.
Robyn

2

Es ist definitiv machbar. Ob es sich lohnt, hängt von Ihren Zielen ab.

Sie müssen keine eigene Sprache erfinden oder einen Compiler schreiben, damit dies funktioniert.

Wenn Sie möchten, dass Ihr Spiel leicht erweiterbar ist, ist es wahrscheinlich eine gute Idee, sich dafür zu entscheiden.

Es ist wahrscheinlich mehr Arbeit für Sie, zumindest kurzfristig, verständliche Systeme zu erstellen und Änderungen zu vereinfachen.

Ein Spiel, das dies tut, ist Rimworld (ich habe keine Zugehörigkeit), und Sie können möglicherweise sehen und daraus lernen, wie sie es gemacht haben, indem Sie eine Menge Spieldaten und -mechaniken in XML-Dateien ablegen , die sich in den Spielordnern befinden, damit jeder sie sehen und lesen kann ändern. Der Kern / die Engine des Spiels wurde mit Unity erstellt.

Es gibt auch die Möglichkeit, das Spiel durch eigentliche Codierung weiter zu erweitern, ich weiß weniger darüber, aber du kannst es im Mods-Forum lernen.

Die Möglichkeit, das Spiel zu modifizieren, macht es für viele interessanter und ich denke, es hat viel zu seinem Erfolg beigetragen. Außerdem können die Entwickler beliebige Mod-Inhalte in das Hauptspiel einbinden, wodurch die Entwicklung beschleunigt und das Spiel verbessert wird, da sie Unterstützung von vielen Leuten erhalten, und sie können sich entscheiden, Dinge basierend auf zu übernehmen was ist beliebt, was scheint zu funktionieren, etc.

Und natürlich haben sie, besonders für ein kleines unabhängiges Studio, Hunderte von Leuten, die sich Ideen einfallen lassen und diese für sie testen, was eine Menge Arbeit ist, die sie selbst nicht erledigen oder wahrscheinlich Leute einstellen könnten.


Obwohl ich sehen kann, wie Spieldaten mit XML definiert werden, kann ich mir nicht vorstellen, wie Sie damit Spielmechanismen / -regeln definieren können. Könnten Sie vielleicht ein Beispiel / einen Artikel zum Thema liefern?
tis

@tis Regeln sind nur eine andere Art von Daten. Wenn meine Engine "If A do B" hat, kann ich A und B aus einer XML-Datei laden. Jetzt können Benutzer ziemlich willkürliche Regeln festlegen. Ein zusätzliches Bit, das helfen kann, ist die Bereitstellung einer Liste mit allen möglichen As und Bs, die Sie per se unterstützen ZB "Wenn Statusstatustyp dann Bewegungsgeschwindigkeit 100", "Wenn Statusstatustyp und Zeit> x dann Statusstatustyp" Denken Sie also in Ihrem Entwurf darüber nach, welche Arten von Regeln Sie für welche Arten von Objekten (Status, Zeit, Bewegungsgeschwindigkeit) und zulassen möchten mit welcher Art von Zusammensetzung (und / oder etc ...). Bei Zustand unter Wasser und Zeit> 5 Gesundheit -10.
ttbek

1

Vielleicht möchten Sie sich mit objektorientiertem Design befassen . Python hat dafür eine gute Unterstützung.

Darüber werden dicke Bücher geschrieben, die für Anfänger beängstigend sein können, aber die Hauptprinzipien sind ziemlich einfach.

Der Hauptpunkt ist nur, dass Sie identifizieren, mit welcher Art von Objekten Sie arbeiten. Sie sagen nicht, über welche Art von Spiel Sie nachdenken, aber Dinge wie Spieler, Monster, Gegenstand, Ausrüstung, Waffe, Rüstung usw. sind typische Objekte.

Wenn Sie verschiedene Spieltypen möchten, möchten Sie wahrscheinlich ein Spielobjekt, das sich um die Siegbedingung und dergleichen kümmert. Vielleicht auch ein Kartenobjekt?

Manchmal ist nicht klar, ob etwas ein Objekt verdient oder nicht, z. B. Schaden. Wenn Sie einem Objekt keinen Schaden zufügen, wird der Code einfacher, aber wenn Sie es zu einem Objekt machen, wird das Anpassen einfacher.

Unterklassen: Sowohl Waffen als auch Rüstungen sind Ausrüstung. Ausrüstungen sind Einzelteile. Es gibt wahrscheinlich andere Arten von Gegenständen. Sie werden es wahrscheinlich nützlich finden, einen Klassenkämpfer zu definieren, dessen Unterklassen sowohl Spieler als auch Monster sind.

Die Idee ist, dass zum Beispiel Waffen viele Dinge mit allen anderen Arten von Gegenständen gemeinsam haben, sie haben ein Gewicht, eine Größe und andere Eigenschaften wie diese.

Wenn Sie eine Unterklasse wählen, können Sie sagen: "Waffen sind wie andere Gegenstände, aber Sie können sie auch einsetzen, sie wirken sich auf den von Ihnen verursachten Schaden aus, usw. usw."

Durch Unterklassen können Ihre Mod-Builder auch sagen: "Mein neuer Waffentyp entspricht genau den Standardwaffen, nur dass ..."

Dann musst du entscheiden, welches Objekt für was verantwortlich ist. Dies ist nicht so einfach, wie es scheint, und Sie sollten darüber nachdenken. Wenn Sie die falschen Entscheidungen treffen, wirkt sich dies nicht wesentlich auf das Grundspiel aus, es wird jedoch schwieriger, die Einstellungen anzupassen.

Solange Sie nur selber basteln, können Sie Dinge ändern, aber sobald Sie etwas für die Öffentlichkeit freigeben, wird es viel schwieriger, Änderungen vorzunehmen! Die Leute werden Modifikationen machen, die davon abhängen, dass die Dinge so sind, wie sie jetzt sind. Sogar Bugs. Die Leute werden Mods schreiben, die von Fehlern abhängen, die im Code bleiben. Wenn du Dinge änderst, brechen diese Mods und Lynchmobs erscheinen in deinem Haus.

Beispielsweise:

Ein Spieler mit einer Waffe greift ein Monster mit mehreren Rüstungen an. Dies geschieht in einem bestimmten Spielmodus und auf einer bestimmten Karte.

Beide Combatant können Fähigkeiten wie Critical Hit und Dodge haben.

Welches Objekt ist für was verantwortlich?

Darauf gibt es keine richtige Antwort. Viel hängt davon ab, welche Art von Anpassung Sie zulassen möchten.

Wenn Sie niemals ein Objekt aufrufen (z. B. die Karte), kann dieses Objekt den Angriff in keiner Weise ändern.

Nachdem Sie alle diese Entscheidungen getroffen haben, dokumentieren Sie sie . Schreiben Sie ein "Modder-Handbuch", in dem genau aufgeführt ist, über welche modifizierbaren Methoden jedes Objekt verfügt, welche Parameter sie annehmen, was sie zurückgeben sollen usw. usw.

Viel Glück!


Ihr Beitrag wird sehr geschätzt und Sie haben viel Mühe darauf verwendet, sodass er auf jeden Fall eine +1 wert ist, aber ich bin mir über OOP im Allgemeinen im Klaren (obwohl es an Erfahrung mangelt). Meine aktuellen Probleme betreffen den allgemeinsten Designansatz, den ich einnehmen sollte. Mein Spiel ist nicht so groß wie D & D im Maßstab, aber es ist trotzdem SEHR tief in der Mechanik. Das bedeutet eine Menge komplexer, auf verschiedenen Ebenen miteinander verschränkter Regeln. Womit ich den Benutzern erlauben möchte, einige Werte erheblich zu erweitern und nicht nur geringfügig zu verändern. Es kann sein , gibt es keine einfache Lösung, in der Tat ..
tis

@tis Der Schlüssel dazu ist, die richtige Entscheidung darüber zu treffen, was wirklich die Objekte in Ihrem OO-Modell des Spiels sind. Der "naheliegende" Ausgangspunkt sind die "Nomen" wie Waffe, Rüstung usw., die nicht der einzige Weg sind und zu einem Wirrwarr an nicht anpassbarem Code führen können. Wenn eine Regel besagt, dass Sie nur um Mitternacht einige Monster mit Silberkugeln auf einem Kirchhof erschießen, wo setzen Sie diese Regel im Code durch? In der Gun- (oder Bullet-) Klasse, in der Monster-Klasse, in der Fighter-Klasse des Gun-Users, in der Churchyard-Klasse oder in der Time-Klasse? Die beste Antwort könnte "keine der oben genannten" sein ...
Alephzero

... und überdenken Sie das gesamte Design in Bezug auf eine Rules-Klasse (die wahrscheinlich wirklich eine Datenbank ist) und eine Conflict Resolution-Klasse. Nun, andere Regeln wie "Wenn du keine Kugeln hast, kannst du deine Waffe immer noch als Keule benutzen" und "Wenn Alice einen Zauber wirkt, der Bob teilweise (aber nicht vollständig) vor Schusswunden schützt, während Charlie versucht, auf Bob zu schießen, then .... "einen einzigen und" offensichtlichen "Platz haben, der im Code implementiert werden soll. Sie werden feststellen, dass Ihre ursprüngliche Waffenklasse nur noch sehr wenig bewirkt, außer einige audiovisuelle Effekte - und nicht einmal das, wenn es sich um ein textbasiertes Spiel handelt!
Alephzero

1

Eine einfache Möglichkeit, grundlegende Unterstützung dafür zu erhalten, besteht darin, die meisten numerischen Werte in eine oder mehrere separate Textdateien zu unterteilen, damit interessierte Personen sie in Vergessenheit geraten können.

Sie haben beispielsweise Tischspiele erwähnt. Wenn Sie ein Spiel hatten, das auf D & D basiert, könnten Sie eine weapon_damageDatei haben, die Linien wie enthält Battleaxe: 1d12. Ihr Dienstprogrammcode liest diese Datei und fügt sie hinzu, wenn BattleaxeIhr Code Schaden anrichtet generate a number from 1-12, 1 time(s). Wenn Sie die Zeile zum Lesen anpassen, werden Battleaxe: 4d6diese stattdessen generate a number from 1-6, 4 time(s)hinzugefügt. In ähnlicher Weise könnten Sie einen Ordner haben Creaturesund in Ihrem Inneren eine Datei für jede Kreatur, einschließlich Zeilen wie AC: 12; Wenn Sie diesem Ordner dann neue Dateien hinzufügen, werden neue Kreaturen erstellt. Es könnte sogar für Charakterklassen, Geländetypen und eine Menge Dinge gemacht werden.

Diese Art der nicht-Code-Anpassung kann immer noch sehr leistungsfähig sein und viele Teile Ihres Spiels abdecken. Auf diese Weise kann ein Benutzer jedoch keine Änderungen vornehmen, die Sie nicht explizit angegeben haben. Sie können beispielsweise aktivieren Sneak Attack: [damage], dass Sie einer beliebigen Kreatur oder Klasse zugewiesen werden [damage], um sie zu einem Angriff hinzuzufügen , der die Bedingungen für einen Sneak Attack erfüllt. Sie könnten sogar Möglichkeiten bereitstellen, um die Bedingungen zu ändern, z. B. "wann immer Sie aus dem Verborgenen angreifen" oder "wann immer Sie flankieren" oder "wann immer Sie einen Vorteil haben". Wenn ein Benutzer jedoch entscheidet, dass er Sneak Attacks ausführen möchte, können Sie beim Ausführen eines Angriffswurfs auch Stealth-Attacken gegen die Wahrnehmung des Ziels ausführen. Wenn beide Würfe erfolgreich sind, fügen Sie den Sneak Attack-Schaden hinzu.

Wenn Sie möchten, dass ein Benutzer dem Spiel ein völlig neues Verhalten hinzufügt, ohne dass er die gleichen Programmierkenntnisse wie der Entwickler benötigt, dann möchten Sie, wie bereits erwähnt, im Wesentlichen entweder eine Game Engine oder eine separate Programmiersprache erstellen. Für Änderungen, für die keine Codierungskenntnisse erforderlich sind, bieten textbasierte Datendateien und Ordnerstrukturen noch viele Optionen. Wenn Sie möchten, dass Benutzer mehr als das ändern, müssen Sie sie bitten, eine Programmiersprache zu lernen oder zu kennen.


Ja, ich muss ihnen erlauben, neue Mechaniken hinzuzufügen, nur einige Werte zu ändern, reicht nicht aus. Ich dachte auch, dass dies möglicherweise eine separate Sprache benötigt. Ich dachte nur, dass es bereits eine gibt, die ich in meinem Python-Dienstprogrammcode verwenden kann.
tis

Haben Sie schon darüber nachgedacht, was Wikipedia zum Thema hat? en.wikipedia.org/wiki/Logic_programming
ttbek

0

[Ich bin ein jahrzehntelanger Softwareentwickler, habe aber keine Erfahrung in der Spieleentwicklung. Vielleicht geht die Spieleindustrie aus guten Gründen anders vor ...]

Ihr Ansatz ist absolut sinnvoll für mich. Der Kern enthält die grundlegenden Funktionen, auf denen Mechanik und Regeln aufbauen, sodass es sich um eine API handelt, die von den übergeordneten Komponenten verwendet werden soll.

Und beim Entwerfen einer API ist es meine Lieblingsrichtlinie, die Sprache zu erstellen, in der Sie Ihren Code auf höherer Ebene ausdrücken möchten (natürlich unter Berücksichtigung der Syntaxbeschränkungen Ihrer Programmiersprache).

Ein guter Ansatz wäre es, einige hypothetische Regeln und Mechanismen so zu schreiben, wie Sie es möchten (natürlich mit Pythons Syntax), um herauszufinden, was die Kern-API für die Regeln und Mechanismen bereitstellen soll Lagen.

Und natürlich würde ich empfehlen, sich die Skriptfunktionen bestehender Spiele anzuschauen, um eine Vorstellung davon zu bekommen, was sie tun.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.