]> git.netwichtig.de Git - user/henk/code/ruby/rbot.git/blob - data/rbot/plugins/roulette.rb
make sure @commands is never nil in script.rb
[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?("player " + m.sourcenick)
25       playerdata = @registry["player " + m.sourcenick]
26     else
27       playerdata = RouletteHistory.new(0,0,0,0,0)
28     end
29
30     totals = nil
31     if @registry.has_key?("totals")
32       totals = @registry["totals"]
33     else
34       totals = RouletteHistory.new(0,0,0,0,0)
35     end
36
37     unless @players.include?(m.sourcenick)
38       @players << m.sourcenick
39       playerdata.games += 1
40     end
41     playerdata.shots += 1
42     totals.shots += 1
43     
44     shot = @chambers.pop
45     if shot
46       m.reply "#{m.sourcenick}: chamber #{6 - @chambers.length} of 6 => *BANG*"
47       playerdata.deaths += 1
48       totals.deaths += 1
49       @players.each {|plyr|
50         next if plyr == m.sourcenick
51         pdata = @registry["player " + plyr]
52         next if pdata == nil
53         pdata.wins += 1
54         totals.wins += 1
55         @registry["player " + plyr] = pdata
56       }
57       @players = Array.new
58     else
59       m.reply "#{m.sourcenick}: chamber #{6 - @chambers.length} of 6 => +click+"
60       playerdata.misses += 1
61       totals.misses += 1
62     end
63
64     @registry["player " + m.sourcenick] = playerdata
65     @registry["totals"] = totals
66     
67     if shot || @chambers.empty?
68       reload(m)
69     end
70   end
71   def reload(m, params = {})
72     @bot.action m.replyto, "reloads"
73     reset_chambers
74     # all players win on a reload
75     # (allows you to play 3-shot matches etc)
76     totals = nil
77     if @registry.has_key?("totals")
78       totals = @registry["totals"]
79     else
80       totals = RouletteHistory.new(0,0,0,0,0)
81     end
82
83     @players.each {|plyr|
84       pdata = @registry["player " + plyr]
85       next if pdata == nil
86       pdata.wins += 1
87       totals.wins += 1
88       @registry["player " + plyr] = pdata
89     }
90
91     totals.games += 1
92     @registry["totals"] = totals
93
94     @players = Array.new
95   end
96   def reset_chambers
97     @chambers = [false, false, false, false, false, false]
98     @chambers[rand(@chambers.length)] = true
99   end
100   def playerstats(m, params)
101     player = params[:player]
102     pstats = @registry["player " + player]
103     if pstats.nil?
104       m.reply "#{player} hasn't played enough games yet"
105     else
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."
107     end
108   end
109   def stats(m, params)
110     if @registry.has_key?("totals")
111       totals = @registry["totals"]
112       total_games = totals.games
113       total_shots = totals.shots
114     else
115       total_games = 0
116       total_shots = 0
117     end
118
119     total_players = 0
120
121     died_most = [nil,0]
122     won_most = [nil,0]
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)
129       next unless match
130       k = match[1]
131
132       total_players += 1
133       
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
139       end
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
144       end
145
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
151       end
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
156       end
157
158       if died_most[0].nil? || v.deaths > died_most[1]
159         died_most = [[k], v.deaths]
160       elsif v.deaths == died_most[1]
161         died_most[0] << k
162       end
163       if won_most[0].nil? || v.wins > won_most[1]
164         won_most = [[k], v.wins]
165       elsif v.wins == won_most[1]
166         won_most[0] << k
167       end
168     }
169     if total_games < 1
170       m.reply "roulette stats: no games completed yet"
171     else
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]})."
173     end
174   end
175 end
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'