技術文章>ゲーム・パズル関係

チョコットランド補助ツール:チョコリラン
Nobuhide Tsuda
20-May-2009

チョコットランド

チョコットランドハンゲームで遊べるオンラインMMORPG
通称:ちょこらん
みんなでいっしょに冒険
モンスターを倒し、経験値をゲットし、レベルアップ〜
アイテムをゲットし、装備を合成〜
クエストをクリアして、貴重なアイテムをゲット〜

職業:戦士、魔法使い、僧侶、盗賊
それぞれ一長一短がある。

他のプレイヤーと協力してモンスターを倒し・アイテム集めしたり、 装備・アイテム交換したり、装備を合成したり、チャットしたりするのは楽しい
豊富な装備・アクセサリーがあり、一部ではお着替えゲームと化している

不満:

チョコリラン

不満を解消するために、補助ツール:チョコリランを開発した。

画面を上図に示す。

以下の機能を持つ

言語:C++、開発環境:VC6、テキストエディタ:ViVi

実装

ウィンドウ認識

起動直後またはメニューにより、チョコットランドウィンドウを検索し、メンバ変数に格納しておく。

    m_pWnd = CWnd::FindWindow(NULL, "チョコットランド");
    if( m_pWnd == NULL )
        AfxMessageBox("チョコットランド ウィンドウを発見できませんでした。");

画面認識

タイマー割り込みにより、1秒に1回簡単な画面認識を行い経験値割合を表示する。
経験値は画面左上に黄色のグラフで表示されるので、その部分を CDC::GetPixel(x, y) により判定する

    CDC *pDC = m_pWnd->GetDC();    // 画面デバイスコンテキスト取得
    int exp = 0;
    {for(int x = 0; x < 100; ++x) {
        COLORREF col = pDC->GetPixel(EXP_X0 + x, EXP_Y0);    //  EXPグラフ部分の画面色をゲット
        if( col != COL_EXP ) break;
        exp += 1;
    }}

[- +] ボタンは状況により位置が異なるので、そのピクセルパターンを検索する。
チョコットランドウィンドウを順次直接参照すると時間がかかるので、 ビットマップにいったん転送してから単純な線形検索を行っている。

    CBitmap bm;
    bm.CreateCompatibleBitmap(pDC, 800, 450);
    CDC dcBM;
    VERIFY(dcBM.CreateCompatibleDC(pDC));
    dcBM.SelectObject(bm);
    dcBM.BitBlt(0, 0, CHOKO_WIN_WD, CHOKO_WIN_HT, pDC, 0, CHOKO_WIN_Y0, SRCCOPY);

    for(int x = 0; x < CHOKO_WIN_WD; ++x) {
        for(int y = 0; y < CHOKO_WIN_HT; ++y) {
            if( isMinusPlus(&dcBM, x, y) ) {	//	x y 位置に [- +] ボタンがあるかどうかを判定
                point.x = x;
                point.y = y + CHOKO_WIN_Y0;
                ReleaseDC(pDC);
                return true;
            }
        }
    }
    ReleaseDC(pDC);
    return false;

[- +] ボタン押下

売る数、捨てる数を増減させる場合は、前節の手順によりその位置を求め、SendMessage で WM_LBUTTONDOWN、WM_LBUTTONUP を送ればよい。

    for(int i = 0; i < n; ++i) {    // n はボタンを押す回数
        m_pWnd->SendMessage(WM_LBUTTONDOWN, 0, MAKELONG(x, y));
        m_pWnd->SendMessage(WM_LBUTTONUP, 0, MAKELONG(x, y));
        ::Sleep(1000/n);
    }

キー押下メッセージ送付

チャット入力部分に文字を入力するには、WM_KEYDOWN、WM_KEYUP を送り、フォーカスを設定し、 文字列は WM_CHAR メッセージにより送信する。

    m_pWnd->SendMessage(WM_KEYDOWN, VK_RETURN);		//	[Enter] キー
    m_pWnd->SendMessage(WM_KEYUP, VK_RETURN);

    m_pWnd->SendMessage(WM_CHAR, *ptr);             //  文字列入力

まとめ

チョコットランドの操作性の不満を解消するための補助ツール:チョコリラン を開発した。
簡単な画面認識を行い、情報表示を可能にした。
ユーザの指定により Windows メッセージをチョコットランド送ることで、チョコットランドの操作を実現した。

チョコリランにより、ちょこらんが快適により楽しくプレイできるようになった。
ちょこらんのやりすぎに注意しましょう。