module SiegeGame
Constants
- PLUGIN
- STYLE_TITLE
Public Instance Methods
Source
# File lib/siege_game.rb, line 186 def format_header(title) IrcFormat.report_header(tag: "SIEGE", title: title, style: STYLE_TITLE) end
Source
# File lib/siege_game.rb, line 190 def format_status(game) return format_header("No game") + "\nNo siege in progress." unless game lines = [format_header("#{game['challenger']} vs #{game['target']}")] lines << SiegeBoard.render(game["grid"]) if game["grid"] lines << "Turn: #{game['turn']}" if game["turn"] lines << IrcFormat.report_footer(game["stage"]) lines.join("\n") end
Source
# File lib/siege_game.rb, line 124 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 "move", "wall", "board" return { action: parts[0].downcase.to_sym } if parts[0].casecmp?("board") return { error: usage_message } if parts.length < 2 { action: parts[0].downcase.to_sym, coord: parts[1].upcase } else { error: usage_message } end end
Source
# File lib/siege_game.rb, line 140 def start_game(game) grid = SiegeBoard.place_units(SiegeBoard.fresh_grid, player_a: game["challenger"], player_b: game["target"]) game = game.dup game["stage"] = "active" game["grid"] = grid game["turn"] = game["challenger"] { game: game, message: "#{format_header('Grid Siege')} \n#{SiegeBoard.render(grid)}\n#{game['challenger']} moves first — !siege move A1 or !siege wall B2" } end
Source
# File lib/siege_game.rb, line 152 def take_turn(game:, user:, action:, coord:) return { error: "No active siege." } unless game && game["stage"] == "active" return { error: "Not your turn." } unless GameStore.same_nick?(user, game["turn"]) unit = SiegeBoard.unit_for(game, user) grid = game["grid"] index = SiegeBoard.coord_to_index(coord) result = case action when :move SiegeBoard.move_unit(grid: grid, unit: unit, dest_index: index) when :wall SiegeBoard.place_wall(grid: grid, index: index) else { error: usage_message } end return result if result[:error] game = game.dup game["grid"] = result[:grid] win = SiegeBoard.winner?(game["grid"], unit) if win game["stage"] = "done" game["winner"] = GameStore.norm_nick(user) return { game: game, message: "#{GameStore.norm_nick(user)} reaches the base and wins!\n#{SiegeBoard.render(game['grid'])}", done: true } end game["turn"] = AsyncDuel.opponent(game, user) { game: game, message: "#{format_header('Turn')} \n#{SiegeBoard.render(game['grid'])}\nTurn: #{game['turn']}" } end
Source
# File lib/siege_game.rb, line 120 def usage_message "Usage: !siege challenge <nick> | accept | decline | move <coord> | wall <coord> | board | status" end