diff --git a/src/dice.c b/src/dice.c new file mode 100644 index 0000000..50acdf4 --- /dev/null +++ b/src/dice.c @@ -0,0 +1,44 @@ +#include "dice.h" +#include +#include + +int roll_die(enum die_type die) { + int const max = die - 1; + return (rand() % max) + 1; +} + +static int current_active_count = 0; +static enum die_type active_dice_set[MAX_ACTIVE_DICE]; + +enum die_type const *get_active_dice_set(size_t *out_length) { + if (out_length != nullptr) { + *out_length = current_active_count; + } + return active_dice_set; +} + +size_t add_die_to_active(enum die_type die) { + if (current_active_count >= MAX_ACTIVE_DICE) { + return MAX_ACTIVE_DICE; + } + active_dice_set[current_active_count] = die; + return current_active_count++; +} + +void remove_die_from_active(size_t index) { + memmove(active_dice_set + index + 1, active_dice_set + index, MAX_ACTIVE_DICE - index - 1); +} + +struct roll_result_type roll_active_dice_set(enum die_type die) { + struct roll_result_type results = { + .individual_result_count = MAX_ACTIVE_DICE, + .total = 0 + }; + for (size_t i = 0; i < current_active_count; ++i) { + results.individual_results[i] = roll_die(active_dice_set[i]); + results.total += results.individual_results[i]; + } + + return results; +} + diff --git a/src/dice.h b/src/dice.h new file mode 100644 index 0000000..370edac --- /dev/null +++ b/src/dice.h @@ -0,0 +1,33 @@ +#ifndef DICE_H +#define DICE_H + +#include + +#ifndef MAX_ACTIVE_DICE +#define MAX_ACTIVE_DICE 5 +#endif + +enum die_type { + COIN = 2, + D4 = 4, + D8 = 8, + D10 = 10, + D12 = 12, + D20 = 20, + D100 = 100 +}; + +struct roll_result_type { + size_t individual_result_count; + int individual_results[MAX_ACTIVE_DICE]; + int total; +}; + +extern int roll_die(enum die_type die); + +extern enum die_type const *get_active_dice_set(size_t *out_length); +extern size_t add_die_to_active(enum die_type die); +extern void remove_die_from_active(size_t index); +extern struct roll_result_type roll_active_dice_set(enum die_type die); + +#endif // !DICE_H