mmofacts.com

Spiellogik

gepostet vor 16 Jahre, 3 Monate von cherry

Welche Logik erwartet der Spieler in einem Tick-basierten Spiel?

Hier die Ausgangssituation: ein Tick-basiertes Spiel; sagen wir ein Tick alle 60 Minuten. Das Interface ist komplett mit AJAX aehnlicher Technologie entwickelt, d.h. wenn der Spieler eine Aktion ausloest geht eine Anfrage an den Gameserver - der antwortet entsprechend der Spiellogik. Der Client kann dann mit der Antwort etwas anfangen und verarbeitet sie entsprechen. Wichtige Punkte zu beachten: die Seite wird nicht neu geladen wenn der Spieler eine Anfrage schickt. Die Aenderungen die ein Spieler taetigt (sagen wir eine Zahl in eine Textbox eintragen) gehen auch nicht verloren.

Das erste Problem das ich bereits geloest habe (glaube ich) ist folgendes: das Spiel berechnet grade einen Tick und der Spieler schickt eine Anfrage etwas zu aendern (Schiffe zu bauen z.B.). Die Tick-Routine ist grade mitten drin, darum schickt der Server die Antwort, dass das Spiel gerade tickt und er es in ein paar Sekunden nochmal probieren soll. Die Aenderungen die der Spieler vorgenommen hat werden nicht uebernommen, allerdings sind sie noch im User Interface weil die Seite nicht neu geladen wurde. Er muss also einfach in ein paar Sekunden nochmal "absenden" druecken und alles ist gut. Oder? ...

Beim zweiten Problem, und das geht direkt Hand in Hand mit dem Ersten ist mir nicht so ganz klar was die bessere Logik waere: der Spieler logt sich ein, seine Mama ruft ihn zum Abendessen. Er kommt 30 Minuten spaeter wieder an den PC (ist immer noch eingeloggt) und moechte jetzt eine Aenderung abschicken. In der Zwischenzeit hat das Spiel aber getickt. Der Spieler nimmt also seine Aenderungen auf Basis eines alten Spielstands vor. Er schickt also eine Anfrage zur Aenderung an den Server. Nun habe ich es so gemacht, dass der Server merkt wenn der Client einen alten Spielstand hat weil vom Client immer die Tick Nummer mitgeschickt wird. Was soll aber jetzt passieren: soll die Aenderung uebernommen werden oder soll sie verworfen werden mit dem Hinweis an den Benutzer, dass das Spiel getickt hat? Soll das Spiel den neuen Spielstand automatisch an den Benutzer schicken und damit seine Aenderung auch in der Benutzeroberflaeche loeschen?

Wie loest ihr sowas? Habt ihr aehnliche Situationen? Welche Spiellogik erwartet der Spieler?

Viele Gruesse,

cherry

gepostet vor 16 Jahre, 3 Monate von Fobby

Problem 1:

Den Spieler hat es nicht zu interessieren, ob du intern gerade Schwierigkeiten hast, seine Daten zu verarbeiten oder nicht. Das ist eine unschöne Lösung. Etwas aufwändiger aber für den User deutlich angenehmer dürfte folgendes sein: Alles, was in diese "kritische" Phase fällt, verpackst du in irgendeiner Form in einer Art Aktionstable. Wenn der Tick fertig ist, wird dieser Table abgearbeitet und alles ist so, wie es sein soll.

Problem 2:

Das Problem hast du aber nicht nur, wenn Mutti ruft, sondern bei jedem Tick. Da du ja scheinbar schon einen Countdown drin hast, weiß der Client, wann es tickt. Nun ist es klar, dass die neuen Daten irgendwie ins Interface müssen. Da würde ich radikal ein AJAX-Request ausführen, das alle benötigten Daten lädt und ins Interface schreibt. Welche Art von Userinput könnte denn damit überschrieben werden?

gepostet vor 16 Jahre, 3 Monate von Dunedan

Ich sehe ein generelles Problem bei dieser Tick-Variante. Wenn du schon jetzt meinst, dass der Server während des Ticks ein paar Sekunden beschäftigt ist, wie ist das denn dann erst wenn man ein paar hundert Spieler spielen? Ich würde einfach mal sagen es skaliert nicht.

