diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/colonial_twilight/cards.rb | 3 | ||||
-rw-r--r-- | lib/colonial_twilight/cli.rb | 2 | ||||
-rw-r--r-- | lib/colonial_twilight/game.rb | 110 |
3 files changed, 74 insertions, 41 deletions
diff --git a/lib/colonial_twilight/cards.rb b/lib/colonial_twilight/cards.rb index 0f98dc4..4ffcff5 100644 --- a/lib/colonial_twilight/cards.rb +++ b/lib/colonial_twilight/cards.rb @@ -49,10 +49,11 @@ module ColonialTwilight attr_reader :cards def initialize @cards = {} + add_card 0, 'None', nil, nil add_card 1, 'Quadrillage', 0, CardAction.new('Place up to all French Police in Available in up to 3 spaces', {:what=>:french_police,:from=>:available}) end - def pull n; @cards[n] end + def pull n; @cards[n > 0 ? 1 : 0] end # FIXME private diff --git a/lib/colonial_twilight/cli.rb b/lib/colonial_twilight/cli.rb index 97700ea..8618508 100644 --- a/lib/colonial_twilight/cli.rb +++ b/lib/colonial_twilight/cli.rb @@ -73,7 +73,7 @@ module ColonialTwilight ret << chose('Choose a ruleset', @game.rules) { |s| a = s.split('-'); a[0] = a[0].yellow; a.join('-') } exit(0) if ret[-1] < 0 @game.start self, *ret - # @game.start self, 0, 0 + @game.play end def logo diff --git a/lib/colonial_twilight/game.rb b/lib/colonial_twilight/game.rb index 75c4534..3b1dd99 100644 --- a/lib/colonial_twilight/game.rb +++ b/lib/colonial_twilight/game.rb @@ -13,6 +13,8 @@ module ColonialTwilight class Game + MAX_CARD = 71 + @scenarios = ['Short: 1960-1962: The End Game', 'Medium: 1957-1962: Midgame Development', 'Full: 1955-1962: Algérie Francaise!'].freeze @@ -27,11 +29,11 @@ module ColonialTwilight }.freeze @swap_actions= [:ope_special, :ope_limited] class << self - attr_reader :scenarios, :rules, :actions, :cards + attr_reader :scenarios, :rules, :actions end def rules; Game.rules end def scenarios; Game.scenarios end - def possible_actions used=nil + def possible_actions used ks = Game.actions.keys if not used.nil? if used == :event @@ -65,62 +67,92 @@ module ColonialTwilight @ruleset = rs @scenario = s @board.load [:short, :medium, :long][s] - @max_card = 71 @turn = 0 - @cards = [] + @cards = { + :current => @deck.pull(0), + :prev => @deck.pull(0) + } @actions = [] - @players = [FLNBot.new(self, :FLN), GOVPlayer.new(self, :GOV)] - play + @players = { + :fln => FLNBot.new(self, :FLN), + :gov => GOVPlayer.new(self, :GOV), + :first => :fln, + :second => :gov + } + end + + def current_card + @cards[:current] + end + + def first + @players[@players[:first]] + end + + def second + @players[@players[:second]] + end + + def eligibility_swap + @players[:first], @players[:second] = @players[:second], @players[:first] end - def current_card; @cards[-1] end + def eligibility_swap? + Game.swap_actions.include? @actions[0] + end def play - save_board 0 while true @turn += 1 - ui.turn_start @turn, *@players - c = ui.pull_card @max_card - c = 1 # FIXME - @cards << @deck.pull(c) - ui.show_card @cards[-1] - File.open("actions-#{@turn}.json",'w') { |f| f << JSON.generate([]) } - - ui.continue? @players[0].instance_of? FLNBot - ui.player @players[0], true - @actions[0] = @players[0].play possible_actions - @ui.adjust_track @board.compute_victory_points - save_board 0 + ui.turn_start @turn, first, second + _pull_card - ui.continue? @players[1].instance_of? FLNBot - ui.player @players[1], false - @actions[1] = @players[1].play possible_actions @actions[0] - @ui.adjust_track @board.compute_victory_points - save_board 1 + act = _play first, nil + @ui.adjust_track @board.compute_victory_points + act = _play second, act + @ui.adjust_track @board.compute_victory_points - @cards.shift if @cards.length > 2 - @players[0], @players[1] = @players[1], @players[0] if eligibility_swap? + eligibility_swap if eligibility_swap? @actions.clear end end - def eligibility_swap? - Game.swap_actions.include? @actions[0] + def action_done player, action + File.open("actions-#{@turn}.json",'r+') do |f| + data = JSON.load f + data << action + f.seek 0 + f << JSON.generate(data) + end + @ui.show_player_action player, action end - def save_board phase - json = JSON.generate @board.data - File.open("turn-#{@turn}-#{phase}.json",'w') { |f| f << json } + private + + def _play player, prev_act + _save prev_act.nil? + ui.continue? player.instance_of? FLNBot + ui.player player, prev_act.nil? + player.play possible_actions prev_act end - def action_done player, action - data = nil - File.open("actions-#{@turn}.json",'r') { |f| data = JSON.load f } - data << action + def _pull_card + @cards[:prev] = @cards[:current] + @cards[:current] = @deck.pull ui.pull_card(MAX_CARD) + ui.show_card @cards[:current] + end - json = JSON.generate data - File.open("actions-#{@turn}.json",'w') { |f| f << json } - @ui.show_player_action player, action + def _save first + h = { + :ruleset => @ruleset, + :scenario => @scenario, + :turn => @turn, + :cards => {:current => @cards[:current].num, :prev => @cards[:prev].num}, + :players => {:first => @players[:first], :second => @players[:second]}, + :board => @board.data + } + File.open("turn-#{@turn}-#{first ? 0 : 1}.json",'w') { |f| f << JSON.generate(h) } + File.open("actions-#{@turn}.json",'w') { |f| f << JSON.generate([]) } end end |