3 # Description: Rbot plugin. Rolls rpg style dice
4 # Author: David Dorward (http://david.us-lot.org/ - you might find a more up to date version of this plugin there)
8 # You can get rbot from: http://www.linuxbrit.co.uk/rbot/
11 # 0.1 - Initial release
12 # 0.1.1 - bug fix, only 1 digit for number of dice sides on first roll
13 # 0.3.0 - Spelling correction on changelog 0.1.1
14 # - Return results of each roll
15 # 0.3.1 - Minor documentation update
16 # 0.3.2 - Bug fix, could not subtract numbers (String can't be coerced into Fixnum)
18 # TODO: Test! Test! Test!
20 # Fumble/Critical counter (1's and x's where x is sides on dice)
21 ####################################################
24 attr_reader :total, :view, :dice
25 def initialize(dice, view, total)
32 return "["+ dice.to_s + ": " + total.to_s + " | " + view + "] "
36 class DicePlugin < Plugin
37 BotConfig.register BotConfigIntegerValue.new('dice.max_dices',
38 :default => 100, :validate => Proc.new{|v| v > 0},
39 :desc => "Maximum number of dices to throw.")
41 def help(plugin, topic="")
42 plugin + " <string> (where <string> is something like: d6 or 2d6 or 2d6+4 or 2d6+1d20 or 2d6+1d5+4d7-3d4-6) => Rolls that set of virtual dice"
49 unless dice[0] =~ /^[0-9]+/
52 for i in 0...dice[0].to_i
53 tmp = rand(dice[1].to_i) + 1
57 return DiceDisplay.new(d, repr.join(", "), r)
75 viewer = DiceDisplay.new(porm + dice, d.to_s, r)
80 # If either not given parameters or given incorrect parameters, return with
82 unless(m.params && m.params =~ /^[0-9]*d[0-9]+(\s*[+-]\s*([0-9]+|[0-9]*d[0-9])+)*$/)
83 m.nickreply "incorrect usage: " + help(m.plugin)
87 # Extract the actual dice request from the message parameters, splitting it
88 # into dice and modifiers
89 a = m.params.gsub(/\s+/,'').scan(/^[0-9]*d[0-9]+|[+-][0-9]*d[0-9]+|[+-][0-9]+/)
90 # check nr of total dices
93 # We use .max with 1 so that specs such as d6 count as 1 and not as 0
94 nr += [dice.split(/d/)[0].to_i, 1].max
96 if nr > @bot.config['dice.max_dices']
97 m.reply "can't handle more than %u dices" % @bot.config['dice.max_dices']
101 # Roll the dice with the extracted request
102 rolled = rolldice(a[0])
104 t = rolled.get_view()
106 # Deal with all the remaining parts of the given dice request
107 for i in 1...a.length
109 r = r + tmp.total.to_i
113 m.nickreply r.to_s + " || " + m.params + ": " + t
116 plugin = DicePlugin.new
117 plugin.register("dice")
118 plugin.register("roll")
119 ##############################################