gepostet vor 16 Jahre, 3 Monate von cherry

Original von Fobby

Problem 1:

Den Spieler hat es nicht zu interessieren, ob du intern gerade Schwierigkeiten hast, seine Daten zu verarbeiten oder nicht. Das ist eine unschöne Lösung. Etwas aufwändiger aber für den User deutlich angenehmer dürfte folgendes sein: Alles, was in diese "kritische" Phase fällt, verpackst du in irgendeiner Form in einer Art Aktionstable. Wenn der Tick fertig ist, wird dieser Table abgearbeitet und alles ist so, wie es sein soll.

Problem 2:

Das Problem hast du aber nicht nur, wenn Mutti ruft, sondern bei jedem Tick. Da du ja scheinbar schon einen Countdown drin hast, weiß der Client, wann es tickt. Nun ist es klar, dass die neuen Daten irgendwie ins Interface müssen. Da würde ich radikal ein AJAX-Request ausführen, das alle benötigten Daten lädt und ins Interface schreibt. Welche Art von Userinput könnte denn damit überschrieben werden?

Zu 1: Ja, Du hast recht. Es ist unschoen, aber hast Du es tatsaechlich schonmal so implementiert? Denn was passiert ist folgendes: der Spieler macht eine Aenderung aber diese Aenderung erscheint nicht bis nach dem Tick fuer den Spieler. Normal ist er aber gewohnt, dass eine Aenderung sofort erscheint. Das wird ihn verwirren.

Zu 2: Ja, ein regelmaessiges "reload" immer nach dem vermeintlichen Tick habe ich mir auch schon ueberlegt. Der Userinput der damit jedoch ueberschrieben werden kann ist der, der noch nicht abgeschickt wird. Stell Dir vor der User gibt was in ein Formular ein und dann kommt die brutale refresh Routine und loescht ihm die Eingabe. Da wird er sauer werden.

Skalierbarkeit ist eher kein Problem und war auch nicht Bestandteil der Frage. Wie wir grade im Chat diskutierten sind maximal 16 Spieler im Spiel.

TheUndeadable hat den Vorschlag gemacht einfach einen Lock zu setzen und dann einen Request der waehrend des Ticks ankommt warten zu lassen bis der Tick fertig ist und ihn erst dann auszufuehren. Auch argumentierte er, dass der Spieler ja weiss wann es tickt und er halt Pech hat wenn er kurz vor dem Tick etwas aendert, was aber erst nach dem Tick bearbeitet wird. Ich finde die Vorschlaege sehr gut.

Natuerlich sind weitere Kommentare, Ideen und Erfahrungsberichte sehr willkommen

gepostet vor 16 Jahre, 3 Monate von Fobby

Tja, habe jetzt nicht damit gerechnet, dass der Cron so lange dauert. Hm .. eine nicht perfekte aber effektive Möglichkeit könnte es auch sein, das Infterface einfach zu "sperren" solange der Cron läuft. Also z.B. eine halbtransparente Bitte-Warten-Grafik über die Seite legen. Wenn der Cron durch ist, neue Werte laden, ins Interface schreiben und Grafik wegtoggeln.

Bleibt die Frage nach den überschriebenen Formularen: Aber ich frage dich, welche Formulare werden von den Ticks beeinflusst? Wenn ich eine Flotte von a nach b schicke, und zwischendurch tickt's, dann ändert das an den Koordinaten nichts. Wenn ich auf einem Planeten die Steuern ändere, genausowenig.

Achja: "Der User hat Pech" ist nie ein guter Vorschlag

gepostet vor 16 Jahre, 2 Monate von None

Ich würde vorschlagen, dem User die Wahl zu lassen alá "Es ist inzwischen ein neuer Spielstand verfügbar. Wollen Sie ihre Aktion auf Basis des alten Spielstandes durchführen, oder sie noch einmal überarbeiten?".

Ansonsten muss ich sagen, dass wenn Mama zum Essen ruft, ein Klick auf einen Button gerade noch gehen sollte. Der Normaluser wird dann auch einsehen, dass er "Pech gehabt" hat.

Auf diese Diskussion antworten