MJRフォーマットとは闘牌を記録するための標準規格案です。
標準規格とは言っても、(平成11年3月現在)これを採用しているソフトウェアやゲーム/通信対戦/各種配布メディア/データベース等は存在しません。
牌譜の記録が標準化されることで、多くの大会の記録や通信対戦がデータベース化され、クイズの形式や雑誌での読み物が多様化し、戦略戦術を討議する場面でのリアリティが増し、ひいては「鑑る競技」「魅せる競技」として、麻雀というゲームが発展したらこれはとても素敵なことだなと思い、ここに一つのフォーマットを定義してみました。
な〜んて講釈タレてみたところで、誰も賛同してくれなかったら、それだけの話です。 このMJRフォーマットそのものが陽の目を見なくとも、これが契機になって、いつか誰かが、あるいはどこかの団体/出版社が、素敵な形に仕上げてくれたらかなり嬉しいです。
このページは、[放言]『電脳技術でパオ』を読んで、ツッコミを入れてくれた方々のおかげで完成しました。感謝します。

MJRフォーマット

$1:目的と目標と方針

牌譜(=闘牌の進行を記録する方式)を標準化することによっていろんな素敵な環境が生まれるに違いない。
麻雀が大好きな人達が過去の対戦や遠隔地での対戦を手軽に追体験できたり、様々な大会での記録が利活用可能な形でデータベース化されたり、多くの出版物やゲームソフトなんかも出てくるかも知れない。 そして、競技技術が向上するだけでなく、『魅せる競技』『鑑賞する競技』としても麻雀がもっともっと広く認められるようになると素敵だ。
こんなことを考えて標準化案『MJR』フォーマットを考えました。
取りあえずは、ネットによる対戦の成績や、採譜ソフトや、シミュレーションソフト等が対応してくれるととても嬉しい。
それと、批評やクイズ問題等で臨場感を高めることができたらイイと考えます。
『MJR』フォーマットは、誰もがどのようにでも使えます。
ソフトウェアに組み込んだり、出版したり、他者に紹介することは全て自由です。
改変、定義機能の追加等も自由にできます。
『MJR』フォーマットに対応したソフトウェアや出版物等が、独自の権利に基づいて価格を設定することそれ事体には何の制限もありません。その場合であっても、『MJR』フォーマットの著作者はいかなる報酬も要求しないと同時に、何の保証もせず、また責任も負いません。
『MJR』フォーマットは次に掲げるモノに採用されることを期待して定義されます。

これ以外にも多くの用途があります。

$2:ファイルの概略

MJRは基本的にはテキスト形式の可読なファイルです。
通信上、あるいはデータベース格納上、また隠蔽の目的の為に、テキストを圧縮/アーカイブ/エンコード/暗号化することは自由であり、その手法そのものは独自の形式としては定義しません。

ファイルは、牌譜を定義する行とコメント行とで構成されます。
定義行は必ず "$" で始まるタグが先頭にあり、その他の行はすべてコメント行で、MJRを解釈するアナライザはコメント行を無視します。

MJRは二つに大別され、一つは『半荘』等のゲームの一区切りの進行を記述するもので、もう一つは局の進行を記述するものです。
ゲームの区切りの進行を記述するMJRを『荘MJR』と呼び、局の進行を記述するMJRを『局MJR』と呼びます。

『荘MJR』で記述される要素の代表的なものは、対戦が行われた時と場所や対戦者の名称や、各局での点数の授受等です。
『局MJR』で記述される要素の代表的なものは、一局の中での各人の配牌や自摸牌、捨牌、リーチ等のアクションです。
『荘MJR』で定義されるすべての情報は、『局MJR』でも定義が可能です。 『局MJR』でのみ実際の牌の去就を定義できますが、『荘MJR』でのみ半荘全体の点数の動きなどを定義できます。

『荘MJR』も『局MJR』もそれぞれが独立したファイルで、単独でもデータとしては有効ですが、『荘MJR』の一部には詳細な記述として『局MJR』へのポインタを定義することができます。
一つの『荘MJR』と、その中に定義される複数の『局MJR』とで、半荘が完全に再現できます。

$3:タグの基本

