読者です 読者をやめる 読者になる 読者になる

Λάδι Βιώσας

http://profile.hatena.ne.jp/kenkitii/

サン牧無双を完全自動化計画

mixi ruby

最近サンシャイン牧場というゲームにはまっているわけですけど、そのチートツールでサン牧無双ってのがあります。詳しい説明はさけますが、よくできたツールなんですよコレ。あ、念のためいっときますが、どんなツールか試してるだけで実際には使ってないですよ。で、このツール、以前はセッション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の操作をするライブラリとして、PerlWin32::GuiTestってやつがあるんですけど、あるウインドウのボタンをクリックするのに、そのウインドウをアクティブにしないとできないっぽくて、自分で作ってしまいました。上のスクリプトでは PostMessage で BM_CLICK を投げてるので、スクリプトを動かしても、マウスをのっとられずにすみます。サン牧無双ツールを最小化しておいて普通に Windows で作業しててオッケー。

で、、、技術的な興味からサン牧無双のソースコード読みたいんですけど、作者さんソースコードみせてくれないかなー。profileに書いてあるメアドに送ってくれたら嬉しいんですけど!!C#わかりませんが、、、