Advertisement
quixadhal

fn_dice_parse

Apr 17th, 2020
724
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE FUNCTION public.fn_dice_parse(dice text) RETURNS TABLE(rolls integer, die integer, modifier integer, result integer)
  2.     LANGUAGE plpgsql
  3.     AS $_$
  4. declare
  5.     parsed text[];
  6. begin
  7.     parsed := regexp_matches(dice, '^\s*(\d+)d(\d+)([+-]\d+)?\s*$');
  8.     rolls := parsed[1]::integer;
  9.     die := parsed[2]::integer;
  10.     modifier := parsed[3]::integer;
  11.     if (rolls is null and die is null and modifier is null) then
  12.         parsed := regexp_matches(dice, '^\s*([+-]?\d+)\s*$');
  13.         modifier := parsed[1]::integer;
  14.         result := modifier;
  15.         if (modifier is null) then
  16.             return;
  17.         end if;
  18.     else
  19.         if (modifier is null) then
  20.             result := 0;
  21.         else
  22.             result := modifier;
  23.         end if;
  24.         if (rolls > 0 and die > 0) then
  25.             for i in 1..rolls loop
  26.                 result := result + floor(random() * die) + 1;
  27.             end loop;
  28.         end if;
  29.     end if;
  30.     return next;
  31. end;
  32. $_$;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement