「まうじゃん」対戦相手プラグイン インターフェース仕様
バージョン 12
2003年11月9日 改訂(「Pocket PC版」の表記を「WindowsCE版」に変更)
2003年8月16日 改訂(Pocket PC版に対応)

石畑 恭平
E-mail : ishihata@amy.hi-ho.ne.jp

ここでは、Windows版「まうじゃん」及び WindowsCE版「まうじゃん+」でサポートされている対戦相手プラグインの仕様を説明します。

C/C++ を知らない方は、読んでも分からないと思います。あしからず。

1 概要

 対戦相手プラグインは DLL の形で供給されます。よって、プラグインを作成するには DLL を作ることのできる環境が必要です。私は C/C++ のことしか分かりませんのではっきりとは言えませんが、 DLL を作れるのであれば他の言語でも作成できると思います。
 なお、この仕様書は Windows 版「まうじゃん」と WindowsCE版「まうじゃん+」の両方に対応しています。この仕様書に従って書いたソースコードは、両プラットフォーム用にビルドして使うことができます(きっと)。

 まず、Windows.h をインクルードしてください。

#include <windows.h>

 プラグインの DLL には MJPInterfaceFunc という関数が存在する必要があります。プロトタイプは

UINT WINAPI MJPInterfaceFunc(LPVOID inst,UINT message,UINT param1,UINT param2);
で、この関数を介してウィンドウメッセージと同じような感じで「まうじゃん」本体からメッセージが送られてきます。ここで WINAPI 呼び出し規約を使っているのは、C/C++以外の言語でも作れるように、との考えからですが、実は本当にこれで良いのか自分でも分かってなかったりします。そうそう、当然のことですが、この関数は外部から見えるようにしといてください。
 プラグインから「まうじゃん」本体に指示を出す(データを得たり、吹き出しを出す等)ときは、「まうじゃん」本体に用意されている MJSendMessage 関数を呼び出します。プロトタイプは
UINT WINAPI MJSendMessage(LPVOID inst,UINT message,UINT param1,UINT param2);
です。この関数へのアドレスは、プラグインの初期化時に得ることができます。

 

2 簡単な例

 とりあえず、簡単なプログラム例を見てみましょう。

ファイル名 Test.c
#include <windows.h>
#include "MIPIface.h"

UINT (WINAPI *MJSendMessage)(LPVOID,UINT,UINT,UINT);

UINT WINAPI MJPInterfaceFunc(LPVOID inst,UINT message,UINT param1,UINT param2)
{
   switch(message){
   case MJPI_SUTEHAI :
      return MJPIR_SUTEHAI | 13;
   case MJPI_ONACTION :
      return 0;
   case MJPI_STARTKYOKU :
      return 0;
   case MJPI_ENDKYOKU :
      return 0;
   case MJPI_STARTGAME :
      return 0;
   case MJPI_ENDGAME :
      return 0;
   case MJPI_CREATEINSTANCE :
      return 0;
   case MJPI_INITIALIZE :
      MJSendMessage = (UINT (WINAPI *)(LPVOID,UINT,UINT,UINT))param2;
      return 0;
   case MJPI_YOURNAME :
      return (UINT)TEXT("てすと");
   case MJPI_DESTROY :
      return 0;
   }
   return MJR_NOTCARED;
}
ファイル名 Test.def
LIBRARY Test

EXPORTS
    MJPInterfaceFunc
このプログラムをビルドするには、上記2つのファイルの他に、ヘッダファイル MIPIface.h が必要になります。
MIPIface.h ダウンロード

必要なファイルがそろったら、ビルドしてみましょう。Visual C++ を使用する場合は以下のようにします。

  1. DLL 作成用の空のプロジェクトを作成する。
  2. Test.c と Test.def をプロジェクトに追加する。
  3. ビルドする。

ビルドしてできた DLL は、「まうじゃん」に認識させると”てすと”という名前の対戦相手になります。内容は、「ツモ切り!」です。なにが来ようと「ツモ切り」です。WINDOWSプログラミングの経験のある方なら、だいたいどういうものか分かっていただけたと思います。

 

