]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blob - data/rbot/plugins/roulette.rb
Sat Jul 30 01:19:32 BST 2005 Tom Gilbert <tom@linuxbrit.co.uk>
[user/henk/code/ruby/rbot.git] / data / 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     reset_chambers
7     @players = Array.new
8   end
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)"
11   end
12   def clearstats(m, params)
13     @registry.clear
14     m.okay
15   end
16
17   def roulette(m, params)
18     if m.private?
19       m.reply "you gotta play roulette in channel dude"
20       return
21     end
22
23     playerdata = nil
24     if @registry.has_key?(m.sourcenick)
25       playerdata = @registry[m.sourcenick]
26     else
27       playerdata = RouletteHistory.new(0,0,0,0,0)
28     end
29     
30     unless @players.include?(m.sourcenick)
31       @players << m.sourcenick
32       playerdata.games += 1
33     end
34     playerdata.shots += 1
35     
36     shot = @chambers.pop
37     if shot
38       m.reply "#{m.sourcenick}: chamber #{6 - @chambers.length} of 6 => *BANG*"
39       playerdata.deaths += 1
40       @players.each {|plyr|
41         next if plyr == m.sourcenick
42         pdata = @registry[plyr]
43         next if pdata == nil
44         pdata.wins += 1
45         @registry[plyr] = pdata
46       }
47     else
48       m.reply "#{m.sourcenick}: chamber #{6 - @chambers.length} of 6 => +click+"
49       playerdata.misses += 1
50     end
51
52     @registry[m.sourcenick] = playerdata
53     
54     if shot || @chambers.empty?
55       reload(m)
56     end
57   end
58   def reload(m, params = {})
59     @bot.action m.replyto, "reloads"
60     reset_chambers
61     # all players win on a reload
62     # (allows you to play 3-shot matches etc)
63     @players.each {|plyr|
64       pdata = @registry[plyr]
65       next if pdata == nil
66       pdata.wins += 1
67       @registry[plyr] = pdata
68     }
69     @players = Array.new
70   end
71   def reset_chambers
72     @chambers = [false, false, false, false, false, false]
73     @chambers[rand(@chambers.length)] = true
74   end
75   def playerstats(m, params)
76     player = params[:player]
77     pstats = @registry[player]
78     if pstats.nil?
79       m.reply "#{player} hasn't played enough games yet"
80     else
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."
82     end
83   end
84   def stats(m, params)
85     total_players = 0
86     total_games = 0
87     total_shots = 0
88     
89     died_most = [nil,0]
90     won_most = [nil,0]
91     h_win_percent = [nil,0]
92     l_win_percent = [nil,0]
93     h_luck_percent = [nil,0]
94     l_luck_percent = [nil,0]
95     @registry.each {|k,v|
96       total_players += 1
97       total_games += v.deaths
98       total_shots += v.shots
99       
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
105       end
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
110       end
111
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
117       end
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
122       end
123
124       if died_most[0].nil? || v.deaths > died_most[1]
125         died_most = [[k], v.deaths]
126       elsif v.deaths == died_most[1]
127         died_most[0] << k
128       end
129       if won_most[0].nil? || v.wins > won_most[1]
130         won_most = [[k], v.wins]
131       elsif v.wins == won_most[1]
132         won_most[0] << k
133       end
134     }
135     if total_games < 1
136       m.reply "roulette stats: no games played yet"
137     else
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]})."
139     end
140   end
141 end
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'