UCGO-PS UWSCマクロ勉強~めざせ完全自動化(・∀・)ノシ その弐 | おっチャン寝る

おっチャン寝る

おっチャン寝る(オッチャンネル)とは、オッチャンが「おっ」と思った面白動画を貼り付けたり、面白かったゲームの話題でもゆるーく綴ります。他のBlogで真面目な事を書いている分、ここでは大いに弾けますw

本日作成したのは、敵機来襲時の工場格納プロセス(・∀・)
人に説明するつもりでBlogに書くと、自分自身整理されるので今日は教える感じで丁寧に書いてみるね。

実はこのBlog記事を書き終わってから、ソースの整理が出来て、より分かりやすいマクロに改良できたので(・∀・)

敵機確認の方法は別の機会に述べるとして…

MS工場に格納する場合、工場が空いていなければなならない。
工場をクリアにし、
/getoffコマンドを打ち込みNPCになり
自分のマシンを生産ウィンドにドラッグ・アンド・ドロップしてTakeOutする。
/transportコマンドを打ち込みハンガーに戻る。

ここまでを作ります。

確認事項
1)今、何をしているか?
生産中
待機中
2)工場に在庫はあるかないか

これらを何によって判別するか?

まず、生産中だと工場に格納できないので、生産中を示すProgressウィンドを判別する。

$おっチャン寝る-UCGOPS

このウィンドの「Progress」の部分を判別に使えば、生産中でも破壊中でも同じように判別できる(・∀・)

$おっチャン寝る-Progress


Progress.bmp があれば生産中と判断し確認作業を等間隔でループする、無ければ次の動作へ
Progressウィンドが確認できなくなったら、成功しようが失敗しようが表示されるOKボタンを確認して、そいつをクリック。

前回説明していないから今日書いておくけど…

画像判定して何らかの動作をする場合
ifb CHKIMG("画像.bmp")
動作コマンド
endif

と記述します。
画像があった場合、動作コマンドを実行する。
という事です。

ifb !CHKIMG("画像.bmp")
動作コマンド
endif

この場合は、画像がなかった場合動作コマンドを実行する。となります。
ifはendifで閉じます。

ifb !CHKIMG("画像.bmp")
動作コマンド1
else
動作コマンド2
endif

この場合は、画像が無かった場合動作コマンド1を実行し、画像があった場合動作コマンド2を実行する。となります。
その他の場合はelseを使います。


同じ作業をループさせる場合、while Trueを使います。
while TrueはWENDで閉じます。
ループを止める場合breakを使います。

while True
ifb !CHKIMG("画像.bmp")
動作コマンド
endif
break
WEND

この場合、画像が無かった場合動作コマンドをループで無限回実行し、画像が現れたら止まる。となります。

ってな具合で

確認作業1
生産中を判別し、生産中の場合、生産判別を一定間隔でループさせ、生産完了ウィンドが出たら、生産判別のループを止め、OKウィンドのボタンを押す。
という記述を書いてみます。

確認作業1ソース
ifb CHKIMG("Progress.bmp") //生産中を判別、以下生産中の場合
while True //生産完了まで以下をループ
ifb CHKIMG("check.bmp") //生産が終わったら表示される画面の認識
BTN(LEFT,CLICK,519,364,300) //OKボタンクリック
break //ループ終了させる
else //生産完了画面がなかったら
sleep(0.8) //確認間隔
endif
WEND //ループ範囲終了
endif


生産が失敗しようと成功しようと、OKボタンにはチェックマークが表示されますのでアクティブなOKボタンのチェックマークを画像判定に使います。

$おっチャン寝る-チェックマーク


確認作業2
生産中ではなく待機中でもなく、生産完了直後だった場合は
生産に成功した場合、Confirmウィンドが表示され
生産に失敗した場合、Attentionウィンドが表示されますので
それぞれOKボタンをクリックして、この場合必ず工場に在庫が発生しますので工場ウィンドを開いてTakeoutし工場ウィンドを閉じてやります。

判定用画像は、こんな感じで必要最小限に留めておけば、妨害要素に邪魔されにくく確実に判定できます。
$おっチャン寝る-例