3 インスタンスの考え方

 ある程度プログラミングの経験のある方なら分かると思うのですが、オブジェクト指向においてはクラスとインスタンスという考え方が重要になります。対戦相手プラグインもこの考え方を使っています(と言うより、DLLの考え方がそうだから仕方ないんですよね)。ここまで読んで「なんだか難しそうだな」と思ってしまった方、そんなに身構えるほどのことではありません。要するに、対戦相手ごとに作業領域が必要だ、ということなのです。
 なぜそういうものが必要なのか? DLLのプログラムを組んだことのある方なら分かると思うのですが、DLLは複数のところで使われている場合でも、そのDLLのグローバル変数はすべてのところで共有されてしまうのです。たとえば、ある対戦相手プラグインを作って、その対戦相手同士を対戦させたとしましょう。もし、そのプラグインの内部データをグローバル変数に入れていたら、ある対戦相手が別の対戦相手の内部データを破壊してしまうことになります。そのため、グローバル変数を使わずに、内部データを保存するためのメモリ(=作業領域)が必要になります。

 「まうじゃん」では、各対戦相手のための作業領域を本体側で確保し、そこへのポインタをプラグインに送るという形をとっています。また、このポインタを用いて各対戦相手を区別しています。

 MJInterfaceFunc 関数および MJSendMessage 関数の第1引数(inst)は、このポインタを表します。このポインタを使って内部データにアクセスしたり、MJSendMessage 関数で「まうじゃん」本体に指示を出します。

 ただし、MJInterfaceFunc 関数を介して「まうじゃん」本体からメッセージが送られる場合、場合によっては第1引数(inst)に 0 (NULL) が指定されることがあります。これは、そのメッセージが個々のインスタンスに対するものではなく、クラス全体に対するものだということを表します。とは言っても、そういうメッセージは限られてますので、あまり深く考える必要は無いでしょう。どのようなメッセージがこれに当たるのかは、各メッセージを説明しながら書きます。

 このような仕様のため、言語としては C よりも C++ を使った方が楽です(クラスを扱えるから)。

 

4 決まりごと

4.1 MIPIface.h について

 対戦相手プラグインを作るには、MIPIface.h というヘッダファイルが必要です。

MIPIface.h ダウンロード

プログラムの先頭で、windows.h の後に #include してください。

#include <windows.h>
#include "MIPIface.h"

4.2 牌番号

 プログラムでは、牌を 0 から 33 の整数の値で表します。各牌と数の対応は以下の通りです。

番号 0 ・・・ 8 9 ・・・ 17 18 ・・・ 26 27 28 29 30 31 32 33
一萬 ・・・ 九萬 一筒 ・・・ 九筒 一索 ・・・ 九索 西
 

4.3 構造体

 対戦相手プラグインのインターフェースでは、手牌の状態を MJITehai という構造体で表します。この構造体は MIPIface.h で定義されており、その定義は以下のようになっています。

typedef struct {
        UINT tehai[14];
        UINT tehai_max;
        UINT minshun[4];
        UINT minshun_max;
        UINT minkou[4];
        UINT minkou_max;
        UINT minkan[4];
        UINT minkan_max;
        UINT ankan[4];
        UINT ankan_max;
        UINT reserved1;
        UINT reserved2;
} MJITehai;
メンバ変数の内容を以下に説明します。

tehai[14] : 鳴いたものやアンカン以外の、手の内にある手牌の状態を表します。ただしこの中にはツモ牌は含まれません。「まうじゃん」本体から手牌の状態を得る場合は昇順にソートされて渡されますが、プラグインから「まうじゃん」本体に渡す時はソートされている必要はありません。

tehai_max : tehai[14]の中に実際にあるデータの数。最大で13になります。

minshun[4] : ミンシュン(チーした順子)を表します。順子ですから連なった3つの牌から成っているわけですが、その内の一番小さいもの(たとえば、2,3,4の場合は2)の牌番号がこの値となります。

minshun_max : ミンシュンの数。

minkou[4], minkou_max : ミンコを表します。

minkan[4], minkan_max : ミンカンを表します。

ankan[4], ankan_max : アンカンを表します。

reserved1, reserved2 : 予約されています。

 

