サン牧無双を完全自動化計画
最近サンシャイン牧場というゲームにはまっているわけですけど、そのチートツールでサン牧無双ってのがあります。詳しい説明はさけますが、よくできたツールなんですよコレ。あ、念のためいっときますが、どんなツールか試してるだけで実際には使ってないですよ。で、このツール、以前はセッションIDを手動で取得する必要があったけど、現在のバージョンはブラウザからセッションIDを自動で取得できるようになってます。
ここまでよく出来てるんだから、なんとか完全自動化できないものかなぁ、と思って ruby でスクリプト書いてみました。
# -*- coding: utf-8 -*- require 'dl/win32' require 'win32ole' require 'kconv' class SunbokuGuiTest BM_CLICK = 0x00F5 def initialize appname = 'サン牧無双'.tosjis @windows = Hash.new fw = Win32API.new('user32', 'FindWindow', 'LP', 'L') @hwnd = fw.call(0,appname) user32 = DL.dlopen("user32") ec= user32['EnumChildWindows', '0LPL'] enum_child_window_proc = DL.callback('IL'){|hw| caption = get_window_text(hw) @windows[caption] = hw unless caption == "" -1 } ec.call(@hwnd, enum_child_window_proc, 0) end def check (@hwnd == 0) ? false : true end def get_window_text(hwnd) buf = "\0" * 500 gWT = Win32API.new('user32','GetWindowTextA','LPI','I') gWT.call(hwnd,buf, buf.size) caption = buf.unpack("A*")[0] return caption end def push_button(caption) hwnd = @windows[caption.tosjis] pm = Win32API.new("user32", "PostMessage",['L','L','L','L'],'V') pm.call(hwnd, BM_CLICK, 0, 0) end end def startup_ie(delay=10, visible=false) ie = WIN32OLE.new('InternetExplorer.Application') ie.Navigate("http://mixi.jp/run_appli.pl?id=7157") ie.Visible = visible sleep delay while ie.busy sleep 1 end ie.Quit end if $0 == __FILE__ sg = SunbokuGuiTest.new unless sg.check puts '無双を起動しといてね'.tosjis exit end puts "ie起動してセッションID取得中、、、".tosjis startup_ie puts '無双!'.tosjis sg.push_button('無双') end
使い方
使い方は、サン牧無双を起動しておいて、スクリプトを動かします。スクリプトでやってることは、ieでサンシャイン牧場を起動して、サン牧無双の「無双」ボタンを押してるだけです。あとはpycronとかで定期的に動かせば、、、
おまけの話
GUIの操作をするライブラリとして、PerlのWin32::GuiTestってやつがあるんですけど、あるウインドウのボタンをクリックするのに、そのウインドウをアクティブにしないとできないっぽくて、自分で作ってしまいました。上のスクリプトでは PostMessage で BM_CLICK を投げてるので、スクリプトを動かしても、マウスをのっとられずにすみます。サン牧無双ツールを最小化しておいて普通に Windows で作業しててオッケー。
で、、、技術的な興味からサン牧無双のソースコード読みたいんですけど、作者さんソースコードみせてくれないかなー。profileに書いてあるメアドに送ってくれたら嬉しいんですけど!!C#わかりませんが、、、