ugrás a tartalomhoz

Flash játék botot hogyan érdemes írni?

inf · 2015. Dec. 8. (K), 06.46
Van egy flash játék, amihez szeretnék botot írni. Elég egyszerű dologról van szó, tower defense, 5 féle torony közül lehet választani minden körben. 2, 3 vagy 4 lerakott toronyból össze lehet kombinálni egy speciálisat, ami erősebb, mint a normál. Szerencsés esetben egy leosztásban lejön az a kombináció, amiből speciálisat lehet összerakni. Lehet új leosztást kérni, ami pénzbe kerül. Van hozzá egy sandbox mode, amiben rengeteg pénzt ad az elején, szóval ez a része nem akadály. Azt mondják, hogy van egy speciális tower, amit csak úgy lehet lerakni, ha egy leosztásban 4 ugyanolyan perfect feljön. Erre számításaim szerint 40960000:1 az esély, amit érthető okokból nem szeretnék összekattintani.

A helyzet az, hogy én egyáltalán nem értek a flash-hez. Az egész kb annyi lenne, hogy le kellene szimulálni 5 kattintást bizonyos helyekre, ellenőrizni az eredményt, utána meg repicket kérni egy újabb kattintással, ha nem stimmel. Ha stimmel, akkor meg valami riasztást kiadni repick helyett. Kódban ez néhány sor lehet. A kérdés az, hogy erre mi a legalkalmasabb eszköz?

Pillanatnyilag én kb ott tartok, hogy létezik olyan, hogy external interface flash-nél, amin keresztül talán-talán elérhető ami nekem kell, és akkor nem kell képfelismerő algoritmusokra hagyatkoznom. Ezen kívül tudom, hogy van greasemonkey userscript és firefox plugin. Mindkettőt szívből gyülölöm, de az utóbbit ha lehet még jobban, mert annyira gáz az API, és annyira nehéz debuggolni. Bármi ötlet még ezeken kívül, ami talán alkalmas a fejlesztésre?
 
1

Tudomásom szerint az

Endyl · 2015. Dec. 8. (K), 11.43
Tudomásom szerint az ExternalInterface arra való, hogy explicit exportáljanak vele kívülről, JS-ből hívható függvényeket; de ha ezt nem tették meg, akkor nem fogsz ezen keresztül AS kódot hívni. Úgyhogy lehet, hogy marad a képfelismerés valamilyen módon.

