1 RouletteHistory = Struct.new("RouletteHistory", :games, :shots, :deaths, :misses, :wins)
3 class RoulettePlugin < Plugin
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)"
12 if m.params == "reload"
13 @bot.action m.replyto, "reloads"
15 # all players win on a reload
16 # (allows you to play 3-shot matches etc)
18 pdata = @registry[plyr]
21 @registry[plyr] = pdata
24 elsif m.params == "stats"
27 elsif m.params =~ /^stats\s+(.+)$/
28 m.reply(playerstats($1))
30 elsif m.params == "clearstats"
31 if @bot.auth.allow?("config", m.source, m.replyto)
37 m.reply "incorrect usage: " + help(m.plugin)
41 m.reply "you gotta play roulette in channel dude"
46 if @registry.has_key?(m.sourcenick)
47 playerdata = @registry[m.sourcenick]
49 playerdata = RouletteHistory.new(0,0,0,0,0)
52 unless @players.include?(m.sourcenick)
53 @players << m.sourcenick
60 m.reply "#{m.sourcenick}: chamber #{6 - @chambers.length} of 6 => *BANG*"
61 playerdata.deaths += 1
63 next if plyr == m.sourcenick
64 pdata = @registry[plyr]
67 @registry[plyr] = pdata
70 m.reply "#{m.sourcenick}: chamber #{6 - @chambers.length} of 6 => +click+"
71 playerdata.misses += 1
74 @registry[m.sourcenick] = playerdata
76 if shot || @chambers.empty?
77 @bot.action m.replyto, "reloads"
82 @chambers = [false, false, false, false, false, false]
83 @chambers[rand(@chambers.length)] = true
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."
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|
104 total_games += v.deaths
105 total_shots += v.shots
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
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
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
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
131 if died_most[0].nil? || v.deaths > died_most[1]
132 died_most = [[k], v.deaths]
133 elsif v.deaths == died_most[1]
136 if won_most[0].nil? || v.wins > won_most[1]
137 won_most = [[k], v.wins]
138 elsif v.wins == won_most[1]
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]})."
146 plugin = RoulettePlugin.new
147 plugin.register("roulette")