Nachdem ich mir den Fall nochmal etwas durch den Kopf gehen lassen hab, handelt es sich hier mit hoher Wahrscheinlichkeit um einen Synchronisationsfehler im Kampfsystem:
- Der Spieler ignoriert den Gegner und bewegt sich mit hoher Geschwindigkeit von ihm weg
- Wenn er sich weit genug vom Gegner entfernt hat, wird der Kampf beendet
- Vermutlich wird dazu eine COMBAT_END Nachricht o.ä. an den Charakter geschickt
- In diesem Fall war hier jedoch noch weiterhin ein Distanzangriff des Gegners aktiv (Flammenatem verfolgt den fliehenden Spieler und hat ihn noch nicht erreicht), als der Spieler ausser Reichweite kommt und der Kampf vom System für beendet erklärt wird
- Die noch nicht abgeschlossene Attacke auf den Charakter blockiert das Kampfende
- Die COMBAT_END Nachricht wird damit gelöscht, ohne umgesetzt worden zu sein
- Nachdem der Flammenatem des Drachens die Spielfigur erreicht hat, dort eingeschlagen ist und Schaden verursacht hat, ist auch der letzte Angriff beendet und kein weiterer mehr aktiv
- Damit könnte der Kampf nun tatsächlich beendet werden, wird es aber nicht mehr: Die bereits verschickte COMBAT_END Nachricht wurde bereits bearbeitet, ohne ausgeführt zu werden, und dann gelöscht. Eine neuerliche Nachricht zum Beenden des Kampfes wird nicht verschickt, weil das System meint, den Kampf bereits beendet zu haben
Der Fehler liegt also darin, dass eine COMBAT_END Nachricht unbearbeitet verworfen wird. Zur Lösung bieten sich 2 unterschiedliche Ansätze an:
1) Eine COMBAT_END Nachricht muss vom Charakter als ausgeführt bestätigt werden, sobald die Spielfigur tatsächlich aus dem Kampf genommen wird.
Solange dies nicht geschieht, darf das System einen Kampf nicht als erledigt ansehen, sondern muss ihn später erneut versuchen zu beenden.
Hier wird eine COMBAT_END Nachricht verschickt, ohne dass sich das Kampfsystem dafür interessiert, ob sie auch tatsächlich umgesetzt wird. Für das System ist der Kampf damit beendet (Nachricht wurde ja verschickt), während für den Charakter der Kampf weiterhin aktiv ist (das Beenden des Kampfes wurde wegen noch aktiver Attacke des Gegners abgelehnt).
2) Wird eine COMBAT_END Nachricht nur ein einziges Mal verschickt, muss Charakter-seitig darauf geachtet werden, dass sie nicht unbearbeitet verworfen wird und damit verloren geht. Das lässt sich beispielsweise durch eine Semaphore erreichen, die durch noch laufende Attacken gesetzt und nach Abschluss eines Angriffs wieder gelöscht wird.
Jede gestartete und noch nicht abgeschlossene Attacke auf die Spielfigur setzt die Semaphore, sie wird erst nach einem vollständig abgeschlossenen Angriff wieder zurückgesetzt.
Jedes Bearbeiten einer COMBAT_END Nachricht prüft zunächst diese Semaphore. Ist sie gesetzt, wird die weitere Bearbeitung blockiert und die Nachricht damit gequeued. Erst nach dem Zurücksetzen der Semaphore erfolgt die abschliessende Bearbeitung der Nachricht. So wird verhindert, dass sie unbearbeitet verloren geht.