Stämme Bot – Timing ist alles

Heute geht es um präzise tickende Maschienen und ein Projekt, das nun doch ziemlich komplex geworden ist. Ein Stämme Bot!

Doch zunächst etwas in eigener Sache: Vielleicht bist Du hier, weil Du mehr oder weniger freiwillig von Keller-Elite auf diese Seite weitergeleitet wurdest. Hoschi111 war so nett, nach der Schließung von Keller-Elite die User hier her zu leiten. Ist eine große Ehre für mich und ich hoffe es gibt hier den ein oder anderen Artikel der Dich interessiert.

Ich weis nicht, ob Du schon Erfahrung im Browsergame „Die Stämme“ gemacht hast. Wenn nein, hier eine kurze Einführung: Um ein anderes Dorf zu erobern (im Stämmejargon auch „adeln“) muss man zwischen 3 und 5 erfolgreiche Angriffe mit einem Adelsgeschlecht auf das Dorf führen. Jedes Adelsgeschlecht (kurz AG) senkt die Zustimmung der Bevölkerung um 20-35 Prozent. Nach und nach sind die Dorfbewohner gewillt zum Angreifer überzulaufen. Dies möchte der Verteidiger natürlich verhindern und schickt allerei Defensive Einheiten in den Kampf um das Dorf zu verteidigen. Manchmal ist die Übermacht aber so groß, dass die eigene Verteidigung nicht standhält. Und dann tritt Plan B in der Kraft: Das „raustimen“. Da die große Offensive vor den AGs angreifen muss, um das Dorf von jeglicher Verteidigung zu befreien, laufen verschiedene Angriffswellen auf ein Dorf. Zumeist sind das ein bis zwei große Offensiven und direkt dahinter die AGs. Die AGs greifen meist mit nur geringem „Begleitschutz“ an, denn eigentlich ist das Dorf ja leer. Und meist werden alle verfügbaren Einheiten bei der großen Offensive gebraucht.

Der Clou ist nun das „Timen“ dieser Angriffe. Man möchte dem Verteidiger möglichst wenig Chancen geben, zwischen den beiden Angriffswellen (Offensive und AGs) Unterstützung im Dorf zu plazieren. Also folgen die Angriffe im Optimalfall wenige Zehntelsekunden aufeinander. Da man 4 Angriffe für die AGs möglichst Zeitnahe aufeinander losschicken muss, wird die Sache spannend. Es gibt extra Tools im Internet zum üben des „Timens“ dieser Angriffe. Doch in was in der Computer uns weit vorraus? Richtig, Timing!

Aus einem Tool, das lediglich Planngszwecke erfüllen sollte, ist so ein mehr oder weniger komplexer Bot geworden. Ein paar Bilder sagen wie immer mehr als Worte:

DSBot_1

Dies ist eine stufenlos zoombare Karte der Welt. Jeder Pixel repräsentiert ein Dorf, grüne Flächen markieren dementsprechend leere Flächen. Tonfarbene Dörfer gehören Spielern, graue Dörfer sind verlassene „Barbarendörfer“. Und das tollste an der Karte: Man kann Stämme, Player und sogar einzelne Dörfer markieren und speichern. In diesem Falle habe ich mir den Spiler „SoftCake Orange“ rausgesucht und ihn Orange markiert. Sein Stamm „cakeZ“ wird Blau markiert und ein weiteres Stammesmitglied von „cakeZ“ ist als rot hervorgehoben. Coole Sache, oder?

Woher ich die ganzen Daten bekomme? Die Stämme stellt regelmäsig aktualisierte Karten, Spieler und Stammesdaten zur Verfügung. Diese werden als Text-Datei eingelesen, in Klassen geparst und dementsprechend aufbereitet.

DSBot_2

Eine Karte ist zwar schön und gut, doch was wenn Not am Mann ist? Wenn eingehende Angriffe kommen, und man die Verteidigung zwischen die beiden oben beschriebenen Angriffswellen packen möchte? Da bietet es sich an, einen Angriff auf ein nahegelegenes, verlassenes Dorf zu starten. Der Angriff selbst ist egal, aber die Rückkehrzeit ist interessant. Denn wenn wir den Angriff geschickt losschicken, kommt er zu genau der geplanten Uhrzeit zwischen den Angriffswellen zurück. Die Rückkehrzeit berechnet sich zum Glück simple aus „Laufzeit zum Dorf * 2“. Die große Offensive des Aggressors geht in die Leere und die AGs werden von der zurückgekehrten Armee abgefangen. Dazu dient diese Ansicht. Sie berechnet automatisch die Rückkehrzeit für Dörfer in der Umgebung und zählt herrunter, bis man einen Angriff abschicken muss.

