diff --git a/lib/dominion/game.rb b/lib/dominion/game.rb index 73fc4d6..e3f8904 100644 --- a/lib/dominion/game.rb +++ b/lib/dominion/game.rb @@ -68,17 +68,9 @@ def step self.prompt = { :prompt => "action (#{player[:actions]} left)?", - :autocomplete => { - :card_active => lambda {|card| - [*card[:type]].include?(:action) && player[:hand].include?(card) - }, - :strategy => lambda {|input| - suggest = input.length == 0 ? nil : board.map(&:first).detect {|x| - prompt[:autocomplete][:card_active][x] && x[:name] =~ /^#{input}/i - } - suggest ? suggest[:name] : nil - } - }, + :autocomplete => Input::Autocomplete.cards {|card| + [*card[:type]].include?(:action) && player[:hand].include?(card) + }[self], :color => :green_back, :accept => lambda {|input| self.prompt = nil @@ -92,17 +84,9 @@ def step elsif player[:buys] > 0 # TODO: option to skip copper buys self.prompt = { :prompt => "buy (#{treasure(player)}/#{player[:buys]} left)?", - :autocomplete => { - :card_active => lambda {|card| - card[:cost] <= treasure(player) - }, - :strategy => lambda {|input| - suggest = input.length == 0 ? nil : board.map(&:first).detect {|x| - prompt[:autocomplete][:card_active][x] && x[:name] =~ /^#{Regexp.escape(input)}/i - } - suggest ? suggest[:name] : nil - } - }, + :autocomplete => Input::Autocomplete.cards {|card| + card[:cost] <= treasure(player) + }[self], :color => :magenta_back, :accept => lambda {|input| self.prompt = nil diff --git a/lib/dominion/input.rb b/lib/dominion/input.rb index f52cdcb..990f760 100644 --- a/lib/dominion/input.rb +++ b/lib/dominion/input.rb @@ -34,6 +34,20 @@ def self.accept_cards(opts) end class Autocomplete + def self.cards(&match_func) + lambda {|game| { + :card_active => lambda {|card| + match_func.call(card) + }, + :strategy => lambda {|input| + suggest = input.length == 0 ? nil : game.board.map(&:first).detect {|x| + match_func.call(x) && x[:name] =~ /^#{input}/i + } + suggest ? suggest[:name] : nil + } + }} + end + def self.cards_on_board(match_func = lambda {|x| true }) lambda {|game| {