4.4 赤五ルールに伴う拡張(バージョン3以降)

 以前のバージョンでは「赤五」ルールのことを考えていませんでした。そのため、そのままでは赤五と普通の牌の区別ができません。

 「赤五」ルールに対応するためには、まず構造体タイプをタイプ1に変更します。それには後述のMJMI_SETSTRUCTTYPEメッセージを送ります。初期化の部分で送れば良いでしょう。

case MJPI_INITIALIZE :
        MJSendMessage = (UINT (WINAPI *)(LPVOID,UINT,UINT,UINT))param2;
        if (inst) if ((*MJSendMessage)(inst,MJMI_SETSTRUCTTYPE,1,0)==MJR_NOTCARED) return 1;
        return 0;
すると、そのプラグインが得られるあらゆる牌情報(手牌、捨て牌、ツモ牌)の牌番号には、赤に関する付加情報が入るようになります。具体的には、牌番号の第6ビットが、赤牌かそうでないかのフラグになります。つまり、赤五の牌番号は、
赤五萬 ・・・ 4 + 64 = 68
赤五筒 ・・・ 13 + 64 = 77
赤五索 ・・・ 22 + 64 = 86
になります。

また、手牌を表す構造体として、MJITehai 構造体の代わりに MJITehai1 構造体を用いることになります。

typedef struct {
        UINT tehai[14];
        UINT tehai_max;
        UINT minshun[4];
        UINT minshun_max;
        UINT minkou[4];
        UINT minkou_max;
        UINT minkan[4];
        UINT minkan_max;
        UINT ankan[4];
        UINT ankan_max;
        UINT minshun_hai[3][4];
        UINT minkou_hai[3][4];
        UINT minkan_hai[4][4];
        UINT ankan_hai[4][4];
        UINT reserved1;
        UINT reserved2;
} MJITehai1;
拡張されたメンバ変数について説明します。

minshun_hai[ j ][ i ] : minshun[ i ]の構成を表します。minshun_hai[0][ i ]は鳴いた牌の牌番号,minshun_hai[1][ i ], minshun_hai[2][ i ]は残りの2牌の牌番号です。

minkou_hai, minkan_hai, ankan_hai も同様です。

 

5 メッセージ

 メッセージには、「まうじゃん」本体からプラグインへ送られてくる(MJInterfaceFunc で受けることになる)MJPIメッセージと、プラグインから「まうじゃん」本体に送る(MJSendMessage で送る)MJMIメッセージがあります。ここではそれぞれについて説明します。

5.1 MJPIメッセージ

 「まうじゃん」本体からプラグインに送られてくるメッセージを MJPIメッセージと呼びます。MJPIメッセージに対しては、基本的に”無視”することができます(例外あり)。無視する場合は、MJR_NOTCARED を返します。この場合、「まうじゃん」本体が適当に処理してくれます。よって、プラグインでは応答したいメッセージに対するコードだけを書いて、あとは無視する、ということができます。ちなみに、MJPIメッセージに対する無効な戻り値は原則として無視されます。
 

MJPIメッセージ一覧
重要
メッセージ
内容
MJPI_CREATEINSTANCE 必要な作業領域を返す
MJPI_INITIALIZE インスタンス初期化
MJPI_YOURNAME 名前を返す
MJPI_DESTROY インスタンス破棄
MJPI_SUTEHAI 捨て牌
MJPI_ONACTION 他家のアクションへの対応
MJPI_STARTGAME 半荘(一荘)開始
MJPI_ENDGAME 半荘(一荘)終了
MJPI_STARTKYOKU 局の開始
MJPI_ENDKYOKU 局の終了
MJPI_BASHOGIME 場所決め
MJPI_ISEXCHANGEABLE 途中参加の可否
MJPI_ONEXCHANGE 途中参加

 では、メッセージを説明しましょう。

5.1.1 ちゃんとに応答すべきメッセージ

MJPI_CREATEINSTANCE

このメッセージはインスタンスに 0 (NULL) を指定して送られることがあります。

 必要な作業領域のサイズ(バイト数)を返してください。

戻り値 : インスタンス生成に必要なサイズ(バイト数)

無視した場合 : 0とみなされる

 

MJPI_INITIALIZE

このメッセージはインスタンスに 0 (NULL) を指定して送られることがあります。

 インスタンスを初期化する時に一回だけ送られてきます。MJSendMessage 関数へのポインタはこのときにのみ取得できます。

