Honeybees persönlicher Weg zur Software: Entwicklung von Tools zur Vereinfachung und Automatisierung von Mini-Games.
Mein Einstieg ins Reverse Engineering und die Softwareentwicklung
Dieser Artikel über die Automatisierung von Mini-Games ist der zweite Teil einer Artikelserie. Im ersten Teil ging es, um ein Projekt, welches LEDs kabellos an die Ambilight Alternative Hyperion angebunden hatte.
In dieser Artikelserie möchte ich meinen ganz persönlichen Weg zu diesem sehr interessanten Bereich in der IT näherbringen. Vielleicht kann er ja auch dem ein oder anderen als Blaupause dienen. Ich habe mir in den letzten Jahren natürlich mehr als nur diese Geräte angesehen. Aber bei diesen handelt es sich um die Geräte, in die ich am tiefsten eingestiegen bin oder die zu einem großen Wissensdurst und Schub bei mir geführt hatten. Daneben gab es auch andere Projekte, die mich lange beschäftigt haben. Darunter mein persönlicher Favorit: Das Reverse Engineering der Toniebox.
Ich war selbst von klein auf sehr IT interessiert. Somit fiel sehr schnell der Fokus auf die Softwareentwicklung, insbesondere auf .NET und Java. Auch meine Ausbildung habe ich in diesem Bereich gemacht. Von dort habe ich folgenden Ansatz mitgenommen:
Schaue Dir ein (komplexes) Problem an, zerlege es in mehrere kleinere (simple) Probleme, und finde so Stück für Stück eine Lösung.
Riesen Baumeisterschaft 2009 – AutoHotkey und Visual Basic
Schon vor über 10 Jahren dachte ich mir bei einigen eintönigen Mini-Games, die auch damals häufig bei Gewinnspielen zum Einsatz kamen, wieso muss ich die Spiele so spielen, wie sie vorgegeben sind. Vielleicht kann ich mir das Ganze ja erleichtern, in dem ich mir Software schreibe, die mir die Bedienung einfacher gestaltet, mich beim Spielen unterstützt oder es komplett für mich übernimmt.
Bei der Riesen Baumeisterschaft 2009 gab es auf einer eigens dafür eingerichteten Webseite baumeisterschaft.de drei verschiedene Minispiele, bei denen man sich messen konnte: Riesen mauern, Riesen stapeln und Riesen verladen.
Das erste Spiel war „Riesen mauern“. Dabei musste man fallende Mauersteine analog zu Tetris in eine Mauer stapeln und dabei vorher noch Mörtel in die Fuge schmieren. Das zweite Spiel war „Riesen stapeln“, bei dem er hieß Kisten mit einem Kran zu stapeln. Zu guter Letzt musste man in „Riesen verladen“ eine Liste mit Material (Zement, Steine, Sand und Latten) abarbeiten und per Klick in die Schubkarre befördern.
Alle Spiele lassen sich durch kleine Scripte, ohne großen Programmieraufwand oder Vorkenntnisse, sehr gut vereinfach.
Das Mini-Game Mauern braucht Mörtel
Beim Mauern hieß es: immer schön den Mörtel aus dem Eimer auf die Kelle und dann auf die Mauer. Dazu musste einmal auf den Eimer und anschließend auf die passende Stelle an der Mauer geklickt werden. Den ersten Schritt habe ich mir über ein kleiner AutoHotkey Script erspart. Das Script fängt den linken Mausklick ab, klickt an die ursprüngliche Position und auch anschließend direkt auf den Mörteleimer. Dieses kleine Script spart entscheidende Sekunden:
Hier hatten wir einen Fall von „Simples Problem“ und „Simple Lösung“, wie ich es am Anfang angesprochen hatte.
Das Mini-Game Verladen braucht Werkzeug
Weiterhin müssen beim Verladen möglichst viele Verladelisten abgearbeitet werden. Jedes Teil der Liste musste per Mausklick in die Schubkarre gelegt werden. Waren zum Beispiel drei Bretter gefordert, musste das Brett dreimal angeklickt werden. Es gab maximal vier immer identische Produkte, die maximal je 6x geordert wurden.
Die Mini-Games waren damals noch in Flash implementiert und nicht in JavaScript. Damit war es nicht so einfach möglich, die Werte direkt im Browser per JavaScript auszulesen. Hier lässt sich aber wieder Autohotkey wunderbar verwenden, um die Eingaben dazu direkt mit der Tastatur oder einem Joystick zu erledigen, anstatt mühsam die Maus zu bewegen. Dazu habe ich mir verschiedene Varianten überlegt und umgesetzt. Einmal einfach einen einzelnen Tastendruck oder Joypaddruck zu verwenden, um ein Produkt zu verladen. Auch zunächst eine Zahl und dann die dazugehörige Taste für das Produkt zu drücken war eine Variante.
Eine Bilderkennung hatte ich damals auch dazu implementiert. Etwas, was man heute mit OpenCV umsetzen würde, habe ich händisch per Visual Basic versucht. Das Mini-Game Riesen stapeln hatte ich nicht automatisiert, da es für eine einfache Lösung zu komplex war.
Mini-Game Verladen per Gamepad oder per Tastatur mit AutoHotkey
Mit AutoHotkey lassen sich Tastendrücke von einem Gamepad genauso leicht abfangen wie von der Tastatur. Der Tastendruck wird dann einfach in einen Mausklick übersetzt.
Eine Stufe weiter geht die Variante, bei dem zunächst über das Numpad die Anzahl in einer Variante abgelegt wird, um dann anschließend per Buchstabe x-Mal auf das zu verladende Objekt zu klicken.
Die weiteren Varianten sind in voller Länge im dazugehörigen GitHub Repository zu finden.
Bilderkennung per Visual Basic 6
Nachdem das Script nun über simulierte Mausklicks die Schubkarre beladen kann, war die Idee nun, auch die benötigten Waren zu erkennen und somit die Schubkarre im Mini-Game Verladen vollautomatisch zu füllen. Wie oben beschrieben kannte ich damals keinen einfachen Weg, die Ladungsliste direkt aus dem Browser auszulesen. Heutzutage wäre das sicherlich sehr einfach per JavaScript möglich. Weiterhin würde ich auch noch versuchen, die Liste aus dem Arbeitsspeicher zu extrahieren. Daher hatte ich den Ansatz der Bilderkennung gewählt:
- Screenshot vom Browserfenster machen
- Relevante Bildteile extrahieren (Ladungsliste)
- Bildteile mit Referenzbildern vergleichen (1x für die Anzahl, 1x für das Produkt)
- Erkanntes Produkt x-mal anklicken
Die Funktion für den Bildvergleich habe ich hier eingebunden. Der vollständige, sehr unschöne Quellcode findet sich außerdem wieder auf GitHub. Hinweis: Dies ist selbstgebastelter Code für die Bilderkennung. Heutzutage würde ich auf ein Framework wie zum Beispiel OpenCV setzen!
Abschluss
In der letzten Zeit habe ich mich viel mit OpenCV beschäftigt und mich dem Fernsteuern eines Android-Smartphones via AndroidViewClient / scrcpy gewidmet. Das Ziel dabei war es ein AliExpress Mini-Game zu automatisieren. Bei Gelegenheit schreibe ich gerne auch noch ein paar Worte dazu. Das Spiel heißt „Geld-Sprung“ und sieht wie folgt aus:
Auch freue ich mich über Feedback: Wie hat euch der Artikel gefallen? Ich hoffe, ich konnte damit vielleicht den ein oder anderen dazu zu inspirieren, ein interessantes Open-Source-Projekt zu starten, oder über seinen ganz persönlichen Tellerrand hinauszuschauen. Schreibt mir in den Kommentaren!