forked from mirrors/misskey
* ビルドによる自動的なソース更新 * 麻雀関連のキーバリューペアを追加 * 役の定義をまとめてエクスポート * タイポ修正 * Revert "麻雀関連のキーバリューペアを追加" This reverts commit c349cdf70c69af89d93ed7db035efaaacf2c2785. * misskey-jsのビルドによる自動更新 * 型エラーに対処 * riichiがtrueの場合に門前であるかを確認 * EnvForCalcYakuのhouseプロパティを廃止 * 風牌の役の共通部分をクラスで定義 * タイポ修正 * 役牌をクラスで共通化 * 一盃口と二盃口のテストを通す * 一盃口・二盃口判定関数の調整 * 一気通貫の判定にチーによる順子も考慮する * 混全帯幺九の実装 * 純全帯幺九の実装 * 七対子の実装とテストの修正 * tsumoTileまたはronTileを必須に * 待ちを確認して平和の判定を可能に * 三暗刻と四暗刻、四暗刻単騎の実装 * 四暗刻であるために通常の役を判定できない牌姿のテストを修正 * 混老頭と清老頭を実装 * 三槓子と四槓子を実装 * 平和の実装とテストを修正 * 小三元のテストを修正 * 国士無双に対子の確認を追加 * 国士無双十三面待ちを実装し、テストを修正 * 一部の役の七対子形を認め、テストを追加 * 手牌の数を確認 * 役の定義をカプセル化して型エラーの対処 * ツモ・ロンの判定を修正 * calcYakusの引数のhandTilesを修正 * calcYakusに渡す風をseatWindに修正 * 嶺上開花の実装 * 海底摸月の実装 * FourMentsuOneJyantouWithWait型の作成 * 河底撈魚の実装 * ダブル立直の実装 * 天和・地和の実装 * エンジンのテストを作成 * エンジンによる地和のテストを追加 * 嶺上開花のテスト * ライセンスの記述を追加 * ダブル立直一発ツモのテスト * ダブル立直海底ツモのテスト * ダブル立直河底のテスト * 役満も処理できるように * 点数のテスト * 打牌時にrinshanFlags[house]をfalseに * 七対子形の字一色を認める * typo
71 lines
2.1 KiB
TypeScript
71 lines
2.1 KiB
TypeScript
/*
|
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
*/
|
|
|
|
import assert from "node:assert"
|
|
import { calcWaitPatterns } from "../src/common.fu"
|
|
import { analyzeFourMentsuOneJyantou } from "../src/common"
|
|
|
|
describe('Fu', () => {
|
|
describe('Wait patterns', () => {
|
|
it('Ryanmen', () => {
|
|
const fourMentsuOneJyantou = analyzeFourMentsuOneJyantou(
|
|
['m2', 'm3', 'm4', 'p6', 'p7', 'p8', 'p5', 'p6', 'p7', 's1', 's1', 's7', 's8', 's9']
|
|
)[0];
|
|
assert.deepStrictEqual(calcWaitPatterns(fourMentsuOneJyantou, 's9'), [{
|
|
...fourMentsuOneJyantou,
|
|
waitedFor: 'mentsu',
|
|
agariTile: 's9',
|
|
waitedTaatsu: ['s7', 's8'],
|
|
}]);
|
|
});
|
|
|
|
it('Kanchan', () => {
|
|
const fourMentsuOneJyantou = analyzeFourMentsuOneJyantou(
|
|
['m2', 'm3', 'm4', 'p6', 'p7', 'p8', 'p5', 'p6', 'p7', 's1', 's1', 's7', 's8', 's9']
|
|
)[0];
|
|
assert.deepStrictEqual(calcWaitPatterns(fourMentsuOneJyantou, 's8'), [{
|
|
...fourMentsuOneJyantou,
|
|
waitedFor: 'mentsu',
|
|
agariTile: 's8',
|
|
waitedTaatsu: ['s7', 's9'],
|
|
}]);
|
|
})
|
|
|
|
it('Penchan', () => {
|
|
const fourMentsuOneJyantou = analyzeFourMentsuOneJyantou(
|
|
['m2', 'm3', 'm4', 'p6', 'p7', 'p8', 'p5', 'p6', 'p7', 's1', 's1', 's7', 's8', 's9']
|
|
)[0];
|
|
assert.deepStrictEqual(calcWaitPatterns(fourMentsuOneJyantou, 's7'), [{
|
|
...fourMentsuOneJyantou,
|
|
waitedFor: 'mentsu',
|
|
agariTile: 's7',
|
|
waitedTaatsu: ['s8', 's9'],
|
|
}]);
|
|
})
|
|
|
|
it('Tanki', () => {
|
|
const fourMentsuOneJyantou = analyzeFourMentsuOneJyantou(
|
|
['m1', 'm1', 'm1', 'm2', 'm2', 'm2', 'm3', 'm3', 'm3', 'haku', 'haku', 'haku', 'e', 'e']
|
|
)[0];
|
|
assert.deepStrictEqual(calcWaitPatterns(fourMentsuOneJyantou, 'e'), [{
|
|
...fourMentsuOneJyantou,
|
|
waitedFor: 'head',
|
|
agariTile: 'e',
|
|
}]);
|
|
});
|
|
|
|
it('Nobetan', () => {
|
|
const fourMentsuOneJyantou = analyzeFourMentsuOneJyantou(
|
|
['m1', 'm2', 'm3', 'm5', 'm6', 'm7', 'p2', 'p3', 'p4', 's3', 's4', 's5', 's6', 's6']
|
|
)[0];
|
|
assert.deepStrictEqual(calcWaitPatterns(fourMentsuOneJyantou, 's6'), [{
|
|
...fourMentsuOneJyantou,
|
|
waitedFor: 'head',
|
|
agariTile: 's6',
|
|
}]);
|
|
});
|
|
});
|
|
});
|