param2 : MJSendMessage 関数へのポインタ

戻り値 : 正常終了のときは0、それ以外のときは0以外

無視した場合 : 異常終了とみなされる

 

MJPI_YOURNAME

このメッセージはインスタンスに 0 (NULL) を指定して送られることがあります。

 対戦相手の名前を表す文字列へのポインタを返してください。文字列の終端はNULL文字(\0)である必要があります。また、名前は半角10文字(全角なら5文字)以下でなくてはなりません。

文字コードについて

 Windows 版「まうじゃん」では、文字コードに ASCII/シフトJIS コードを使用しています。それに対して WindowsCE 版「まうじゃん+」では、文字コードに UNICODE(UTF-16) を使用しています。どちらのプラットフォームにも対応できるよう、文字を扱う際は TCHAR 型と TEXT マクロを使用することをおすすめします。これらの型やマクロについては、Win32 プラットフォームSDK のドキュメント等をご覧ください。

戻り値 : 名前を表す文字列へのポインタ

例 :
return (UINT)TEXT("てすと");

無視した場合 : 適当な名前がつけられる

 

MJPI_DESTROY

このメッセージはインスタンスに 0 (NULL) を指定して送られることがあります。

 インスタンスを破壊する直前に送られます。必要な事後処理をおこなってください。

戻り値 : 正常終了のときは0、それ以外のときは0以外

無視した場合 : 異常終了とみなされる

 

MJPI_SUTEHAI

 捨て牌する状況のときに送られます。

LOWORD(param1) : 牌番号  今持ってきた牌 , それ以外 : つも牌は無い

戻り値 :

単に牌を捨てる場合 : MJPIR_SUTEHAI | x
リーチをかける場合 : MJPIR_REACH | x
ツモする場合 : MJPIR_TSUMO
流す場合 : MJPIR_NAGASHI
カンする場合 : MJPIR_KAN | hai_no

x : 手牌の左端からの番号(0〜13)。MJITehai 構造体の tehai メンバの添字に対応する。ツモ牌は右端にあると考え、常に13に当たる。
hai_no : 牌番号

"|"記号は論理和を表す。

無視した場合 : 適当な牌が捨てられます。

 

MJPI_ONACTION

 自分を含む誰かがアクションを起こした時に送られます。

LOWORD(param1) : アクションを起こした家(自分が0,下家が1,対面が2,上家が3)

HIWORD(param1) : アクションの対象となる家(自分が0,下家が1,対面が2,上家が3)

param2 : 起こしたアクション

捨て牌(リーチの場合を除く) : MJPIR_SUTEHAI | hai_no
捨て牌してリーチ : MJPIR_REACH | hai_no
ポン : MJPIR_PON | hai_no
チー(左端を鳴いた場合) : MJPIR_CHII1 | hai_no
チー(右端を鳴いた場合) : MJPIR_CHII2 | hai_no
チー(間を鳴いた場合) : MJPIR_CHII3 | hai_no
ミンカン : MJPIR_MINKAN | hai_no
アンカン : MJPIR_ANKAN | hai_no
ロン : MJPIR_RON | hai_no
ツモ : MJPIR_TSUMO
流し : MJPIR_NAGASHI

hai_no : 牌番号 , それぞれ下位8ビットを使用

戻り値 : 
何もしない : 0
ポン : MJPIR_PON | no_aka5_flag
チー(左端を鳴く場合) : MJPIR_CHII1 | no_aka5_flag
チー(右端を鳴く場合) : MJPIR_CHII2 | no_aka5_flag
チー(間を鳴く場合) : MJPIR_CHII3 | no_aka5_flag
カン : MJPIR_KAN
ロン : MJPIR_RON

no_aka5_flag : 赤五を優先させて順子(あるいは明刻)を作る場合は0,そうでない場合は1

無視した場合 : 何もしません。

 

5.1.2 それほど重要でないメッセージ

MJPI_STARTGAME

 半荘(一荘)開始時に送られます。

戻り値 : 0を返してください。

無視した場合 : 0を返したと見なされます。

 

MJPI_ENDGAME

 半荘(一荘)終了時に送られます。

