|
|
@@ -12,22 +12,8 @@
|
|
|
#include <memory>
|
|
|
#include <numeric>
|
|
|
|
|
|
-#include "die.h"
|
|
|
#include "random.h"
|
|
|
|
|
|
-namespace dice {
|
|
|
- struct die_roll {
|
|
|
- operator int() const;
|
|
|
- sign sign;
|
|
|
- std::vector<int> rolled;
|
|
|
- };
|
|
|
- struct dice_roll {
|
|
|
- operator int() const;
|
|
|
- std::vector<die_roll> sub_rolls;
|
|
|
- std::vector<mod> modifiers;
|
|
|
- };
|
|
|
-}
|
|
|
-
|
|
|
namespace dice {
|
|
|
die_roll::operator int() const {
|
|
|
return sgn(sign) * std::accumulate(rolled.begin(), rolled.end(), 0);
|
|
|
@@ -38,34 +24,32 @@ namespace dice {
|
|
|
std::accumulate(modifiers.begin(), modifiers.end(), 0);
|
|
|
}
|
|
|
|
|
|
- void print(std::ostream & out, die_roll const & r) {
|
|
|
+ std::ostream & operator<<(std::ostream & out, die_roll const & r) {
|
|
|
out << str(r.sign);
|
|
|
- if (r.rolled.size() > 1) {
|
|
|
- out << "[ ";
|
|
|
- }
|
|
|
- out << r.rolled[0];
|
|
|
- for (int i = 1; i < r.rolled.size(); ++i) {
|
|
|
- out << ", " << r.rolled[i];
|
|
|
- }
|
|
|
- if (r.rolled.size() > 1) {
|
|
|
- out << " ]";
|
|
|
+ switch (r.rolled.size()) {
|
|
|
+ // Prevent crashes if we somehow get a 0dM expression
|
|
|
+ case 0: return out << "0";
|
|
|
+ // Don't bother with braces if there's only a single roll,
|
|
|
+ // the braces are for grouping purposes.
|
|
|
+ case 1: return out << r.rolled[0];
|
|
|
+ default:
|
|
|
+ out << "[ ";
|
|
|
+ out << r.rolled[0];
|
|
|
+ for (int i = 1; i < r.rolled.size(); ++i) {
|
|
|
+ out << ", " << r.rolled[i];
|
|
|
+ }
|
|
|
+ return out << " ]";
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- void print(std::ostream & out, dice_roll const & r) {
|
|
|
+ std::ostream & operator<<(std::ostream & out, dice_roll const & r) {
|
|
|
for (die_roll const & dr : r.sub_rolls) {
|
|
|
- print(out, dr);
|
|
|
+ out << dr;
|
|
|
}
|
|
|
for (mod const & m : r.modifiers) {
|
|
|
- out << str(m.sign);
|
|
|
- out << m.value;
|
|
|
+ out << str(m.sign) << m.value;
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- std::ostream & operator<<(std::ostream & out, dice_roll const & r) {
|
|
|
- out << int(r) << " (";
|
|
|
- print(out, r);
|
|
|
- return out << ")";
|
|
|
+ return out;
|
|
|
}
|
|
|
|
|
|
die_roll roll_impl(die const & d, engine::random & gen) {
|
|
|
@@ -84,18 +68,12 @@ namespace dice {
|
|
|
return {hits, d.modifier};
|
|
|
}
|
|
|
|
|
|
- void roll(dice const & d) {
|
|
|
+ std::vector<dice_roll> roll(dice const & d) {
|
|
|
+ std::vector<dice_roll> out;
|
|
|
engine::random gen;
|
|
|
- std::cout << "Result of '" << d << "': ";
|
|
|
- if (d.num != 1) {
|
|
|
- std::cout << "\n";
|
|
|
- for (int i = 0; i < d.num; ++i) {
|
|
|
- auto r = roll_impl(d, gen);
|
|
|
- std::cout << " Result/" << i << ": " << r << "\n";
|
|
|
- }
|
|
|
- } else {
|
|
|
- auto r = roll_impl(d, gen);
|
|
|
- std::cout << r << "\n";
|
|
|
+ for (int i = 0; i < d.num; ++i) {
|
|
|
+ out.emplace_back(roll_impl(d, gen));
|
|
|
}
|
|
|
+ return out;
|
|
|
}
|
|
|
}
|