Skip to content

Instantly share code, notes, and snippets.

@tritium21
Last active December 20, 2015 23:19
Show Gist options
  • Save tritium21/6211464 to your computer and use it in GitHub Desktop.
Save tritium21/6211464 to your computer and use it in GitHub Desktop.
;Copyright 2004, 2005, 2008 Alex Walters.
on *:text:!dice help:*:{
notice $nick !dice <pool> <target> [action] (Botch 1)
notice $nick !sdice <pool> <target> [action] (10's rerolled, Botch 1)
notice $nick !xdice <pool> <target> [action] (9's rerolled, Botch 1)
notice $nick !nwod <pool> [action] (10's rerolled, target 8)
notice $nick !9nwod <pool> [action] (9's rerolled, target 8)
notice $nick !8nwod <pool> [action] (8's rerolled, target 8)
notice $nick !cnwod [action] (10's rerolled, target 10, Botch 1)
}
on *:text:!dice*:*:chandice $$2 $$3 0 1 $iif($target == $me,$nick,$chan) $nick $4-
on *:text:!sdice*:*:chandice $2 $$3 10 1 $iif($target == $me,$nick,$chan) $nick $4- $dbrak(Specialized)
on *:text:!xdice*:*:chandice $$2 $$3 9 1 $iif($target == $me,$nick,$chan) $nick $4- $dbrak(Double Specialized)
on *:text:!nwod*:*:chandice $$2 8 10 0 $iif($target == $me,$nick,$chan) $nick $3-
on *:text:!9nwod*:*:chandice $$2 8 9 0 $iif($target == $me,$nick,$chan) $nick $3- $dbrak(9 Again)
on *:text:!8nwod*:*:chandice $$2 8 8 0 $iif($target == $me,$nick,$chan) $nick $3- $dbrak(8 Again)
on *:text:!cnwod*:*:chandice 1 10 10 1 $iif($target == $me,$nick,$chan) $nick $2- $dbrak(Chance)
alias chandice {
var %dice = $wdice($1,$2,$3,$4)
var %roll = $gettok(%dice,1,124)
var %reroll = $gettok(%dice,2,124)
var %status = $gettok(%dice,3,124)
if (%status > 1000) {
msg $5 6error:14 $wdice(%status).err 
}
else {
describe $5 Rolls14 $1 dice vs.14 $2 for14 $6 $iif($7,to14 $7- $+ )
describe $5 Rolls: $+(12,$chr(91),06,%roll,12,$chr(93),) $iif(%reroll != 0,Rerolls: $+(12,$chr(91),06,%reroll,12,$chr(93),)) Successes: $+(12,$chr(91),06,%status,12,$chr(93),) $iif(%status == -1,4 $+ $chr(91) $+ BOTCH! $+ $chr(93) $+ )
}
}
alias wdice {
if ($prop == err) {
;1 = dice pool greater than 20
;2 = dice pool 0 or less
;4 = dice target grater than 10
;8 = dice target 0 or lesss
;16 = reroll target grater than 10
;32 = botch target grater than 10
var %err = $calc($1 - 1000)
var %rpl = $null
if ($and(%err,1)) {
var %rpl = %rpl Dice pool greater than 20.
}
if ($and(%err,2)) {
var %rpl = %rpl Dice pool 0 or less.
}
if ($and(%err,4)) {
var %rpl = %rpl Dice target grater than 10.
}
if ($and(%err,8)) {
var %rpl = %rpl Dice target 0 or lesss.
}
if ($and(%err,16)) {
var %rpl = %rpl Reroll target grater than 10.
}
if ($and(%err,32)) {
var %rpl = %rpl Botch target grater than 10.
}
return %rpl $chr(40) $+ Code: $1 $+ $chr(41)
}
else {
;$1 = Dice pool (Number of dice to roll)
;$2 = Target Number (use to 8 for New World of darkness)
;$3 = Target Number for reroll
;$4 = Target Number for botch (1)
;Reply:
; (rolls)|(rerolls or 0 if none)|(status code)
;Status Codes:
; 1 = Success
; 0 = Failure
; -1 = botch
; 1000+ = Error
;Name Attributes as variables
var %pool = $1
var %dtarg = $2
var %rtarg = $3
var %btarg = $4
;Initialize script Variables
var %_reroll = 0
var %_roll = 0
var %succ = 0
var %botch = 0
var %status = 0
var %die = 0
var %err = 1000
;Start Input error check
if (%pool > 20) {
var %err = %err + 1
}
if (%pool <= 0) {
var %err = %err + 2
}
if (%dtarg > 10) {
var %err = %err + 4
}
if (%dtarg <= 0) {
var %err = %err + 8
}
if (%rtarg > 10) {
var %err = %err + 16
}
if (%btarg > 10) {
var %err = %err + 32
}
if (%err > 1000) {
var %out = 0 $+ $chr(124) $+ 0 $+ $chr(124) $+ %err
return %out
halt
}
;End Input error check
;start primary dice loop
while (%_roll < %pool) {
;var %die = $rand(1,10)
var %die = $rng(10)
inc %_roll 1
;adds roll to dice roll list
var %rolls = %rolls $+ %die $+ $chr(44)
;check for success
if (%die >= %dtarg) {
;check if reroll is set
if (%rtarg > 0) {
;check if qualifies for reroll
if (%die >= %rtarg) {
inc %_reroll 1
}
}
inc %succ 1
}
;check if botch set
elseif (%btarg > 0) {
;check if qualifies for botch
if (%die <= %btarg) {
inc %botch 1
dec %_reroll 1
}
}
}
;end primary dice loop
;start reroll dice loop
while (%_reroll >= 1) {
;var %die = $rand(1,10)
var %die = $rng(10)
dec %_reroll 1
;adds roll to reroll list
var %rerolls = %rerolls $+ %die $+ $chr(44)
;check for success
if (%die >= %dtarg) {
;check if qualifies for addition reroll
if (%die >= %rtarg) {
inc %_reroll 1
}
inc %succ 1
}
;check for botch set
elseif (%btarg > 0) {
;check if qualifies for botch
if (%die <= %btarg) {
inc %botch 1
}
}
}
;end reroll dice loop
;remove last coma from (re)roll lists
var %rolls = $left(%rolls,$calc($len(%rolls)-1))
var %rerolls = $left(%rerolls,$calc($len(%rerolls)-1))
;if no reroll list, add a 0 to create a useable token
if (!%rerolls) {
var %rerolls = 0
}
;check for botch
if (%botch > %succ) {
var %status = -1
}
;check for fail
elseif (%succ == 0) {
var %status = 0
}
;otherwise success
else {
var %succ = %succ - %botch
var %status = %succ
}
;create token
var %out = %rolls $+ $chr(124) $+ %rerolls $+ $chr(124) $+ %status
return %out
}
}
alias dbrak {
var %string = $$1-
var %out = $+(4,$chr(40),%string,$chr(41),)
return %out
}
;Copyright Alexander Walters 2008, All Rights Reserved
;main trigger
on *:text:!roll *:*:{
;check to see if it was PMed or in a channel.
;set %chan to the users nick if in PM
;set %chan to originating channel if from channel
if ($target == $me) {
var %chan = $nick
}
elseif ($target ischan) {
var %chan = $chan
}
;start the script proper
dice %chan $nick $$2-
}
alias dice {
;input %chan %nick %dice %action
var %chan = $1
var %nick = $2
var %test = $3-
;help section. only triggers if help is the first word and ignores all subsiquent words
if (help* iswm %test) {
notice %nick !roll [<rolls>#][<[+|-]accept>/][dice]d<sides>[+|-|/|*<math>][r<[+|-]reroll[+|-]>][t<[+|-]target[+|-]>] [roll 2] ... [roll N] [Action]
notice %nick rolls: How many times to do the following roll. each roll will be on its own line
notice %nick accept: Of the dice rolled, how many of them to count into the total. A positive value here means the highest N dice are counted. A negitive number means the lowest N dice are counted.
notice %nick dice: Number of dice in each roll. Defaults to 1 if not specified.
notice %nick sides: Number of sides the die rolled have. this is a number between 2 and 100.
notice %nick math: Add, Subtract, Multiply, Divide the total by this number.
notice %nick reroll: Specifies which dice should be rerolled. A positive number means all dice that are lower than or equal to that number will be rerolled untill there is a result higher. A negitive number indicates dice higher than or equal to that number will be rerolled.
notice %nick target: To calculate margins of success and failure, specify a target. A positive number indicates that the resulting total should be higher than the target. A negitive number indicates successful results are lower than the target. A positive margin is a success, a negitive one is a failure.
}
else {
;total number of space delminated values in the test
var %total = $numtok(%test,32)
;looking for the descriptive action in the command.
;If there is one, %remainder will be filled with it, else it wont be set
var %check_index = 1
while (%check_index <= %total) {
;get Nth space deliminated value
var %die = $gettok(%test,%check_index,32)
;check against generic dice
var %die_parsed = $dice_parse(%die)
;check against dice side chain: white wolf
var %ww_check = $regex(ww_check,%die,%ww_regex)
;if it is generic or sidechained dice...
if (%die_parsed || %ww_check) {
;incriment the index, and nothing more
inc %check_index 1
continue
}
;if it is not dice, and there has been atleast one actual set of dice...
elseif (%check_index > 1) {
;take current string position, add the "-" symbol, then add the total size...
var %remain_tok = $+(%check_index,$chr(45),%total)
;to tell it to set %remainder to all remaining tokens.
var %remainder = $gettok(%test,%remain_tok,32)
;break the loop
break
}
else {
;break the loop incase something unexpected happened and NONE of the above were called
break
}
}
var %index = 1
var %ww_regex = ^([w|t|r|b][0-9]+)([w|t|r|b][0-9]+)([w|t|r|b][0-9]+)?([w|t|r|b][0-9]+)?$
while (%index <= %total) {
var %die = $gettok(%test,%index,32)
var %die_parsed = $dice_parse(%die)
var %ww_test = $regex(ww_test,%die,%ww_regex)
if (%die_parsed && ($left(%die_parsed,1) != $chr(33))) {
var %roll = $dice_roll(%die_parsed)
var %index2 = 1
var %total2 = $numtok(%roll,124)
describe %chan Rolls 14 $+ %die $+  for 14 $+ %nick $+  $iif(%remainder,to 14 $+ %remainder)
while (%index2 <= %total2) {
describe %chan Rolls $+ $chr(58) 12 $+ $chr(91) $+ 06 $+ $gettok($gettok(%roll,%index2,124),1,58) $+ 12 $+ $chr(93) $+  Total $+ $chr(58) 12 $+ $chr(91) $+ 06 $+ $gettok($gettok(%roll,%index2,124),2,58) $+ 12 $+ $chr(93) $+ 
inc %index2 1
}
}
elseif (%ww_test) {
var %ww_dice_rx = ^w([0-9]+)$
var %ww_targ_rx = ^t([0-9]+)$
var %ww_rero_rx = ^r([0-9]+)$
var %ww_botc_rx = ^b([0-9]+)$
var %ww_totl_rx = $regml(ww_test,0)
var %ww_dice = 0
var %ww_targ = 0
var %ww_rero = 0
var %ww_botc = 0
var %n = 1
while (%n <= %ww_totl_rx) {
var %test_base = $regml(ww_test,%n)
if ($regex(dice,%test_base,%ww_dice_rx)) {
var %ww_dice $regml(dice,1)
}
if ($regex(targ,%test_base,%ww_targ_rx)) {
var %ww_targ $regml(targ,1)
}
if ($regex(rero,%test_base,%ww_rero_rx)) {
var %ww_rero $regml(rero,1)
}
if ($regex(botc,%test_base,%ww_botc_rx)) {
var %ww_botc $regml(botc,1)
}
inc %n 1
}
chandice %ww_dice %ww_targ %ww_rero %ww_botc %chan %nick $iif(%remainder,%remainder)
}
elseif ($left(%die_parsed,1) == $chr(33)) {
var %tmp_len = $len(%die_parsed)
var %tmp_len = $calc(%tmp_len -1)
var %errs = $right(%die_parsed,%tmp_len)
msg %chan ERROR! $dice_parse(%errs).error
}
else {
break
}
inc %index 1
}
}
}
alias dice_parse {
if ($prop = error) {
var %out = $null
var %input = $1
var %err = 1
var %errors = Too many rolls (>10).;Too many dice in roll (>50).;Accepted dice range higher than total dice rolled.;Too many sides on dice (>100).;Reroll set too high;Reroll set too low.;Target set out of range.
while (%err <= 7) {
if ($isbit(%input,%err)) {
var %out = $addtok(%out,$gettok(%errors,%err,59),32)
}
inc %err 1
}
return %out
}
else {
var %input = $1
if (!%input) {
return $false
}
var %main_regx = ^([0-9]+#)?([+|-]?[0-9]+[+|-]?/)?([0-9]+)?(d[0-9]+)([+|\-|\*|/][0-9]+)?(r[+|-]?[0-9]+[+|-]?)?(t[+|-]?[0-9]+[+|-]?)?$
var %roll_regx = ^([0-9]+)#$
var %take_regx = ^([+|-]?[0-9]+)([+|-])?/$
var %dice_regx = ^([0-9]+)$
var %side_regx = ^d([0-9]+)$
var %math_regx = ^([+|\-|\*|/][0-9]+)$
var %rero_regx = ^r([+|-]?[0-9]+)([+|-])?$
var %targ_regx = ^t([+|-]?[0-9]+)([+|-])?$
var %roll = 1
var %take = 0
var %dice = 1
var %side = 0
var %rero = 0
var %math = 0
var %targ = 0
var %first_run = $regex(dice_parse,%input,%main_regx)
if (%first_run) {
var %total = $regml(dice_parse,0)
var %n = 1
while (%n <= %total) {
var %test_base = $regml(dice_parse,%n)
if ($regex(roll,%test_base,%roll_regx)) {
var %roll $regml(roll,1)
}
if ($regex(take,%test_base,%take_regx)) {
if ($regml(take,0) == 1) {
var %take = $regml(take,1)
}
elseif ($regml(take,0) == 2) {
var %take = $+($regml(take,2),$regml(take,1))
}
}
if ($regex(dice,%test_base,%dice_regx)) {
var %dice = $regml(dice,1)
}
if ($regex(side,%test_base,%side_regx)) {
var %side = $regml(side,1)
}
if ($regex(math,%test_base,%math_regx)) {
var %math = $regml(math,1)
}
if ($regex(rero,%test_base,%rero_regx)) {
if ($regml(rero,0) == 1) {
var %rero = $regml(rero,1)
}
elseif ($regml(rero,0) == 2) {
var %rero = $+($regml(rero,2),$regml(rero,1))
}
}
if ($regex(targ,%test_base,%targ_regx)) {
if ($regml(targ,0) == 1) {
var %targ = $regml(targ,1)
}
elseif ($regml(targ,0) == 2) {
var %targ = $+($regml(targ,2),$regml(targ,1))
}
}
inc %n 1
}
var %error = 0
if (%roll > 10) {
var %error = $biton(%error,1)
}
if (%dice > 50) {
var %error = $biton(%error,2)
}
if ($abs(%take) > %dice) {
var %error = $biton(%error,3)
}
if (%side > 100) {
var %error = $biton(%error,4)
}
if (((%rero < 0) && ($abs(%rero) > %side)) || ((%rero > 0) && (%rero > $calc(%side -1)))) {
var %error = $biton(%error,5)
}
if (((%rero > 0) && (%rero < 1)) || ((%rero < 0) && ($abs(%rero) < 2))) {
var %error = $biton(%error,6)
}
if (((%targ > 0) && ((%targ > $calc((%dice * %side)) || (%targ < 1)))) || ((%targ < 0) && ($abs(%targ) < %dice))) {
var %error = $biton(%error,7)
}
;spit it out
if (%error) {
return $chr(33) $+ %error
}
else {
return %roll %take %dice %side %rero %math %targ
}
}
else {
return $false
}
}
}
on 1:start:{
rng_org_refill
}
alias rng_org_refill {
set %working $true
sockopen rnd_org www.random.org 80
if (!$hget(rng_org_tbl)) {
hmake rng_org_tbl 100
}
}
on 1:sockopen:rnd_org:{
sockwrite -n rnd_org GET /integers/?num=500&min=1&max=100&col=1&base=10&format=plain&rnd=new
sockwrite -n rnd_org Host: www.random.org
sockwrite rnd_org $crlf
}
on 1:sockread:rnd_org: {
if ($sockerr > 0) return
:nextread
sockread %rng_data
if ($sockbr == 0) {
sockclose rnd_org
echo -a $hget(rng_org_tbl,0).item Numbers in list
unset %working
return
}
hadd rng_org_tbl $calc($hget(rng_org_tbl,0).item + 1) %rng_data
goto nextread
}
alias rng {
var %sides = $$1
var %devisor = $calc(%sides / 100)
var %size = $hget(rng_org_tbl,0).item
if (%size == 0) {
var %number = $rand(1,%sides)
if (!%working) {
set %working $true
.timer 1 0 rng_org_refill
}
}
else {
var %rand_nbr = $hget(rng_org_tbl,%size)
var %number = $ceil($calc(%rand_nbr * %devisor))
hdel rng_org_tbl %size
;echo -a $hget(rng_org_tbl,0).item Numbers in list
}
return %number
}
alias dice_roll {
;Input %roll %take %dice %side %rero %math
var %input = $1-
if ($numtok(%input,32) > 1) {
tokenize 32 %input
}
elseif ($numtok(%input,44) > 1) {
tokenize 44 %input
}
var %roll = $round($1,0)
var %take = $round($2,0)
var %dice = $round($3,0)
var %side = $round($4,0)
var %rero = $round($5,0)
var %math = $6
var %targ = $round($7,0)
var %roll_index = 1
var %dice_out = $null
var %dice_string_tok = 44
var %dice_out_roll_tok = 124
var %dice_out_sep_tok = 58
var %rero_string_temp_tok = 59
var %rero_string_tok = 44
while (%roll_index <= %roll) {
var %dice_out_temp = $null
var %dice_add = $null
var %dice_string_tmp = $null
var %dice_string = $null
var %rero_string = $null
var %dice_out_temp = $null
var %dice_out_write_pos = $null
var %dice_index = 1
while (%dice_index <= %dice) {
var %dice_temp = $null
var %dice_temp = $rng(%side)
if (%rero != 0) {
var %rero_string_temp = $null
var %rero_string_temp = $instok(%rero_string_temp,%dice_temp,1,%rero_string_temp_tok)
while (((%rero > 0) && (%dice_temp <= %rero)) || ((%rero < 0) && (%dice_temp >= $abs(%rero)))) {
var %dice_temp = $rng(%side)
var %rero_string_temp = $instok(%rero_string_temp,%dice_temp,1,%rero_string_temp_tok)
}
var %rero_string_write_pos = $calc($numtok(%rero_string,%rero_string_tok) +1)
var %rero_string = $instok(%rero_string,%rero_string_temp,%rero_string_write_pos,%rero_string_tok)
}
var %dice_string_write_pos = $calc($numtok(%dice_string,%dice_string_tok) +1)
var %dice_string = $instok(%dice_string,%dice_temp,%dice_string_write_pos,%dice_string_tok)
inc %dice_index 1
}
;need to support negitive takes (take the lesser of the rolls)
;aolution: dont invert the sort if the take is less than 0
var %dice_string_tmp = $sorttok(%dice_string,%dice_string_tok,$iif(%take < 0,n,nr))
var %dice_add = $iif($abs(%take) > 0,$abs(%take),$numtok(%dice_string_tmp,%dice_string_tok))
var %dice_add_index = 1
var %dice_add_temp = 0
var %dice_sum = 0
while (%dice_add_index <= %dice_add) {
var %dice_add_temp = $gettok(%dice_string_tmp,%dice_add_index,%dice_string_tok)
var %dice_sum = $calc(%dice_sum + %dice_add_temp)
inc %dice_add_index 1
}
if (%math != 0) {
var %dice_sum = $calc(%dice_sum %math)
}
;add support here for total targets.
if (%targ != 0) {
if (%targ > 0) {
var %margin = $calc(%dice_sum - %targ)
}
if (%targ < 0) {
var %margin = $calc($abs(%targ) - %dice_sum)
}
var %dice_sum = %dice_sum $+($chr(40),Margin %margin,$chr(41))
}
if (%rero != 0) {
var %rero_outter_total = $numtok(%rero_string,%rero_string_tok)
var %rero_outter_index = 1
while (%rero_outter_index <= %rero_outter_total) {
var %rero_outter_to_inner = $gettok(%rero_string,%rero_outter_index,%rero_string_tok)
var %rero_inner_total = $numtok(%rero_outter_to_inner,%rero_string_temp_tok)
if (1 < %rero_inner_total) {
var %rero_inner_first = $gettok(%rero_outter_to_inner,1,%rero_string_temp_tok)
var %rero_inner = $deltok(%rero_outter_to_inner,1,%rero_string_temp_tok)
var %rero_inner = $+(%rero_inner_first,05,$chr(40),%rero_inner,$chr(41),06)
var %rero_string = $deltok(%rero_string,%rero_outter_index,%rero_string_tok)
var %rero_string = $instok(%rero_string,%rero_inner,%rero_outter_index,%rero_string_tok)
}
inc %rero_outter_index 1
}
}
var %dice_out_proc = $iif(%rero != 0,%rero_string,%dice_string)
if ($abs(%take) > 0) {
var %take_total = $numtok(%dice_string_tmp,%dice_string_tok)
var %take_index = $calc($abs(%take) +1)
while (%take_index <= %take_total) {
var %take_temp = $gettok(%dice_string_tmp,%take_index,%dice_string_tok)
var %take_temp_pos = $findtok(%dice_string,%take_temp,1,%dice_string_tok)
var %take_temp_token = 04 $+ $gettok(%dice_out_proc,%take_temp_pos,%dice_string_tok) $+ 06
var %dice_out_proc = $deltok(%dice_out_proc,%take_temp_pos,%dice_string_tok)
var %dice_out_proc = $instok(%dice_out_proc,%take_temp_token,%take_temp_pos,%dice_string_tok)
inc %take_index 1
}
}
var %dice_out_temp = $instok(%dice_out_temp,$replace(%dice_out_proc,$chr(44),$chr(32)),1,%dice_out_sep_tok)
var %dice_out_temp = $instok(%dice_out_temp,%dice_sum,2,%dice_out_sep_tok)
var %dice_out_write_pos = $calc($numtok(%dice_out,%dice_out_roll_tok) +1)
var %dice_out = $instok(%dice_out,%dice_out_temp,dice_out_write_pos,%dice_out_roll_tok)
inc %roll_index 1
}
return %dice_out
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment