summaryrefslogtreecommitdiff
path: root/src/spells4.c
diff options
context:
space:
mode:
authorBardur Arantsson <bardur@scientician.net>2012-05-27 17:54:26 +0200
committerBardur Arantsson <bardur@scientician.net>2012-05-29 05:38:01 +0200
commit48310612100205a13b4d743951fbc436d081d011 (patch)
treead97e584547176272dfee043bf23232da6d635a5 /src/spells4.c
parent33f06d33cc2f4cd3d36a9616f7f9e9abc7287080 (diff)
Lua: Add "dice_type" to support moving spells to C
Diffstat (limited to 'src/spells4.c')
-rw-r--r--src/spells4.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/spells4.c b/src/spells4.c
index e94274a2..1cbc451c 100644
--- a/src/spells4.c
+++ b/src/spells4.c
@@ -619,3 +619,96 @@ int compare_device_allocation(device_allocation *a, device_allocation *b)
}
SGLIB_DEFINE_LIST_FUNCTIONS(device_allocation, compare_device_allocation, next);
+
+void dice_init(dice_type *dice, long base, long num, long sides)
+{
+ assert(dice != NULL);
+
+ dice->base = base;
+ dice->num = num;
+ dice->sides = sides;
+}
+
+bool_ dice_parse(dice_type *dice, cptr s)
+{
+ long base, num, sides;
+
+ if (sscanf(s, "%ld+%ldd%ld", &base, &num, &sides) == 3)
+ {
+ dice_init(dice, base, num, sides);
+ return TRUE;
+ }
+
+ if (sscanf(s, "%ld+d%ld", &base, &sides) == 2)
+ {
+ dice_init(dice, base, 1, sides);
+ return TRUE;
+ }
+
+ if (sscanf(s, "d%ld", &sides) == 1)
+ {
+ dice_init(dice, 0, 1, sides);
+ return TRUE;
+ }
+
+ if (sscanf(s, "%ldd%ld", &num, &sides) == 2)
+ {
+ dice_init(dice, 0, num, sides);
+ return TRUE;
+ }
+
+ if (sscanf(s, "%ld", &base) == 1)
+ {
+ dice_init(dice, base, 0, 0);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void dice_parse_checked(dice_type *dice, cptr s)
+{
+ bool_ result = dice_parse(dice, s);
+ if (!result)
+ {
+ abort();
+ }
+}
+
+long dice_roll(dice_type *dice)
+{
+ assert(dice != NULL);
+ return dice->base + damroll(dice->num, dice->sides);
+}
+
+void dice_print(dice_type *dice, char *output)
+{
+ char buf[16];
+
+ output[0] = '\0';
+
+ if (dice->base > 0)
+ {
+ sprintf(buf, "%ld", dice->base);
+ strcat(output, buf);
+ }
+
+ if ((dice->num > 0) || (dice->sides > 0))
+ {
+ if (dice->base > 0)
+ {
+ strcat(output, "+");
+ }
+
+ if (dice->num > 1)
+ {
+ sprintf(buf, "%ld", dice->num);
+ strcat(output, buf);
+ }
+
+ strcat(output, "d");
+
+ sprintf(buf, "%ld", dice->sides);
+ strcat(output, buf);
+ }
+}