A firefox addonok debuggolhatósága rengeteget javult (én legalábbis elegendőnek érzem már). A régi API tényleg elég macerás, de legalább rugalmas, és szinte mindent meg lehet benne oldani (nem úgy mint az elvileg jobb Addon SDK-ban (bár itt még elérhetők a low level API-k); a Chrome féle WebExtension-ről meg ne is beszéljünk (szép api, amivel alig elérhető valami (egyelőre?), amiért anno elkezdtem ismerkedni az extension fejlesztéssel).
4

Ja nekem is ez rémlett, azért

inf · 2015. Dec. 8. (K), 20.02
Ja nekem is ez rémlett, azért írtam, hogy talán-talán. De nem hiszem, hogy bármi exportálva lenne. Majd megpróbálok utánajárni, hátha mégis elérhető valami.

Hát én anno próbáltam egy kiterjesztést chrome-ról átvinni firefox addon sdk-ra sikertelenül. Elvileg csak pár dolgot kellett átírni benne, a gyakorlatban viszont nem működött a dolog, nem jöttem rá, hogy miért, hiányoztak a debug eszközök, lehet, hogy nem néztem utána elég alaposan, hogy mik vannak, de én nem találtam semmit. Ilyesmik voltak, amik kellettek volna:

abszolút URL elkérése

chrome.extension.getURL("relative/path");
vs
    function getURL(relative) {
        var wm = Components.classes["##kukac##mozilla.org/appshell/window-mediator;1"].
            getService(Components.interfaces.nsIWindowMediator);
        var recentWindow = wm.getMostRecentWindow("navigator:browser");
        var base = recentWindow ? recentWindow.content.document.location : null;
        return base + "/" + relative;
    }
bizonyos fájlok elérésének blokkolása
 chrome.webRequest.onBeforeRequest.addListener(function() {
  return {
   cancel: true
  }
 }, {
  urls: ["*://domain.com/main.js*"]
 }, ["blocking"]);
vs

const Ci = Components.interfaces;
const Cu = Components.utils;

Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");

var observer = {
    QueryInterface: XPCOMUtils.generateQI([
        Ci.nsIObserver,
        Ci.nsISupportsWeakReference
    ]),

    observe: function(subject, topic, data)
    {
        if (topic == "http-on-modify-request" &&
            subject instanceof Ci.nsIHttpChannel)
        {
            var uri = subject.URI;
            if (uri.host == "domain.com" && /main\.js/.test(uri.path))
                subject.cancel();
        }
    }
};

Services.obs.addObserver(observer, "http-on-modify-request", true);
Még a chrome-al sem voltam minden téren kibékülve, de nagyságrendekkel jobb volt, mint ez a hányadék, ami az addon sdk-ból kijött. Biztos én rontottam el valamit, passz. :D Mindenesetre nem szívesen térnék vissza ehhez, ha van rá mód...
2

Két program

anti81 · 2015. Dec. 8. (K), 11.52
Személy szerint Autohotkey-t tudom ajánlani, ha Windows-ra kell, Sikuli, ha más platformra. Igaz, hogy ezek képfelismeréssel dolgoznak, de meg lehet adni toleranciát, így nem kell, hogy a kép pixel pontosan jelenjen meg a képernyőn.
5

Gondoltam erre is,

inf · 2015. Dec. 8. (K), 20.06
Gondoltam erre is, blogmarkoltam valamikor, de már elfelejtettem, hogy mi volt a neve. Köszi, végső megoldásnak, ha csak képfelismeréssel megy, akkor ez lesz. Szerintem pixelre pontosan jó lesz, nem igazán változik a dolgok kinézete. A gondom inkább azzal van, hogy áttetszőek a képek, szóval valahogy le kellene vonni a hátteret belőle, hogy működőképes legyen.
7

Sikulit most nézem, az a gond

inf · 2015. Dec. 8. (K), 21.54
Sikulit most nézem, az a gond vele, hogy nem tud átlátszó képeket kezelni, ez a játék meg sok helyen átlátszó ikonokkal machinál, szóval nem biztos, hogy a legjobb választás. A másik, amit nem tudom hogyan tudnék megoldani vele, hogy valahogy bevinni, hogy milyen koordinátákra rakja le az 5 tornyot. Ugye ez állandóan változik, ahogy egyre több torony kerül lerakásra.

AutoHotKey ahogy nézem tud átlátszó képeket is, kipróbálom, hátha össze tudom hozni azzal.
3

Egyszer írtam for fun egy

MadBence · 2015. Dec. 8. (K), 11.57
Egyszer írtam for fun egy botot a diamond dash-hez, ott képfelismeréssel (getUserMedia) oldottam meg (a kattintásokat pedig xdo-val). Az eredmény teljesen korrekt volt (az egyes cellák színét nagyon jól ki lehetett számolni, a különböző effektek ellenére is).

Én anno utána néztem, nekem az jött le, hogy semmilyen kommunikációs lehetőség nincs a meglévő flash programmal (de lehet, hogy csak én nem voltam elég alapos).
6

Hát én bízok a

inf · 2015. Dec. 8. (K), 20.10
Hát én bízok a szakértelmedben, én sem hallottam az external interface-en kívül semmiről.

Működőtt a botod a háttérben is? Elvileg a sikuli csak vm-ben tud a háttérben futni, én meg nem szeretnék vm-es megoldást, az már tényleg kicsit túlzás lenne egy játék miatt, az addon ezért szimpatikusabb.

Megvan még a kódja? Nem nagyon találok tutorialt a témában, gondolom melós dokumentáció alapján összehozni.
8

Közben jobban utánajártam a

inf · 2015. Dec. 9. (Sze), 04.02
Közben jobban utánajártam a témának, és nem biztos, hogy ez a kép felismerős megoldás a legjobb. Az swf fájlok tartalmazzák a forráskódot, szóval elég egyszerű a decompile, pl az én esetemben 2000 sor ez egész játék: http://www.showmycode.com/?5a99db46816b4491011947a8f4a26f43. Ezek után bele lehet nyúlni az adatküldésbe is communication sniffingel, át lehet írni a futó alkalmazást a memóriában, de akár megpróbálhatom átírni a kódot és újrafordítani is. Próbáltam wiresharkkal nézni a kommunikációt, de még nem igazán értek hozzá, nem találtam semmi használhatót csak bináris kódot, de nem jelenti azt, hogy nincs ott semmi. Azt mondják, hogy RTMP-vel kommunikál a flash a szerverrel. http://stackoverflow.com/a/13352379/607033. Ha nem a szerver generálja a leosztást, akkor megoldható, hogy olyan leosztást adjon, amilyet csak akarok. Nem hajtok semmilyen toplistára, csak kíváncsi vagyok mennyit üt az uber stone az ellenfélen.

(Ami vicces, hogy zend encoded php-t is tud decompile-olni a linkelt weboldal. Nem valami sokat ér a fizetős titkosítás sem. :D)