main.cxx 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. //
  2. // main.cxx
  3. // curses_dice
  4. //
  5. // Created by Sam Jaffe on 7/23/24.
  6. // Copyright © 2024 Sam Jaffe. All rights reserved.
  7. //
  8. #include <sstream>
  9. #include <ncurses-wrapper/cli.h>
  10. #include <ncurses-wrapper/color.h>
  11. #include <ncurses-wrapper/window.h>
  12. #include "dice-roll/die.h"
  13. #include "dice-roll/exception.h"
  14. #include "dice-roll/roll.h"
  15. using namespace curses;
  16. ColorPair color(bool good, bool bad) {
  17. if (good) {
  18. return ColorPair{Color::GREEN, Color::DEFAULT};
  19. } else if (bad) {
  20. return ColorPair{Color::RED, Color::DEFAULT};
  21. } else {
  22. return ColorPair{Color::DEFAULT, Color::DEFAULT};
  23. }
  24. }
  25. ColorPair color(bool good) { return color(good, !good); }
  26. void print(curses::Window & window, int roll, int sides) {
  27. if (auto scope = window.with(color(roll == sides, roll == 1))) {
  28. window.printf("%d", roll);
  29. }
  30. }
  31. void print(curses::Window & window, dice::dice_roll const & r) {
  32. if (r.dc.comp != dice::difficulty_class::test::None) {
  33. if (auto scope = window.with(color(int(r)))) {
  34. window << (int(r) ? "PASS" : "FAIL");
  35. }
  36. window.printf(" (");
  37. } else {
  38. window.printf("%d (", int(r));
  39. }
  40. for (dice::die_roll const & dr : r.sub_rolls) {
  41. window << dr.sign;
  42. switch (dr.rolled.size()) {
  43. case 0:
  44. window.printf("0");
  45. break;
  46. case 1:
  47. print(window, dr.rolled[0], dr.sides);
  48. break;
  49. default:
  50. window.printf("[ ");
  51. print(window, dr.rolled[0], dr.sides);
  52. for (int i = 1; i < dr.rolled.size(); ++i) {
  53. window.printf(", ");
  54. print(window, dr.rolled[i], dr.sides);
  55. }
  56. window.printf(" ]");
  57. }
  58. }
  59. for (dice::mod const & m : r.modifiers) {
  60. window << m.sign;
  61. window.printf("%d", m.value);
  62. }
  63. window.printf(")\n");
  64. }
  65. void print(curses::Window & window, std::vector<dice::dice_roll> const & rs) {
  66. if (rs.size() != 1) {
  67. window.printf("\n");
  68. for (int i = 0; i < rs.size(); ++i) {
  69. window.printf(" Result/%d: ", i);
  70. print(window, rs[i]);
  71. }
  72. } else {
  73. print(window, rs[0]);
  74. }
  75. }
  76. int main(int, const char **) {
  77. Cli("> ", WithColor).loop([](curses::Window & window, std::string line) {
  78. if (line.empty()) return;
  79. auto d = dice::from_string(line);
  80. auto rs = dice::roller()(d);
  81. window << "Result of '" << d << "': ";
  82. print(window, rs);
  83. });
  84. return 0;
  85. }