# Riichi Mahjong Calculator Via the Terminal CLI tool that calculates the score of a hand in riichi mahjong.
- Manual mode (Calculator Mode): given han and fu, calculates the score
- Normal mode: given a hand, calculates the score with included yaku and fu ![demo gif](demo.gif) ## Examples ### Calculator Mode ```bash ~/$ mahc -m 4 30 --ba 3 > Dealer: 12500 (4200) non-dealer: 8600 (2300/ 4200) ``` ### Normal Mode note: the winning group has to go last (this is to calculate fu correctly) ``` bash ~/$ mahc --tiles 777z 111z 234p 234p 11p -w 1p -p Ew -s Ew > 7 Han/ 50 Fu Dealer: 18000 (6000) Non-dealer: 12000 (3000/6000) Yaku: Iipeikou: 1 Honitsu: 3 Yakuhai: 1 Yakuhai: 1 Yakuhai: 1 Fu: BasePoints: 20 ClosedRon: 10 NonSimpleClosedTriplet: 8 NonSimpleClosedTriplet: 8 SingleWait: 2 ``` ### Using file input ``` # hands.txt --tiles 1p 9p 1s 9s 1m 9m rd gd wd Ew Sw Nw WWw -w Ww -p Ew -s Ew --tiles 11z NNw SSw WWw rrd wwd ggd -w gd -p Ew -s Ew -d Ew Ew -m 4 30 --ba 3 ``` ```bash ~/$ mahc -f hands.txt ❯ Dealer: 96000 (32000) Non-dealer: 64000 (16000/32000) Yaku: KokushiMusou Yakuman KokushiMusou Yakuman 13 sided wait Dealer: 144000 (48000) Non-dealer: 96000 (24000/48000) Yaku: Tsuuiisou Yakuman Daichiishin Yakuman Shousuushii Yakuman 4 Han/ 30 Fu/ 3 Honba Dealer: 12500 (4200) non-dealer: 8600 (2300/4200) ``` ### Json out in ***normal mode*** ```bash ~/$ mahc --tiles 123p 456p 789p rrrdo 99p -w 9p -p Ew -s Ew -d 9p --json ``` yields ```json { "dora":1, "fu":30, "fuString":[ "BasePoints: 20", "NonSimpleOpenTriplet: 4", "SingleWait: 2" ], "han":5, "honba":0, "scores":{ "dealer":{"ron":12000,"tsumo":4000}, "non-dealer":{ "ron":8000, "tsumo":{"dealer":4000,"non-dealer":2000} } }, "yakuString":["Honitsu: 2","Ittsuu: 1","Yakuhai: 1"]} ``` and in ***calculator mode*** ```bash ~/$ mahc -m 4 30 --ba 3 --json ``` yields ```json { "fu":30, "han":4, "honba":3, "scores":{ "dealer":{ "ron":12500, "tsumo":4200 }, "non-dealer":{ "ron":8600, "tsumo":{ "dealer":4200, "non-dealer":2300 } } } } ``` ## Notation ### Suits | Type | Notation | |-------|-----------------------------------------------| | Man (Characters) | 1m, 2m, 3m, 4m, 5m, 6m, 7m, 8m, 9m | | Pin (Circles) | 1p, 2p, 3p, 4p, 5p, 6p, 7p, 8p, 9p | | Sou (Bamboos) | 1s, 2s, 3s, 4s, 5s, 6s, 7s, 8s, 9s | ### Honors | Type | Notation | MPSZ Notation | |---------|----------------|--------------------| | Winds | Ew, Sw, Ww, Nw |1z, 2z, 3z, 4z | | Dragons | wd, gd, rd |5z, 6z, 7z | ### Special Notation | Description | Example | |-----------------|-------------------------------------------------| | Open Sets | 234po (an open sequence of 2, 3, 4 in Pin suit) | | akadora | 0m, 0p, 0s | - eg: EEEw (triplet of east wind) - eg: 234m (sequence of 2 3 4 Man) - eg: 406s (sequence of 4 5 6 Sou with the akadora 5 sou) - eg: rrrrdo (open quad of red dragon) - eg: 11s (pair of 1 sou) - eg: 8m (8 man tile) ## Installation #### *using cargo* ``` cargo install mahc mahc --version ``` #### *build from source* ``` git clone https://github.com/DrCheeseFace/mahc cd mahc cargo build ./target/debug/mahc --version ``` #### *from latest release* ``` curl -s https://api.github.com/repos/DrCheeseFace/rusty-riichi-mahjong-calculator/releases/latest | grep "browser_download_url" | cut -d '"' -f 4 | wget -i - unzip mahc-v1.1.0-x86_64-unknown-linux-gnu.zip -d mahc cd mahc/x86_64-unknown-linux-gnu/release ./mahc --version ``` ## Implemented hand validations as of yet ##### One Han Yaku - [x] Tanyao - [x] Iipeikou - [x] Yakuhai - [x] MenzenTsumo - [x] Pinfu - [x] Riichi - [x] Ippatsu - [x] Haitei - [x] RinshanKaihou - [x] Chankan ##### Two Han Yaku - [x] DoubleRiichi - [x] Toitoi - [x] Ittsuu - [x] SanshokuDoujun - [x] Chantaiyao - [x] Sanankou - [x] SanshokuDoukou - [x] Sankantsu - [x] Honroutou - [x] Shousangen - [x] Chiitoitsu ##### Three Han Yaku - [x] Honitsu - [x] JunchanTaiyao - [x] Ryanpeikou ##### Six Han Yaku - [x] Chinitsu ##### Yakuman - [x] KazoeYakuman - [x] KokushiMusou - [x] KokushiMusou 13 sided wait - [x] Suuankou - [x] Suuankou tanki wait - [x] Daisangen - [x] Shousuushii - [x] Daisuushii - [x] Tsuuiisou - [x] Daiichishin - [x] Chinroutou - [x] Ryuuiisou - [x] ChuurenPoutou - [x] ChuurenPoutou 9 sided wait - [x] Suukantsu - [x] Tenhou - [x] Chiihou ## TODO - [x] validation a hand is possible (eg not having 20 east tiles :) - [x] add all da yaku - [x] validation on if yaku is there - [x] validate winning tile - [x] propogate the errors up for a nice printout - [x] validate stuff like cant riichi and double riichi. all that haitei, chankan rinshan shizz - [x] file stdIn - [x] json out flag - [x] tile input for ```--dora``` flag - [ ] add more comprehensive tests - [ ] document the undocumented ## Contributing - If you spot a bug (which there probabably are many), put in an issue with how to reproduce it - if youd like to contribute, DO IT (send a PR) - keep in mind, we pretty far from finishing it currently. so FUCK validation (for the time being) ![this.jpg](https://64.media.tumblr.com/07006d83e5810b3c651254e7b9a3e713/c4dc091a7806e504-ef/s400x600/cdfb08014450e71074a0a8763a67661485d59f8c.gif)