すべてのタグは、行の先頭で定義され、記号 "$" で始まります。
あるタグに対応するオペランドは、タグと同じ行にタグのすぐ後に定義されます。 一つのタグに対応するオペランドは、記号 "(" と ")" とで囲まれ、複数の要素を持つ場合には、記号 "/" で区切られます。
またタグの定義は基本的には一行内で完結しなければなりません(特別なタグの使用により複数行に定義することは可能。後述)。

一行に、複数のタグを定義することは可能です。

すべてのタグとオペランドの一部は、1バイト英文字と記号の列で表現され、大文字小文字の別を問いません。

『荘MJR』で使用可能なタグのほとんどは『局MJR』でも同様に使用できますが、同じ意味で使われた場合には『局MJR』のタグが優先されます。 複数の『局MJR』でも同じ意味で同一のタグが使用された場合には、後の『局MJR』が有効です。

アナライザが理解できないタグがあっても、それを無視して問題なく動作します。 逆に、そのようにアナライザは作成されなければなりません。

$4:タグの説明1−共通タグ

この章で述べられるタグは、『荘MJR』でも『局MJR』でも使用されます。

タグ説明
・例a
・例b
$CHARSET(?) このMJRで表現される日本語2バイト文字のコード体系です。
取り得るオペランドは、"EUC"、"JIS"、"XJIS"のいづれかです。 この定義がなければ、シフトJISコードとみなされます。
・$CHARSET(XJIS)
$VERSION(?) このフォーマットのバージョンです。
必ず "1" と表記します。
・$VERSION(1)
$DATE(?/?/?) このMJRで記述されるゲームが行われた日付けです。
"year/month/day"の順に表現します。 年月日のいずれかが未定義でも構いません。
これはゲームが実施された日付けであり、MJRが記述された日付けではありません。
・$DATE(1999/02/03)
・$DATE(2001/1/)
・$DATE(1997//)
$RULE(?) このMJRで記述されるゲームのルールです。
任意の文字列で簡潔に表現します。
推奨は、12文字(24バイト)以下の文字列です。
・$RULE(ナシナシ、北海道の5人打)
・$RULE(関東式極悪サンマ)
$PLAYERS(?/?/?/?) 競技者の名前です。
定義する順番は、後述のいくつかのタグと対応していなければいけません。
サンマを四人でやる場合には、四人分の名前を定義します。
推奨は、一人の名前が8文字(16バイト)以下の文字列です。
・$PLAYERS(阿佐田/小島/古川/田村)
・$PLAYERS(天貴志/原田) ・・二人麻雀らしい
・$PLAYERS(百貫雀///) ・・他の三人の名は不明
$PLAYERSACT(?/?/?/?) 競技者がゲームの途中で交替する場合に使用します。
要素の順番は、前に定義された「$PLAYERS」タグと対応していなければいけません。
・$PLAYERSACT(//畑/) ・・三番目が "畑" と交替
$POINT(?/?/?/?/?) この定義がなされた時点での得点を表現します。
「$PLAYERS」タグよりも、1項目よけいにあり、供託得点を表します。 オペランドの右辺の書式は、絶対得点もしくは、相対得点を表します。
下の三つの例は(その前が全員 "25000" 持ちならば)全て同じ状況です。
・$POINT(25000/28900/25000/21100/0)
・$POINT(/28900//21100/)
・$POINT(/+3900//-3900/)
$POINTSTT(?/?/?/?) 開始時の得点です。
『荘MJR』内で使われる場合には、開荘時の持ち点を表します。
『局MJR』内で使われる場合には、開局時の持ち点を表します。
『局MJR』内で使われる場合に供託点があれば、一項目増えます。
このタグは、ファイル内に一度しか使用してはいけません。
得点の記述は絶対得点でなければいけません。
下の例は東の一局で二人聴牌/一人立直が流局したようです。
・$POINTSTT(23500/25500/26500/23500/1000)
$POINTEND(?/?/?/?) 終了時の得点です。
『荘MJR』内で使われる場合には、ゲーム終了時の持ち点を表します。
『局MJR』内で使われる場合には、終局時の持ち点を表します。
『局MJR』内で使われる場合に供託点があれば、一項目増えます。
このタグは、ファイル内に一度しか使用してはいけません。
得点の記述は絶対得点でなければいけません。
下の例は東の一局で二人聴牌/一人立直が流局したようです。
・$POINTEND(23500/25500/26500/23500/1000)
$STATE(?/?/?) 場、局、本場をそれぞれ数値で表します。
東場は "1"、南場は "2" です。
・$STATE(2/4/0) ・・南場四局平場
・$STATE(3/1/15) ・・西場一局15本場
$RONFIG(?) アガリの役名を任意の文字列で表現します。
・$RONFIG(メンタンピン、ドラ1)
・$RONFIG(立直一発搶槓国士無双)
$$(?=?/?=?/...) トークンの置換定義です。
各種のタグ以前に使用することにより、以降の定義を簡略化できます。
ただし次の文字は、置換前後の文字列内の一部としては使用できません。
"(", ")", "/", "=", "-", "+", " ", "?", "*", "$", "&", ":", "!",
及び、その他の可読でない1バイト文字(BEEP,TAB,CR,LF等)
下に掲げる二つの例は同じ内容を表します。
・$PLAYERS(阿佐田/小島/古川/田村)
 $PLAYERSACT(//畑/)
・$$(tetsu=阿佐田哲也/takeo=小島武夫/mutsu=畑正憲)
 $PLAYERS($tetsu/$takeo/古川剴章/田村光昭)
 $PLAYERSACT(//$mutsu/)
$& 一つのタグの定義が複数行にまたがる場合に使用します。
下に掲げる二つの例は同じ内容を表します。
・$PLAYERS(神様/ミスター/古川/田村)
・$PLAYERS(神様/ミスター/
 $&古川/田村)

$5:タグの説明2−『荘MJR』でのみ使用可能なタグ

この章で述べられるタグは、『局MJR』では使用できません。

タグ説明
・例a
・例b
$MJR(?) 直前に定義された「$STATE」タグの局の牌符ファイルを指示します。
ここでは、『局MJR』ファイルのファイル名が記述されます。
この定義以前に「$STATE」タグを定義することを推奨します。
・$STATE(2:4:0)
 $MJR(PAIFU204.MJR)
  ・・南場四局平場の闘牌は「PAIFU204.MJR」に定義されてる

$6:タグの説明3−『局MJR』でのみ使用可能な一般的なタグ

実際の闘牌を定義するのに十分な定義です。
この章で述べられるタグは、『荘MJR』では使用できません。

タグ説明
・例a
・例b
$DRA(?)
$DRA-KAN(?)
$DRA-URA(?)
ドラを表します。
もし、通常のドラを最初から2つ用意するような場合には "/" を使います。
・$DRA(m3)
・$DRA-URA(p5r)
$PAI-01E(?/?/?/?/?/?/?/?/?/?/?/?/?/?)
$PAI-00S(?/?/?/?/?/?/?/?/?/?/?/?/?)
$PAI-00W(?/?/?/?/?/?/?/?/?/?/?/?/?)
$PAI-00N(?/?/?/?/?/?/?/?/?/?/?/?/?)
配牌を表します。
「$PAI-00E」が東家の配牌を、他はそれぞれ南家、西家、北家の配牌です。 (牌の表記は別章)
必ずしも全員の配牌が定義される必要はありません。
注意:東家の配牌は「PAI-01」ですが、他家は「PAI-00」です。
下の例は、親が国士無双を天和する場面です。
・$PAI-00E(we/ws/ww/wn/dw/dg/dc/m1/m9/p1/p9/s1/s9/dwr!)
$GET-02E(?/?/?/....)
$GET-01S(?/?/?/....)
$GET-01W(?/?/?/....)
$GET-01N(?/?/?/....)
取得した牌の列を表します。
通常のツモ牌の場合は、配牌と同様に記述します。
他家の捨て牌から取得した場合は、"P:", "K:", "1:", "2:", "3:" 等の後に記述します。 "P:"は「ポン」を、"K:"は「大明槓」を、 "1:", "2:", "3:"は「チイ」をそれぞれ表します。
嶺上牌からのツモ牌は、取得牌の後に "-" を付しその後に記述します。
巡目が飛ばされた場合には、"//" のように、何も記述しません。
和了りの場合は、"!" を付します。
注意:東家の取得牌は「GET-02」ですが、他家は「GET-01」です。
下の例aは、東家が第一打に「一萬」を捨て、「白」を明槓して、嶺上から「發」をツモって更に槓して、「中」をツモって和了った場面です。
例bは、南家が十三ヤオ九牌を順番にツモってきた状況です。
・$GET-02E(m1/K:dw-dg-dc!)
・$GET-01S(we/ws/ww/wn/dw/dg/dc/m1/m9/p1/p9/s1/s9)
$TRW-02E(?/?/?/....)
$TRW-01S(?/?/?/....)
$TRW-01W(?/?/?/....)
$TRW-01N(?/?/?/....)
捨牌の列を表します。
立直宣言牌には、牌の後に "-" を追記します。
ツモ切りの場合には "." で、代用できます。
巡目が飛ばされた場合には、"//" のように、何も記述しません。
捨牌が他家への放縦の場合には、牌の後に "!" を追加します。
注意:東家の取得牌は「TRW-02」ですが、他家は「TRW-01」です。
次の例は、西家が赤五筒を切ってダブルリーチをかけた後で、面子がカブッてしまい、最後には、五筒が放縦牌となってしまった状況です。
・$TRW-01W(p5r-/p3/p4/p5/p5!)

$7:タグの説明4−『局MJR』でのみ使用可能な特殊なタグ

この章では、ある場面での闘牌を定義する方法を紹介します。
この章で述べられるタグは、『荘MJR』では使用できません。

タグ説明
・例a
・例b
$PAI-99E(?/?/?/....)
$PAI-99S(?/?/?/....)
$PAI-99W(?/?/?/....)
$PAI-99N(?/?/?/....)
"99" の部分は任意の数字列で、巡目を表します。
「$PAI-11W」とは、11巡目を完了した時点での西家の手牌を表します。
牌の数は13枚でも14枚でも構いません。もっと少なくとも構いません。
$GET-99E(?/?/?/....)
$GET-99S(?/?/?/....)
$GET-99W(?/?/?/....)
$GET-99N(?/?/?/....)
"99" の部分は任意の数字列で、巡目を表します。
「$GET-11N」で定義されるツモ牌列は、11巡目以降のツモ牌という意味です。
$GET-E(?)
$GET-S(?)
$GET-W(?)
$GET-N(?)
それ以前に記述された「$GET」タグの次の巡目のツモ牌です。
$TRW-99E(?/?/?/....)
$TRW-99S(?/?/?/....)
$TRW-99W(?/?/?/....)
$TRW-99N(?/?/?/....)
"99" の部分は任意の数字列で、巡目を表します。
「$TRW-12N」で定義される捨牌列は、12巡目以降の捨牌という意味です。
・$TRW-08N(m8/p5)
  ・・北家が8巡目に八萬を捨て、9巡目に五筒を捨てた
・$TRW-18S(dg!)
  ・・南家が18巡目に發を捨てて放銃した
$TRW-E(?)
$TRW-S(?)
$TRW-W(?)
$TRW-N(?)
それ以前に記述された「$TRW」タグの次の巡目の捨牌です。
$99E(?/?)
$99S(?/?)
$99W(?/?)
$99N(?/?)
"99" の部分は任意の数字列で、巡目を表します。
2つの牌の定義により、ある巡目のツモ牌と捨牌とを表します。
他者の捨牌から牌を取得した表記(前半)は、「$GET」タグと同様です。
捨牌に関する表記(後半)は、「$TRW」タグと同様です。
次の例は、東家の三巡目のツモは何なのかわからないが、 9筒を捨てた、ということを表します。
・$03E(?/p9)

$8:牌の表記

萬子:m1,m2,...m9
索子:s1,s2,...s9
筒子:p1,p2,...p9
東南西北/白發中:we,ws,ww,wn/dw,dg,dc
赤牌:p5r,m5r など
青牌:p5b,m5b など
白ポッチ:dwr

MJRに関するFAQ

Q:何故、こんなに複雑なのですか?

Q:もっと読みやすい形にできませんか?

Q:小明槓の時はどのように記述するのですか?

Q:暗槓の表記はどうですか?

Q:『チイ』の数字の意味は何ですか?

Q:『荘MJR』なんてあるのは何故ですか?

Q:タグの種類が多すぎます。少なくなりませんか?

Q:「$RULE」タグの目的は何ですか?

Q:「$RONFIG」の引数が文字列なのは何故ですか?

Q:「$POINTSTT」と「$POINTEND」は不要なのではないですか?

Q:ポンが入った場合の巡目はどのように決めるのですか?

Q:フェアリー麻雀にも対応していますか?

Q:『ツモ牌が不明』という例の意味は何ですか?

Q:サンプルファイルはありますか?