確認作業2ソース
ifb CHKIMG("Confirm.bmp") //生産完了直後なら
BTN(LEFT,CLICK,519,364,300) //OK // 左クリック
sleep(0.8)
BTN(LEFT,CLICK,686,182,300) //工場ウィンド開ける
BTN(LEFT,CLICK,686,182,156)
sleep(0.8)
BTN(LEFT,CLICK,454,120,300) //TAKEOUT
sleep(0.8)
BTN(LEFT,CLICK,496,40,300) //工場ウィンド閉じる
endif
ifb CHKIMG("attention.bmp") //生産失敗直後なら
BTN(LEFT,CLICK,519,364,300) //OK // 左クリック
sleep(0.8)
BTN(LEFT,CLICK,686,182,300) //工場ウィンド開ける
BTN(LEFT,CLICK,686,182,156)
sleep(0.8)
BTN(LEFT,CLICK,454,120,300) //TAKEOUT
sleep(0.8)
BTN(LEFT,CLICK,496,40,300) //工場ウィンド閉じる
endif



次に、待機中でも何もしていない瞬間だった場合のケース

工場に生産物や材料が存在すると格納できないので、
その存在を確認して、ある場合はTakeOutする。

ここで何を持って在庫を判別するか悩んだんですが…

おっチャン寝る-工場ウィンド


工場の在庫判定に使う普遍の画像は、コレでしょう(・∀・)

在庫あり
おっチャン寝る-在庫あり


在庫なし
おっチャン寝る-在庫なし


確認作業3
では、工場ウィンドをダブルクリックで開けて
工場の在庫をチェック
在庫あり画像が識別できたら、Takeoutボタンを押し工場をクリアにし工場ウィンドを閉じる。

確認作業3ソース
BTN(LEFT,CLICK,686,182,300) //工場ウィンド開ける
BTN(LEFT,CLICK,686,182,156)
sleep(0.8)
ifb CHKIMG("1_1.bmp") //工場に何か生産物があるか工場ウィンドの1/1表示で判定
BTN(LEFT,CLICK,439,116,300) //在庫がある場合TAKEOUT
sleep(0.8)
BTN(LEFT,CLICK,496,40,300) //工場ウィンド閉じる
endif
BTN(LEFT,CLICK,496,40,300) //工場ウィンド閉じる
sleep(0.8)



工場格納実行
以上で、それぞれのケースに於いて工場をクリアにする事ができますので、/getoffコマンドでマシンを降り、工場ウィンドを開け、工場にマシンをドラッグ・アンド・ドロップして格納し、/transportコマンドでハンガーに飛びます。

工場格納ソース
BTN(LEFT,CLICK,499,619,300) //getoffコマンド入力実行
KBD(VK_OEM_2,CLICK,40)
KBD(VK_G,CLICK,31)
KBD(VK_E,CLICK,40)
KBD(VK_T,CLICK,40)
KBD(VK_O,CLICK,40)
KBD(VK_F,CLICK,40)
KBD(VK_F,CLICK,40)
KBD(VK_RETURN,CLICK,40)
BTN(LEFT,CLICK,610,108,234) //工場ウィンド開ける
BTN(LEFT,CLICK,610,108,156)
BTN(LEFT,DOWN,614,391,172) //マシン選択(ドラッグ)
BTN(LEFT,UP,333,181,300) //格納(ドロップ)
BTN(LEFT,CLICK,395,116,300) //TAKEOUT
BTN(LEFT,CLICK,496,44,300) //工場ウィンド閉じる
//ミディア搭乗
BTN(LEFT,CLICK,499,619,300) //transportコマンド入力実行
KBD(VK_OEM_2,CLICK,40)
KBD(VK_T,CLICK,40)
KBD(VK_R,CLICK,40)
KBD(VK_A,CLICK,40)
KBD(VK_N,CLICK,40)
KBD(VK_S,CLICK,40)
KBD(VK_P,DOWN,40)
KBD(VK_O,DOWN,40)
KBD(VK_P,UP,40)
KBD(VK_O,UP,40)
KBD(VK_R,CLICK,40)
KBD(VK_T,CLICK,40)
KBD(VK_RETURN,CLICK,40)
BTN(LEFT,CLICK,256,101,234) //USERタブ
BTN(LEFT,CLICK,141,200,300) //ハンガー選択
BTN(LEFT,CLICK,261,543,300) //OK
BTN(LEFT,CLICK,519,370,265) //OK
sleep(60.0) //NPCで60秒待機(次の動作までの待機時間)



さて、これらを一つにまとめると
確認作業1 生産作業中の確認
確認作業2 状態の確認
確認作業3 工場環境の確認
工場格納実行
となります。

MS工場格納マクロ.UWS

