Mittwoch, 29. August 2012

League of Legends Timer

In diesem Post möchte ich, nach längerer Inaktivität, wieder ein etwas längeres Projekt vorstellen, und zwar geht es um einen Timer für League of Legends.
League of Legends ist ein Computerspiel, auch wenn das Thema vielleicht nicht ganz zu diesem Blog passt, können Interessierte am Spiel oder auch Andere aus Interesse am Code gerne weiterlesen.
Zuerst etwas allgemeines für alle, die League of Legends, auch LoL genannt, nicht kennen: Es wurde von der Warcraft-III-Mod Defence of the Ancients inspiriert und ist nun ein eigenständiges Spiel. Ziel ist es, sich mit seinem Helden den Weg in die andere Basis zu erkämpfen. Auf der Karte sind verschiedene neutrale Monster verteilt, welche nach Erledigung nach einer bestimmten Zeit wiederkommen. Manche Spieler benutzen nun für besonders wichtige Monster einen Timer, welcher Ihnen ansagt, wann diese wiederkommen.

Zuerst möchte ich die Funktionen dieses in C# geschriebenen Timers vorstellen: Durch Drücken von NumPad0 - 5 werden die Timer der einzelnen Monster aktiviert, die Ziffern stehen hierbei für (in der genannten Reihenfolge): Baron, Dragon, Blue, Red, gegnerischer Blue, gegnerischer Red. Die Zeit bis zu deren Wiederkehr wird dann auf dem Formular angezeigt, zusätzlich gibt es akkustische Warnungen bei 30 und 60 Sekunden.

Ein meiner Meinung nach besonders interessantes Feature ist die Möglichkeit des Timers, sich online mit anderen zu synchronisieren. Die Idee ist folgende: Alle Mitglieder des Teams haben einen Timer am Laufen und derjenige, der die Monster erledigt (bzw. jemand, der es sieht) drückt die entsprechende Taste. Dann erhalten alle verbundenen Timer der Teammitglieder diese Information, so dass jeder die Warnungen erhält.

Über die Taste NumPad9 können die Zeiten aller laufenden Timer ausgegeben werden. Mittels F2 wird das Formular in den Vordergrund geholt. Über F9 lässt sich der "Chat Modus" (de-)aktivieren. Ist dieser aktiviert, wird bei Starten eines Timers die Rückkehrzeit des entsprechenden Monsters im Chat ausgegeben. Hierfür muss jedoch beim Starten des Spiels F10 gedrückt werden, damit das Programm den Nullpunkt setzen kann.

Nun zum Code: Wie immer möchte ich hier darauf hinweisen, dass ich diesen Blog zum Spaß betreibe und das Programm nicht sonderlich schön programmiert ist, mir geht es mehr um die Idee dahinter.

Folgende vorhergehende Posts setze ich als bekannt voraus, da ich deren Inhalt im Timer verwendet habe:
Anwendungen in den Vordergrund bringen
Globale Hotkeys erstellen
FTP Abfragen
Objekte serialisieren
Tastendruck simulieren
Sprachausgabe

Wichtig für die Synchronisation der verschiedenen Clients ist eine globale Zeit. Ähnlich wie in diesem Post hier liest das Programm den Quelltext der Seite http://www.uhrzeit.org aus, um eine standarisierte Zeit zu erhalten.
Beim Start des Programms wählt der Benutzer einen Kanal X zwischen 100-999 aus. Auf dem Server werden, sofern noch nicht vorhanden, die Dateien "syncX" und "timesX" angelegt. In der "sync" Datei steht nur die globale Zeit der letzten Benutzung, sodass nach 2 Stunden die vorherigen Spielstände gelöscht werden können. Wichtiger ist die "times" Datei. In dieser stehen in serialisierter Form die Zeiten bis zur Wiederkehr der verschiedenen Monster sowie die globale Zeit, zu der die Datei beschrieben wurde.
Alle 30 Sekunden rufen nun die Clients diese Datei vom Server ab. Sie deserialisieren dann die Zeiten (diese werden in einer Klasse LoLTimer verwaltet) und ziehen von den Zeiten die Differenz aus jetziger globaler Zeit und globaler Zeit der Dateiänderung ab, rechnen also die Zeiten bis zur Wiederkehr auf die aktuelle Zeit um. Bei diesen Zeiten wird immer die höchste betrachtet, d.h. der, der zuletzt den Timer gestartet hat, dessen Zeit wird benutzt.
Diese Regel wird beim Ändern der lokalen Instanz von LoLTimer beachtet, ist eine der aktuellen Zeiten höher, wird die Instanz serialisiert und als neue "times" Datei auf den Server geladen.
Dies ist die wesentliche logische Schwierigkeit meiner Meinung nach hinter dem Quellcode, ich belasse es hiermit mit den Erklärungen und poste im nächsten Post einfach den Quellcode.

Ich hoffe, das Programm gefällt zum herumexperimentieren, bei Fragen oder Anregungen bitte melden.
Herunterzuladen ist das ganze Programm unter diesem Link.

1 Kommentar: