Elektronik und Co.de

Wir schreiben über unsere Projekte

siedleriv

Siedler IV Statistik Kevin 🔖 AutoIt Python 📅 16. Januar 2021

Spieldaten live auslesen und auswerten

Habt ihr auch schon mal ein Spiel gespielt und habt euch überlegt, welche Strategie sich ausgezahlt hat bzw. ausgezahlt hätte? Oder wolltet ihr eure Leistungen besser mit denen von Mitspielern vergleichen?

Uns ging es so im Spiel “Siedler IV” und wir haben uns überlegt, wie wir das bewerkstelligen können. Entsprechend dreht sich dieser Artikel stark um das Spiel, aber die allgemeinen Fragen bleiben für jedes andere Spiel gleich.

Am Ende einer jeden Runde wird einem Spieler zwar eine kurze Übersicht und Bewertung der Leistungen angezeigt, aber nur vom finalen Stand und nicht sehr detailliert.

Welche Daten interessieren uns?

In Siedler IV geht es darum ein Dorf aufzubauen, Truppen auszubilden und mit den Truppen das gegnerische Land einzunehmen. Entsprechend interessieren uns natürlich für alle Spieler:

  • Gebäude
  • Einheiten
  • Rohstoffe

Für alle natürlich optimalerweise der aktuelle Wert, jedoch interessiert uns die genaue Positionierung der Elemente nicht. In einer weit entfernten Version wäre die Positionierung eventuell auch interessant, um nicht-spielenden einen Einblick in das Spiel zu erlauben.

Werden die Daten vom Spiel gespeichert?

Leider speichert Siedler IV die gewünschten Daten nicht, aber die Daten müssen ja existieren, da das Spiel am Spielende in der Lage ist eine kleine Statistik zu liefern und während des Spielens in der GUI immer angezeigt wird, wie viele Gebäude, Einheiten und Rohstoffe verfügbar sind. Somit können wir mit Sicherheit sagen, dass wir im Arbeitsspeicher sicher Informationen finden, die uns genau das liefern was wir wollen, möglicherweise nur mit etwas Rechenarbeit.

Wie hätten wir die Daten gerne zur Auswertung?

Um die Daten sinnvoll auswerten zu können, wäre es wünschenswert, die Werte in einer Tabelle in gleichmäßigen Zeitschritten zu haben, damit die Daten verschiedener Spieler schön übereinander gelegt werden können.

Haben wir besondere Einschränkungen?

Siedler IV ist ein etwa 20 Jahre altes Spiel, das keine Anti-Cheat-Mechanismen oder ähnliches besitzt. Entsprechend riskieren wir mit sämtlichen Modifikationen weder irgendeinen Account, noch beeinflussen wir für irgendjemanden die Spielerfahrung. Wir wollen aber, zumindest aktuell, das Spiel nicht nennenswert manipulieren.

Wie kommen wir an die Daten?

Die Daten liegen bei Siedler IV wie bei jedem anderen Spiel im RAM. Da Siedler IV sehr einfach in dem Aufbau ist, liegen die Daten auch unverschlüsselt und (teilweise) logisch zusammenhängend dort. Mittels CheatEngine oder ArtMoney ist es ohne viel Aufwand möglich, die Speicheradressen im Spiel zu finden, an denen die gewünschten Daten liegen.

Wichtig zu beachten ist jedoch, dass sich die Speicheradressen mancher Daten verschieben können und daher immer getestet werden muss, ob die Daten auch nach einem Neustart des Computers und auf einem anderen Computer auf der gleichen Adresse zu finden sind.

Ist dies nicht der Fall, muss ein sogenannter Static-Pointer (ein Pointer der immer an der gleichen Speicheradresse steht und auf den benötigten Bereich zeigt) gefunden werden. Genau dieses Problem ergab sich auch in unserem Fall, aber auch dieser Pointer lässt sich einfach mit einem der genannten Programme finden.

Da wir beide keine Experten im Umgang mit diesen Tools sind gibt es hier keine Anleitung dazu, YouTube und Co. bieten hier aber viele gut verständliche Anleitungen.

Implementierung in AutoIT (Version 1)

Natürlich eignen sich Programme wie ArtMoney und CheatEngine nicht, um sinnvoll Daten über eine längere Zeit zu speichern, somit entschlossen wir uns einen Logger in AutoIT zu programmieren.