LOWORD(param1) : 順位(0〜3)

(int)param2 : 点数

戻り値 : 0を返してください。

無視した場合 : 0を返したと見なされます。

 

MJPI_STARTKYOKU

 局が開始されるときに送られます。

LOWORD(param1) : 局(0 : 東一局,1 : 東二局,・・・,4 : 南一局,・・・,7 : 南四局,8 : 西一局,・・・,11 : 西四局,12 : 北一局,・・・,15: 北四局)

LOWORD(param2) : 自分の家(0 : 東,1 : 南,2 : 西,3 : 北)

戻り値 : 0を返してください。

無視した場合 : 0を返したと見なされます。

 

MJPI_ENDKYOKU

 局が終了するときに送られます。

param1 : 局が終了した理由。以下のうちのどれか。

MJEK_AGARI : 誰かが和がった
MJEK_RYUKYOKU : 流局
MJEK_CHONBO : チョンボ
(LONG*)param2 : 点数の変化をあらわす LONG [4] へのポインタ。この配列の値はそれぞれ自分、下家、対面、上家の点数の変化分をあらわす。

戻り値 : 0を返してください。

無視した場合 : 0を返したと見なされます。

 

MJPI_BASHOGIME

 場所決めのときに送られます。

(UINT*)param1 : nokoriへのポインタ

UINT nokori[4]

場所決めに使う4つの牌の現在の状態を表します。
左端の牌が nokori[0],右端の牌が nokori[3]に対応します。
値が4以上の牌が、まだ残っているものです。

戻り値 : 取る牌のインデックス(0〜3)を返してください。

無視した場合 : 適当に取ってくれます。
 
 

MJPI_ISEXCHANGEABLE

このメッセージはインスタンスに 0 (NULL) を指定して送られることがあります。

 このプラグインが途中参加に対応しているかどうかを判断するために送られます。途中参加に対応するには、このメッセージに対して 0 を返す必要があります。途中参加可能なプラグインには、途中参加する際に MJPI_ONEXCHANGE メッセージが送られます。

戻り値 : 途中参加に対応するプラグインは 0,そうでないプラグインは0以外

無視した場合 : 途中参加に対応していないとみなされる
 
 

MJPI_ONEXCHANGE

 途中参加するときに一度だけ送られます。内部データのセット等、必要な処理をおこなってください。
 MJPI_ISEXCHANGEABLEに0以外を返したプラグイン(途中参加に対応していないプラグイン)には、このメッセージは送られません。

LOWORD(param1) : 現在の状態を表す。以下のうちのどれか。

MJST_INKYOKU : 局の中
LOWORD(param2) : 局(0 : 東一局,1 : 東二局,・・・,4 : 南一局,・・・,7 : 南四局,8 : 西一局,・・・,11 : 西四局,12 : 北一局,・・・,15: 北四局)
HIWORD(param2) : 自分の家(0 : 東,1 : 南,2 : 西,3 : 北)
MJST_BASHOGIME : 場所決め中
戻り値 : 正常終了のときは0、それ以外のときは0以外

無視した場合 : 異常終了したとみなされる

 

5.2 MJMIメッセージ

 プラグインが情報取得などの目的で「まうじゃん」本体に送るメッセージを MJMIメッセージと呼びます。これらのメッセージは、前述の MJSendMessage関数を用いて送ります。なお、MJMIメッセージとともに送られる無効なデータは原則として無視されます。
 

MJMIメッセージ一覧
メッセージ
内容
MJMI_GETTEHAI 手牌の取得
MJMI_GETMACHI 待ち牌の取得
MJMI_GETAGARITEN あがり点の取得
MJMI_GETKAWA 河の取得
MJMI_GETKAWAEX 河の取得・拡張版
MJMI_GETDORA ドラの取得
MJMI_GETSCORE 点数の取得
MJMI_GETKYOKU 現在の局の取得
MJMI_GETHONBA 現在何本場かを取得
MJMI_GETREACHBOU 現在場に出ているリーチ棒の数を取得
MJMI_GETHAIREMAIN 残りの山牌数を取得
MJMI_GETVISIBLEHAIS 任意の牌の場に見えている数を取得
MJMI_ANKANABILITY 暗槓、加槓可能な牌の取得
MJMI_KKHAIABILITY 九種九牌かどうかのチェック
MJMI_SSPUTOABILITY 十三不塔かどうかのチェック
MJMI_LASTTSUMOGIRI 最後に捨てた牌がツモ切りかどうかの取得
MJMI_GETRULE ルールの取得
MJMI_SETSTRUCTTYPE 構造体タイプの設定
MJMI_FUKIDASHI 吹き出しを出す
MJMI_SETAUTOFUKIDASHI 自動吹き出しの設定
MJMI_GETWAREME 現在の割れ目を取得
MJMI_GETVERSION インターフェースのバージョンを取得

