Ich arbeite an einem Echtzeit-Dungeon-Crawler, der sich auf ein relativ komplexes und flexibles Skill-System konzentriert. Etwas ähnlich wie MMORPGs mit vielen zusammengesetzten Zaubersprüchen, Flächeneffekten, Buffs / Debuffs usw. Ich arbeite an den letzten Subsystemen des Motors.
Ich habe ein Problem mit Aktionen gefunden, die im selben Logikrahmen ausgeführt werden und die Attribute eines Schauspielers ändern.
Nehmen wir zum Beispiel an, zwei Schauspieler verwenden im selben Logik-Tick eine Fertigkeit aufeinander, die 100 Schaden verursacht und einen Debuff hinterlässt, der den verursachten Schaden halbiert.
Wenn ich einfach über jeden Schauspieler iteriere und seine Fähigkeiten verarbeite, verursacht der eine, der früher verarbeitet wird, vollen Schaden, der andere tut dies mit dem entkräfteten Zustand, der nur 50 verursacht. Idealerweise möchte ich, dass beide ähnlich arbeiten. vollen Schaden verursachen und den Debuff verlassen.
Was mich nervt, ist die unbestimmte Natur, die sich aus der Reihenfolge der Iteration ergibt.
Eine Lösung, über die ich nachgedacht habe, bestand darin, alle Änderungen des Statistikwerts und die Buff / Debuff-Anwendung zu verschieben, bis alle Fähigkeiten verarbeitet sind, da dies die einzigen Dinge sind, die das Verhalten von Fähigkeiten beeinflussen können. Im Grunde genommen mache ich eine Schleife über Akteure, verarbeite ihre Fähigkeitsmethoden, stelle aber die Änderungen der Statistik- und Statuseffekte in einer Liste in die Warteschlange.
Sobald ich jede Fähigkeit verarbeitet habe, die ich noch einmal durchlaufe, ändere ich diesmal die tatsächlichen Statistiken von den Werten in der Warteschlange.
Dies behebt das Determinismusproblem, verursacht aber ein anderes.
Um ein anderes Beispiel zu verwenden (da ich den allgemeinen Fall nicht genau
formulieren kann): Nehmen wir an, der Spieler hat 100 Mana und wird von zehn Manaburn-Angriffen in einem Frame getroffen, von denen jeder höchstens 50 Mana brennt und Schaden in Höhe des Manas verursacht verbrannt.
Wenn ich den vorherigen Fix nicht benutze, funktioniert er korrekt, zwei verbrennen die 100 Mana des Spielers, der 100 Schaden verursacht, die restlichen acht tun nichts.
Da sich der Manawert des Spielers noch nicht ändert, landen alle zehn Angriffe und verursachen 500 Schaden, mehr als die Menge an Mana, die der Spieler hat. Dies ist eine noch albernere Situation als zuvor.
Ich bin ein ziemlicher Amateur, ich habe weniger Erfahrung als Witz beim Entwerfen komplexer Systeme. Ist es möglich, ein bestimmtes Verhalten für Aktionen zu bestimmen, die im selben Rahmen stattfinden, und gleichzeitig schlimmere Konsequenzen wie im zweiten Beispiel zu vermeiden?
Ich weiß, dass der Player die Fehler im ersten Fall wahrscheinlich nicht bemerken wird, und ich glaube auch nicht, dass andere Entwickler sich mit diesem Problem beschäftigen.
Ich bin trotzdem neugierig, ist so etwas möglich, ein Wunschtraum, oder habe ich nur eine verzerrte Vorstellung davon, wie die Spielelogik funktionieren soll?
Vielen Dank!