Copyright (c) 2008-2013, 2019-2021 MihailJP
MiHaJongでは、バージョン1.7より、AIの思考ルーチンをLuaスクリプトで書くことができます。 この文書では、MiHaJong用に追加された要素を説明しています。 Lua言語の基本的なことは、別途Lua言語のリファレンスマニュアルなどをご覧ください。
Vista 以降をお使いの場合で C:\Program Files 以下にインストールした場合、 AIスクリプトファイルはは C:\Users\(ユーザー名)\AppData\Roaming\MiHaJong\ai に置かれます。 そうでない場合、インストール先のフォルダーに ai というサブフォルダーがありますのでそこにスクリプトを置きます。
半荘を始めるときに規定のフォルダーから *.lua ファイルが検索され、 見つかったスクリプトファイルの中からランダムに選択されてロードされます。
MiHaJongでは、基本ライブラリ(コルーチンライブラリを含む)のみがオープンさ れています。
MiHaJongで使用するLuaスクリプトでは、次の関数をグローバル環境に定義しなければなりません。 定義されていない場合、そのスクリプトを無効とみなしツモ切りを行います。
ontsumo(gametbl)
ツモ番になるごとに、(山から1枚自摸った状態で)この関数が呼ばれます。この関数は引数を1つ取り、2つの値を返します。
引数 gametbl
は、卓の情報を示すテーブルで、軽量ユーザーデータとメソッドが格納されています。
1番目の返り値は、捨て牌の付帯情報(暗槓する、リーチする……)を表す番号です。
これについては、後述する mihajong.DiscardType
を参照してください。
2番目の返り値は、手牌の番号を表すインデックスで、1から14で指定します。 14を指定すると、ツモ切りしたことになります(副露してもこれは変わりません)。 存在しない牌のインデックスを指定した場合、多牌でアガリ放棄となります。
なお、1番目の返り値に mihajong.DiscardType.Agari
か mihajong.DiscardType.Kyuushu
を指定した場合
捨牌が不要ですので、この場合は2番目の返り値を nil
にしてもかまいません。
ondiscard(gametbl)
誰かの打牌があるごとに、この関数が呼ばれます。この関数は引数を1つ取り、1つの値を返します。
引数 gametbl
は、卓の情報を示すテーブルで、軽量ユーザーデータとメソッドが格納されています。
返り値は鳴きの種類を表す番号です。これについては、後述する mihajong.Call
を参照してください。
MiHaJongで使用するLuaスクリプトでは、前述した必須の関数のほか、次の関数が呼ばれることがあります。 定義されていない場合、何もしなかったものとみなされます(スクリプト自体が無効とみなされたりはしません)。
onkakan(gametbl)
誰かの加槓があると、この関数が呼ばれます。引数・返り値は ondiscard
と同様です。
この関数は、槍槓を和了るために定義されています。
onankan(gametbl)
誰かの暗槓があると、この関数が呼ばれます。引数・返り値は ondiscard
と同様です。
この関数は、国士無双を槍槓で和了るために定義されています。
init(gametbl)
局が開始され、ephemeral
テーブル(後述)が初期化されると呼ばれます。
引数はontsumo
やondiscard
と同様です。戻り値はありません。
ephemeral
テーブルにサブテーブルが必要な場合などは、この関数内で初期化を行なってください。
MiHaJongで使用するLuaスクリプトでは、グローバル環境における次の名前が将来の拡張のために予約されています。
name
onhaipaistart
onhaipaiend
onmyagari
onfurikomi
onothersagari
onryuukyoku
onendgame
ontsumo
、ondiscard
の引数についてontsumo()
やondiscard()
の引数には、卓の状態が渡されます。
引数は1つのテーブルで、次のフィールド、メソッドが含まれています。
gametbl.addr
卓情報のアドレスを示す軽量ユーザーデータです。
gametbl.playerid
自分自身を表すプレイヤー番号です。
gametbl:movetile(from, to)
インデックスfromの位置の牌をtoに移動します。返り値はありません。
鳴きたい牌を指定するとき、toを1にして使います。
gametbl:evaluate(tsumoflag, [tiletbl])
現在の手が和了になっているなら、その点数を調べます。
gametbl:gethand()
形式の引数を指定した場合、その手牌で点数を計算します。
tsumoflag
には、ツモ和了として計算するならtrue
、ロン和了として計算す
るならfalse
を指定します。
返り値は以下のフィールドが含まれるテーブルとなります。
ismahjong
フィールド和了形になっているならtrue
、そうでなければfalse
が格納されます。
なお、このフィールドの値がfalse
の場合、ほかのフィールドは存在しません。
isvalid
フィールド縛りを満たしているならtrue
、そうでなければfalse
が格納されます。
fu
フィールド評価結果の符が格納されます。
han
フィールド評価結果の合計翻が格納されます。例えば、「三色・ツモ・ドラ1」で あれば4です。
mangan
フィールド評価結果の合計満貫が格納されます。例えば、役満なら4、ダブル役満なら8です。
points
フィールド評価結果の基本点数が格納されます。これは、子がツモ和了した時に他の子が支払う点数に相当します。 また、100点単位の切り上げは行われません。例えば、30符1翻の「ゴミ手」であれば240、満貫であれば2000となります。
gametbl:getactiveplayer()
現在のツモ番のプレイヤー番号を1~4(三人打ちの場合は1~3)の数値で返します。
gametbl:getbakaze()
場風牌を返します。返り値は mihajong.Tile.Wind
テーブルの定数のどれかです
(白入ありのルールでは mihajong.Tile.Dragon
テーブルの値になることもあります)。
gametbl:getbasepoint()
原点(返し点)を返します。
gametbl:getchip([playerid])
playerid
で指定したプレイヤー(省略した、またはnil
を指定した場合は自分自身)のチップの収支を返します。
但し、チップ無しのルールの場合はnil
を返します。
gametbl:getcurrentdiscard()
現在の捨牌を表すテーブルで返します。ontsumo()
関数内では意味を持ちません。
このテーブルは次のフィールドをもちます。
tile
フィールド牌の種類を表す番号が入ります。
red
フィールド赤ドラかどうかを示す番号が入ります。
gametbl:getdeckleft()
山牌の残り枚数を返します(王牌は数えません)。
gametbl:getdeposit()
現在の供託点棒の数を返します。
gametbl:getdiscard([playerid])
playerid
で指定したプレイヤー(省略した、またはnil
を指定した場合は自分自身)捨牌をテーブルで返します。
このテーブルはそれぞれの捨牌の情報がサブテーブルとして順番に格納されており、これには次のフィールドがあります。
tile
フィールド牌の種類を表す番号が入ります。
red
フィールド赤ドラかどうかを示す番号が入ります。
through
フィールドツモ切りした牌であればtrueが、そうでなければfalseが入ります。
riichi
フィールドリーチ宣言牌であればtrueが、そうでなければfalseが入ります。
taken
フィールド鳴かれた牌であればtrueが、そうでなければfalseが入ります。
gametbl:getdorainfo()
牌の種類ごとにドラになっているかどうか(なっている場合は何重にドラになっているかも)を格納したテーブルを返します。
このテーブルのキーは mihajong.Tile
に定義された数値で、キーに関連付けられる値は、
例えばドラではないときは0、ダブルドラになっているときは2……という数値になります。
なお、槓ドラ(裏ドラはもちろん含まれません)のほか、永田町ルールにおけるサイコロによるドラも含まれます。
注意! この関数で返されるテーブルはキーが飛び飛びの数値になっています。
注意! Luaの言語仕様では、0はtrue
に評価されます。ある牌がドラではないことを判定したいならば、
(gametbl:getdorainfo())[mihajong.Tile.Wind.East] == 0
のようにします。
gametbl:getdoukasen()
導火線(自摸牌の位置)にあたるプレイヤーの番号を1~4(三人打ちの場合は1~3)の数値で返します。
導火線なしの時はnil
を返します。
gametbl:getflower([playerid])
playerid
で指定したプレイヤー(省略した、またはnil
を指定した場合は自分自身)の花牌、
または三麻の抜きドラの数を返します。
gametbl:gethand([playerid])
自分の(playerid
を指定した場合は指定したプレイヤー、但し他家を指定する場合はオープン立直している場合に限る)手牌をテーブルで返します。
このテーブルは1~14のインデックスを持ちますが、自摸牌のインデックスは常に14となります。
このため、門前でないときはsparse な配列になることがあります。
存在する牌の位置には牌の情報を格納したサブテーブルが入り、牌が存在しない位置はnil
となります。
親の配牌時は自摸牌に関係なく理牌された状態で1~14に牌のデータが格納されています。
また、鳴いた直後の捨牌についてはインデックス14がnil
となっています。
tile
フィールド牌の種類を表す番号が入ります。
red
フィールド赤ドラかどうかを示す番号が入ります。
gametbl:getjikaze()
自風牌を返します。返り値は mihajong.Tile.Wind
テーブルの定数のどれかです。
gametbl:getmeld([playerid])
playerid
で指定したプレイヤー(省略した、またはnil
を指定した場合は自分自身)の鳴き面子を格納したテーブルで返します。
このテーブルは鳴いた回数に応じて1~4のインデックスを持ちます。門前かつ暗槓も行なっていない場合は空のテーブルが返ります。
個別の鳴き面子の情報はサブテーブルで表され、次のフィールドが含まれます。
tile
フィールド牌の種類を表す番号が入ります。ただし明順子(チー)の場合、一番数字の低い牌が入ります。
red
フィールドそれぞれの牌について赤ドラかどうかを示す番号を格納した配列が入ります。
type
フィールド面子の種類(順子、刻子……)を示す番号が入ります。
gametbl:getopenwait()
牌の種類ごとにオープンリーチの待ち牌になっているかどうかを格納したテーブルを返します。
このテーブルのキーは mihajong.Tile
に定義された数値で、キーに関連付けられる値は、
その牌がオープンリーチの待ち牌になっていればtrue
、そうでなければfalse
になります。
注意! この関数で返されるテーブルはキーが飛び飛びの数値になっています。
gametbl:getpreviousdiscard()
この関数は返り値が2つあります。鳴いた直後の捨牌である場合、直前に鳴いた牌の種類を表す番号を返します。 この関数は、食い変えにならないようにするための判定に使用できます。
1番目の返り値は鳴いた牌の現物を表す番号で、2番めは(チーの直後である場合のみ)筋食い変えになるような牌の番号です。
該当する牌がなければ、nil
が返ります。
gametbl:getrank([playerid])
playerid
で指定したプレイヤー(省略した、またはnil
を指定した場合は自分自身)の順位を返します。
gametbl:getround()
現在の局番号を返します。 これは、東1局を1とし、東2局を2、以下同様にして北4局が16となり、返り東1局が17(白入ありのルールでは白1局が17、 以下同様にして中4局が28、返り東1局が29)とした通し番号です。
なお、三人打ちでは4、8、12(以下同様)が欠番となります(四麻・三麻問わず南1局は5になるということ)。
東場のみを行うルールの場合、東5局は5、東6局は6……のように、「東n局」のnの部分がそのまま返されます。
gametbl:getrule(ruletag)
ruletag
で指定された文字列に対応するルール設定を返します。
gametbl:getscore([playerid])
playerid
で指定したプレイヤー(省略した、またはnil
を指定した場合は自分自身)の持ち点を返します。
滅多に発生しないことですが、箱下ありの青天井ルールであまりに絶対値の大きい点数の場合、正確な値が取得できない場合があります。
gametbl:getseentiles()
牌の種類ごとに場に見えている枚数を格納したテーブルを返します。
このテーブルのキーは mihajong.Tile
に定義された数値です。
注意! この関数で返されるテーブルはキーが飛び飛びの数値になっていま す。
gametbl:getshanten([tiletbl][, type])
現在の向聴数を返します。gametbl:gethand()
形式の引数を指定した場合、その手牌の向聴数を計算します。
typeを指定した場合、和了形式を限定した向聴数を返します。type
には、mihajong.AgariType
のフィールドのどれかを指定します。
聴牌になっている場合は0となり、和了っている場合は-1が返されます。
門前でないのに七対子に対する向聴数を求めようとした場合などそのような和了り方が不可能な場合や、
南北戦争なしのルールで南北戦争に対する向聴数を求めようとした場合などそのような和了り方がルール上認められていない場合、
返り値はnil
になります。
gametbl:gettenpaistat([tiletbl])
聴牌に関する情報をテーブルで返します。gametbl:gethand()
形式の引数を指定した場合、その手牌について計算します。
このテーブルには次のフィールドがあります。
isfuriten
フィールドフリテンであればtrue
が、そうでなければfalse
が入ります。
total
フィールド待ち牌の残り枚数が入ります。
kinds
フィールド待ち牌の種類数(2面待ちなら2、3面待ちなら3のように)が入ります。
bytile
フィールド牌ごとに次の情報を格納したサブテーブルです。このテーブルのキーは mihajong.Tile
に定義された数値です。
flag
: その牌が待ちになっていたらtrue
、そうでなければfalse
です。count
: その牌の残り枚数です。gametbl:gettilecontext()
手牌の中のある牌について、面子を構成しているかどうか判断するための情報を格納したテーブルを返します。
インデックスは gametbl:gethand()
の返り値と同様で、次のフィールドを持つサブテーブルが格納されています。
そのインデックスの牌が存在すればtrue、そうでなければfalse
が格納されます。
formstriplet
フィールド刻子をなしている牌ならtrue
、そうでなければfalse
が格納されます。
formssequence
フィールド順子をなしている牌ならtrue
、そうでなければfalse
が格納されます。
canformquad
フィールド手の内に4枚あるならtrue
、そうでなければfalse
が格納されます。
formspair
フィールド対子をなしている牌ならtrue
、そうでなければfalse
が格納されます。
formsryanmen
フィールド両面搭子をなしている牌ならtrue
、そうでなければfalse
が格納されます。
formskanchan
フィールド嵌搭子をなしている牌ならtrue
、そうでなければfalse
が格納されます。
formspenchan
フィールド辺搭子をなしている牌ならtrue
、そうでなければfalse
が格納されます。
gametbl:gettilerisk()
手牌の中のそれぞれの牌について、安牌かどうか判断するための情報を格納したテーブル返します。
インデックスは gametbl:gethand()
の返り値と同様で、次のフィールドを持つサブテーブルが格納されています。
issameasprevious
フィールド合わせ打ちになる牌ならtrue
、そうでなければfalse
が格納されます。
isdora
フィールドドラの現物ならtrue
、そうでなければfalse
が格納されます。
isdorasuji
フィールドドラ筋にあたる牌ならtrue
、そうでなければfalse
が格納されます。
isdorasoba
フィールドドラそば(=ドラの跨ぎ筋)の牌ならtrue
、そうでなければfalse
が格納されます。
isnochance
フィールドノーチャンスの牌ならtrue
、そうでなければfalse
が格納されます。
isonechance
フィールドワンチャンスの牌ならtrue
、そうでなければfalse
が格納されます。
isneverdiscarded
フィールド生牌ならtrue
、そうでなければfalse
が格納されます。
isseenfour
フィールド場に4枚見えているならtrue
、そうでなければfalse
が格納されます。
kamicha
/toimen
/shimocha
フィールド上家、対面、下家に対し通りそうかどうかを判断する材料を提供します。 これはサブテーブルであり、次のようなブール値のフィールドを持っています。
なお、三人打ちで存在しないプレイヤーの位置についてはフィールド自体がありません(空テーブルではなくnil
となります)。
isgembutsu
: 現物かどうかissuji
: 表筋かどうかisurasuji
: 裏筋かどうかisaida4ken
: 間4ケンかどうかismatagisuji
: 跨ぎ筋かどうかissenkisuji
: 疝気筋かどうかisnamakurasuji
: 鈍筋(なまくらすじ)かどうかisnakasuji
: 中筋かどうかgametbl:gettilesinhand()
牌の種類ごとに手牌に持っている枚数を格納したテーブルを返します。
このテーブルのキーは mihajong.Tile
に定義された数値です。
注意! この関数で返されるテーブルはキーが飛び飛びの数値になっていま す。
gametbl:gettsumibou()
現在の積み棒の数を返します。
gametbl:getwareme()
割れ目(開門の位置)にあたるプレイヤーの番号を1~4(三人打ちの場合は1~3)の数値で返します。
割れ目なしの時はnil
を返します。
gametbl:getyakuhaiwind()
それぞれの風牌について役牌になっているかどうかを格納したテーブルを返します。
これはEast
、South
、West
、North
のフィールドをもち、その牌が役牌になっていればtrue
が、そうでなければfalse
が設定されています。
gametbl:isabovebase([player])
player
には調べたいプレイヤーの番号を指定します。
nil
が渡された場合または省略された場合は、自身の状態を調べます。
浮いている(持ち点が返し点以上)ならtrue
を、そうでなければfalse
を返します。
gametbl:isankanallowed()
リーチ後に暗槓出来る状態ならtrue
を、そうでなければfalse
を返します。
なお、この関数はリーチしていない状態でも使用できますが、その場合は意味をなしません。
gametbl:isdoujunfuriten()
同巡内フリテンか、リーチ後見逃しによるフリテンであればtrue
を、そうでなければfalse
を返します。
現物フリテンかどうか調べるには、gametbl:gettenpaistat()
を使用します。
gametbl:isfinalround()
オーラスまたは延長戦(半荘戦であれば西入以降)であればtrue
を、そうでなければfalse
を返します。
gametbl:isfirstdraw()
鳴きのない第1ツモ(親については配牌直後)であればtrue
を、そうでなければfalse
を返します。
gametbl:isippatsu([player])
player
には調べたいプレイヤーの番号を指定します。nil
が渡された場合または省略された場合は、自身の状態を調べます。
立直一発が成立しうる状態ならtrue
を、そうでなければfalse
を返します。
但し、一発なしのルールの時はnil
を返します。
gametbl:iskansanjunqualified([player])
player
には調べたいプレイヤーの番号を指定します。nil
が渡された場合または省略された場合は、自身の状態を調べます。
3巡目に槓をしている場合はtrue
を、そうでなければfalse
を返します。
但し、槓三巡なしのルールの時はnil
を返します。
gametbl:iskyuushu()
九種九牌の条件を満たしていればtrue
を、そうでなければfalse
を返します。
但し、九種九牌で流せないルールの時はnil
を返します。
gametbl:ismenzen([player])
player
には調べたいプレイヤーの番号を指定します。nil
が渡された場合または省略された場合は、自身の状態を調べます。
門前であればtrue
を、そうでなければfalse
を返します。
gametbl:isopenriichideclared([player])
player
には調べたいプレイヤーの番号を指定します。nil
が渡された場合または省略された場合は、自身の状態を調べます。
オープン立直しているならtrue
を、そうでなければfalse
を返します。
gametbl:ispenultimateround()
ラス前(半荘戦であれば南3局、東風戦であれば東3局)であればtrue
を、そうでなければfalse
を返します。
gametbl:isrenpaitenhohqualified()
この関数は2つのブール値を返します。
1つめの返り値は戻牌天和の条件を満たしているかどうかで、満たしているならtrue
を、そうでなければfalse
を返します。
2つめの返り値はその局で戻牌天和の条件を満たしたことがあるかどうかで、
満たしたことがないならtrue
を、そうでなければfalse
を返します。
gametbl:isriichideclared([player])
player
には調べたいプレイヤーの番号を指定します。nil
が渡された場合または省略された場合は、自身の状態を調べます。
立直しているならtrue
を、そうでなければfalse
を返します。
gametbl:isshisanbuda()
十三不塔になっていればtrue
を、そうでなければfalse
を返します。
但し、十三不塔なしのルールの時はnil
を返します。
gametbl:isshisibuda()
十三無靠(十四不塔)になっていればtrue
を、そうでなければfalse
を返します。
但し、十三無靠(十四不塔)なしのルールの時はnil
を返します。
gametbl:isshokanqualified([player])
player
には調べたいプレイヤーの番号を指定します。nil
が渡された場合または省略された場合は、自身の状態を調べます。
1巡目に槓をしている場合はtrue
を、そうでなければfalse
を返します。但し、初槓なしのルールの時はnil
を返します。
gametbl:issumaroallowed([player])
player
には調べたいプレイヤーの番号を指定します。nil
が渡された場合または省略された場合は、自身の状態を調べます。
四馬路和了のための事前条件(満貫以上の和了)を満たしている場合true
を、そうでなければfalse
を返します。
但し、四馬路自体がないルールの時はnil
を返します。
gametbl:isyakitori([player])
player
には調べたいプレイヤーの番号を指定します。nil
が渡された場合または省略された場合は、自身の状態を調べます。
指定したプレイヤーが焼き鳥ならtrue
を、そうでなければfalse
を返します。
但し、焼き鳥なしのルールの時はnil
を返します。
mihajong
テーブルMiHaJongで使用する(現在のシャンテン数を求める、などといった)関数、
あるいは(暗槓する、リーチするといった捨牌の付帯情報の番号といった)エイリアスが、
mihajong
テーブルに格納されています。
注意! これらのサブテーブルはすべてプロキシテーブルになっているため、
単に pairs(mihajong.Tile.Wind)
としただけでは正しいイテレータが返りません。
正しいイテレータを取得するには、
pairs(getmetatable(mihajong.Tile.Wind).__index)
のようにします。
mihajong.DiscardType
暗槓する、リーチするといった捨牌の付帯情報を表す数値を格納したテーブルです。
これらは、determine_discard
関数の戻り値として、「return mihajong.DiscardType.Riichi, 7
」のように使用します。
このテーブルには、以下のフィールドが格納されています。
Normal
: 特に何もせず、普通の捨牌を行います。Ankan
: 捨牌ではなく、暗槓を行います。Kakan
: 捨牌ではなく、加槓を行います。Riichi
: この捨牌で立直を宣言します。Flower
: 捨牌の代わりに、花牌、三麻の北を晒します。OpenRiichi
: この捨牌でオープン立直を宣言します。※1Agari
: ツモアガリを宣言します。※2Kyuushu
: 九種九牌を宣言します。※1 オープンリーチなしの時に mihajong.DiscardType.OpenRiichi
を指定した場合、mihajong.DiscardType.Riichi
を指定したものとみなされます。
※2 和了れない状況で mihajong.DiscardType.Agari
を指定した場合、チョンボになります。
なおこの他に切断されたリモートプレイヤーが返すを特殊なコードも内部的には存在しますが、このスクリプト仕様からそれは省かれています。
mihajong.Call
チー、ポンといった鳴きの種類を表す数値を格納したテーブルです。
これらは、determine_call
関数の戻り値として、「return mihajong.Call.Ron
」のように使用します。
このテーブルには、以下のフィールドが格納されています。
None
: 捨牌を見逃します。Ron
: 捨牌でロンします。※1Kan
: 捨牌を明槓します。Pon
: 捨牌をポンします。Chii.Lower
: 捨牌を両面の小さい側、または辺張の7としてチーします。Chii.Middle
: 捨牌を嵌張としてチーします。Chii.Upper
: 捨牌を両面の大きい側、または辺張の3としてチーします。※1 和了れない状況で mihajong.Call.Ron
を指定した場合、チョンボになります。
mihajong.MeldType
明刻、暗槓といった鳴き面子の種類を表す数値を格納したテーブルです。 このテーブルには、以下のフィールドが格納されています。
Sequence.Lower
: 両面の小さい側、または辺張の7のチー。Sequence.Middle
: 嵌張の7のチー。Sequence.Upper
: 両面の大きい側、または辺張の3のチー。Triplet.Kamicha
: 上家からのポン。Triplet.Toimen
: 対面からのポン。Triplet.Shimocha
: 下家からのポン。Quad.Concealed
: 暗槓。Quad.Exposed.Kamicha
: 上家からの大明槓。Quad.Exposed.Toimen
: 対面からの大明槓。Quad.Exposed.Shimocha
: 下家からの大明槓。Quad.Added.Kamicha
: 上家からのポンへの加槓。Quad.Added.Toimen
: 対面からのポンへの加槓。Quad.Added.Shimocha
: 下家からのポンへの加槓。なお、暗順子、暗刻子を表すコードも内部的には存在しますが、 役判定処理にのみ使われており、AIインターフェイスに出てくることはありません。 そのため、このスクリプト仕様からもそれらのコードは省かれています。
mihajong.AgariType
七対子、国士無双といった和了の形式を表す数値を格納したテーブルです。
これは、gametbl:getshanten()
関数の引数に使用します。
このテーブルには、以下のフィールドが格納されています。
All
: 和了の形式を問わないことを指定します。Regular
: 通常の4面子1雀頭の和了。Pairs
: 七対子。Orphans
: 国士無双。Stellar
: 七星無靠(そのような役が存在するルールのみ。以下同様)。CivilWar
: 南北戦争。TohokuGreen
: 東北新幹線グリーン車。Syzygy
: 惑星直列。Quanbukao
: 全不靠。SevenUp
: セブンアップ。ZuheLong
: 組合龍。Ninnaji
: 仁和寺。mihajong.Tile
一索、五筒といった牌の種類を表す数値を格納したテーブルです。 このテーブルには、以下のフィールドが格納されています。
Character
: 萬子を表すサブテーブルです。
この中には、One
からNine
までの定数があります。数字の1から9も使用できます。Circle
: 筒子を表すサブテーブルです。
この中には、One
からNine
までの定数があります。数字の1から9も使用できます。Bamboo
: 索子を表すサブテーブルです。
この中には、One
からNine
までの定数があります。数字の1から9も使用できます。Wind
: 風牌を表すサブテーブルです。
この中には、East
、South
、West
、North
という定数があります。Dragon
: 三元牌を表すサブテーブルです。
この中には、White
、Green
、Red
という定数があります。Flower
: 花牌を表すサブテーブルです。
この中には、季節牌を表すSpring
、Summer
、Autumn
、Fall
、Winter
、
および草木牌を表すPlum
、Orchid
、Chrysanthemum
、Chrys
、Bamboo
という定数があります。
なお、Fall
はAutumn
と同義で、Chrys
はChrysanthemum
と同義です。
この他にFlower
という定数がありますが、gametbl:getdorainfo()
などの返り値テーブルのインデックスに使用し、手牌データには現れません。mihajong.DoraColor
赤ドラかどうかを表す数値を格納したテーブルです。 このテーブルには、以下のフィールドが格納されています。
Normal
: 黒牌。赤ドラや青ドラではない牌です。Red
: 赤牌。赤ドラともいいます。Blue
: 青牌。青ドラありのルールにのみ現れます。mihajong.gametbl
determine_discard
、determine_call
の引数として渡されるテーブルのプロトタイプです。詳細は前述しています。
mihajong.random
MiHaJongのLuaインタプリタではmath
ライブラリがオープンされていないので、
乱数が必要な場合は mihajong.random()
関数を使います。
C++11の <random>
ライブラリで実装されていて、
Lua標準ライブラリの math.random
(これはC言語のrand()です)よりも高品位な乱数が得られます。
この関数は本物の乱数ではなくあくまで擬似乱数ですが、MiHaJongのシステム側で乱数の種は予測不能な値に設定されます。
なお、この関数は引数の与え方によって異なる挙動を示します。
mihajong.random()
、mihajong.random(nil)
、mihajong.random(nil, nil)
mihajong.random
を引数なしで呼び出した場合、半開区間 [0, 1) の連続一様乱数を返します。
mihajong.random(n)
、mihajong.random(n, nil)
mihajong.random
を1つの整数の引数で呼び出した場合、
閉区間 [1, n] の離散一様乱数を返します(返り値は整数になります)。
たとえば n == 6 の場合、サイコロを1つ振るのと同じになります。
mihajong.random(mean, var)
mihajong.random
を2つの引数で呼び出した場合で、2つ目の引数が正の場合、
平均 μ == mean
、分散 σ^2 == var
の正規乱数を返します。
mihajong.random(n, -faces)
mihajong.random
を2つの引数で呼び出した場合で、2つ目の引数が負の場合、
|faces
| 面のサイコロを n
個振った出目の合計を返します。
mihajong.gametype
MiHaJongの種別を表す文字列です。意味は次のとおりです。
"yonma"
: 四人打ち。"sanma"
: 三人打ち。"sanma_with_four_players"
: 四人三麻。"sanma_without_honors"
: 数牌三麻。"sanma_setouchi"
: 瀬戸内三麻。"guobiao"
: 中国麻雀。mihajong.version
MiHaJongのバージョンです。このテーブルには、以下のフィールドが格納されています。
また、tostring(mihajong.version)
とすると、"1.7.0"
のような文字列が返りますす。
major
: メジャーバージョン。minor
: マイナーバージョン。patch
: パッチバージョン。mihajong.say(message)
この関数は廃止されました。互換性のために残されています。
ephemeral
テーブルこれは空のテーブルで、AI作者が望むものを何でも格納することができます。これらは、毎局開始時にリセットされます。 プレイヤーごとに別々のLua環境が用意されているので、混線することはありません。
半荘中ずっと保持したい情報は、ephemeral
テーブルの「外の」グローバル環境に保持します。