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?(m.sourcenick)
25 playerdata = @registry[m.sourcenick]
27 playerdata = RouletteHistory.new(0,0,0,0,0)
30 unless @players.include?(m.sourcenick)
31 @players << m.sourcenick
38 m.reply "#{m.sourcenick}: chamber #{6 - @chambers.length} of 6 => *BANG*"
39 playerdata.deaths += 1
41 next if plyr == m.sourcenick
42 pdata = @registry[plyr]
45 @registry[plyr] = pdata
48 m.reply "#{m.sourcenick}: chamber #{6 - @chambers.length} of 6 => +click+"
49 playerdata.misses += 1
52 @registry[m.sourcenick] = playerdata
54 if shot || @chambers.empty?
58 def reload(m, params = {})
59 @bot.action m.replyto, "reloads"
61 # all players win on a reload
62 # (allows you to play 3-shot matches etc)
64 pdata = @registry[plyr]
67 @registry[plyr] = pdata
72 @chambers = [false, false, false, false, false, false]
73 @chambers[rand(@chambers.length)] = true
75 def playerstats(m, params)
76 player = params[:player]
77 pstats = @registry[player]
79 m.reply "#{player} hasn't played enough games yet"
81 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."
91 h_win_percent = [nil,0]
92 l_win_percent = [nil,0]
93 h_luck_percent = [nil,0]
94 l_luck_percent = [nil,0]
97 total_games += v.deaths
98 total_shots += v.shots
100 win_rate = v.wins.to_f / v.games * 100
101 if h_win_percent[0].nil? || win_rate > h_win_percent[1] && v.games > 2
102 h_win_percent = [[k], win_rate]
103 elsif win_rate == h_win_percent[1] && v.games > 2
104 h_win_percent[0] << k
106 if l_win_percent[0].nil? || win_rate < l_win_percent[1] && v.games > 2
107 l_win_percent = [[k], win_rate]
108 elsif win_rate == l_win_percent[1] && v.games > 2
109 l_win_percent[0] << k
112 luck = v.misses.to_f / v.shots * 100
113 if h_luck_percent[0].nil? || luck > h_luck_percent[1] && v.games > 2
114 h_luck_percent = [[k], luck]
115 elsif luck == h_luck_percent[1] && v.games > 2
116 h_luck_percent[0] << k
118 if l_luck_percent[0].nil? || luck < l_luck_percent[1] && v.games > 2
119 l_luck_percent = [[k], luck]
120 elsif luck == l_luck_percent[1] && v.games > 2
121 l_luck_percent[0] << k
124 if died_most[0].nil? || v.deaths > died_most[1]
125 died_most = [[k], v.deaths]
126 elsif v.deaths == died_most[1]
129 if won_most[0].nil? || v.wins > won_most[1]
130 won_most = [[k], v.wins]
131 elsif v.wins == won_most[1]
136 m.reply "roulette stats: no games played yet"
138 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]})."
142 plugin = RoulettePlugin.new
143 plugin.map 'roulette reload', :action => 'reload'
144 plugin.map 'roulette stats :player', :action => 'playerstats'
145 plugin.map 'roulette stats', :action => 'stats'
146 plugin.map 'roulette clearstats', :action => 'clearstats', :auth => 'config'
147 plugin.map 'roulette'