以下に MJMIメッセージの説明をします。

 

MJMI_GETTEHAI

 自分の手牌を得ます。また、対象のプレイヤーの手牌も、見えている部分(ミンツやアンカン)だけ得られます。

param1 : 対象のプレイヤー(自分が0,下家が1,対面が2,上家が3)

(MJITehai*) param2 : データを受け取るためのバッファへのポインタ。データは MJITehai構造体です。

戻り値 : 成功した場合は1,失敗した場合は0を返します。

 

MJMI_GETMACHI

 任意の手牌の待ち牌(当たり牌)を得ます。

(MJITehai*) param1 : 手牌へのポインタ。ただし、0を指定すると現在の自分の手牌を指定したことになる。

(UINT*) param2 : 待ち牌のデータを受け取るためのバッファへのポインタ。このバッファは UINT型の配列で、その大きさ(添字)は34以上である必要があり、インデックスが牌番号に対応して、当たり牌の値は0以外に、そうでない牌の値は0になる。

戻り値 : てんぱっている場合は1,そうでない場合は0を返します。

 

MJMI_GETAGARITEN

 任意の手牌を任意の牌であがったときの点数を得ます。ただし、裏ドラは考慮されません。

(MJITehai*) param1 : 手牌へのポインタ。ただし、0を指定すると現在の自分の手牌を指定したことになる。

param2 : あがり牌の牌番号

戻り値 : あがった時の点数

 

MJMI_GETKAWA

 任意のプレイヤーの河の状態を得ます。

LOWORD(param1) : 対象のプレイヤー(自分が0,下家が1,対面が2,上家が3)

(UINT*) param2 : データを得るためのバッファへのポインタ。データは UINT型の配列で、捨てられた牌が順に牌番号の形で得られます。

HIWORD(param1) : バッファの大きさ。UINT配列の大きさ(添字)を与えます。

戻り値 : データの大きさが返されます。

 

MJMI_GETKAWAEX

 任意のプレイヤーの河の状態を得ます。このメッセージはMJMI_GETKAWAの拡張版です。

LOWORD(param1) : 対象のプレイヤー(自分が0,下家が1,対面が2,上家が3)

(MJIKawahai*) param2 : データを得るためのバッファへのポインタ。データは MJIKawahai型の配列で、捨てられた牌が順に牌番号の形で得られます。MJIKawahai 構造体は以下のように定義されています。

typedef struct {
    USHORT hai;
    USHORT state;
} MJIKawahai;

hai : 牌番号
state : その牌の状態。以下の定数の論理和になります。

MJKS_REACH : リーチ宣言牌
MJKS_NAKI : 他家に副露された牌


HIWORD(param1) : バッファの大きさ。MJIKawahai配列の大きさ(添字)を与えます。

戻り値 : データの大きさが返されます。

 

MJMI_GETDORA

 ドラは何かを取得します。

(UINT*) param1 : データを得るためのバッファへのポインタ。データは UINT型の配列で、牌番号の形で得られます。バッファの大きさは UINT型5個分(20バイト)以上とってください。

param2 : 0 にしてください。

戻り値 : ドラの数

 

MJMI_GETSCORE

 任意のプレイヤーの現在の点数を得ます。

param1 : 対象のプレイヤー(自分が0,下家が1,対面が2,上家が3)

param2 : 0 にしてください。

戻り値 : 点数
 

 
MJMI_GETKYOKU

 現在の局を得ます。

param1 : 0 にしてください。

param2 : 0 にしてください。