DSBot_3

Die nächste Ansicht ist eine taktische Übersicht. Es zeigt die Laufwege von Unterstützungstruppen an. Hier kann ich berechnen, welche Dörfer des Gegners Unterstützung an das von mir angegriffene Dorf schicken können. Wenn mein Angriff nach 40 Minuten einschlägt, so weiß ich dass nur maximal 4 Dörfer das anzugreifende Dorf unterstüzen können.

DSBot_4

Die wohl spannenste Ansicht für den „Botter“: Hier können Angriffe geplant werden. Wenn ich ein Dorf mit 4 AGs angreifen möchte, so stelle ich die Ankunftszeit für die Angriffe ein. Da wir etwas realistisch bleiben wollen, baue ich eine Verzögerung von je 1/10 Sekunde ein. Dann starte in den „Attack Thread“, welcher die Zeit auf den Angriff herrunterzählt und losfeuert. Auch sehr praktisch: Manchmal muss man Angriffe abschicken, wenn man nicht am PC ist. Auch hier bietet sich das „Tool“ an. Leider kann ich aus Anonymitätsgründen keine Screenshots von den Angriffsbefehlen zeigen. Aber sie folgen seeeehr dicht aufeinander 😀

Timing ist alles oder zumindest viel im Stämme-Spiel. Man kann eigentlich nicht mehr erobert werden wenn man jeweils die AGs „raustimed“. Schauen wir mal, wie sich das Tool bewährt 😉

Und bevor irgendwelche Fragen kommen: Das Tool steht weder zum Verkauf, noch werde ich es sonst irgendwie publizieren. Denn faires Spielen gehört eigentlich auch in ein solches Browsergame. Das Tool ist ein Experiment. Das Experiment ob es möglich ist, solche präzisen Angriffe zu schicken.

Greez

0

8 Comments

  • Antworten Huskynarr |

    Wie hast du die Angriffszeit berechnet?
    Bin mir nicht mehr sicher ob bei Stämme das pro Feld einfach nur X berechnet wird oder ob das eine hochrechnung ist bei der jedes fällt expotentiell hochzieht.

    0
    • Antworten Easysurfer |

      Es gibt glaube ich auch Server, bei denen die Laufgeschwindigkeit mit der Distanz abnimmt. Auf dem Server auf dem ich spiele hat jede Einheit eine Laufgeschwindigkeit (Minuten pro Feld), welche noch mit der Servergeschwindigkeit und dem Truppenlauffaktor multipliziert wird. Dann kann man einfach über den euklidischen Abstand rechnen: sqrt((x2-x1)^2 + (y2-y1)^2) . Dies ist die Anzahl der zurückzulegenden Felder. Diese Feldanzahl mit „Minuten pro Feld“ multipliziert gibt die Zeit in Sekunden (und Millisekunden), welche wiederrum auf eine Zeit umgerechnet werden kann.

      0
  • Antworten Pain |

    Hallo Easysurfer,
    ich versuche gerade dein Sample nachzubauen und hänge beim Auslesen der Map. Das Json was ich zurück bekomme lässt sich einfach nicht in C# Objekte Parsen. Hast du einen Tipp?

    0
    • Antworten Easysurfer |

      Letzer Absatz:

      Und bevor irgendwelche Fragen kommen: Das Tool steht weder zum Verkauf, noch werde ich es sonst irgendwie publizieren. Denn faires Spielen gehört eigentlich auch in ein solches Browsergame. Das Tool ist ein Experiment. Das Experiment ob es möglich ist, solche präzisen Angriffe zu schicken.

      0
  • Antworten alex |

    hey,
    schöne arbeit!
    was mich interissieren würde, woher bekommst du die aktuelle Serverzeit von dem DS server?

    Gruß

    0
    • Antworten Easysurfer |

      Laut DS Wiki wird die Serverzeit aus dem normalen NTP Pool genommen. Musst halt dein Rechner synchronisiert haben. Alternativ kannst die Serverzeit aus der Response parsen, die ist ja ebenfalls genau (musst halt die Zeit während Senden der Request abziehen). Im Zweifelsfall ein paar Angriffe starten und wieder abbrechen bis Du die richtige Zeit gefunden hast-

      Grüße

      1+
  • Antworten Marc |

    Hab jetzt auch ma nen Bot programmiert der das kann 🙂

    Aber ich habe keine Ahnung wie ich so ne Karte in C# implementieren kann 🙁

    0

So, what do you think ?