Steamのサバイバルゲームの「Subsistenc」を最近、生き抜きでちょくちょくやってるのですが、プレイされてる方はご存じかと思うのですが、素材集めが中々大変なゲームで、木を切って集めるだけの単純作業でも、中々骨が折れたりします…。
一応、エンジニアのはしくれで、プログラミング関係の仕事もやったりしてるので、単純作業を延々と作り返すのはエンジニア失格でもあり、一番簡単な
「木を切る作業」
を自動化してみました。
使用言語は、AutoITで、これに関する詳細は説明すると長くなるのでググって調べてください。
具体的なコードはこんな感じです。
とりあえず、ざっと書いたのでバージョンは「0.01」というところでしょうか。
;=========================
; Subsistenc 木こり自動化スクリプト[ver.0.01]
;=========================
;;; 設定
$LOADP_SLEEP = 16000;ロード待ち時間(ミリ秒※10秒以上推奨)
$LOOP_NUM = InputBox("設定", "繰り返す回数", "", "")
Opt("WinTitleMatchMode", 4);
WinActivate("[REGEXPTITLE:Subsistence.*]")
Send("{ESC}")
Sleep (500)
;;; メインループ
For $ii = 1 To $LOOP_NUM Step 1;
;;; 木を一回切る
Send("{1}")
Sleep (500)
For $i = 0 To 35 Step 1;
If WIN_CHEACK() == 0 Then ExitLoop
MouseClick("left")
Sleep (500)
Next
;;; SAVE
Send("{ESC}")
Sleep (500)
$size = WinGetPos("[REGEXPTITLE:Subsistence.*]")
MouseClick("left",($size[0] + 200), ($size[1] + 770),1)
;;; LOAD
MouseClick("left",($size[0] + 200), ($size[1] + 570),1)
MouseClick("left",($size[0] + 747), ($size[1] + 650),1)
Sleep ($LOADP_SLEEP);ロード待ち
If WIN_CHEACK() == 0 Then ExitLoop
Next
MsgBox(4096, "終了", "自動木こり終了", 10)
Exit;
;====================
; ■ ウインドウ移動チェック
;====================
Func WIN_CHEACK()
If WinGetState("[REGEXPTITLE:Subsistence.*]") == 0 Then
Return 0
EndIf
Return 1
EndFunc
Subsistencで、大木(虫がゲットできる木)の前に立ったら、武器を持たない状態でESCキーを押してメニューを開くと、Windowsの操作ができるようになるかと思うのですが、その際に、上記のスクリプトを実行すると、
最初、入力ダイアログが表示されるので、繰り返す回数を半角数字でセット。
その後、自動で木こり作業が始まります。
木こり作業が終わった後は確認用のダイアログを表示。
その他、途中でウインドウを閉じるなどすると、スクリプトも自動で終了するようにしています。
まだ作りこむ余地は十二分にありますが、とりあえずこれで作業の自動化ができたのでいったん終了しました。
PCから席を外してる間とか、寝てる間などに、木材を集めたい用途に最適だと思います。
あと、コード見るとわかるかもですが、スタート直後にキーボードの1を入力してるので、1番目に斧をセットしてください。
そうしないと正常に動きません。
プログラミングが分かる方でしたらコードを変更されるのでもいいと思います。
課題としては、ウインドウを閉じる以外に、スクリプトを何とか止めたいのですが、思いつく範囲だと、ウインドウ自体を移動させて、その変更を検知して終了させるのが一番お手軽な気はします。
分かりにくいやり方ですが…。
台風14号が上陸中ですが、相変わらず、うちの地域は、雨も風もなく、窓を開けてゲームや、PCで作業をしたりしています。
追記:
スクリプトをアップデート。
木を切る速度をスピードアップして、ウインドウを移動すると終了するように変更。
てか、ここまでやるのなら、最初からまともに書くべきだったかもですが、、元々、使い捨てスクリプトだったのでご了承ください。
;=========================
; Subsistenc 木こり自動化スクリプト[ver.0.02]
;=========================
;=========
; 設定
;=========
$LOADP_SLEEP = 13000 ;ロード待ち時間(ミリ秒※10秒以上推奨)
$SIZE_CHANGE_END = 1 ;初回起動の位置変更で終了フラグ
;=========
; 初期化
;=========
$LOOP_NUM = InputBox("設定", "繰り返す回数", "", "")
Opt("WinTitleMatchMode", 4);
$DEF_SIZE = WinGetPos("[REGEXPTITLE:Subsistence.*]")
WinActivate("[REGEXPTITLE:Subsistence.*]")
Send("{ESC}")
Sleep (500)
;=========
; MAIN LOOP
;=========
For $ii = 1 To $LOOP_NUM Step 1;
;;; cut a tree
Send("{1}")
Sleep (500)
For $i = 1 To 200 Step 1;35
If WIN_CHEACK(WinGetPos("[REGEXPTITLE:Subsistence.*]")) == 0 Then ExitLoop
MouseClick("left")
Sleep (50);
Next
;;; SAVE
Send("{ESC}")
Sleep (500)
$size = WinGetPos("[REGEXPTITLE:Subsistence.*]")
MouseClick("left",($size[0] + 200), ($size[1] + 770),1)
;;; LOAD
MouseClick("left",($size[0] + 200), ($size[1] + 570),1)
MouseClick("left",($size[0] + 747), ($size[1] + 650),1)
Sleep ($LOADP_SLEEP);
$size = WinGetPos("[REGEXPTITLE:Subsistence.*]")
If WIN_CHEACK(WinGetPos("[REGEXPTITLE:Subsistence.*]")) == 0 Then ExitLoop
Next
MsgBox(4096, "END", "exit script", 10)
Exit;
;====================
; ■ ウインドウ移動チェック
;====================
Func WIN_CHEACK($size)
If $size[0] <> $DEF_SIZE[0] AND $SIZE_CHANGE_END Then
MsgBox(4096, "END", "end of moving window", 10)
Exit;
EndIf
If WinGetState("[REGEXPTITLE:Subsistence.*]") == 0 Then
Return 0
EndIf
Return 1
EndFunc
真面目に書き直すかも…。