diff options
Diffstat (limited to 'src/score.cpp')
-rw-r--r-- | src/score.cpp | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/score.cpp b/src/score.cpp new file mode 100644 index 0000000..7d0dc41 --- /dev/null +++ b/src/score.cpp @@ -0,0 +1,65 @@ +#include "score.h" + +inline int roundup(int value, int roundto) { + return value % roundto ? value + roundto - value % roundto : value; +} + +inline int max(int x, int y) { + return x < y ? x : y; +} + +Score::Score(int yaku_, int fu_, int dora_) : yaku(yaku_), fu(fu_), dora(dora_) { + +} + +int Score::han() { + return yaku + dora; +} + +int Score::fu_rounded() { + return roundup(fu, 10); +} + +int Score::base_points() { + if(han() < 5) { + // Normal hand. + return max(fu_rounded() << (2 + han()), 2000); + + } else if(han() <= 5) { + // Mangan. + return 2000; + + } else if(han() <= 7) { + // Haneman. + return 3000; + + } else if(han() <= 10) { + // Baiman. + return 4000; + + } else if(han() <= 12) { + // Sanbaiman. + return 6000; + + } else { + // Kazoe yakuman. + return 8000; + + } +} + +int Score::ron() { + return roundup(base_points() * 4, 100); +} + +int Score::ron_east() { + return roundup(base_points() * 6, 100); +} + +int Score::tsumo() { + return roundup(base_points(), 100); +} + +int Score::tsumo_east() { + return roundup(base_points() * 2, 100); +} |