]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blob - lib/rbot/plugins/roulette.rb
move rbot into lib - still rearranging for packaging/installation
[user/henk/code/ruby/rbot.git] / lib / rbot / plugins / roulette.rb
1 RouletteHistory = Struct.new("RouletteHistory", :games, :shots, :deaths, :misses, :wins)
2
3 class RoulettePlugin < Plugin
4   def initialize
5     super
6     reload
7   end
8   def help(plugin, topic="")
9     "roulette => play russian roulette - starts a new game if one isn't already running. One round in a six chambered gun. Take turns to say roulette to the bot, until somebody dies. roulette reload => force the gun to reload, roulette stats => show stats from all games, roulette stats <player> => show stats for <player>, roulette clearstats => clear stats (config level auth required)"
10   end
11   def privmsg(m)
12     if m.params == "reload"
13       @bot.action m.replyto, "reloads"
14       reload
15       # all players win on a reload
16       # (allows you to play 3-shot matches etc)
17       @players.each {|plyr|
18         pdata = @registry[plyr]
19         next if pdata == nil
20         pdata.wins += 1
21         @registry[plyr] = pdata
22       }
23       return
24     elsif m.params == "stats"
25       m.reply stats
26       return
27     elsif m.params =~ /^stats\s+(.+)$/
28       m.reply(playerstats($1))
29       return
30     elsif m.params == "clearstats"
31       if @bot.auth.allow?("config", m.source, m.replyto)
32         @registry.clear
33         m.okay
34       end
35       return
36     elsif m.params
37       m.reply "incorrect usage: " + help(m.plugin)
38       return
39     end
40     if m.private?
41       m.reply "you gotta play roulette in channel dude"
42       return
43     end
44
45     playerdata = nil
46     if @registry.has_key?(m.sourcenick)
47       playerdata = @registry[m.sourcenick]
48     else
49       playerdata = RouletteHistory.new(0,0,0,0,0)
50     end
51     
52     unless @players.include?(m.sourcenick)
53       @players << m.sourcenick
54       playerdata.games += 1
55     end
56     playerdata.shots += 1
57     
58     shot = @chambers.pop
59     if shot
60       m.reply "#{m.sourcenick}: chamber #{6 - @chambers.length} of 6 => *BANG*"
61       playerdata.deaths += 1
62       @players.each {|plyr|
63         next if plyr == m.sourcenick
64         pdata = @registry[plyr]
65         next if pdata == nil
66         pdata.wins += 1
67         @registry[plyr] = pdata
68       }
69     else
70       m.reply "#{m.sourcenick}: chamber #{6 - @chambers.length} of 6 => +click+"
71       playerdata.misses += 1
72     end
73
74     @registry[m.sourcenick] = playerdata
75     
76     if shot || @chambers.empty?
77       @bot.action m.replyto, "reloads"
78       reload
79     end
80   end
81   def reload
82     @chambers = [false, false, false, false, false, false]
83     @chambers[rand(@chambers.length)] = true
84     @players = Array.new
85   end
86   def playerstats(player)
87     pstats = @registry[player]
88     return "#{player} hasn't played enough games yet" if pstats.nil?
89     return "#{player} has played #{pstats.games} games, won #{pstats.wins} and lost #{pstats.deaths}. #{player} pulled the trigger #{pstats.shots} times and found the chamber empty on #{pstats.misses} occasions."
90   end
91   def stats
92     total_players = 0
93     total_games = 0
94     total_shots = 0
95     
96     died_most = [nil,0]
97     won_most = [nil,0]
98     h_win_percent = [nil,0]
99     l_win_percent = [nil,0]
100     h_luck_percent = [nil,0]
101     l_luck_percent = [nil,0]
102     @registry.each {|k,v|
103       total_players += 1
104       total_games += v.deaths
105       total_shots += v.shots
106       
107       win_rate = v.wins.to_f / v.games * 100
108       if h_win_percent[0].nil? || win_rate > h_win_percent[1] && v.games > 2
109         h_win_percent = [[k], win_rate]
110       elsif win_rate == h_win_percent[1] && v.games > 2
111         h_win_percent[0] << k
112       end
113       if l_win_percent[0].nil? || win_rate < l_win_percent[1] && v.games > 2
114         l_win_percent = [[k], win_rate]
115       elsif win_rate == l_win_percent[1] && v.games > 2
116         l_win_percent[0] << k
117       end
118
119       luck = v.misses.to_f / v.shots * 100
120       if h_luck_percent[0].nil? || luck > h_luck_percent[1] && v.games > 2
121         h_luck_percent = [[k], luck]
122       elsif luck == h_luck_percent[1] && v.games > 2
123         h_luck_percent[0] << k
124       end
125       if l_luck_percent[0].nil? || luck < l_luck_percent[1] && v.games > 2
126         l_luck_percent = [[k], luck]
127       elsif luck == l_luck_percent[1] && v.games > 2
128         l_luck_percent[0] << k
129       end
130
131       if died_most[0].nil? || v.deaths > died_most[1]
132         died_most = [[k], v.deaths]
133       elsif v.deaths == died_most[1]
134         died_most[0] << k
135       end
136       if won_most[0].nil? || v.wins > won_most[1]
137         won_most = [[k], v.wins]
138       elsif v.wins == won_most[1]
139         won_most[0] << k
140       end
141     }
142     return "roulette stats: no games played yet" if total_games < 1
143     return "roulette stats: #{total_games} games completed, #{total_shots} shots fired at #{total_players} players. Luckiest: #{h_luck_percent[0].join(',')} (#{sprintf '%.1f', h_luck_percent[1]}% clicks). Unluckiest: #{l_luck_percent[0].join(',')} (#{sprintf '%.1f', l_luck_percent[1]}% clicks). Highest survival rate: #{h_win_percent[0].join(',')} (#{sprintf '%.1f', h_win_percent[1]}%). Lowest survival rate: #{l_win_percent[0].join(',')} (#{sprintf '%.1f', l_win_percent[1]}%). Most wins: #{won_most[0].join(',')} (#{won_most[1]}). Most deaths: #{died_most[0].join(',')} (#{died_most[1]})."
144   end
145 end
146 plugin = RoulettePlugin.new
147 plugin.register("roulette")