From 9b16a5955d11ba34af4561ae6f3162c11d93ec75 Mon Sep 17 00:00:00 2001 From: Calcitem Date: Sun, 3 Oct 2021 10:26:10 +0800 Subject: [PATCH] rule: Support Endgame N-Move rule TODO: Translation --- src/mills.cpp | 1 + src/mills.h | 1 + src/position.cpp | 7 ++ src/position.h | 11 ++ src/rule.h | 3 + src/search.cpp | 11 +- src/thread.cpp | 2 +- src/types.h | 1 + src/ucioption.cpp | 6 ++ src/ui/flutter_app/lib/common/config.dart | 3 + .../flutter_app/lib/engine/native_engine.dart | 2 + src/ui/flutter_app/lib/l10n/intl_ar.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_bg.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_bn.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_cs.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_da.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_de.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_de_ch.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_el.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_en.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_es.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_et.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_fa.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_fi.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_fr.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_gu.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_hi.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_hr.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_hu.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_id.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_it.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_ja.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_kn.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_ko.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_lt.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_lv.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_mk.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_ms.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_nl.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_nn.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_pl.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_pt.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_ro.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_ru.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_sk.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_sl.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_sq.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_sr.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_sv.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_te.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_th.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_tr.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_uz.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_vi.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_zh.arb | 12 +++ src/ui/flutter_app/lib/l10n/intl_zh_Hant.arb | 12 +++ src/ui/flutter_app/lib/mill/position.dart | 20 ++++ src/ui/flutter_app/lib/mill/rule.dart | 1 + src/ui/flutter_app/lib/mill/types.dart | 1 + src/ui/flutter_app/lib/widgets/game_page.dart | 2 + .../lib/widgets/rule_settings_page.dart | 101 ++++++++++++++++++ src/ui/qt/game.cpp | 8 +- 62 files changed, 718 insertions(+), 3 deletions(-) diff --git a/src/mills.cpp b/src/mills.cpp index 23e1dcdf..5f9caf11 100644 --- a/src/mills.cpp +++ b/src/mills.cpp @@ -29,6 +29,7 @@ const char *loseReasonNoWayStr = "Player%d no way to go. Player%d win!"; const char *loseReasonTimeOverStr = "Time over. Player%d win!"; const char *drawReasonThreefoldRepetitionStr = "Threefold Repetition. Draw!"; const char *drawReasonRule50Str = "N-move rule. Draw!"; +const char *drawReasonEndgameRule50Str = "Endgame N-move rule. Draw!"; const char *loseReasonBoardIsFullStr = "Full. Player2 win!"; const char *drawReasonBoardIsFullStr = "Full. In draw!"; const char *loseReasonlessThanThreeStr = "Player%d win!"; diff --git a/src/mills.h b/src/mills.h index 830e2627..168c4e6b 100644 --- a/src/mills.h +++ b/src/mills.h @@ -26,6 +26,7 @@ extern const char *loseReasonNoWayStr; extern const char *loseReasonTimeOverStr; extern const char *drawReasonThreefoldRepetitionStr; extern const char *drawReasonRule50Str; +extern const char *drawReasonEndgameRule50Str; extern const char *loseReasonBoardIsFullStr; extern const char *drawReasonBoardIsFullStr; extern const char *loseReasonlessThanThreeStr; diff --git a/src/position.cpp b/src/position.cpp index 42228743..e1516314 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -1014,6 +1014,13 @@ bool Position::check_if_game_is_over() set_gameover(DRAW, GameOverReason::drawReasonRule50); return true; } + + if (rule.endgameNMoveRule < rule.nMoveRule && + is_three_endgame() && + posKeyHistory.size() > rule.endgameNMoveRule) { + set_gameover(DRAW, GameOverReason::drawReasonEndgameRule50); + return true; + } #endif // RULE_50 if (pieceOnBoardCount[WHITE] + pieceOnBoardCount[BLACK] >= EFFECTIVE_SQUARE_NB) { diff --git a/src/position.h b/src/position.h index b911defc..331abd85 100644 --- a/src/position.h +++ b/src/position.h @@ -150,6 +150,8 @@ public: //template void updateMobility(Square from, Square to); int calculate_mobility_diff(); + bool is_three_endgame() const; + static bool is_star_square(Square s); bool bitboard_is_ok(); @@ -353,4 +355,13 @@ inline int Position::get_mobility_diff() const return mobilityDiff; } +inline bool Position::is_three_endgame() const +{ + if (get_phase() == Phase::placing) { + return false; + } + + return pieceOnBoardCount[WHITE] == 3 || pieceOnBoardCount[BLACK] == 3; +} + #endif // #ifndef POSITION_H_INCLUDED diff --git a/src/rule.h b/src/rule.h index 21c5e1b0..9e46e226 100644 --- a/src/rule.h +++ b/src/rule.h @@ -74,6 +74,9 @@ struct Rule // The N-move rule in Mill states that if no remove has been made in the last N moves. unsigned int nMoveRule; + + // If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn. + unsigned int endgameNMoveRule; }; #define N_RULES 5 diff --git a/src/search.cpp b/src/search.cpp index 2cab01ed..e47f32c6 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -100,6 +100,12 @@ int Thread::search() if (posKeyHistory.size() > rule.nMoveRule) { return 50; } + + if (rule.endgameNMoveRule < rule.nMoveRule && + rootPos->is_three_endgame() && + posKeyHistory.size() > rule.endgameNMoveRule) { + return 10; + } #endif // RULE_50 #ifdef THREEFOLD_REPETITION @@ -221,7 +227,10 @@ Value qsearch(Position *pos, Sanmill::Stack &ss, Depth depth, Depth or Depth epsilon; #ifdef RULE_50 - if (pos->rule50_count() > rule.nMoveRule) { + if ((pos->rule50_count() > rule.nMoveRule) || + (rule.endgameNMoveRule < rule.nMoveRule && + pos->is_three_endgame() && + pos->rule50_count() > rule.endgameNMoveRule)) { alpha = VALUE_DRAW; if (alpha >= beta) { return alpha; diff --git a/src/thread.cpp b/src/thread.cpp index 2ac584c0..44f2a9a9 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -157,7 +157,7 @@ void Thread::idle_loop() #endif int ret = search(); - if (ret == 3 || ret == 50) { + if (ret == 3 || ret == 50 || ret == 10) { loggerDebug("Draw\n\n"); strCommand = "draw"; emitCommand(); diff --git a/src/types.h b/src/types.h index 727706cb..4d4e9dd6 100644 --- a/src/types.h +++ b/src/types.h @@ -181,6 +181,7 @@ enum class GameOverReason loseReasonTimeOver, drawReasonThreefoldRepetition, drawReasonRule50, + drawReasonEndgameRule50, drawReasonBoardIsFull, }; diff --git a/src/ucioption.cpp b/src/ucioption.cpp index 9eb79652..316d3ff8 100644 --- a/src/ucioption.cpp +++ b/src/ucioption.cpp @@ -167,6 +167,11 @@ void on_nMoveRule(const Option &o) rule.nMoveRule = (unsigned int)o; } +void on_endgameNMoveRule(const Option &o) +{ + rule.endgameNMoveRule = (unsigned int)o; +} + /// Our case insensitive less() function as required by UCI protocol bool CaseInsensitiveLess::operator() (const string &s1, const string &s2) const { @@ -221,6 +226,7 @@ void init(OptionsMap &o) o["IsLoseButNotChangeSideWhenNoWay"] << Option(true, on_isLoseButNotChangeSideWhenNoWay); o["MayFly"] << Option(true, on_mayFly); o["NMoveRule"] << Option(100, 10, 200, on_nMoveRule); + o["EndgameNMoveRule"] << Option(100, 5, 200, on_endgameNMoveRule); } diff --git a/src/ui/flutter_app/lib/common/config.dart b/src/ui/flutter_app/lib/common/config.dart index 2ee11ad2..3dcb7473 100644 --- a/src/ui/flutter_app/lib/common/config.dart +++ b/src/ui/flutter_app/lib/common/config.dart @@ -97,6 +97,7 @@ class Config { static bool isLoseButNotChangeSideWhenNoWay = true; static bool mayFly = true; static int nMoveRule = 100; + static int endgameNMoveRule = 100; static Future loadSettings() async { print("[config] Loading settings..."); @@ -207,6 +208,7 @@ class Config { settings['IsLoseButNotChangeSideWhenNoWay'] ?? true; rule.mayFly = Config.mayFly = settings['MayFly'] ?? true; rule.nMoveRule = Config.nMoveRule = settings['NMoveRule'] ?? 100; + rule.endgameNMoveRule = Config.endgameNMoveRule = settings['EndgameNMoveRule'] ?? 100; settingsLoaded = true; print("[config] Loading settings done!"); @@ -287,6 +289,7 @@ class Config { Config.isLoseButNotChangeSideWhenNoWay; settings['MayFly'] = Config.mayFly; settings['NMoveRule'] = Config.nMoveRule; + settings['EndgameNMoveRule'] = Config.endgameNMoveRule; settings.commit(); diff --git a/src/ui/flutter_app/lib/engine/native_engine.dart b/src/ui/flutter_app/lib/engine/native_engine.dart index 55ce5b2a..44d43612 100644 --- a/src/ui/flutter_app/lib/engine/native_engine.dart +++ b/src/ui/flutter_app/lib/engine/native_engine.dart @@ -172,6 +172,8 @@ class NativeEngine extends Engine { 'setoption name IsLoseButNotChangeSideWhenNoWay value ${Config.isLoseButNotChangeSideWhenNoWay}'); await send('setoption name MayFly value ${Config.mayFly}'); await send('setoption name NMoveRule value ${Config.nMoveRule}'); + await send( + 'setoption name EndgameNMoveRule value ${Config.endgameNMoveRule}'); } String getPositionFen(Position position) { diff --git a/src/ui/flutter_app/lib/l10n/intl_ar.arb b/src/ui/flutter_app/lib/l10n/intl_ar.arb index 3f3de0b5..28e6ca0b 100644 --- a/src/ui/flutter_app/lib/l10n/intl_ar.arb +++ b/src/ui/flutter_app/lib/l10n/intl_ar.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "إذا قام اللاعب بتشكيل الطاحونة في مرحلة التسوية ، فسوف يقوم بإزالة القطعة غير الموضوعة للخصم ويستمر في التحرك.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_bg.arb b/src/ui/flutter_app/lib/l10n/intl_bg.arb index 5514b9fa..43cff444 100644 --- a/src/ui/flutter_app/lib/l10n/intl_bg.arb +++ b/src/ui/flutter_app/lib/l10n/intl_bg.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Ако играч формира мелницата във фазата на поставяне, тя ще премахне непоставената фигура на противника и ще продължи да прави ход.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_bn.arb b/src/ui/flutter_app/lib/l10n/intl_bn.arb index f3afe405..596bd5b0 100644 --- a/src/ui/flutter_app/lib/l10n/intl_bn.arb +++ b/src/ui/flutter_app/lib/l10n/intl_bn.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "যদি প্লেয়ার প্লেসিং পর্যায়ে মিল গঠন করে, সে প্রতিপক্ষের স্থানহীন টুকরাটি সরিয়ে দেবে এবং একটি পদক্ষেপ নিতে থাকবে।", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_cs.arb b/src/ui/flutter_app/lib/l10n/intl_cs.arb index c64b3a60..b789accc 100644 --- a/src/ui/flutter_app/lib/l10n/intl_cs.arb +++ b/src/ui/flutter_app/lib/l10n/intl_cs.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Pokud hráč vytvoří mlýn ve fázi umisťování, odstraní soupeřovu neumístěnou figurku a pokračuje v tahu.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_da.arb b/src/ui/flutter_app/lib/l10n/intl_da.arb index 2796f5c5..0d8ed485 100644 --- a/src/ui/flutter_app/lib/l10n/intl_da.arb +++ b/src/ui/flutter_app/lib/l10n/intl_da.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Hvis en spiller danner møllen i placeringsfasen, vil hun fjerne modstanderens uplacerede brik og fortsætte med at foretage et træk.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_de.arb b/src/ui/flutter_app/lib/l10n/intl_de.arb index d9f52164..bc4984c2 100644 --- a/src/ui/flutter_app/lib/l10n/intl_de.arb +++ b/src/ui/flutter_app/lib/l10n/intl_de.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Wenn ein Spieler in der Platzierungsphase die Mühle bildet, entfernt er den nicht platzierten Stein des Gegners und macht weiter seinen Zug.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_de_ch.arb b/src/ui/flutter_app/lib/l10n/intl_de_ch.arb index 93cb8eb6..66f14374 100644 --- a/src/ui/flutter_app/lib/l10n/intl_de_ch.arb +++ b/src/ui/flutter_app/lib/l10n/intl_de_ch.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Wenn ein Spieler in der Platzierungsphase die Mühle bildet, entfernt er den nicht platzierten Stein des Gegners und macht weiter seinen Zug.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_el.arb b/src/ui/flutter_app/lib/l10n/intl_el.arb index bbbd56ed..a52de682 100644 --- a/src/ui/flutter_app/lib/l10n/intl_el.arb +++ b/src/ui/flutter_app/lib/l10n/intl_el.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Εάν ένας παίκτης σχηματίσει το μύλο στη φάση τοποθέτησης, θα αφαιρέσει το μη τοποθετημένο κομμάτι του αντιπάλου και θα συνεχίσει να κάνει μια κίνηση.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_en.arb b/src/ui/flutter_app/lib/l10n/intl_en.arb index d94db1b6..e07adbe9 100644 --- a/src/ui/flutter_app/lib/l10n/intl_en.arb +++ b/src/ui/flutter_app/lib/l10n/intl_en.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_es.arb b/src/ui/flutter_app/lib/l10n/intl_es.arb index d72b0da9..f2e9f0ec 100644 --- a/src/ui/flutter_app/lib/l10n/intl_es.arb +++ b/src/ui/flutter_app/lib/l10n/intl_es.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Si un jugador forma el molino en la fase de colocación, retirará la pieza no colocada del oponente y continuará haciendo un movimiento.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_et.arb b/src/ui/flutter_app/lib/l10n/intl_et.arb index e3c6555d..e8bb1de1 100644 --- a/src/ui/flutter_app/lib/l10n/intl_et.arb +++ b/src/ui/flutter_app/lib/l10n/intl_et.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Kui mängija moodustab veski paigutamise faasis, eemaldab ta vastase asetamata tüki ja jätkab käigu tegemist.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_fa.arb b/src/ui/flutter_app/lib/l10n/intl_fa.arb index 834b6bf2..761feaac 100644 --- a/src/ui/flutter_app/lib/l10n/intl_fa.arb +++ b/src/ui/flutter_app/lib/l10n/intl_fa.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "اگر بازیکنی آسیاب را در مرحله قرار دادن تشکیل دهد ، مهره بدون محل حریف را برداشته و به حرکت خود ادامه می دهد.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_fi.arb b/src/ui/flutter_app/lib/l10n/intl_fi.arb index 6744683e..c9981d4c 100644 --- a/src/ui/flutter_app/lib/l10n/intl_fi.arb +++ b/src/ui/flutter_app/lib/l10n/intl_fi.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Jos pelaaja muodostaa myllyn sijoitusvaiheessa, hän poistaa vastustajan sijoittamattoman palan ja jatkaa siirtoa.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_fr.arb b/src/ui/flutter_app/lib/l10n/intl_fr.arb index 027ecee4..1613120b 100644 --- a/src/ui/flutter_app/lib/l10n/intl_fr.arb +++ b/src/ui/flutter_app/lib/l10n/intl_fr.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Si un joueur forme le moulin lors de la phase de placement, il retirera la pièce non placée de l'adversaire et continuera à se déplacer.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_gu.arb b/src/ui/flutter_app/lib/l10n/intl_gu.arb index a4188332..54c2bdb0 100644 --- a/src/ui/flutter_app/lib/l10n/intl_gu.arb +++ b/src/ui/flutter_app/lib/l10n/intl_gu.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "જો કોઈ ખેલાડી પ્લેસિંગ તબક્કામાં મિલની રચના કરે છે, તો તે વિરોધીના સ્થાનાંતરિત ભાગને દૂર કરશે અને ચાલ ચાલુ રાખશે.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_hi.arb b/src/ui/flutter_app/lib/l10n/intl_hi.arb index 6a73c4bc..ce7f5019 100644 --- a/src/ui/flutter_app/lib/l10n/intl_hi.arb +++ b/src/ui/flutter_app/lib/l10n/intl_hi.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "यदि कोई खिलाड़ी प्लेसिंग चरण में चक्की बनाता है, तो वह प्रतिद्वंद्वी के स्थान से हटाए गए टुकड़े को हटा देगी और एक चाल चलती रहेगी।", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_hr.arb b/src/ui/flutter_app/lib/l10n/intl_hr.arb index de1fb6e8..4fb30ed7 100644 --- a/src/ui/flutter_app/lib/l10n/intl_hr.arb +++ b/src/ui/flutter_app/lib/l10n/intl_hr.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Ako igrač formira mlin u fazi postavljanja, uklonit će protivnikov nezamješten dio i nastaviti činiti potez.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_hu.arb b/src/ui/flutter_app/lib/l10n/intl_hu.arb index 3102f1d8..a027146c 100644 --- a/src/ui/flutter_app/lib/l10n/intl_hu.arb +++ b/src/ui/flutter_app/lib/l10n/intl_hu.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Ha egy játékos az elhelyezési szakaszban megalapítja a malmot, akkor eltávolítja az ellenfél elhelyezett darabját, és folytatja a lépést.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_id.arb b/src/ui/flutter_app/lib/l10n/intl_id.arb index 7cb75b08..60899f88 100644 --- a/src/ui/flutter_app/lib/l10n/intl_id.arb +++ b/src/ui/flutter_app/lib/l10n/intl_id.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Jika seorang pemain membentuk penggilingan di fase penempatan, dia akan menghapus bidak lawan yang belum ditempatkan dan terus bergerak.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_it.arb b/src/ui/flutter_app/lib/l10n/intl_it.arb index 3576ac9f..0e55bbbf 100644 --- a/src/ui/flutter_app/lib/l10n/intl_it.arb +++ b/src/ui/flutter_app/lib/l10n/intl_it.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Se un giocatore forma il mulino nella fase di piazzamento, rimuoverà il pezzo non piazzato dell'avversario e continuerà a fare una mossa.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_ja.arb b/src/ui/flutter_app/lib/l10n/intl_ja.arb index ec485501..6a491806 100644 --- a/src/ui/flutter_app/lib/l10n/intl_ja.arb +++ b/src/ui/flutter_app/lib/l10n/intl_ja.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "スリーカムが形成されると、対戦相手の配置されていないピースのみをキャプチャしてゲームを続行できます。", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_kn.arb b/src/ui/flutter_app/lib/l10n/intl_kn.arb index 6336773e..1a00cc25 100644 --- a/src/ui/flutter_app/lib/l10n/intl_kn.arb +++ b/src/ui/flutter_app/lib/l10n/intl_kn.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "ಇರಿಸುವ ಹಂತದಲ್ಲಿ ಆಟಗಾರ್ತಿಯು ಗಿರಣಿಯನ್ನು ರೂಪಿಸಿದರೆ, ಆಕೆ ಎದುರಾಳಿಯ ಸ್ಥಾನವಿಲ್ಲದ ತುಂಡನ್ನು ತೆಗೆದು ಚಲನೆಯನ್ನು ಮುಂದುವರಿಸುತ್ತಾಳೆ.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_ko.arb b/src/ui/flutter_app/lib/l10n/intl_ko.arb index c081515e..ba90e9ec 100644 --- a/src/ui/flutter_app/lib/l10n/intl_ko.arb +++ b/src/ui/flutter_app/lib/l10n/intl_ko.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "플레이어가 배치 단계에서 밀을 형성하면 상대의 배치되지 않은 조각을 제거하고 계속 이동합니다.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_lt.arb b/src/ui/flutter_app/lib/l10n/intl_lt.arb index 19e5d00f..8273ad19 100644 --- a/src/ui/flutter_app/lib/l10n/intl_lt.arb +++ b/src/ui/flutter_app/lib/l10n/intl_lt.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Jei žaidėjas suformuoja malūną dėjimo stadijoje, ji pašalina priešininko nepadėtą figūrą ir toliau daro ėjimą.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_lv.arb b/src/ui/flutter_app/lib/l10n/intl_lv.arb index 91367e81..de3be4dc 100644 --- a/src/ui/flutter_app/lib/l10n/intl_lv.arb +++ b/src/ui/flutter_app/lib/l10n/intl_lv.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Ja spēlētājs ievieto dzirnavas ievietošanas fāzē, viņa noņem pretinieka nenovietoto gabalu un turpina gājienu.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_mk.arb b/src/ui/flutter_app/lib/l10n/intl_mk.arb index f5978141..008d5191 100644 --- a/src/ui/flutter_app/lib/l10n/intl_mk.arb +++ b/src/ui/flutter_app/lib/l10n/intl_mk.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Ако играчот ја формира воденицата во фазата на пласман, таа ќе го отстрани непласираното парче на противничката и ќе продолжи да прави потег.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_ms.arb b/src/ui/flutter_app/lib/l10n/intl_ms.arb index 7c11be20..18f33015 100644 --- a/src/ui/flutter_app/lib/l10n/intl_ms.arb +++ b/src/ui/flutter_app/lib/l10n/intl_ms.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Sekiranya pemain membentuk kilang dalam fasa penempatan, dia akan mengeluarkan bahagian lawan yang tidak ditempatkan dan terus bergerak.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_nl.arb b/src/ui/flutter_app/lib/l10n/intl_nl.arb index 70723647..4d15ee60 100644 --- a/src/ui/flutter_app/lib/l10n/intl_nl.arb +++ b/src/ui/flutter_app/lib/l10n/intl_nl.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Als een speler de molen vormt in de plaatsingsfase, zal ze het niet-geplaatste stuk van de tegenstander verwijderen en doorgaan met een zet.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_nn.arb b/src/ui/flutter_app/lib/l10n/intl_nn.arb index fc2e28ff..296b7247 100644 --- a/src/ui/flutter_app/lib/l10n/intl_nn.arb +++ b/src/ui/flutter_app/lib/l10n/intl_nn.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Hvis en spiller danner møllen i plasseringsfasen, vil hun fjerne motstanderens uplasserte brikke og fortsette å gjøre et trekk.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_pl.arb b/src/ui/flutter_app/lib/l10n/intl_pl.arb index 4b403977..01b5371b 100644 --- a/src/ui/flutter_app/lib/l10n/intl_pl.arb +++ b/src/ui/flutter_app/lib/l10n/intl_pl.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Jeśli gracz utworzy młyn w fazie układania, usunie nieumieszczony pion przeciwnika i kontynuuje ruch.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_pt.arb b/src/ui/flutter_app/lib/l10n/intl_pt.arb index 85e683a2..15454346 100644 --- a/src/ui/flutter_app/lib/l10n/intl_pt.arb +++ b/src/ui/flutter_app/lib/l10n/intl_pt.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Se um jogador formar o moinho na fase de colocação, ele removerá a peça não colocada do oponente e continuará a fazer um movimento.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_ro.arb b/src/ui/flutter_app/lib/l10n/intl_ro.arb index 69346fd8..2caa5ba7 100644 --- a/src/ui/flutter_app/lib/l10n/intl_ro.arb +++ b/src/ui/flutter_app/lib/l10n/intl_ro.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Dacă un jucător formează moara în faza de plasare, va elimina piesa neplasată a adversarului și va continua să facă o mișcare.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_ru.arb b/src/ui/flutter_app/lib/l10n/intl_ru.arb index badbe06a..61a24d17 100644 --- a/src/ui/flutter_app/lib/l10n/intl_ru.arb +++ b/src/ui/flutter_app/lib/l10n/intl_ru.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Если игрок формирует мельницу в фазе размещения, он удалит неразмещенную фишку противника и продолжит движение.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_sk.arb b/src/ui/flutter_app/lib/l10n/intl_sk.arb index 398b6d81..75d7b369 100644 --- a/src/ui/flutter_app/lib/l10n/intl_sk.arb +++ b/src/ui/flutter_app/lib/l10n/intl_sk.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Ak hráč formuje mlyn vo fáze kladenia, odstráni súperovo neumiestnené miesto a pokračuje v ťahu.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_sl.arb b/src/ui/flutter_app/lib/l10n/intl_sl.arb index eedd9bd4..023b14c1 100644 --- a/src/ui/flutter_app/lib/l10n/intl_sl.arb +++ b/src/ui/flutter_app/lib/l10n/intl_sl.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Če igralec v fazi postavitve oblikuje mlin, bo odstranil nasprotnikov nezameščen kos in nadaljeval s potezo.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_sq.arb b/src/ui/flutter_app/lib/l10n/intl_sq.arb index 13e039c5..29aa9b66 100644 --- a/src/ui/flutter_app/lib/l10n/intl_sq.arb +++ b/src/ui/flutter_app/lib/l10n/intl_sq.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Nëse një lojtar formon mullirin në fazën e vendosjes, ajo do të heqë pjesën e pavendosur të kundërshtarit dhe do të vazhdojë të bëjë një lëvizje.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_sr.arb b/src/ui/flutter_app/lib/l10n/intl_sr.arb index 0d1c3f1a..11c395de 100644 --- a/src/ui/flutter_app/lib/l10n/intl_sr.arb +++ b/src/ui/flutter_app/lib/l10n/intl_sr.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Ако играч формира воденицу у фази постављања, она ће уклонити противников незамењени део и наставити да прави потез.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_sv.arb b/src/ui/flutter_app/lib/l10n/intl_sv.arb index e5cf462c..cdc31b22 100644 --- a/src/ui/flutter_app/lib/l10n/intl_sv.arb +++ b/src/ui/flutter_app/lib/l10n/intl_sv.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Om en spelare bildar kvarnen i placeringsfasen, tar hon bort motståndarens oplacerade bit och fortsätter att göra ett drag.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_te.arb b/src/ui/flutter_app/lib/l10n/intl_te.arb index 010a69d2..a25d3c6c 100644 --- a/src/ui/flutter_app/lib/l10n/intl_te.arb +++ b/src/ui/flutter_app/lib/l10n/intl_te.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "ప్లేసింగ్ ఉంచే దశలో ఒక క్రీడాకారుడు మిల్లును ఏర్పాటు చేస్తే, ఆమె ప్రత్యర్థి యొక్క అన్‌ప్లాస్డ్ భాగాన్ని తీసివేసి, ఒక కదలికను కొనసాగిస్తుంది.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_th.arb b/src/ui/flutter_app/lib/l10n/intl_th.arb index a73df6cb..58c3ec9d 100644 --- a/src/ui/flutter_app/lib/l10n/intl_th.arb +++ b/src/ui/flutter_app/lib/l10n/intl_th.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "หากผู้เล่นสร้างโรงสีในขั้นตอนการวาง เธอจะถอดชิ้นส่วนที่ไม่ได้วางของคู่ต่อสู้ออกและทำการเคลื่อนไหวต่อไป", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_tr.arb b/src/ui/flutter_app/lib/l10n/intl_tr.arb index 662c8680..28b4a4ac 100644 --- a/src/ui/flutter_app/lib/l10n/intl_tr.arb +++ b/src/ui/flutter_app/lib/l10n/intl_tr.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Bir oyuncu değirmeni yerleştirme aşamasında oluşturursa, rakibin yerleştirilmemiş taşını kaldıracak ve hamle yapmaya devam edecektir.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_uz.arb b/src/ui/flutter_app/lib/l10n/intl_uz.arb index 064a7ea5..a5c3c78c 100644 --- a/src/ui/flutter_app/lib/l10n/intl_uz.arb +++ b/src/ui/flutter_app/lib/l10n/intl_uz.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Agar o'yinchi joylashtirish bosqichida tegirmonni hosil qilsa, u raqibning joylanmagan qismini olib tashlaydi va harakatni davom ettiradi.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_vi.arb b/src/ui/flutter_app/lib/l10n/intl_vi.arb index acd55f67..9d65b5da 100644 --- a/src/ui/flutter_app/lib/l10n/intl_vi.arb +++ b/src/ui/flutter_app/lib/l10n/intl_vi.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "Nếu một người chơi hình thành cối xay trong giai đoạn đặt, cô ấy sẽ loại bỏ quân cờ của đối thủ và tiếp tục di chuyển.", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_zh.arb b/src/ui/flutter_app/lib/l10n/intl_zh.arb index 9d7058fd..7eaa7c22 100644 --- a/src/ui/flutter_app/lib/l10n/intl_zh.arb +++ b/src/ui/flutter_app/lib/l10n/intl_zh.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "当形成三连时,只能吃掉对手未摆的棋子并继续行棋。", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/l10n/intl_zh_Hant.arb b/src/ui/flutter_app/lib/l10n/intl_zh_Hant.arb index 50ad9abb..9536db44 100644 --- a/src/ui/flutter_app/lib/l10n/intl_zh_Hant.arb +++ b/src/ui/flutter_app/lib/l10n/intl_zh_Hant.arb @@ -1208,5 +1208,17 @@ "removeUnplacedPiece_Detail": "當形成三連時,只能吃掉對手未擺的棋子並繼續行棋。", "@removeUnplacedPiece_Detail": { "description": "If a player forms the mill in the placing phase, she will remove the opponent's unplaced piece and continue to make a move." + }, + "endgameNMoveRule": "Endgame N-Move rule", + "@endgameNMoveRule": { + "description": "Endgame N-Move rule" + }, + "endgameNMoveRule_Detail": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn.", + "@endgameNMoveRule_Detail": { + "description": "If either player has only three pieces and neither player removes a piece within a specific moves, the game is drawn." + }, + "drawReasonEndgameRule50": "Either player has only three pieces and neither player removes a piece within a specific moves.", + "@drawReasonEndgameRule50": { + "description": "Either player has only three pieces and neither player removes a piece within a specific moves." } } \ No newline at end of file diff --git a/src/ui/flutter_app/lib/mill/position.dart b/src/ui/flutter_app/lib/mill/position.dart index fa6f3080..e2d4acad 100644 --- a/src/ui/flutter_app/lib/mill/position.dart +++ b/src/ui/flutter_app/lib/mill/position.dart @@ -293,6 +293,10 @@ class Position { // TODO: WAR to judge rule50 if (rule.nMoveRule > 0 && posKeyHistory.length > rule.nMoveRule - 1) { gameOverReason = GameOverReason.drawReasonRule50; + } else if (rule.endgameNMoveRule < rule.nMoveRule && + isThreeEndgame() && + posKeyHistory.length > rule.endgameNMoveRule - 1) { + gameOverReason = GameOverReason.drawReasonEndgameRule50; } else { gameOverReason = GameOverReason.drawReasonThreefoldRepetition; } @@ -764,6 +768,15 @@ class Position { } } + bool isThreeEndgame() { + if (phase == Phase.placing) { + return false; + } + + return pieceOnBoardCount[PieceColor.white] == 3 || + pieceOnBoardCount[PieceColor.black] == 3; + } + bool checkIfGameIsOver() { if (phase == Phase.ready || phase == Phase.gameOver) { return true; @@ -774,6 +787,13 @@ class Position { return true; } + if (rule.endgameNMoveRule < rule.nMoveRule && + isThreeEndgame() && + posKeyHistory.length > rule.endgameNMoveRule) { + setGameOver(PieceColor.draw, GameOverReason.drawReasonEndgameRule50); + return true; + } + if (pieceOnBoardCount[PieceColor.white]! + pieceOnBoardCount[PieceColor.black]! >= rankNumber * fileNumber) { diff --git a/src/ui/flutter_app/lib/mill/rule.dart b/src/ui/flutter_app/lib/mill/rule.dart index ae5c2362..330e9d2b 100644 --- a/src/ui/flutter_app/lib/mill/rule.dart +++ b/src/ui/flutter_app/lib/mill/rule.dart @@ -35,6 +35,7 @@ class Rule { bool isLoseButNotChangeSideWhenNoWay = true; bool mayFly = true; int nMoveRule = 100; + int endgameNMoveRule = 100; } Rule rule = Rule(); diff --git a/src/ui/flutter_app/lib/mill/types.dart b/src/ui/flutter_app/lib/mill/types.dart index b2c0ab85..acd007e8 100644 --- a/src/ui/flutter_app/lib/mill/types.dart +++ b/src/ui/flutter_app/lib/mill/types.dart @@ -183,6 +183,7 @@ enum GameOverReason { loseReasonTimeOver, drawReasonThreefoldRepetition, drawReasonRule50, + drawReasonEndgameRule50, drawReasonBoardIsFull } diff --git a/src/ui/flutter_app/lib/widgets/game_page.dart b/src/ui/flutter_app/lib/widgets/game_page.dart index 9c46ed39..7f6c0dd9 100644 --- a/src/ui/flutter_app/lib/widgets/game_page.dart +++ b/src/ui/flutter_app/lib/widgets/game_page.dart @@ -1207,6 +1207,8 @@ class _GamePageState extends State GameOverReason.loseReasonTimeOver: loserStr + S.of(context).loseReasonTimeOver, GameOverReason.drawReasonRule50: S.of(context).drawReasonRule50, + GameOverReason.drawReasonEndgameRule50: + S.of(context).drawReasonEndgameRule50, GameOverReason.drawReasonBoardIsFull: S.of(context).drawReasonBoardIsFull, GameOverReason.drawReasonThreefoldRepetition: S.of(context).drawReasonThreefoldRepetition, diff --git a/src/ui/flutter_app/lib/widgets/rule_settings_page.dart b/src/ui/flutter_app/lib/widgets/rule_settings_page.dart index 49c68c24..f75bc4ff 100644 --- a/src/ui/flutter_app/lib/widgets/rule_settings_page.dart +++ b/src/ui/flutter_app/lib/widgets/rule_settings_page.dart @@ -86,6 +86,14 @@ class _RuleSettingsPageState extends State { onTap: setNMoveRule, ), ListItemDivider(), + SettingsListTile( + context: context, + titleString: S.of(context).endgameNMoveRule, + subtitleString: S.of(context).endgameNMoveRule_Detail, + trailingString: Config.endgameNMoveRule.toString(), + onTap: setEndgameNMoveRule, + ), + ListItemDivider(), ], ), SizedBox(height: AppTheme.sizedBoxHeight), @@ -331,6 +339,99 @@ class _RuleSettingsPageState extends State { ); } + setEndgameNMoveRule() { + callback(int? endgameNMoveRule) async { + print("[config] endgameNMoveRule = $endgameNMoveRule"); + + Navigator.of(context).pop(); + + setState(() { + rule.endgameNMoveRule = + Config.endgameNMoveRule = endgameNMoveRule ?? 100; + }); + + print("[config] rule.endgameNMoveRule: ${rule.endgameNMoveRule}"); + + Config.save(); + } + + showModalBottomSheet( + context: context, + builder: (BuildContext context) => Semantics( + label: S.of(context).endgameNMoveRule, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + RadioListTile( + activeColor: AppTheme.switchListTileActiveColor, + title: Text('5'), + groupValue: Config.endgameNMoveRule, + value: 5, + onChanged: callback, + ), + ListItemDivider(), + RadioListTile( + activeColor: AppTheme.switchListTileActiveColor, + title: Text('10'), + groupValue: Config.endgameNMoveRule, + value: 10, + onChanged: callback, + ), + ListItemDivider(), + RadioListTile( + activeColor: AppTheme.switchListTileActiveColor, + title: Text('20'), + groupValue: Config.endgameNMoveRule, + value: 20, + onChanged: callback, + ), + ListItemDivider(), + RadioListTile( + activeColor: AppTheme.switchListTileActiveColor, + title: Text('30'), + groupValue: Config.endgameNMoveRule, + value: 30, + onChanged: callback, + ), + ListItemDivider(), + RadioListTile( + activeColor: AppTheme.switchListTileActiveColor, + title: Text('50'), + groupValue: Config.endgameNMoveRule, + value: 50, + onChanged: callback, + ), + ListItemDivider(), + RadioListTile( + activeColor: AppTheme.switchListTileActiveColor, + title: Text('60'), + groupValue: Config.endgameNMoveRule, + value: 60, + onChanged: callback, + ), + ListItemDivider(), + RadioListTile( + activeColor: AppTheme.switchListTileActiveColor, + title: Text('100'), + groupValue: Config.endgameNMoveRule, + value: 100, + onChanged: callback, + ), + ListItemDivider(), + RadioListTile( + activeColor: AppTheme.switchListTileActiveColor, + title: Text('200'), + groupValue: Config.endgameNMoveRule, + value: 200, + onChanged: callback, + ), + ListItemDivider(), + ], + ), + ), + ); + } + setFlyPieceCount() { callback(int? flyPieceCount) async { print("[config] flyPieceCount = $flyPieceCount"); diff --git a/src/ui/qt/game.cpp b/src/ui/qt/game.cpp index 1f77e13a..1f018e94 100644 --- a/src/ui/qt/game.cpp +++ b/src/ui/qt/game.cpp @@ -1619,6 +1619,9 @@ void Game::appendGameOverReasonToMoveHistory() case GameOverReason::drawReasonRule50: snprintf(record, Position::RECORD_LEN_MAX, drawReasonRule50Str); break; + case GameOverReason::drawReasonEndgameRule50: + snprintf(record, Position::RECORD_LEN_MAX, drawReasonEndgameRule50Str); + break; case GameOverReason::loseReasonBoardIsFull: snprintf(record, Position::RECORD_LEN_MAX, loseReasonBoardIsFullStr); break; @@ -1719,12 +1722,15 @@ void Game::setTips() case GameOverReason::drawReasonRule50: reasonStr = "连续50回合无吃子判和。"; break; + case GameOverReason::drawReasonEndgameRule50: + reasonStr = "残局中连续50回合无吃子判和。"; + break; case GameOverReason::drawReasonBoardIsFull: reasonStr = "棋盘满判和。"; break; default: break; - } + } tips = reasonStr + resultStr + scoreStr; break;