| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- //
- // main.cxx
- // curses_dice
- //
- // Created by Sam Jaffe on 7/23/24.
- // Copyright © 2024 Sam Jaffe. All rights reserved.
- //
- #include <sstream>
- #include <ncurses-wrapper/cli.h>
- #include <ncurses-wrapper/color.h>
- #include <ncurses-wrapper/window.h>
- #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<dice::dice_roll> 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;
- }
|