roll.cxx 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. //
  2. // roll.cxx
  3. // dice-roll
  4. //
  5. // Created by Sam Jaffe on 12/1/18.
  6. // Copyright © 2018 Sam Jaffe. All rights reserved.
  7. //
  8. #include "dice-roll/roll.h"
  9. #include <numeric>
  10. #include "dice-roll/random.h"
  11. namespace dice {
  12. die_roll::operator int() const {
  13. return sgn(sign) * std::accumulate(rolled.begin(), rolled.end(), 0);
  14. }
  15. dice_roll::operator int() const {
  16. auto subtotal = std::accumulate(sub_rolls.begin(), sub_rolls.end(), 0) +
  17. std::accumulate(modifiers.begin(), modifiers.end(), 0);
  18. if (dc.comp != difficulty_class::test::None) {
  19. return static_cast<int>(dc(subtotal));
  20. } else {
  21. return subtotal;
  22. }
  23. }
  24. die_roll roll_impl(die const & d, engine::random & gen) {
  25. std::vector<int> hits;
  26. for (int i = 0; i < d.num; ++i) {
  27. hits.push_back(gen.roll(d.sides));
  28. }
  29. switch (d.keep.method) {
  30. case keep::Highest:
  31. for (int i = 0; i < d.num - d.keep.amount; ++i) {
  32. hits.erase(std::min_element(hits.begin(), hits.end()));
  33. }
  34. break;
  35. case keep::Lowest:
  36. for (int i = 0; i < d.num - d.keep.amount; ++i) {
  37. hits.erase(std::max_element(hits.begin(), hits.end()));
  38. }
  39. break;
  40. default:
  41. break;
  42. }
  43. return {d.sgn, hits};
  44. }
  45. dice_roll roll_impl(dice const & d, engine::random & gen) {
  46. std::vector<die_roll> hits;
  47. for (die const & di : d.of) {
  48. hits.push_back(roll_impl(di, gen));
  49. }
  50. return {hits, d.modifier, d.dc};
  51. }
  52. roller::roller() : gen() {}
  53. roller::roller(engine::random && g) : gen(std::forward<engine::random>(g)) {}
  54. std::vector<dice_roll> roller::operator()(dice const & d) {
  55. std::vector<dice_roll> out;
  56. for (int i = 0; i < d.num; ++i) {
  57. out.emplace_back(roll_impl(d, gen));
  58. }
  59. return out;
  60. }
  61. }