Die erste Version erlaubt das Auswählen des zu beobachtenden Spieler und loggt ab Drücken des “Start”-Buttons diesen Spieler. Sie kann nur bei geöffnetem Siedler IV gestartet werden. Der Log wird für jeden Spieler als CSV-Datei gespeichert. Ein Spieler kann somit mehrere Spieler loggen (in einzelnen Dateien), jedoch muss für jeden Spieler ein neues Fenster geöffnet werden. Das Logging muss jedoch vor dem Schließen des Spiels beendet werden, sonst stürtz der Logger ab. Upsi!

Dieses Ergebnis zeigt, dass das Loggen wunderbar funktioniert und unser Ansatz der richtige ist. Im Ordner des Statistik-Tool ist ein Ordner namens “logs” notwendig!

Implementierung in AutoIT (Version 2)

Das Logging muss professioneller werden und so auch die GUI.

Der Logger V2 beobachtet das Spiel, erkennt den Start einer Runde sowie die Anzahl der Spieler und beginnt dann sofort die Daten in Abständen von 5 Sekunden für alle Teilnehmer in einer Datei zu speichern. Wird die Runde beendet, erkennt der Logger dies auch und beendet das Logging. Wird Siedler IV komplett beendet erkennt der Logger dies auch, wartet aber weiterhin auf einen Neustart des Spiels, sodass der Logger - theoretisch - sogar im Autostart des PCs aufgerufen werden könnte um jederzeit für eine neue Runde Siedler bereit zu sein.

GUI des Loggers V2

Visualisierung in Python (Version 1)

Rohdaten sind geil, das steht außer Frage. Aber natürlich ist ein hübscher Graph immer deutlich nützlicher um eine schnelle Auswertung zu bekommen. Hierfür verwenden wir Python3, da es optimal zur Verarbeitung von Daten ist.

Dem Python-Programm wird die Logdatei als Paremeter übergeben. Hierzu wird die Datei im Explorer auf die Python-Datei gezogen oder in der Konsole wie folgt übergeben:

python SIV_Visualizer.py LOGDATEI.CSV

Mit dem Visualisierungs-Tool kann einfach vorgegeben werden, welche der gespeicherten Daten in Graphen dargestellt werden sollen. In Zeile 18 des Scripts wird im Array vorgegeben, welche Einträge des Logs visualisiert werden sollen. Welche Zahlen hier einzutragen sind, zeigt der Logger beim Öffnen der Datei an, bevor ein Graph generiert wird:

Konsolenausgabe

Die Graphen der gewählten Einträge werden dann in einer Grafikdatei im Ordner der Log-Datei hinterlegt, wobei das Tool erkennt wie viele Spieler im Spiel waren und automatisch die gewünschten Werte für alle Spieler plottet. Es gibt keine Beschränkung der Anzahl der Plots. Werden mehr Werte geplottet, vergrößert sich automatisch die ausgegebene Bilddatei.

Beispielplot

Auf der X-Achse ist die Spielzeit in Minuten aufgetragen.

Implementierung in AutoIT (Version 3) & neue Visualisierung

Da die Plots aus den alten Versionen nur zugewiesen können, wenn klar ist welcher Spieler an welcher Position war, gibt es nun die Version 3 des Loggers mit neuer Visualisierung. Nun werden auch Kartenname und Spielername übernommen und im Plot angezeigt. Die Daten liegen im Log in der ersten Zeile.

Beispielplot aus Logger V3, Visualisierung V2

Mögliche Verbesserungen

Kein Projekt ist jemals fertig, genau so wenig ist dieses. Aber die Funktion die bisher implementiert ist ist absolut zuverlässig und Verbesserungen können jederzeit noch nachgeliefert werden.

Mögliche Verbesserungen und Erweiterungen für dieses Projekt sind:

  • Speicherung der Spielerfarben, etc. (any ideas?)
  • Fortsetzen einer Partie könnte durch das Tool erkannt werden und das alte Logfile entsprechend erweitert werden
  • Website zum Hochladen der Spielverläufe um bessere Taktiken zu finden und die eigenen Verläufe mit vielen anderen Spielern zu vergleichen (z.B. Freies-Siedeln Rangliste bzw. Ökonomiemodus extrem)

Ob und wann wir diese umsetzen ist nicht klar, solltet Ihr aber Interesse an etwas davon haben oder dieses Projekt weiterführen/ergänzen wollen, schreibt uns eine Nachricht!

Downloads


^