module AbsShowdown
Constants
- DATA_PATH
- DEFAULT_PRIZE
- PLUGIN
- STYLE_TITLE
Public Instance Methods
Source
# File lib/abs_showdown.rb, line 47 def activate(game, rand: ->(max) { Random.rand(0...max) }) game = game.dup game["stage"] = "guessing" game["facts"] = { game["challenger"] => facts[rand.call(facts.length)], game["target"] => facts[rand.call(facts.length)] } game["guesses"] = {} { game: game, message: format_prompt(game) } end
Source
# File lib/abs_showdown.rb, line 19 def facts @facts ||= JSON.parse(File.read(DATA_PATH)) end
Source
# File lib/abs_showdown.rb, line 61 def format_prompt(game) lines = [IrcFormat.report_header(tag: "ABS", title: "Stat Showdown", style: STYLE_TITLE)] [game["challenger"], game["target"]].each do |nick| fact = game["facts"][nick] lines << "#{nick}: #{fact['question']} — !abs showdown guess <number>" end lines << IrcFormat.report_footer("closest guess wins") lines.join("\n") end
Source
# File lib/abs_showdown.rb, line 123 def format_status(game) return "No Stat Showdown active." unless game "Stat Showdown — stage #{game['stage']} — #{game['challenger']} vs #{game['target']}" end
Source
# File lib/abs_showdown.rb, line 31 def parse_command(text) base = AsyncDuel.parse_base(text, usage: usage_message) return base unless base[:action] == :unknown parts = base[:tail] case parts[0].downcase when "guess" return { error: usage_message } if parts.length < 2 num = parts[1].to_f { action: :guess, value: num } else { error: usage_message } end end
Source
# File lib/abs_showdown.rb, line 89 def resolve(game, store: Game.default_store) challenger = game["challenger"] target = game["target"] c_guess = game["guesses"][challenger].to_f t_guess = game["guesses"][target].to_f c_answer = game["facts"][challenger]["answer"].to_f t_answer = game["facts"][target]["answer"].to_f c_diff = (c_guess - c_answer).abs t_diff = (t_guess - t_answer).abs winner = if c_diff < t_diff challenger elsif t_diff < c_diff target else "tie" end lines = [ IrcFormat.report_header(tag: "ABS", title: "Stat Showdown results", style: STYLE_TITLE), "#{challenger}: #{game['facts'][challenger]['question']} — answer #{c_answer}, guessed #{c_guess}", "#{target}: #{game['facts'][target]['question']} — answer #{t_answer}, guessed #{t_guess}" ] lines << if winner == "tie" "Tie game." else Game.credit_winnings(winner, DEFAULT_PRIZE, store: store) balance = Game.balance_for(winner, store: store) "#{winner} wins — closest to the real value. Prize #{DEFAULT_PRIZE} credits — balance #{balance}" end lines << IrcFormat.report_footer("Australian Bureau of Statistics") { game: game.merge("stage" => "done"), done: true, message: lines.join("\n") } end
Source
# File lib/abs_showdown.rb, line 71 def submit_guess(game:, user:, value:) return { error: "Not in guessing phase." } unless game && game["stage"] == "guessing" return { error: "You are not in this game." } unless AsyncDuel.player?(game, user) key = GameStore.norm_nick(user) return { error: "You already guessed." } if game["guesses"][key] game = game.dup game["guesses"] = game["guesses"].dup game["guesses"][key] = value if game["guesses"].size >= 2 return resolve(game, store: Game.default_store) end { game: game, message: "#{user} locked in #{value}. Waiting for opponent." } end
Source
# File lib/abs_showdown.rb, line 27 def usage_message "Usage: !abs showdown challenge <nick> | accept | decline | guess <number> | status" end