diff options
Diffstat (limited to 'lib/colonial_twilight')
-rw-r--r-- | lib/colonial_twilight/board.rb | 123 | ||||
-rw-r--r-- | lib/colonial_twilight/fln_bot.rb | 4 |
2 files changed, 65 insertions, 62 deletions
diff --git a/lib/colonial_twilight/board.rb b/lib/colonial_twilight/board.rb index 6ddd97b..c539dd2 100644 --- a/lib/colonial_twilight/board.rb +++ b/lib/colonial_twilight/board.rb @@ -137,6 +137,24 @@ module ColonialTwilight end + class Track + attr_accessor :v + def initialize max + @v = 0 + @max = max + end + def shift v + w = @v + v + return false if (w < 0 or w > @max) + @v = w + true + end + def clamp v + @v = (@v + v).clamp(0, @max) + end + def data; @v end + end + class Box < Forces attr_reader :name def initialize sym @@ -260,22 +278,33 @@ module ColonialTwilight FRANCE_TRACK=['A','B','C','D','E','F'].freeze - attr_accessor :commitment - attr_accessor :gov_resources, :fln_resources - attr_accessor :support_commitment,:opposition_bases - attr_accessor :resettled_sectors - attr_accessor :france_track, :border_zone_track + attr_reader :spaces_h, :spaces, :sectors, :cities, :countries - attr_reader :spaces, :sectors, :cities, :countries - attr_reader :spaces_h + [:commitment, :gov_resources, :fln_resources, :resettled_sectors, :france_track, :border_zone_track].each do |sym| + define_method sym do instance_variable_get("@#{sym}").v end + end + + [:gov_bases, :french_troops, :french_police, :algerian_troops, :algerian_police, :fln_bases, :fln_underground].each do |sym| + define_method "available_#{sym}" do @available.send(sym) end + # define_method "casualties_#{sym}" do @casualties.send(sym) end + # define_method "out_of_play_#{sym}" do @out_of_play.send(sym) end + end def initialize @names = [] @spaces_h = {} @capabilities = [] + @resettled_sectors = 0 @available = Box.new :available @casualties = Box.new :casualties @out_of_play = Box.new :out_of_play + @fln_resources = Track.new 50 + @gov_resources = Track.new 50 + @commitment = Track.new 50 + @support_commitment = Track.new 50 + @opposition_bases = Track.new 50 + @france_track = Track.new 5 + @border_zone_track = Track.new 4 feed @spaces = @spaces_h.values @sectors = @spaces.select { |s| not s.country? } @@ -283,13 +312,6 @@ module ColonialTwilight @countries = @spaces.select { |s| s.country? } end - [:gov_bases, :french_troops, :french_police, :algerian_troops, :algerian_police, - :fln_bases, :fln_underground].each do |sym| - define_method "available_#{sym}" do @available.send(sym) end - # define_method "casualties_#{sym}" do @casualties.send(sym) end - # define_method "out_of_play_#{sym}" do @out_of_play.send(sym) end - end - def transfer n, what, from, to, towhat=nil towhat = what if towhat.nil? from = get_var from if from.is_a? Symbol @@ -309,34 +331,18 @@ module ColonialTwilight end end - def shift_commitment dc - @commitment = (@commitment + dc).clamp(0, 50) - end - - def shift_resources who, dr - if who == :fln - @fln_resources = (@fln_resources + dr).clamp(0, 50) - elsif who == :gov - @gov_resources = (@gov_resources + dr).clamp(0, 50) + def shift_track what, dt + case what + when :fln_resources; @fln_resources.clamp dt + when :gov_resources; @gov_resources.clamp dt + when :commitment; @commitment.clamp dt + when :france_track; @france_track.shift dt + when :border_zone_track; @border_zone_track.shift dt else - raise "shift_resources : unknown who : #{who}" + raise "shift_track: '#{what}'unknown" end end - def shift_france_track dt - ft = @france_track + dt - return false if (ft < 0 or ft > 5) - @france_track = ft - true - end - - def shift_border_zone_track dt - ft = @shift_border_zone_track + dt - return false if (ft < 0 or ft > 4) - @border_zone_track = ft - true - end - def has where=:spaces, &block r = search &block r.length > 0 @@ -356,28 +362,25 @@ module ColonialTwilight end def compute_victory_points - values = [@support_commitment, @opposition_bases] - @opposition_bases = 0 - @support_commitment = @commitment + values = [@support_commitment.v, @opposition_bases.v] + @opposition_bases.v = 0 + @support_commitment.v = @commitment.v @spaces_h.each do |n,s| - @opposition_bases += s.fln_bases - @opposition_bases += s.pop if s.alignment == :oppose - @support_commitment += s.pop if s.alignment == :support + @opposition_bases.clamp s.fln_bases + @opposition_bases.clamp s.pop if s.alignment == :oppose + @support_commitment.clamp s.pop if s.alignment == :support end - @support_commitment = @support_commitment.clamp(0, 50) - @opposition_bases = @opposition_bases.clamp(0, 50) - values << @support_commitment << @opposition_bases + values << @support_commitment.v << @opposition_bases.v end def data h = { } - [:commitment, :gov_resources, :fln_resources, :support_commitment, :opposition_bases, :resettled_sectors, :france_track, :border_zone_track].each do |sym| - h[sym] = send(sym) + [:gov_resources, :fln_resources, :commitment, :support_commitment, :opposition_bases, + :france_track, :border_zone_track, :available, :casualties, :out_of_play].each do |sym| + h[sym] = instance_variable_get("@#{sym}").data end + h[:resettled_sectors] = @resettled_sectors h[:capabilities] = @capabilities - h[:available] = @available.data - h[:casualties] = @casualties.data - h[:out_of_play] = @out_of_play.data h[:spaces] = @spaces_h.inject([])do |a,(k,s)| a << s.data end h end @@ -507,12 +510,12 @@ module ColonialTwilight end def short - @commitment = 15 - @fln_resources = 15 - @gov_resources = 20 @resettled_sectors = 0 - @france_track = 4 - @border_zone_track = 3 + @commitment.v = 15 + @fln_resources.v = 15 + @gov_resources.v = 20 + @france_track.v = 4 + @border_zone_track.v = 3 @out_of_play.fln_underground = 5 @available.gov_bases = 2 @available.french_police = 4 @@ -521,7 +524,7 @@ module ColonialTwilight resettle 'Setif' resettle 'Tlemcen' resettle 'Bordj Bou Arreridj' - raise "resettled sectors not counted" if resettled_sectors != 3 + raise "resettled sectors not counted" if @resettled_sectors != 3 set_sector 0, {:ap=>1, :fln=>1}, :oppose set_sector 2, {:fp=>1} set_sector 4, {:ap=>1, :fln=>1}, :oppose @@ -548,8 +551,8 @@ module ColonialTwilight set_sector 28, {:fln=>4, :flnb=>2} set_sector 29, {:fln=>5, :flnb=>2} compute_victory_points - raise "wrong opposition + bases" if @opposition_bases != 19 - raise "wrong support + commitment" if @support_commitment != 22 + raise "wrong opposition + bases" if @opposition_bases.v != 19 + raise "wrong support + commitment" if @support_commitment.v != 22 end def medium diff --git a/lib/colonial_twilight/fln_bot.rb b/lib/colonial_twilight/fln_bot.rb index e119d36..ed1c2b4 100644 --- a/lib/colonial_twilight/fln_bot.rb +++ b/lib/colonial_twilight/fln_bot.rb @@ -557,7 +557,7 @@ module ColonialTwilight def _shift_france_track h = get_action :rally, 1, :france_track, false - return false if not @board.shift_france_track 1 + return false if not @board.shift_track :france_track, 1 puts ' => shift_france_track' if @debug h[:france_track] = @board.france_track apply_action h @@ -609,7 +609,7 @@ module ColonialTwilight # :pass, :event, :agitate end cost = h[:fln_resources] - @board.shift_resources :fln, -cost + @board.shift_track :fln_resources, -cost @expended_resources += cost unless h.has_key? :already_expended # _reserve_agitate h[:resources] = {:cost=>cost, :value=>@board.fln_resources} h[:controls] = h[:controls].inject({}){|ch,(k,v)| ch[k] = [v, k.control] if v != k.control; ch} |