]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blob - data/rbot/plugins/dice.rb
script, rss plugins: raise if main data could not be restored from the registry
[user/henk/code/ruby/rbot.git] / data / rbot / plugins / dice.rb
1 ##################
2 # Filename: dice.rb
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)
5 # Version: 0.3.2
6 # Date: Sat 6 Apr 2002
7 #
8 # You can get rbot from: http://www.linuxbrit.co.uk/rbot/
9 #
10 # Changelog
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)
17 #
18 # TODO: Test! Test! Test!
19 #       Comment!
20 #       Fumble/Critical counter (1's and x's where x is sides on dice)
21 ####################################################
22
23 class DiceDisplay
24   attr_reader :total, :view, :dice
25   def initialize(dice, view, total)
26     @total = total
27     @dice = dice
28     @view = view
29   end
30
31   def get_view()
32     return "["+ dice.to_s + ": " + total.to_s + " | " + view + "] "
33   end
34 end
35
36 class DicePlugin < Plugin
37   def help(plugin, topic="")
38     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"
39   end
40
41   def rolldice(d)
42     dice = d.split(/d/)
43     repr = []
44     r = 0
45     unless dice[0] =~ /^[0-9]+/
46       dice[0] = 1
47     end
48     for i in 0...dice[0].to_i
49       tmp = rand(dice[1].to_i) + 1
50       repr << tmp.to_s
51       r = r + tmp
52     end
53     return DiceDisplay.new(d, repr.join(", "), r)
54   end
55
56   def iddice(d)
57     dice = d
58     porm = d.slice!(0,1)
59     if d =~ /d/
60       rolled = rolldice(d)
61       d = rolled.view
62       r = rolled.total
63     else
64       r = d
65     end
66
67     if porm == "-"
68       r = 0 - r.to_i
69     end
70
71     viewer = DiceDisplay.new(porm + dice, d.to_s, r)
72     return viewer
73   end
74
75   def privmsg(m)
76     # If either not given parameters or given incorrect parameters, return with
77     # the help message
78     unless(m.params && m.params =~ /^[0-9]*d[0-9]+(\s*[+-]\s*([0-9]+|[0-9]*d[0-9])+)*$/)
79       m.nickreply "incorrect usage: " + help(m.plugin)
80       return
81     end
82
83     # Extract the actual dice request from the message parameters, splitting it
84     # into dice and modifiers
85     a = m.params.gsub(/\s+/,'').scan(/^[0-9]*d[0-9]+|[+-][0-9]*d[0-9]+|[+-][0-9]+/)
86
87     # Roll the dice with the extracted request
88     rolled = rolldice(a[0])
89     r = rolled.total
90     t = rolled.get_view()
91
92     # Deal with all the remaining parts of the given dice request
93     for i in 1...a.length
94       tmp = iddice(a[i])
95       r = r + tmp.total.to_i
96       t = t + tmp.get_view
97     end
98     t.chop!
99     m.nickreply r.to_s + " || " + m.params + ": " + t
100   end
101 end
102 plugin = DicePlugin.new
103 plugin.register("dice")
104 plugin.register("roll")
105 ##############################################
106 #fin