戻り値 : 局((0 : 東一局,1 : 東二局,・・・,4 : 南一局,・・・,7 : 南四局,8 : 西一局,・・・,11 : 西四局,12 : 北一局,・・・,15: 北四局))
 
 

MJMI_GETHONBA

 現在何本場かを得ます。

param1 : 0 にしてください。

param2 : 0 にしてください。

戻り値 : 本数

 

MJMI_GETREACHBOU

 現在場に出ているリーチ棒の数を得ます。

param1 : 0 にしてください。

param2 : 0 にしてください。

戻り値 : リーチ棒の数

 

MJMI_GETHAIREMAIN

 山に残されている牌(王牌を除く)の数を得ます。

param1 : 0 にしてください。

param2 : 0 にしてください。

戻り値 : 山に残されている牌(王牌を除く)の数

 

MJMI_GETVISIBLEHAIS

 任意の牌がいくつ場に見えているかを得ます。

param1 : 牌の牌番号

param2 : 0 にしてください。

戻り値 : 場に見えている数

 

MJMI_ANKANABILITY

 暗槓、あるいは加槓できる牌を列挙します。

(USHORT*)param1 : 配列 USHORT[3] へのポインタを指定してください。この配列には、暗槓、あるいは加槓可能な牌の牌番号が返されます。

param2 : 0 にすると槓可能な牌すべてが列挙されます。1 を指定するとチョンボチェックが行われ、チョンボになる可能性のある槓は列挙されません。

戻り値 : 槓できる牌の数

例 : たとえば三萬と一策が槓可能な状態でこのメッセージを送ると、戻り値に 2 が返され、 ((USHORT*)param1)[0] に 2 が、 ((USHORT*)param1)[1] に 18 がセットされる。
 
 

MJMI_KKHAIABILITY

 九種九牌で流せるかどうかを調べます。

param1 : 0 にしてください。

param2 : 0 にしてください。

戻り値 : 流せない場合は0、流せる場合は非0

 

MJMI_SSPUTOABILITY

 十三不塔であがれるかどうかを調べます。

param1 : 0 にしてください。

param2 : 0 にしてください。

戻り値 : あがれない場合は0、あがれる場合は非0
 
 

MJMI_LASTTSUMOGIRI

 最後に捨てられた牌がツモ切りかどうかを得ます。

param1 : 0 にしてください。

param2 : 0 にしてください。

戻り値 : ツモ切りの場合は1、そうでない場合は0
 
 

MJMI_GETRULE

 現在のルールを得ます。

param1 : 得たいルールの種類を以下の中から指定します。

 
 
param1 内容 戻り値
MJRL_KUITAN 喰い断の有無 0:無し,1:有り
MJRL_KANSAKI 完全先付けの有無 0:無し,1:有り
MJRL_PAO 包(パオ)の有無 0:無し,1:有り
MJRL_RON 複数ロンの扱い 0:頭ハネ,1:ダブロンまで有り,2:トリプル有り
MJRL_MOCHITEN 持ち点 持ち点
MJRL_BUTTOBI ぶっとびの有無 0:無し,1:有り
MJRL_WAREME 割れ目の有無 0:無し,1:有り
MJRL_AKA5 赤五の有無 0:無し,1:有り
MJRL_AKA5S 各赤五牌の数 bit0-3:赤五萬,bit4-7:赤五筒,bit8-11:赤五索の数
MJRL_SHANYU 西入の条件 0:西入無し,1:無条件で西入,2:下の欄参照
MJRL_SHANYU_SCORE 西入条件が2の場合 トップの点数がこの値未満だと西入
MJRL_NANNYU 南入の条件 0:南入無し,1:無条件で南入,2:下の欄参照
MJRL_NANNYU_SCORE 南入条件が2の場合 トップの点数がこの値未満だと南入
MJRL_KUINAOSHI 食い直しの許可/禁止 0:禁止,1:許可
MJRL_URADORA 裏ドラ・カン裏の有無 0:無し,1:有り(カン裏は無し),2:カン裏も有り
MJRL_SCORE0REACH 持ち点が900点以下でのリーチ 0:不可,1:可能
MJRL_RYANSHIBA 二翻縛りの有無 0:無し,1:有り
MJRL_DORAPLUS ドラとドラ表示牌の関係 0:ドラはドラ表示牌と同じ,1:ドラはドラ表示牌の次の牌
MJRL_FURITENREACH フリテンリーチの可否 bit0:流局時,bit1:ツモ時
各ビットが 0:フリテンリーチはチョンボ,1:チョンボにならない
MJRL_KARATEN カラテンの扱い 0:ノーテン扱い,1:テンパイ扱い
MJRL_PINZUMO ピンヅモの有無 0:無し,1:有り
MJRL_NOTENOYANAGARE ノーテン親流れの有無 bit0:東場,bit1:南場,bit2:西場,bit3:北場
各ビットが 0:無し,1:有り
MJRL_KANINREACH リーチ後のカンの許可/禁止 0:禁止,1:待ち不変で可,2:構成不変で可
MJRL_TOPOYAAGARIEND オーラストップ親和がし終了 0:連荘,1:終了
MJRL_77MANGAN 30符4翻を満貫とするか 0:満貫としない,1:満貫とする
MJRL_DBLRONCHONBO 正当な和了がある場合のチョンボの扱い 0:チョンボは無効,1:チョンボは有効
param2 : 0 にしてください。

