diff --git a/common/gametbl.h b/common/gametbl.h index 0b066b3f..2f2bef5d 100644 --- a/common/gametbl.h +++ b/common/gametbl.h @@ -280,6 +280,7 @@ struct PlayerTable { // プレイヤーの状態を格納 bool DoujunFuriten; // 同順振聴である bool AgariHouki; // 和了り放棄の罰則中かどうか RichiStat RichiFlag; // リーチしているかどうか + uint8_t RichiOrder; // リーチした順番(開立直栄和用) DeclFlag DeclarationFlag; // 鳴きの宣言 Flowers FlowerFlag; // 晒している花牌を格納するフラグ uint8_t NorthFlag; // 晒している北風牌を格納するフラグ diff --git a/mjcore/data/confitem.csv b/mjcore/data/confitem.csv index f0996859..311f4e95 100644 --- a/mjcore/data/confitem.csv +++ b/mjcore/data/confitem.csv @@ -159,7 +159,7 @@ 172,31,0,,,,,,suukantsu,四槓子,四槓子の飜数と包の有無を設定します,yakuman,double_yakuman,yakuman_with_pao,double_yakuman_with_pao,,,,,,,,,,,,,,,, 173,31,0,,,,,,tenhoh,天和,天和の飜数を設定します,yakuman,double_yakuman,,,,,,,,,,,,,,,,,, 174,31,0,,,,,,exposed_pinfu,喰い平,鳴いた平和形の符を設定します,30fu,20fu,1han_30fu_unbound,1han_20fu_unbound,1han_30fu,1han_20fu,,,,,,,,,,,,,, -175,31,0,,,,,,open_riichi,オープン立直,オープン立直の有無を設定します,no,yes,,,,,,,,,,,,,,,,,, +175,31,0,,,,,,open_riichi,オープン立直,オープン立直の有無を設定します,no,yes_nonriichi_yakuman,yes_okkake_yakuman,yes_without_yakuman,,,,,,,,,,,,,,,, 176,31,0,,,,,,daisharin,大車輪,大車輪の有無と価値を設定します(2~8の純正のみ),no,yakuman_menzen,double_yakuman_menzen,,,,,,,,,,,,,,,,, 177,31,0,,,,,,sanrenkoh,三連刻,三連刻の有無と価値を設定します,no,2han,3han,,,,,,,,,,,,,,,,, 178,31,0,,,,,,suurenkoh,四連刻,四連刻の有無と価値を設定します,no,yakuman,8han_incl_toitoi,,,,,,,,,,,,,,,,, diff --git a/mjcore/data/confitem.ini b/mjcore/data/confitem.ini index 42f7f750..9f24a3f0 100644 --- a/mjcore/data/confitem.ini +++ b/mjcore/data/confitem.ini @@ -252,3 +252,6 @@ roll_twice=二度振り 18sec=18秒 19sec=19秒 20sec=20秒 +yes_nonriichi_yakuman=あり(非立直者からは役満) +yes_okkake_yakuman=あり(先立直者以外からは役満) +yes_without_yakuman=あり(役満払いなし) diff --git a/mjcore/gametbl.cpp b/mjcore/gametbl.cpp index 1c4ff0e9..f9afbaed 100644 --- a/mjcore/gametbl.cpp +++ b/mjcore/gametbl.cpp @@ -168,6 +168,7 @@ void inittable(GameTable* const gameStat) { /* 局単位での初期化 */ gameStat->Player[pl].RichiFlag.IppatsuFlag = gameStat->Player[pl].RichiFlag.DoubleFlag = gameStat->Player[pl].RichiFlag.OpenFlag = false; + gameStat->Player[pl].RichiOrder = 0; gameStat->Player[pl].FirstDrawFlag = true; // 1巡目である(地和、ダブル立直の判定に使う) gameStat->Player[pl].DoujunFuriten = // 同順振聴である gameStat->Player[pl].AgariHouki = false; // 和了り放棄の罰則中かどうか @@ -301,6 +302,7 @@ GameTable* makesandBox(const GameTable* const gameStat, PlayerID targetPlayer) { sandbox->Player[p].RichiFlag.IppatsuFlag = gameStat->Player[p].RichiFlag.IppatsuFlag; sandbox->Player[p].RichiFlag.DoubleFlag = gameStat->Player[p].RichiFlag.DoubleFlag; sandbox->Player[p].RichiFlag.OpenFlag = gameStat->Player[p].RichiFlag.OpenFlag; + sandbox->Player[p].RichiOrder = gameStat->Player[p].RichiOrder; sandbox->Player[p].FirstDrawFlag = gameStat->Player[p].FirstDrawFlag; sandbox->Player[p].DoujunFuriten = gameStat->Player[p].DoujunFuriten; sandbox->Player[p].AgariHouki = gameStat->Player[p].AgariHouki; diff --git a/mjcore/mouda.cpp b/mjcore/mouda.cpp index 636935b5..c59f5220 100644 --- a/mjcore/mouda.cpp +++ b/mjcore/mouda.cpp @@ -335,6 +335,12 @@ namespace { /* 内部処理分割用 */ gameStat->statOfActive().PlayerScore -= 1000; if (DiscardTileIndex.type == DiscardTileNum::OpenRiichi) chkOpenMachi(gameStat, gameStat->CurrentPlayer.Active); + if (gameStat->statOfActive().RichiOrder == 0) { // 立直の順番を記録 + for (int i = 0; i < ACTUAL_PLAYERS; ++i) { + if (gameStat->Player[i].RichiFlag.RichiFlag) + ++gameStat->statOfActive().RichiOrder; + } + } } /* 天和や地和のフラグを降ろす */ gameStat->statOfActive().FirstDrawFlag = diff --git a/mjcore/yaku/catalog/context.cpp b/mjcore/yaku/catalog/context.cpp index 4bce0d69..e72f4254 100644 --- a/mjcore/yaku/catalog/context.cpp +++ b/mjcore/yaku/catalog/context.cpp @@ -50,22 +50,32 @@ void yaku::yakuCalculator::YakuCatalog::catalogInit::yakulst_contextual() { } )); /* プンリー放銃 */ - yaku::yakuCalculator::YakuCatalog::Instantiate()->catalog.push_back(Yaku( - _T("開立直栄和"), yaku::yakuCalculator::Yaku::HANFUNC( [](const MentsuAnalysis* const analysis) { - return (analysis->MenzenFlag()) ? - yaku::yakuCalculator::Yaku::YAKU_HAN(yaku::yakuCalculator::Yaku::YAKU_HAN::HAN(11, yaku::yakuCalculator::Han), - yaku::yakuCalculator::Yaku::YAKU_HAN::HAN::yv_null) : - yaku::yakuCalculator::Yaku::YAKU_HAN(); - }), - [](const MentsuAnalysis* const analysis) -> bool { - return ((analysis->shanten[shantenAll] == -1) && // 何かの手で和了になっている - (analysis->PlayerStat()->RichiFlag.RichiFlag) && // 立直している - (analysis->PlayerStat()->RichiFlag.OpenFlag) && // オープン立直フラグが立っている - (!analysis->TsumoAgariFlag()) && // ロン - (analysis->GameStat->CurrentPlayer.Furikomi >= 0) && - (!analysis->GameStat->Player[analysis->GameStat->CurrentPlayer.Furikomi].RichiFlag.RichiFlag)); // 非リーチ者からの和了 - } - )); + if (!RuleData::chkRule("open_riichi", "yes_without_yakuman")) { + yaku::yakuCalculator::YakuCatalog::Instantiate()->catalog.push_back(Yaku( + _T("開立直栄和"), yaku::yakuCalculator::Yaku::HANFUNC( [](const MentsuAnalysis* const analysis) { + return (analysis->MenzenFlag()) ? + yaku::yakuCalculator::Yaku::YAKU_HAN(yaku::yakuCalculator::Yaku::YAKU_HAN::HAN(11, yaku::yakuCalculator::Han), + yaku::yakuCalculator::Yaku::YAKU_HAN::HAN::yv_null) : + yaku::yakuCalculator::Yaku::YAKU_HAN(); + }), + RuleData::chkRule("open_riichi", "yes_okkake_yakuman") ? static_cast([](const MentsuAnalysis* const analysis) -> bool { + return ((analysis->shanten[shantenAll] == -1) && // 何かの手で和了になっている + (analysis->PlayerStat()->RichiFlag.RichiFlag) && // 立直している + (analysis->PlayerStat()->RichiFlag.OpenFlag) && // オープン立直フラグが立っている + (!analysis->TsumoAgariFlag()) && // ロン + (analysis->GameStat->CurrentPlayer.Furikomi >= 0) && + ((!analysis->GameStat->Player[analysis->GameStat->CurrentPlayer.Furikomi].RichiFlag.RichiFlag) || // 非リーチ者からの和了 or + (analysis->PlayerStat()->RichiOrder < analysis->GameStat->Player[analysis->GameStat->CurrentPlayer.Furikomi].RichiOrder))); // 追っかけリーチ者からの和了 + }) : ([](const MentsuAnalysis* const analysis) -> bool { + return ((analysis->shanten[shantenAll] == -1) && // 何かの手で和了になっている + (analysis->PlayerStat()->RichiFlag.RichiFlag) && // 立直している + (analysis->PlayerStat()->RichiFlag.OpenFlag) && // オープン立直フラグが立っている + (!analysis->TsumoAgariFlag()) && // ロン + (analysis->GameStat->CurrentPlayer.Furikomi >= 0) && + (!analysis->GameStat->Player[analysis->GameStat->CurrentPlayer.Furikomi].RichiFlag.RichiFlag)); // 非リーチ者からの和了 + }) + )); + } } /* 一発(方言では即ともいう) */ if (RuleData::chkRuleApplied("riichi_ippatsu")&&(!RuleData::chkRule("riichi_ippatsu", "chip_only"))) { // 一発が役にならないルールを除外