X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=data%2Frbot%2Fplugins%2Froulette.rb;h=9fce8d8ae890e5d7a22d40611810bdd70a30b263;hb=386274dd8f83d4aac27e837f1dca11f0f9250ee8;hp=c9d585ea8e7e576687037ab16ad2b7e66b2f2ca2;hpb=21949774b91eaec6ecde4eaa8ad121e2c0a36b87;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/data/rbot/plugins/roulette.rb b/data/rbot/plugins/roulette.rb index c9d585ea..9fce8d8a 100644 --- a/data/rbot/plugins/roulette.rb +++ b/data/rbot/plugins/roulette.rb @@ -1,98 +1,155 @@ RouletteHistory = Struct.new("RouletteHistory", :games, :shots, :deaths, :misses, :wins) class RoulettePlugin < Plugin + BotConfig.register BotConfigBooleanValue.new('roulette.autospin', + :default => true, + :desc => "Automatically spins the roulette at the butlast shot") + BotConfig.register BotConfigBooleanValue.new('roulette.kick', + :default => false, + :desc => "Kicks shot players from the channel") + def initialize super - reload + reset_chambers + @players = Array.new end + def help(plugin, topic="") - "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 => show stats for , roulette clearstats => clear stats (config level auth required)" + "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 => show stats for , roulette clearstats => clear stats (config level auth required), roulette spin => spins the cylinder" end - def privmsg(m) - if m.params == "reload" - @bot.action m.replyto, "reloads" - reload - # all players win on a reload - # (allows you to play 3-shot matches etc) - @players.each {|plyr| - pdata = @registry[plyr] - next if pdata == nil - pdata.wins += 1 - @registry[plyr] = pdata - } - return - elsif m.params == "stats" - m.reply stats - return - elsif m.params =~ /^stats\s+(.+)$/ - m.reply(playerstats($1)) - return - elsif m.params == "clearstats" - if @bot.auth.allow?("config", m.source, m.replyto) - @registry.clear - m.okay - end - return - elsif m.params - m.reply "incorrect usage: " + help(m.plugin) - return - end + + def clearstats(m, params) + @registry.clear + m.okay + end + + def roulette(m, params) if m.private? m.reply "you gotta play roulette in channel dude" return end playerdata = nil - if @registry.has_key?(m.sourcenick) - playerdata = @registry[m.sourcenick] + if @registry.has_key?("player " + m.sourcenick) + playerdata = @registry["player " + m.sourcenick] else playerdata = RouletteHistory.new(0,0,0,0,0) end - + + totals = nil + if @registry.has_key?("totals") + totals = @registry["totals"] + else + totals = RouletteHistory.new(0,0,0,0,0) + end + unless @players.include?(m.sourcenick) @players << m.sourcenick playerdata.games += 1 end playerdata.shots += 1 + totals.shots += 1 shot = @chambers.pop if shot m.reply "#{m.sourcenick}: chamber #{6 - @chambers.length} of 6 => *BANG*" playerdata.deaths += 1 + totals.deaths += 1 @players.each {|plyr| next if plyr == m.sourcenick - pdata = @registry[plyr] + pdata = @registry["player " + plyr] next if pdata == nil pdata.wins += 1 - @registry[plyr] = pdata + totals.wins += 1 + @registry["player " + plyr] = pdata } + @players = Array.new + @bot.kick(m.replyto, m.sourcenick, "*BANG*") if @bot.config['roulette.kick'] else m.reply "#{m.sourcenick}: chamber #{6 - @chambers.length} of 6 => +click+" playerdata.misses += 1 + totals.misses += 1 end - @registry[m.sourcenick] = playerdata + @registry["player " + m.sourcenick] = playerdata + @registry["totals"] = totals if shot || @chambers.empty? - @bot.action m.replyto, "reloads" - reload + reload(m) + elsif @chambers.length == 1 and @bot.config['roulette.autospin'] + spin(m) end end - def reload + + def reload(m, params = {}) + if m.private? + m.reply "you gotta play roulette in channel dude" + return + end + + m.act "reloads" + reset_chambers + # all players win on a reload + # (allows you to play 3-shot matches etc) + totals = nil + if @registry.has_key?("totals") + totals = @registry["totals"] + else + totals = RouletteHistory.new(0,0,0,0,0) + end + + @players.each {|plyr| + pdata = @registry["player " + plyr] + next if pdata == nil + pdata.wins += 1 + totals.wins += 1 + @registry["player " + plyr] = pdata + } + + totals.games += 1 + @registry["totals"] = totals + + @players = Array.new + end + + def spin(m, params={}) + # Spinning is just like resetting, except that nobody wins + if m.private? + m.reply "you gotta play roulette in channel dude" + return + end + + m.act "spins the cylinder" + reset_chambers + end + + def reset_chambers @chambers = [false, false, false, false, false, false] @chambers[rand(@chambers.length)] = true - @players = Array.new end - def playerstats(player) - pstats = @registry[player] - return "#{player} hasn't played enough games yet" if pstats.nil? - 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." + + def playerstats(m, params) + player = params[:player] + pstats = @registry["player " + player] + if pstats.nil? + m.reply "#{player} hasn't played enough games yet" + else + 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." + end end - def stats + + def stats(m, params) + if @registry.has_key?("totals") + totals = @registry["totals"] + total_games = totals.games + total_shots = totals.shots + else + total_games = 0 + total_shots = 0 + end + total_players = 0 - total_games = 0 - total_shots = 0 - + died_most = [nil,0] won_most = [nil,0] h_win_percent = [nil,0] @@ -100,9 +157,11 @@ class RoulettePlugin < Plugin h_luck_percent = [nil,0] l_luck_percent = [nil,0] @registry.each {|k,v| + match = /player (.+)/.match(k) + next unless match + k = match[1] + total_players += 1 - total_games += v.deaths - total_shots += v.shots win_rate = v.wins.to_f / v.games * 100 if h_win_percent[0].nil? || win_rate > h_win_percent[1] && v.games > 2 @@ -139,9 +198,22 @@ class RoulettePlugin < Plugin won_most[0] << k end } - return "roulette stats: no games played yet" if total_games < 1 - 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]})." + if total_games < 1 + m.reply "roulette stats: no games completed yet" + else + 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]})." + end end end + plugin = RoulettePlugin.new -plugin.register("roulette") + +plugin.default_auth('clearstats', false) + +plugin.map 'roulette reload', :action => 'reload' +plugin.map 'roulette spin', :action => 'spin' +plugin.map 'roulette stats :player', :action => 'playerstats' +plugin.map 'roulette stats', :action => 'stats' +plugin.map 'roulette clearstats', :action => 'clearstats' +plugin.map 'roulette' +