AutoIt HotKeySet überwacht Tastenkombinationen

So, heute mal etwas AutoIt.
Mein Hintergrund: Cursed Treasure ist, mal abgesehen von den letzten 2 Level nicht sonderlich schwer. In diesen 2 letzten Spielen allerdings wird man praktisch gezwungen sehr schnell zu klicken. Es gibt in dem Spiel 3 Skills aber diese haben keine Tastenkürzel. Man muss tatsächlich immer drauf klicken.

Um das Problem schnell zu beheben habe ich mir eine neue Funktion in AutoIt gesucht:

HotKeySet("[kürzel]", "[funktion]")

Mit dem Code kann man eine Überwachung starten, die auf eine bestimmte Tastenkombination eine bestimmte Funktion startet.

Ein Beispiel:

HotKeySet("!c", "meteor") ; Überwache ALT+C

Func meteor()
	$coords = MouseGetPos() ; Speichere aktuelle Position
	MouseClick("left",1030,600,1,1) ; Koordinaten des Skills
	MouseClick("left",$coords[0],$coords[1],1,1) ; Skill auf der gespeicherten Position nutzen
EndFunc

; Script am Leben halten
while 1
    sleep(100000000)
WEnd

Mein WordPress Syntax Highlighting Plugin kennt sogar AutoIt, nicht schlecht.

Jedenfalls reagiert Zeile 1 auf die Tastenkombination ALT+C. Alt wird dabei zu einem „!“, mehr dazu auf der Send() Infoseite von AutoIt.
Beim Drücken dieser Tasten wird die meteor Funktion aufgerufen. Diese speichert die aktuellen Mauskoordinaten, klickt eine feste Stelle des Bildschirms an und klickt danach wieder auf der Stelle, auf der die Maus stand, als die Tastenkombination gedrückt wurde.

Ich stelle also die Koordinaten des Meteor Skills ein, führe die Maus über ein Zielobjekt (jetzt mal rein theoretisch z.B. einen Wave 40 unsichtbaren Ninja Champion aus Level 15) und drücke die Tastenkombination. Die Maus speichert den Ort, klickt auf den Skill und führt diesen an der alten Stelle aus. Das ganze dauert nur wenige Millisekunden 🙂

Zeile 10-12 sorgen dafür, dass das Script endlos lange läuft und man beliebig oft die Tastenkombinationen nutzen kann.

So sähe also ein kleines Cursed Treasure Script aus:

HotKeySet("!{SPACE}", "wave")
HotKeySet("!y", "wood")
HotKeySet("!x", "haste")
HotKeySet("!c", "meteor")

Func wave()
	$coords = MouseGetPos()
	MouseClick("left",970,450,1,1)
	MouseClick("left",$coords[0],$coords[1],1,1)
EndFunc

Func wood()
	$coords = MouseGetPos()
	MouseClick("left",920,600,1,1) ; 
	MouseClick("left",$coords[0],$coords[1],1,1)
EndFunc

Func haste()
	$coords = MouseGetPos()
	MouseClick("left",1135,773,1,1)
	MouseClick("left",$coords[0],$coords[1],1,1)
EndFunc

Func meteor()
	$coords = MouseGetPos()
	MouseClick("left",1030,600,1,1)
	MouseClick("left",$coords[0],$coords[1],1,1)
EndFunc

while 1
    sleep(100000000)
WEnd

Neue Wave mit Alt+Leertaste, Alt+Y/X/C nutzen die 3 Skills. Koordinaten anpassen ist aber Voraussetzung.
Das ganze ließe sich auf weniger als 10 Zeilen zusammenstampfen und statt Koordinaten vielleicht mit Farberkennung verallgemeinern aber war ja nur so ein kleiner Spaß.

2 Kommentare

  1. Hallo Hannes,
    AutoIt kenne ich bereits, hat mir schon oft die Arbeit erleichtert.

    Vielen Dank für das coole Skript für CTreasure.

    Was mich aber brennend interessieren würde, wie du statt der fest vorgegebenen Pixel die Elemente auflösungsunabhängig auswählen würdest.
    Du hast oben etwas von einer Farberkennung geschrieben, was meinst du genau damit?

  2. Während ich diesen Comment so tippe ist mir mittlerweile eine bessere Methode eingefallen. Aber erstmal meine damalige Überlegung:
    PixelGetColor(x, y) gibt von einem Pixel auf x, y den dezimalen Farbwert zurück. Hex(PixelGetColor(x,y),6) gibt den hexadezimalen Farbwert aus.
    Ich dachte dann an sowas wie eine Abfrage von mehreren Pixeln und dann den festen Bezug zu den Buttons.

    Beispiel:
    < href="https://stuff.it-stack.de/img/ctreasure-hotkeys.png">Beispielbild
    Ich teste eine Reihe von 5-10 eindeutigen Pixeln oben rechts, die in jedem CT Game gleich sind (auch egal auf welcher Flashgames Seite ich CT spiele).
    Sind diese Pixel tatsächlich vorhanden dann kann ich relativ dazu eine feste Anzahl an Pixeln nach unten und rechts gehen, um die richtig Buttons zu treffen.

    If( Hex(PixelGetColor(x,y),6) == farbe && Hex(PixelGetColor(x+1,y),6) == farbe && Hex(PixelGetColor(x+2,y),6) && Hex(PixelGetColor(x+3,y),6) …)
    $wavex=x+100
    $wavey=y+500
    $woodx=x+50
    $woody=y+600

    Oder etwas in der Art.
    Problem ist nur, die Pixelposition dieser markierten Stelle oben rechts zu finden ist nicht so einfach.

    Aber so wäre rein theoretisch eine farbbasierte Lösung.

    Meine neue Idee:
    Der Benutzer wird einfach beim Spielstart (bzw. Scriptstart) nach den Buttonskoords gefragt.
    Konzept:
    Ausgabe: Bewege die Maus über Abholzen.
    $wood = MouseGetPos()
    Ausgabe: Bewege die Maus nun über Meteor.
    $meteor = MouseGetPos()
    … usw. Danach darf der Bildschirmausschnitt einfach nicht mehr bewegt werden.
    Ich denke das ist die schnellste und benutzerfreundlichste Lösung.

    Edit: Okay, farbbasierte Erkennung ist doch möglich. Denn, geile Funktion: PixelSearch sucht zusammen mit Farbwerten nach nem Pixel. Das könnte man sicher wie oben gedacht ausbauen.
    Ich glaube das wird demnächst ne Aufgabe für mich 🙂

Schreibe einen Kommentar