Archiv verlassen und diese Seite im Standarddesign anzeigen : Mechanismus hinter einem Kampfscript
StrongSoul
30.06.2008, 22:58
Guten Abend,
nach langer Zeit möchte ich mal wieder ein wenig rum experimentieren.
Im Moment bin ich dabei ein Rundenbasiertes Kampfsystem zu entwickeln. Das Konzept steht eigentlich, nur bin ich mir noch nicht ganz so sicher, wie ich die Berechnungen im Hintergrund mache.
Also, ich versuche so wenig komplex wie möglich zu sein, die Grundwete der Charaktere sind schnell erklärt:
Kraft - Bestimmt die Stärke physischer Angriffe
Geist - Bestimmt die Stärke magischer Angriffe
Ausdauer - Bestimmt die Lebenspunkte
Geschicklichkeit - Dieser Wert soll die Trefferwahrscheinlichkeit steigern.
Beweglichkeit - Dieser Wert soll die Ausweichchance bestimmen.
Rüstung - Schützt den Spieler vor den Attacken.
So, und jetzt kommt der Punkt der mir Kopfschmerzen bereitet.
Ich weiss einfach nicht, im welchem Verhältniss ich diese Werte miteinander verrechnen soll.
Ein pures "Schaden = (Angreifer)Kraft - (Verteidiger)Rüstung" reicht zwar um das Script im allgemeinen zu testen, aber das reicht mir nicht.
Zudem würde ich gerne noch kritische Treffer hinzufügen.
Ich habe in diesem Gebiet leider zu wenig Erfahrung um weiter zu kommen, ich hoffe das man mir irgendwie helfen kann.
Natürlich werden jetzt viele kommen und sagen: Hey nehm doch einfach das Standart Script XYZ.
Aber ich möchte eigentlich einfach nur verstehen wie ich diese Werte miteinander kombiniere.
Ich hoffe das mir einige mit ihrer Weisheit und vor allem Erfahrung da weiterhelfen können.
Schönen Gruss
Strongsoul
Die Idee ist schon mal gut.
Zudem würde ich gerne noch kritische Treffer hinzufügen.
Dann würde meiner Meinung nach noch ein "Glück"-Wert sinnvoll erscheinen.
Ich bin zwar kein Profi, was das Scripten angeht, doch ich werde diesen Thread aufmerksam verfolgen, da mich deine Frage ebenfalls interessiert.
Ich nehme an, dass das Script auf Abfragen basiert.
Sogenannten IF-THEN-ELSE Abfragen (WENN-DANN-ANDERNFALLS).
Ich stelle mir das so vor, dass du die ganzen Werte, wie z.B.
Kraft, Ausdauer, Geschicklichkeit etc. als Variablen speicherst. Steigt der Protagonist einen Level, so kann der Spieler Atrributpunkte auf die genannten Werte verteilen. Die jeweilige Variable verändert sich also.
Findet nun ein Kampf statt, dann greifen die Abfragen auf die Variablen zurück, die den (Kraft-, Ausdauer-, Glück- etc.) Wert liefern.
Beispielsweise werden dem Gegner bei einer Stärke von 1. Attributpunkt,
5 - 10 Schadenspunkte abgezogen.
Ich hab' selbst vor so etwas ähnliches mal zu entwickeln und würde mich ebenfalls freuen, wenn jemand Vorschläge und konstruktive Kritik einbringen würde.
EDIT: Ich glaube ich habe zu kompliziert gedacht. Hab' mir das gerade kurz vorm' schlafen gehen noch mal durch den Kopf gehn' lassen. Nach meiner Methode müsste man ja für jeden Attributpunkt und die jeweilige Eigenschaft eine Abfrage erstellen.
Also wenn jede Eigenschaft, sagen wir maximal 100 Attribut Punkte hätte, dann wären das Insgesamt 700 Abfragen (Glück mit eingeschlossen).
Nicht dass ich mich davor drücken würde, diese zu schreiben (wobei das meiste Copy&Paste wäre), ich würde mich nur wundern, wenn der 2k/3 Maker das ohne ruckeln auf die Reihe kriegen würde.
Jan der Superparanoid
01.07.2008, 02:28
Wenn dir (Angr.)-(Vert.) zu simpel ist brauchst du mehr Komponenten, wie zB Waffenschaden, Waffenart, Rüstungsart.
Viel kannst du auch über die Geschicklichkeit regeln (und/oder Glück, wenn du diesen Wert einführen möchtest). Weil es gibt ja nicht nur Treffer und nicht-Treffer. Kritische Treffer würde ich über Geschick laufen lassen. Höhere Trefferwahrscheinlichkeit => Höhere Critrate. Crits zu berechnen is ganz leicht. Nimmst ne beliebige Formel die Geschick (/Glück) mit dem Charakterlvl ins Verhältnis setzt und daraus ne Critchance errechnet.
Bsp:
Charaktere um lvl 10 haben ~100 Geschick.
Charakterlvl: 10
Geschick: 100
Geschick/Lvl/2 = Critchance
100/10/2 = 5%
Je höher der Lvl ist, desto mehr Geschick braucht man, um eine höhere Critchance zu bekommen. So verhinderst du, dass man irgendwann die Critchance 100% erreicht, wenn man ein lvlgeek ist.
Nochmal zur Trefferchance:
Wie gesagt gibs nich nur Treffer und Nichttreffer. Könntest den Schadenswert per Zufall variieren, um verschieden gute Treffer zu erzielen.
Bsp:
(Angr-Vert)+(Lvl * Rand. -3 bis 3)
Heisst auf die Differenz von Angr und Vert wird der Herolvl*[eine zahl von -3 bis +3] - so haste auf lvl 1 ne Varianz von DMG+-3, auf lvl 5 +-15, auf lvl 50 +-150.
Alle Werte sind natürlich beliebig wählbar. Welche optimal sind kommt ganz auf dein KS und dein Balancing an. Experimentieren.
Bei den Formerln kannst du auf mit Exponenten arbeiten um Kurven zu kreiiern. Allerdings is Mathe nicht meine Stärke, also überlasse ich da die Vorschläge jemand anderem ;)
Du kannst dir auch hier ein paar Ideen sammeln.
http://irowiki.org/wiki/Stats
http://irowiki.org/wiki/Game_Mechanics
lg
StrongSoul
02.07.2008, 20:48
Hey non, das sind echt zwei sehr interessanten Links, vielen Dank!
Bin zwar leider noch nicht dazu gekommen es komplett durch zu lesen.
Ich denke mal ich werd die Berechnung in mehrere Phasen einteilen.
Phase 1 - Berechnung der Ausweichchance, wenn diese fehlschlägt dann gehts weiter mit
Phase 2 - Berechnung des theoretischen Schadens des Angreifers
Phase 3 - Berechnung der Trefferchance, ist diese erfolgreich erlangt man einen kritischen Treffer, wenn nicht wird der Schaden durch den Rüstwert verringert.
Jan, ich denke deine Ansätze sind schon mal gut, damit kann ich mir auf jedenfall schon mal grob vorstellen wie ich die Werte berechnen kann.
Kann bitte jemand, der sich mit dem Maker etwas auskennt, ein par konstruktive Worte zu meiner Überlegung verlieren?
Hallo Money.
Also das wär garkein Problem. Ich habe zwar keine Ahnung wie man ein CS mittels Maker-Events realisiert, aber programmiertechnisch brauchst du da keine hunderte von conditions sondern lediglich passende formeln, welche die Variablen der einzelnen werte miteinbeziehen.
Schätz ich mal ... :D
Jan der Superparanoid
07.07.2008, 14:36
Das stimmt, für die Berechnungen braucht man eigentlich kaum Abfragen.
Effektiv fragst du ja nicht ab, welchen Wert ein Attribut hat und rechnest dann eine bestimmte Zahl, sondern bindest den Wert des Attributes in die Berechnung ein (wie in meinen Beispielen). Dann muss in der Formal natürlich ggf. zum lvl in Verhältnis gesetzt werden damit die Charaktere nicht imba werden.
Abfragen kommen dann erst wenn du deine Endergebnisse hast und sie anwenden musst, zB Ausweichchance oder Critchance.
MagicMagor
08.07.2008, 10:48
Wie du die Werte genau verrechnest kann man nicht generell sagen. Das hängt davon ab wie du das KS konzipieren willst und auch wie die Werte allgemein skalieren, vor allem im Vergleich zu Level und HP der Charaktere.
Aber dennoch hier einmal ein par einfache Ideen meinerseits:
1. Schadensberechnung
Die erste Frage die wir uns stellen sollten ist, ob Kraft der einzige Faktor ist, der den Schaden von physischen Angriffen beeinflussen soll (dann würden Waffen wohl nur Kraftboni geben) oder ob er zusätzlich zu einer Waffe wirkt. Ich persönlich halte zweiteres für schöner. Wir gehen also nun hin und geben jeder Waffe einen Grundschaden, nennen wir diese Variable mal S (für Schaden). Den Einfluss der Kraft können wir absolut einrechnen oder prozentual, je nachdem was man möchte. Bei einer absoluten Einrechnung hätten wir aber das Problem, daß der Kraftwert später durchaus zum Großteil für den Schaden verantwortlich ist und die Waffe fast egal ist. Beim zweiteren dagegen kann ein Waffenupgrade einen deutlichen Schadensboost geben und es wird schwierig mit einer Billigwaffe später nennenswerten Schaden zu machen. Welches Modell man wählt ist Geschmackssache.
In beiden Fällen berechnen wir aber aus dem Kraftwert unseren Bonus, im ersten Fall ist dieser Bonus ein direkter Schadensbonus, im zweiteren Fall ein prozentualer Faktor. Die einfachste Möglichkeit so einen Bonus zu berechnen ist Kraft/x wobei x hier nach Gutdünken gewählt sein kann. Hängt von der Skalierung der Werte ab und vom Balancing. Mögliche Idee wäre 3, 5 oder 10.
Absoluter Bonus: Schaden = S + Kraft/x
Prozentualer Bonus: Schaden = S*((Kraft/x)/100)
Analog kann die Schadensberechnung für Zauber erfolgen. Jeder Schadenszauber hat einen inneren Schadenswert, analog wie hier errechnet sich ein Schadensbonus abhängig vom Geistwert.
Zusatz: Der Waffen- bzw. Zauberschaden muss nicht fix sein, sondern kann in Form einer Unter- und einer Obergrenze festgelegt werden wobei bei jeder Berechnung ein zufälliger Wert dazwischen gewählt wird mit dem weiter gerechnet wird. So erhält man eine gewisse Varianz im Schaden.
2. Schadensabsorbation/Rüstung
Ähnlich wie bei der Schadensberechnung können wir die Rüstung absolut Schaden abfangen lassen oder prozentual. (Eine Gesamtrüstung kann analog wie beim Schaden auch aus Charakterwert + Ausrüstung errechnet werden). Wir verwenden wieder Rüstung/x als Formel um den Faktor zu errechnen.
Absolut: Erlittener Schaden = Gesamtschaden - Rüstung/x
Prozentual: Erlittener Schaden = Gesamtschaden * (100 - Rüstung/x)/100
3. Trefferchance
Hier verwende ich gerne ein System das unabhängig von der Skalierung der Werte funktioniert. Wir haben hier 2 Werte die gegeneinander geprüft werden müssen, die Geschicklichkeit des Angreifers, die bestimmt wie gut dieser trifft und die Beweglichkeit des Verteidigers, die bestimmt wie gut dieser ausweicht.
Grundidee meines Systems ist, sind beide Werte identisch haben wir es mit einem ausgeglichenen Fall zu tun, in diesem Fall ist die Wahrscheinlichkeit eines Treffers 50%. Für jeden Punkt den die Geschicklichkeit des Angreifers über der Beweglichkeit liegt gibt es einen Bonus von X% auf diese Wahrscheinlichkeit (ich persönlich nehme hier gerne 5%). Für jeden Punkt den die Beweglichkeit über der Geschicklichkeit liegt gibt es X% Abzug von diesen 50%. Dabei sind die Chancen nach unten und oben gecappt, bei zB 5% und 95%.
Rechnerisch sieht das dann so aus:
Wahrscheinlichkeit = 50 + X*(Geschicklichkeit - Beweglichkeit)
Danach die Überprüfung auf die Capgrenzen, dann nur noch Würfeln und vergleichen.
4. Kritchance
Neben der Möglichkeit einen neuen Charakterwert für die Critchance einzuführen kann man diese aber wie bei der Trefferchance auch abhängig von der Geschicklichkeit berechnen lassen. Wir wählen einfach eine andere Grundwahrscheinlichkeit (deutlich niedriger), erhöhen den Einfluss der Beweglichkeit und setzen andere Capgrenzen (zB. bei 0% und 25%)
Das könnte dann so aussehen:
Critchance = 1 + X*(Geschicklichkeit - 5*Beweglichkeit)
X könnte in diesem Fall durchaus so etwas sein wie 0.1 (also effektiv /10) womit wir 1% Critchance für alle 50 Punkte die unsere Geschicklichkeit die Beweglichkeit des Gegners übersteigt.
5. HP
Ganz einfach: Ausdauer * X. Denkbar wäre so was wie 2, 5 oder 10. Man kann das ganze natürlich auch nach Level staffeln, aber ich bin persönlich kein Freund davon in solchen Berechnungen das Level zu berücksichtigen (mMn spiegelt sich das Level direkt in den Attributen wieder).
6. Bonus
Bei all diesen Berechnungen ist natürlich denkbar nach dieser normalen Berechnung direkte Boni draufzuaddieren die zB von Tränken oder aktuell wirksamen Zaubersprüchen kommen.
Das KS an dem ich rumwerkel berechnet Schaden atm ziemlich simpel:
Atk*2-DEF+zufallswert zwischen -3 und 3
Zu simpel, billig, armseelig?
Vielleicht, aber es funtioniert. Muss nur aufpassen, dass die Werte steht's passen. Damit sowas blödes wie Heilung statt DMG nicht zustande kommt.
Natürlich gibt es bei mir keinerlei Elemntresistenzen, was die Sachen recht einfach gestaltet.
Zu simpel, billig, armseelig?
Sollte man nicht sagen. Einen Wert, den man auch berechnen kann, kann man gut für ein taktischer orientiertes Kampfsystem nutzen. Man muss im Gesamtkonzept nur dafür sorgen, dass man auch einen Nutzen daraus ziehen kann. :)
Jan der Superparanoid
15.07.2008, 02:02
Atk*2-DEF+zufallswert zwischen -3 und 3
Das Problem, das ich hier sehe; der Zufallswert wird nich skaliert. Dh am Anfang des Spiels ist er sehr stark und der Zufall entscheidet viel bei einem Kampf mit. Zumindest im Verhältnis zum Ende des Spieles, wo die Differenz von 6 Schadenspunkten wahrscheinlich völlig irrelevant is.
Mag jetz vll nicht superentscheidend sein, aber ich würd jedenfalls nich so machen.
naja könnte man potentiell auch größer machen, mir ging's ja nur drum, dass nicht immer dieselben werte da stehn.
Mastermind
16.07.2008, 20:22
Ich arbeite ja schon ewig an einem rundenbasierenden Kampfsystem (wie manche vielleicht wissen ;)), von daher kann ich mich wohl als "erfahren" auf diesem Gebiet bezeichnen.
Zugegeben - die Entscheidung, wie du den Schaden berechnen willst, beeinflusst dann später sehr stark das sogenannte "Balancing". Darunter versteht man allgemein das Verhältnis zwischen den einzelnen Werten. Fragen wie: "Um wie viel steigert sich der durchschnittliche Schaden wenn sich der Stärke-Wert um 1 erhöht" fallen unter diesen Begriff.
Es gibt unzählige Varianten, wie man den Schaden berechnen kann. Wenn du sagst, dass dir "Angriff - Abwehr = Schaden" zu simpel ist, hilft dir Scar's Methode schon einmal weiter, also per Zufallszahl eine Abweichung festzulegen. Aber du solltest eine Sache bedenken: Wenn der Level der Figuren steigt, steigt vermutlich auch der Schaden, den sie anrichten. Und wenn der durchschnittliche Schadenswert irgendwann bei 300 pro Angriff liegt, werden die drei Schadenspunkte auf oder ab, die Scar vorschlägt, keinen mehr kümmern. Deshalb habe ich mir für mein Kampfsystem (zumindest was die normalen Angriffe betrifft) folgendes System zurechtgelegt (hier am Beispiel des Helden Alex beim Angriff auf Gegner 1):
Common Event: Schadensberechnung
Trigger Type: Call
Starting Condition: None
-----------------------------------------
<> Variable Operation: v[001: Angreifer ATK], set, "Alex ATK"
<> Variable Operation: v[002: Verteidiger DEF], set, v[002: Gegner1 DEF]
<> Variable Operation: v[003: Zufallszahl], set, Random [50-150]
<> Variable Operation: v[004: Schaden], set, v[001: Angreifer ATK]
<> Variable Operation: v[004: Schaden], subtract, v[002: Verteidiger DEF]
<> Variable Operation: v[004: Schaden], multiply, v[003: Zufallszahl]
<> Variable Operation: v[004: Schaden], divide, 100
<>
Also: Im Prinzip ist es wieder das "Stärke - Rüstung = Schaden" - System, allerdings schwankt der Schaden diesmal zwischen 50 und 150% des "Durschnittswertes". Dadurch ist eine Abweichung vom Durchschnittswert auch auf höheren Leveln gewährleistet.
Ich muss ganz ehrlich sagen, dass ich kein Fan von Kampfsystemen bin, bei denen die Helden oder Gegner *von sich aus* beim Angriff daneben hauen können, also ohne dass irgendwelche statusverändernden Zauber auf sie einwirken. Wenn du es aber trotzdem so machen möchtest, würde ich so vorgehen:
<> Variable Operation: v[005: Angreifer Geschick], set, "Alex AGI"
<> Variable Operation: v[006: Verteidiger Bewegl.], set, v[007: Gegner1 Bewegl.]
<> Variable Operation: v[003: Zufallszahl], set, Random [50-150]
<> Variable Operation: v[005: Angreifer Geschick], multiply, v[003: Zufallszahl]
<> Variable Operation: v[005: Angreifer Geschick], divide, 100
<> Variable Operation: v[003: Zufallszahl], set, Random [50-150]
<> Variable Operation: v[005: Verteidiger Bewegl.], multiply, v[003: Zufallszahl]
<> Variable Operation: v[005: Verteidiger Bewegl.], divide, 100
<> Variable Operation: v[008: Trefferquote], set, v[005: Angreifer Geschick]
<> Variable Operation: v[008: Trefferquote], subtract, v[006: Verteidiger Bewegl.]
<> Conditional Branch if v[008: Trefferquote] greater 0
<> Call Event: "Schadensberechnung"
<> else handler
<> Message: "Alex verfehlt den Feind!"
<> end case
Du nimmst hier also beide Male eine Abweichung von 50-150% von den Geschicklichkeits- und Beweglichkeitswerten. Damit ist nicht immer garantiert, dass ein Treffer gelandet wird - aber je größer die Differenz zwischen den beiden ursprünglichen Werten ist, desto größer oder kleiner wird natürlich auch die Trefferquote. Und wenn diese dann größer ist als null (oder ein anderer Wert deiner Wahl), dann erst kommt es zur Schadensberechnung.
Ich hatte auch einmal ein Angriffssystem, das sah in groben Zügen so aus:
Wenn (Stärke des Angreifers minus [Abwehr + Rüstung] des Verteidigers) > 0
dann
Schaden = Stärke des Angreifers - [Abwehr + Rüstung] des Verteidigers + Schadenspotential der ausgerüsteten Waffe des Angreifers
Nimm da noch die Varianz hinzu und du hast ein recht schönes, komplexes System. Allerdings, wie gesagt, ich bin kein Fan von wenn die Helden danebenhauen obwohl kein Grund dazu besteht...
Für weitere Fragen bin ich immer zu haben ^^
Greetz!
Mastermind
Offen gestanden find ich ja 50-150% prozent bissel krass (wenn man pech hat halber Schaden halt). Aber jedem das seine.
Mastermind
18.07.2008, 18:01
Das waren ja auch nur Beispielwerte. Natürlich kann man auch 80-120% oder auch 90-110% nehmen, das ist dann individuell dem Entwickler überlassen. Meine Erfahrung hat bis jetzt jedoch gezeigt, dass man mit 50-150% doch recht gut fährt - ich muss aber dazusagen: das wird auf den Angriffswert des Angreifers angewendet, BEVOR die DEF des Verteidigers abgezogen wird. Eine (schlimmstenfalls) Halbierung des Angriffswertes entspricht also nicht gleich einer Halbierung des Schadens :tuffig:
Sir-Blaster
14.08.2008, 13:10
Wenn du eine Wirklich Komplexe Schadensberechnung haben willst, würd ich auf ausweichswerte zurückgreifen. Wie in World of Warcraft
Anbieten würde sich da:
Angriffskraft
Angriffswert/Trefferwertung
Kritische Trefferwertung
Verteidigung
Die werte könnten dann letztendlich ausschlaggebend sein für den Schaden den man Einsteckt/austeilt. Die werte skallieren sich dann anhand des Levels bzw level unterschied zum gegner
Kämpft man gegen einen Gegner 5 stufen über einem sinkt die Trefferwertung bzw Chance überhaupt zu treffen, und Kämpft man gegen Schwächere steigt die Chance zu treffen.
Natürlich verhält sich das genauso mit der Verteidigungs fertigkeit. (Zum getroffenwerden)
Die Rüstung sollte auch relativ zum Level sein. So würde eine Stufe 40 Plattenrüstung gegen stufe 5 gegner den Maximale Schadens reduzierung ( sagen wir mal 80%) geben, und aber gegen stufe 80 Gegner lediglich einen minimal schutz von 5%
Mastermind
15.08.2008, 11:19
Sir-Blasters Vorschlag hat durchaus etwas für sich - hat aber eine fatale Schwachstelle: jeder Gegner in deinem Spiel muss einen Level zugewiesen bekommen. Wenn du das von Anfang an berücksichtigst und auch durchziehst, stellt das kein Problem dar, aber das nachträglich noch einzubauen könnte sich als Herausforderung herausstellen, vor allem in Bezug auf das Balancing. Die mit Abstand komplexeste Schadensberechnung, die ich kenne, ist die des "Advanced Dungeons & Dragons"-Regelwerks. Such' einfach mal danach unter Google, da wirst du sicher fündig. Bleibt noch zu hinterfragen, in wie weit sich dieses System aber für ein rundenbasierendes KS eignet, da die Trefferchancen da unter'm Strich meistens so um die 50% sind...
Greetz!
Mastermind
Bleibt noch zu hinterfragen, in wie weit sich dieses System aber für ein rundenbasierendes KS eignet, da die Trefferchancen da unter'm Strich meistens so um die 50% sind...
Und Kämpfe sind oft nach wenigen Treffern beendet. Das würde sich nur eigenen, wenn Fluchten Teil des Gameplays sein sollen. (Oder Kämpfe umgehbar sein sollen.)
Huch, da hat doch neulich Sir-Blaster gepostet..
Mastermind
15.08.2008, 19:13
Und Kämpfe sind oft nach wenigen Treffern beendet.
Sehr richtig, Veyrne. Wenn man also wirklich das AD&D-Regelwerk verwenden will, so sollte man auch ein KS basteln, das so ähnlich abläuft wie das der alten "Baldur's Gate"-Spiele: jeder Char greift den Gegner so lange an bis er einen anderen Befehl bekommt. Stellt euch mal vor man müsste dann jeden Angriff extra befehlen und trifft dann nur zu 10%... :D
vBulletin® v3.7.1, Copyright ©2000-2009, Jelsoft Enterprises Ltd.