1 RouletteHistory = Struct.new("RouletteHistory", :games, :shots, :deaths, :misses, :wins)
3 class RoulettePlugin < Plugin
9 def help(plugin, topic="")
10 "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)"
12 def clearstats(m, params)
17 def roulette(m, params)
19 m.reply "you gotta play roulette in channel dude"
24 if @registry.has_key?("player " + m.sourcenick)
25 playerdata = @registry["player " + m.sourcenick]
27 playerdata = RouletteHistory.new(0,0,0,0,0)
31 if @registry.has_key?("totals")
32 totals = @registry["totals"]
34 totals = RouletteHistory.new(0,0,0,0,0)
37 unless @players.include?(m.sourcenick)
38 @players << m.sourcenick
46 m.reply "#{m.sourcenick}: chamber #{6 - @chambers.length} of 6 => *BANG*"
47 playerdata.deaths += 1
50 next if plyr == m.sourcenick
51 pdata = @registry["player " + plyr]
55 @registry["player " + plyr] = pdata
59 m.reply "#{m.sourcenick}: chamber #{6 - @chambers.length} of 6 => +click+"
60 playerdata.misses += 1
64 @registry["player " + m.sourcenick] = playerdata
65 @registry["totals"] = totals
67 if shot || @chambers.empty?
71 def reload(m, params = {})
72 @bot.action m.replyto, "reloads"
74 # all players win on a reload
75 # (allows you to play 3-shot matches etc)
77 if @registry.has_key?("totals")
78 totals = @registry["totals"]
80 totals = RouletteHistory.new(0,0,0,0,0)
84 pdata = @registry["player " + plyr]
88 @registry["player " + plyr] = pdata
92 @registry["totals"] = totals
97 @chambers = [false, false, false, false, false, false]
98 @chambers[rand(@chambers.length)] = true
100 def playerstats(m, params)
101 player = params[:player]
102 pstats = @registry["player " + player]
104 m.reply "#{player} hasn't played enough games yet"
106 m.reply "#{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."
110 if @registry.has_key?("totals")
111 totals = @registry["totals"]
112 total_games = totals.games
113 total_shots = totals.shots
123 h_win_percent = [nil,0]
124 l_win_percent = [nil,0]
125 h_luck_percent = [nil,0]
126 l_luck_percent = [nil,0]
127 @registry.each {|k,v|
128 match = /player (.+)/.match(k)
134 win_rate = v.wins.to_f / v.games * 100
135 if h_win_percent[0].nil? || win_rate > h_win_percent[1] && v.games > 2
136 h_win_percent = [[k], win_rate]
137 elsif win_rate == h_win_percent[1] && v.games > 2
138 h_win_percent[0] << k
140 if l_win_percent[0].nil? || win_rate < l_win_percent[1] && v.games > 2
141 l_win_percent = [[k], win_rate]
142 elsif win_rate == l_win_percent[1] && v.games > 2
143 l_win_percent[0] << k
146 luck = v.misses.to_f / v.shots * 100
147 if h_luck_percent[0].nil? || luck > h_luck_percent[1] && v.games > 2
148 h_luck_percent = [[k], luck]
149 elsif luck == h_luck_percent[1] && v.games > 2
150 h_luck_percent[0] << k
152 if l_luck_percent[0].nil? || luck < l_luck_percent[1] && v.games > 2
153 l_luck_percent = [[k], luck]
154 elsif luck == l_luck_percent[1] && v.games > 2
155 l_luck_percent[0] << k
158 if died_most[0].nil? || v.deaths > died_most[1]
159 died_most = [[k], v.deaths]
160 elsif v.deaths == died_most[1]
163 if won_most[0].nil? || v.wins > won_most[1]
164 won_most = [[k], v.wins]
165 elsif v.wins == won_most[1]
170 m.reply "roulette stats: no games completed yet"
172 m.reply "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]})."
176 plugin = RoulettePlugin.new
177 plugin.map 'roulette reload', :action => 'reload'
178 plugin.map 'roulette stats :player', :action => 'playerstats'
179 plugin.map 'roulette stats', :action => 'stats'
180 plugin.map 'roulette clearstats', :action => 'clearstats', :auth => 'config'
181 plugin.map 'roulette'