戻り値 : 上記の表を参照してください。ただし、指定のルールがサポートされていない場合は MJR_NOTCARED が返されます。
 
 

MJMI_SETSTRUCTTYPE

 「まうじゃん」本体とプラグインの間で交わされるデータのタイプ(構造体タイプ)を変更します。構造体タイプの種別は整数の値で表され、タイプ0,タイプ1,・・・ のように表します。デフォルトの構造体タイプはタイプ0です。

param1 : 構造体タイプ番号

papam2 : 0 にしてください。

戻り値 : 成功した場合は変更前の構造体タイプ番号、失敗した場合は MJR_NOTCARED が返されます。

 

MJMI_FUKIDASHI

 吹き出しを表示します。表示された吹き出しは、一定時間経つと消えます。

文字コードについて

 Windows 版「まうじゃん」では、文字コードに ASCII/シフトJIS コードを使用しています。それに対して WindowsCE 版「まうじゃん+」では、文字コードに UNICODE(UTF-16) を使用しています。どちらのプラットフォームにも対応できるよう、文字を扱う際は TCHAR 型と TEXT マクロを使用することをおすすめします。これらの型やマクロについては、Win32 プラットフォームSDK のドキュメント等をご覧ください。

(TCHAR*) param1 : 吹き出しの中に表示させる文字列へのポインタ。文字列の終端はNULL文字('\0')です。文字列はあまり長くしないでください。

param2 : 0 にしてください。

戻り値 : 成功した場合は1、失敗した場合は0が返されます。

 

MJMI_SETAUTOFUKIDASHI

 「ポン」、「ロン」、「ツモ」など、アクションを起こしたときに自動的に表示される吹き出しのスイッチです。デフォルトでは「表示する」になっています。

param1 : 吹き出しを自動的に表示するには 1、表示しないようにするには 0 にします。

param2 : 0 にしてください。

戻り値 : 変更する前の状態を返します。

 

MJMI_GETWAREME

 現在の割れ目が誰なのかを得ます。

param1 : 0 にしてください。

param2 : 0 にしてください。

戻り値 : 割れ目(自分が0,下家が1,対面が2,上家が3)

 

MJMI_GETVERSION

 対戦相手プラグインのインターフェースのバージョン(と言うよりリビジョン)の番号を得ます。バージョン番号は正の整数で、新しいバージョンほど大きくなります。なお、現在のバージョンは 12です。

param1 : 0 にしてください。

param2 : 0 にしてください。

戻り値 : バージョン番号

 

6 プログラム例

 プログラミング例として、テスト用プラグイン「てぃると」のソースを公開します。ちょっと読みにくいかもしれませんが、利用してください。

「てぃると」ソース(2003/08/15) ダウンロード

7 その他

 あなたが作成したプラグインの著作権は、当然ながらあなたに属します。ですからそのプラグインをどうしようと、基本的にあなたの自由です。ですが、新しいプラグインができたら、できれば私(作者)に連絡してください(強制ではありません)。


これを書いた人 : 石畑 恭平

E-mail : ishihata@amy.hi-ho.ne.jp