電脳麻将 ver.2.0 で開発中の新機能「パラメータによるルールのカスタマイズ」。 麻雀ルールのカスタマイズ(3) ~ 赤牌とドラ - koba::blog に続いて今回の話題は 和了役 と 点計算。これらに関わるパラメータは以下の通り。
断幺九の役判定関数 duanyaojiu()
で クイタンあり が false の場合はメンゼンを役成立条件とする。
function duanyaojiu() {
if (hudi.n_yaojiu > 0) return [];
if (rule['クイタンあり'] || hudi.menqian) // クイタンありか門前の場合
return [{ name: '断幺九', fanshu: 1 }];
return [];
}
状況役はクラス Majiang.Game
で判定する。
メソッド dapai()
でリーチ宣言の際に 一発あり が true なら「一発フラグ」(_yifa
)を立てる。
dapai(dapai) {
/* …… */
if (dapai.substr(-1) == '*') {
this._lizhi[model.lunban] = this._diyizimo ? 2 : 1;
this._yifa[model.lunban] = this._rule['一発あり'];
}
/* …… */
}
ダブル役満あり が false の場合、get_hupai()
での役判定の後の処理で役ごとの「役満数」(fanshu
)を一律1に変更する。これにより役名は「四暗刻単騎」のようにダブル役満特有の名称のまま点数は通常の役満と同じになる。
function get_hupai(mianzi, hudi, pre_hupai, post_hupai, rule) {
/* …… */
for (let hupai of damanguan) {
if (! rule['ダブル役満あり']) hupai.fanshu = '*';
/* …… */
}
/* …… */
}
役満パオあり が false の場合、get_hupai()
の役判定の後の処理で「パオ対象者」(baojia
)を一律削除する。
function get_hupai(mianzi, hudi, pre_hupai, post_hupai, rule) {
/* …… */
for (let hupai of damanguan) {
/* …… */
if (! rule['役満パオあり']) delete hupai.baojia;
}
/* …… */
}
役満の複合あり が false の場合、get_defen()
の基本点計算の際に全体の「役満数」を一律1に変更する。これにより役満パオの責任範囲も自動的に役満1つ分となる。
function get_defen(fu, hupai, rongpai, param) {
/* …… */
if (hupai[0].fanshu[0] == '*') { // 役満の場合
fu = undefined;
/* 基本点を算出する */
damanguan = ! param.rule['役満の複合あり'] ? 1 // 役満数を1にする
: hupai.map(h => h.fanshu.length).reduce((x, y) => x + y);
base = 8000 * damanguan; // 基本点 = 8000 × 役満数
let h = hupai.find(h => h.baojia);
if (h) { // 役満パオがある場合
/* 責任払いの基本点を算出する */
baojia2 = (menfeng + { '+': 1, '=': 2, '-': 3}[h.baojia]) % 4;
base2 = 8000 * Math.min(h.fanshu.length, damanguan);
}
}
/* …… */
}
get_defen()
で基本点(満貫の基本点は2000点)を決定する際に、数え役満あり が true の場合は、13翻以上の基本点を8000点とする。また、切り上げ満貫あり が true の場合は基本点が1920点なら2000点に切り上げる。
function get_defen(fu, hupai, rongpai, param) {
/* …… */
if (hupai[0].fanshu[0] == '*') { // 役満の場合
/* …… */
}
else { // 役満以外の場合
/* 符(fu)と翻数(fanshu)から基本点を算出する */
fanshu = hupai.map(h => h.fanshu).reduce((x, y) => x + y);
base = (fanshu >= 13 && param.rule['数え役満あり'])
? 8000 // 役満
: (fanshu >= 11) ? 6000 // 三倍満
: (fanshu >= 8) ? 4000 // 倍満
: (fanshu >= 6) ? 3000 // 跳満
: param.rule['切り上げ満貫あり'] && fu << (2 + fanshu) == 1920
? 2000 // 満貫
: Math.min(fu << (2 + fanshu), 2000);
}
/* …… */
}