ACW(GETID("UCClient","Rx Application"),7,3,816,638,0)
//生産作業中の確認
//まだ生産中なら待機
ifb CHKIMG("Progress.bmp") //生産中を判別、以下生産中の場合
while True //生産完了まで以下をループ
ifb CHKIMG("check.bmp") //生産が終わったら表示される画面の認識
BTN(LEFT,CLICK,519,364,300) //OKボタンクリック
break //ループ終了させる
else //生産完了画面がなかったら
sleep(0.8) //確認間隔
endif
WEND //ループ範囲終了
endif
//生産作業中ではない場合
//状態の確認
ifb CHKIMG("Confirm.bmp") //生産完了直後なら
BTN(LEFT,CLICK,519,364,300) //OK // 左クリック
sleep(0.8)
BTN(LEFT,CLICK,686,182,300) //工場ウィンド開ける
BTN(LEFT,CLICK,686,182,156)
sleep(0.8)
BTN(LEFT,CLICK,454,120,300) //TAKEOUT
sleep(0.8)
BTN(LEFT,CLICK,496,40,300) //工場ウィンド閉じる
sleep(0.8)
endif
ifb CHKIMG("attention.bmp") //生産失敗直後なら
BTN(LEFT,CLICK,519,364,300) //OK // 左クリック
sleep(0.8)
BTN(LEFT,CLICK,686,182,300) //工場ウィンド開ける
BTN(LEFT,CLICK,686,182,156)
sleep(0.8)
BTN(LEFT,CLICK,454,120,300) //TAKEOUT
sleep(0.8)
BTN(LEFT,CLICK,496,40,300) //工場ウィンド閉じる
sleep(0.8)
endif
//完全な待機状態の場合
//工場環境の確認
BTN(LEFT,CLICK,686,182,300) //工場ウィンド開ける
BTN(LEFT,CLICK,686,182,156)
sleep(0.8)
ifb CHKIMG("1_1.bmp") //工場に何か生産物があるか工場ウィンドの1/1表示で判定
BTN(LEFT,CLICK,439,116,300) //在庫がある場合TAKEOUT
sleep(0.8)
BTN(LEFT,CLICK,496,40,300) //工場ウィンド閉じる
sleep(0.8)
endif
BTN(LEFT,CLICK,496,40,300) //工場ウィンド閉じる
sleep(0.8)
//工場格納実行
BTN(LEFT,CLICK,499,619,300) //getoffコマンド入力実行
KBD(VK_OEM_2,CLICK,40)
KBD(VK_G,CLICK,31)
KBD(VK_E,CLICK,40)
KBD(VK_T,CLICK,40)
KBD(VK_O,CLICK,40)
KBD(VK_F,CLICK,40)
KBD(VK_F,CLICK,40)
KBD(VK_RETURN,CLICK,40)
sleep(0.8)
BTN(LEFT,CLICK,610,108,234) //工場ウィンド開ける
BTN(LEFT,CLICK,610,108,156)
sleep(0.8)
BTN(LEFT,DOWN,614,391,172) //マシン選択(ドラッグ)
BTN(LEFT,UP,333,181,300) //格納(ドロップ)
sleep(0.8)
BTN(LEFT,CLICK,395,116,300) //TAKEOUT
sleep(0.8)
BTN(LEFT,CLICK,496,44,300) //工場ウィンド閉じる
sleep(0.8)
//ミディア搭乗
BTN(LEFT,CLICK,499,619,300) //transportコマンド入力実行
KBD(VK_OEM_2,CLICK,40)
KBD(VK_T,CLICK,40)
KBD(VK_R,CLICK,40)
KBD(VK_A,CLICK,40)
KBD(VK_N,CLICK,40)
KBD(VK_S,CLICK,40)
KBD(VK_P,DOWN,40)
KBD(VK_O,DOWN,40)
KBD(VK_P,UP,40)
KBD(VK_O,UP,40)
KBD(VK_R,CLICK,40)
KBD(VK_T,CLICK,40)
KBD(VK_RETURN,CLICK,40)
sleep(0.8)
BTN(LEFT,CLICK,256,101,234) //USERタブ
sleep(0.8)
BTN(LEFT,CLICK,141,200,300) //ハンガー選択
sleep(0.8)
BTN(LEFT,CLICK,261,543,300) //OK
sleep(0.8)
BTN(LEFT,CLICK,519,370,265) //OK
sleep(60.0) //NPCで60秒待機(次の動作までの待機時間)





長時間の自動運転は可能になったが…
PCの冷却が…(;・∀・)