// // main.cxx // curses_dice // // Created by Sam Jaffe on 7/23/24. // Copyright © 2024 Sam Jaffe. All rights reserved. // #include #include #include #include #include "dice-roll/die.h" #include "dice-roll/exception.h" #include "dice-roll/roll.h" using namespace curses; ColorPair color(bool good, bool bad) { if (good) { return ColorPair{Color::GREEN, Color::DEFAULT}; } else if (bad) { return ColorPair{Color::RED, Color::DEFAULT}; } else { return ColorPair{Color::DEFAULT, Color::DEFAULT}; } } ColorPair color(bool good) { return color(good, !good); } void print(curses::Window & window, int roll, int sides) { if (auto scope = window.with(color(roll == sides, roll == 1))) { window.printf("%d", roll); } } void print(curses::Window & window, dice::dice_roll const & r) { if (r.dc.comp != dice::difficulty_class::test::None) { if (auto scope = window.with(color(int(r)))) { window << (int(r) ? "PASS" : "FAIL"); } window.printf(" ("); } else { window.printf("%d (", int(r)); } for (dice::die_roll const & dr : r.sub_rolls) { window << dr.sign; switch (dr.rolled.size()) { case 0: window.printf("0"); break; case 1: print(window, dr.rolled[0], dr.sides); break; default: window.printf("[ "); print(window, dr.rolled[0], dr.sides); for (int i = 1; i < dr.rolled.size(); ++i) { window.printf(", "); print(window, dr.rolled[i], dr.sides); } window.printf(" ]"); } } for (dice::mod const & m : r.modifiers) { window << m.sign; window.printf("%d", m.value); } window.printf(")\n"); } void print(curses::Window & window, std::vector const & rs) { if (rs.size() != 1) { window.printf("\n"); for (int i = 0; i < rs.size(); ++i) { window.printf(" Result/%d: ", i); print(window, rs[i]); } } else { print(window, rs[0]); } } int main(int, const char **) { Cli("> ", WithColor).loop([](curses::Window & window, std::string line) { if (line.empty()) return; auto d = dice::from_string(line); auto rs = dice::roller()(d); window << "Result of '" << d << "': "; print(window, rs); }); return 0; }