From 3ec9c5a923485ef457d21be3ba845535e19d5f54 Mon Sep 17 00:00:00 2001 From: Patrik Olesen Date: Thu, 2 May 2024 06:50:08 +0200 Subject: [PATCH 01/54] =?UTF-8?q?[18Norway]=20=C3=98=20may=20pass=20tokene?= =?UTF-8?q?d=20out=20city?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/engine/game/g_18_norway/game.rb | 34 +++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/lib/engine/game/g_18_norway/game.rb b/lib/engine/game/g_18_norway/game.rb index 3657016346..11642af057 100644 --- a/lib/engine/game/g_18_norway/game.rb +++ b/lib/engine/game/g_18_norway/game.rb @@ -479,6 +479,40 @@ def event_lm_brown! mjosa.lay(tile_by_id('LM2-0')) end + def compute_stops(route) + stops = super + if @round.train_upgrade_assignments[route.train] + skipped = skipped_stop(route, stops) + stops.reject! { |stop| stop == skipped } if skipped + end + stops + end + + def tokened_out_stop(corporation, stops) + stops[1..-2].find { |node| node.city? && node.blocks?(corporation) } + end + + def skipped_stop(route, stops) + return nil if stops.size <= 2 + + # Blocked stop is highest priority as it may stop route from being legal + corporation = route.train.owner + t = tokened_out_stop(corporation, stops) + return t if t + + counted_stops = stops.select { |stop| stop&.visit_cost&.positive? } + + # Skipping is optional - if we are using STRICTLY fewer stops than distance (jumping adds 1) we don't need to skip + return nil if counted_stops.size < route.train.distance + + # Count how many of our tokens are on the route; if only one we cannot skip that one. + tokened_stops = counted_stops.select { |stop| stop.tokened_by?(route.train.owner) } + counted_stops.delete(tokened_stops.first) if tokened_stops.one? + + # Find the lowest revenue stop that can be skipped + counted_stops.max_by { |stop| revenue_for(route, stops.reject { |s| s == stop }) } + end + def issuable_shares(entity) return [] unless entity.corporation? return [] unless round.steps.find { |step| step.instance_of?(G18Norway::Step::IssueShares) }.active? From e88805c9aef28750c8cebb497cff08cb336bb028 Mon Sep 17 00:00:00 2001 From: Patrik Olesen Date: Thu, 22 Feb 2024 06:19:53 +0100 Subject: [PATCH 02/54] [18Norway] No sales during first SR, then p_any_operational --- lib/engine/game/g_18_norway/game.rb | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/engine/game/g_18_norway/game.rb b/lib/engine/game/g_18_norway/game.rb index 3657016346..2d28133c12 100644 --- a/lib/engine/game/g_18_norway/game.rb +++ b/lib/engine/game/g_18_norway/game.rb @@ -37,7 +37,7 @@ class Game < Game::Base EBUY_SELL_MORE_THAN_NEEDED = true CAPITALIZATION = :incremental MUST_BUY_TRAIN = :always - POOL_SHARE_DROP = :left_block + POOL_SHARE_DROP = :none SELL_AFTER = :p_any_operate SELL_MOVEMENT = :left_block HOME_TOKEN_TIMING = :float @@ -539,6 +539,19 @@ def emergency_issuable_bundles(corp) [] end + + def sell_movement(corporation = nil) + return self.class::SELL_MOVEMENT if corporation.nil? + return :left_block_pres if corporation.second_share.price <= 40 + + self.class::SELL_MOVEMENT + end + + def check_sale_timing(entity, bundle) + return false if @turn <= 1 && !@round.operating? + + super(entity, bundle) + end end end end From 385e4ad4f9fa85efe91cac0fb80e01cbb71b1197 Mon Sep 17 00:00:00 2001 From: Michael Brandt Date: Sat, 29 Jun 2024 23:57:28 -0600 Subject: [PATCH 03/54] avoid `nil?` call --- lib/engine/game/g_18_norway/game.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/engine/game/g_18_norway/game.rb b/lib/engine/game/g_18_norway/game.rb index 2d28133c12..fa54b9ddd0 100644 --- a/lib/engine/game/g_18_norway/game.rb +++ b/lib/engine/game/g_18_norway/game.rb @@ -541,7 +541,7 @@ def emergency_issuable_bundles(corp) end def sell_movement(corporation = nil) - return self.class::SELL_MOVEMENT if corporation.nil? + return self.class::SELL_MOVEMENT unless corporation return :left_block_pres if corporation.second_share.price <= 40 self.class::SELL_MOVEMENT From fb29f9742ff53d7a3a2028683c4476fe9d412b60 Mon Sep 17 00:00:00 2001 From: Patrik Olesen Date: Sun, 30 Jun 2024 15:27:46 +0200 Subject: [PATCH 04/54] [18Uruguay] Change to Alpha Corrected port it should be J14 and not J4 RPTLA should operate last --- lib/engine/game/g_18_uruguay/game.rb | 8 +++++++- lib/engine/game/g_18_uruguay/meta.rb | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/engine/game/g_18_uruguay/game.rb b/lib/engine/game/g_18_uruguay/game.rb index c6ef9746f8..fa5229839c 100644 --- a/lib/engine/game/g_18_uruguay/game.rb +++ b/lib/engine/game/g_18_uruguay/game.rb @@ -112,7 +112,7 @@ class Game < Game::Base ASSIGNMENT_STACK_GROUPS = ASSIGNMENT_TOKENS.transform_values { |_str| 'GOODS' } - PORTS = %w[E1 G1 I1 J4 K5 K7 K13].freeze + PORTS = %w[E1 G1 I1 J14 K5 K7 K13].freeze MARKET = [ %w[70 75 80 90 100p 110 125 150 175 200 225 250 275 300 325 350 375 400 425 450], %w[65 70 75 80 90p 100 110 125 150 175 200 225 250 275 300 325 350 375 400 425], @@ -527,6 +527,12 @@ def can_go_bankrupt?(player, corporation) total_emr_buying_power(player, corporation) < price end + + def operating_order + return super if nationalized? + + super.reject { |c| c == @rptla }.append(@rptla) + end end end end diff --git a/lib/engine/game/g_18_uruguay/meta.rb b/lib/engine/game/g_18_uruguay/meta.rb index b88475503e..46028ee396 100644 --- a/lib/engine/game/g_18_uruguay/meta.rb +++ b/lib/engine/game/g_18_uruguay/meta.rb @@ -8,7 +8,7 @@ module G18Uruguay module Meta include Game::Meta - DEV_STAGE = :prealpha + DEV_STAGE = :alpha PROTOTYPE = true GAME_DESIGNER = 'Pontus Nilsson' From 02d5a634adc41147a1ce9b24364084fd28639ec8 Mon Sep 17 00:00:00 2001 From: patrikolesen Date: Sun, 30 Jun 2024 15:40:32 +0200 Subject: [PATCH 05/54] Update lib/engine/game/g_18_norway/game.rb Co-authored-by: Michael Brandt --- lib/engine/game/g_18_norway/game.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/engine/game/g_18_norway/game.rb b/lib/engine/game/g_18_norway/game.rb index 11642af057..42742151e1 100644 --- a/lib/engine/game/g_18_norway/game.rb +++ b/lib/engine/game/g_18_norway/game.rb @@ -510,7 +510,7 @@ def skipped_stop(route, stops) counted_stops.delete(tokened_stops.first) if tokened_stops.one? # Find the lowest revenue stop that can be skipped - counted_stops.max_by { |stop| revenue_for(route, stops.reject { |s| s == stop }) } + counted_stops.min_by { |stop| revenue_for(route, stops.reject { |s| s == stop }) } end def issuable_shares(entity) From 03a473215c439bad1cc369bc3f29d0f5605592ee Mon Sep 17 00:00:00 2001 From: Patrik Olesen Date: Fri, 7 Jun 2024 09:22:47 +0200 Subject: [PATCH 06/54] [18Norway] Companies should be restartable after close --- lib/engine/game/g_18_norway/game.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/engine/game/g_18_norway/game.rb b/lib/engine/game/g_18_norway/game.rb index 3d71339e97..58660a90cc 100644 --- a/lib/engine/game/g_18_norway/game.rb +++ b/lib/engine/game/g_18_norway/game.rb @@ -49,6 +49,8 @@ class Game < Game::Base BANK_CASH = 999_000 + CLOSED_CORP_RESERVATIONS_REMOVED = false + GAME_END_CHECK = { bankrupt: :immediate, custom: :one_more_full_or_set }.freeze CERT_LIMIT = { @@ -497,6 +499,11 @@ def after_buy_company(player, company, price) end end + def close_corporation(corporation, quiet: false) + super + @corporations << reset_corporation(corporation) + end + def event_lm_green! @log << '-- Event: Mjøsa green ferry lines opens up. --' mjosa.lay(tile_by_id('LM1-0')) From edf6f771d37159d03dcc438649bf125b887295b4 Mon Sep 17 00:00:00 2001 From: Patrik Olesen Date: Thu, 6 Jun 2024 08:56:11 +0200 Subject: [PATCH 07/54] [18Norway] Update cert limit --- lib/engine/game/g_18_norway/game.rb | 12 ++++++++++++ .../g_18_norway/steps/nationalize_corporation.rb | 1 + 2 files changed, 13 insertions(+) diff --git a/lib/engine/game/g_18_norway/game.rb b/lib/engine/game/g_18_norway/game.rb index 3d71339e97..aa3086d7fa 100644 --- a/lib/engine/game/g_18_norway/game.rb +++ b/lib/engine/game/g_18_norway/game.rb @@ -197,6 +197,7 @@ def setup @all_tiles.each { |t| t.ignore_gauge_walk = true } @_tiles.values.each { |t| t.ignore_gauge_walk = true } @hexes.each { |h| h.tile.ignore_gauge_walk = true } + update_cert_limit # Allow to build against Mjosa hex_by_id('H26').neighbors[1] = hex_by_id('G27') @@ -483,6 +484,17 @@ def check_route_token(route, token) raise NoToken, 'Route must contain token' unless token end + def update_cert_limit_to(new_cert_limit) + @cert_limit = new_cert_limit + @log << "Certificate limit is now #{@cert_limit}" + end + + def update_cert_limit + nr = @corporations.sum(0) { |corporation| nationalized?(corporation) ? 1 : 0 } + new_cert_limit = CERT_LIMIT[@players.size][nr] + update_cert_limit_to(new_cert_limit) unless @cert_limit == new_cert_limit + end + def after_buy_company(player, company, price) return super if company.id != 'P7' diff --git a/lib/engine/game/g_18_norway/steps/nationalize_corporation.rb b/lib/engine/game/g_18_norway/steps/nationalize_corporation.rb index 96769bf9a3..f5d0063c1e 100644 --- a/lib/engine/game/g_18_norway/steps/nationalize_corporation.rb +++ b/lib/engine/game/g_18_norway/steps/nationalize_corporation.rb @@ -44,6 +44,7 @@ def process_choose(action) value = @game.convert(action.entity, action.choice.to_i) @log << "#{action.entity.name} nationalized and receives #{@game.format_currency(value)}" + @game.update_cert_limit @game.next_round! end end From e97f390d240aeb78c0c02a4e495f7b860c8df7cd Mon Sep 17 00:00:00 2001 From: Michael Brandt Date: Mon, 1 Jul 2024 21:17:14 -0600 Subject: [PATCH 08/54] [1822PNW] fix backroom negotiations targets Fixes #10996 --- .../game/g_1822_pnw/step/acquire_company.rb | 22 +++++++++---------- public/fixtures/1822PNW/165580.json | 1 + spec/game_state_spec.rb | 14 ++++++++++++ 3 files changed, 26 insertions(+), 11 deletions(-) create mode 100644 public/fixtures/1822PNW/165580.json diff --git a/lib/engine/game/g_1822_pnw/step/acquire_company.rb b/lib/engine/game/g_1822_pnw/step/acquire_company.rb index 028761a827..12235c505a 100644 --- a/lib/engine/game/g_1822_pnw/step/acquire_company.rb +++ b/lib/engine/game/g_1822_pnw/step/acquire_company.rb @@ -7,6 +7,8 @@ module Game module G1822PNW module Step class AcquireCompany < Engine::Step::AcquireCompany + attr_reader :choices + def actions(entity) return ['choose'] if @choices @@ -31,8 +33,6 @@ def process_acquire_company(action) end end - attr_reader :choices - def choice_name 'Pick which associated minor to replace' end @@ -95,21 +95,21 @@ def process_choose(action) end def p20_targets - bidbox_corporations = @game.bidbox_minors.map { |c| @game.corporation_from_company(c) } - targets = @game.corporations.select { |c| @game.associated_minor?(c) && !c.owner && !bidbox_corporations.include?(c) } + bidbox_corporations = Set.new(@game.bidbox_minors) { |c| @game.corporation_from_company(c) } - # include minors that fell through the bidboxes without bids - @game.minor_associations.each do |minor_id, major_id| + @game.minor_associations.each_with_object([]) do |(minor_id, major_id), targets| company = @game.company_by_id("M#{minor_id}") minor = @game.corporation_by_id(minor_id) major = @game.corporation_by_id(major_id) - targets << minor if !company.owner && company.closed? && - !minor.owner && minor.closed? && - !major.owner && !major.floated? - end + already_discarded = (!company.owner && company.closed? && minor.closed?) + + minor_available = !minor.owner && + (already_discarded || !bidbox_corporations.include?(minor)) + major_available = !major.owner && !major.floated? - targets + targets << minor if minor_available && major_available + end end end end diff --git a/public/fixtures/1822PNW/165580.json b/public/fixtures/1822PNW/165580.json new file mode 100644 index 0000000000..aa952fde3a --- /dev/null +++ b/public/fixtures/1822PNW/165580.json @@ -0,0 +1 @@ +{"status":"finished","actions":[{"type":"bid","entity":1339,"entity_type":"player","id":2,"created_at":1718470091,"company":"M17","price":130},{"type":"bid","entity":1339,"entity_type":"player","id":3,"created_at":1718470091,"company":"P21","price":0},{"type":"pass","entity":1339,"entity_type":"player","id":4,"created_at":1718470091},{"type":"bid","entity":790,"entity_type":"player","id":5,"created_at":1718470091,"company":"M17","price":135},{"type":"bid","entity":790,"entity_type":"player","id":6,"created_at":1718470091,"company":"M20","price":100},{"type":"bid","entity":790,"entity_type":"player","id":7,"created_at":1718470091,"company":"M6","price":100},{"type":"bid","entity":14958,"entity_type":"player","id":8,"created_at":1718470091,"company":"M6","price":105},{"type":"pass","entity":14958,"entity_type":"player","id":9,"created_at":1718470091},{"type":"bid","entity":17678,"entity_type":"player","id":10,"created_at":1718470091,"company":"P1","price":0},{"type":"bid","entity":17678,"entity_type":"player","id":11,"created_at":1718470091,"company":"P6","price":0},{"type":"bid","entity":17678,"entity_type":"player","id":12,"created_at":1718470091,"company":"M20","price":105},{"type":"bid","entity":1339,"entity_type":"player","id":13,"created_at":1718470091,"company":"M17","price":140},{"type":"pass","entity":1339,"entity_type":"player","id":14,"created_at":1718470091},{"type":"bid","entity":790,"entity_type":"player","id":15,"created_at":1718470091,"company":"P6","price":20},{"type":"bid","entity":790,"entity_type":"player","id":16,"created_at":1718470091,"company":"M6","price":110},{"type":"bid","entity":790,"entity_type":"player","id":17,"created_at":1718470091,"company":"M17","price":145},{"type":"bid","entity":14958,"entity_type":"player","id":18,"created_at":1718470091,"company":"M6","price":115},{"type":"pass","entity":14958,"entity_type":"player","id":19,"created_at":1718470091},{"type":"bid","entity":17678,"entity_type":"player","id":20,"created_at":1718470091,"company":"M6","price":140},{"type":"pass","entity":17678,"entity_type":"player","id":21,"created_at":1718470091},{"type":"bid","entity":1339,"entity_type":"player","id":22,"created_at":1718470091,"company":"M17","price":150},{"type":"pass","entity":1339,"entity_type":"player","id":23,"created_at":1718470091},{"type":"bid","entity":790,"entity_type":"player","id":24,"created_at":1718470091,"company":"M17","price":155},{"type":"bid","entity":790,"entity_type":"player","id":25,"created_at":1718470091,"company":"M6","price":145},{"type":"pass","entity":790,"entity_type":"player","id":26,"created_at":1718470091},{"type":"bid","entity":14958,"entity_type":"player","id":27,"created_at":1718470091,"company":"M6","price":150},{"type":"bid","entity":14958,"entity_type":"player","id":28,"created_at":1718470091,"company":"P6","price":25},{"type":"pass","entity":14958,"entity_type":"player","id":29,"created_at":1718470091},{"type":"program_share_pass","entity":17678,"entity_type":"player","id":30,"created_at":1718470091,"auto_actions":[{"type":"pass","entity":17678,"entity_type":"player","created_at":1717337974}],"unconditional":false,"indefinite":false},{"type":"bid","entity":1339,"entity_type":"player","id":31,"created_at":1718470091,"company":"M17","price":160},{"type":"pass","entity":1339,"entity_type":"player","id":32,"created_at":1718470091},{"type":"bid","entity":790,"entity_type":"player","id":33,"created_at":1718470091,"company":"P6","price":30},{"type":"bid","entity":790,"entity_type":"player","id":34,"created_at":1718470091,"company":"M17","price":165},{"type":"pass","entity":790,"entity_type":"player","id":35,"created_at":1718470091},{"type":"bid","entity":14958,"entity_type":"player","id":36,"created_at":1718470091,"company":"P6","price":35},{"type":"bid","entity":14958,"entity_type":"player","id":37,"created_at":1718470091,"company":"P1","price":20},{"type":"pass","entity":14958,"entity_type":"player","id":38,"created_at":1718470091,"auto_actions":[{"type":"program_disable","entity":17678,"entity_type":"player","created_at":1717342212,"reason":"No longer winning bid on P1"}]},{"type":"bid","entity":17678,"entity_type":"player","id":39,"created_at":1718470091,"company":"P1","price":40},{"type":"bid","entity":17678,"entity_type":"player","id":40,"created_at":1718470091,"company":"P6","price":50},{"type":"pass","entity":17678,"entity_type":"player","id":41,"created_at":1718470091},{"type":"bid","entity":1339,"entity_type":"player","id":42,"created_at":1718470091,"company":"M17","price":170},{"type":"pass","entity":1339,"entity_type":"player","id":43,"created_at":1718470091},{"type":"bid","entity":790,"entity_type":"player","id":44,"created_at":1718470091,"company":"M20","price":110},{"type":"bid","entity":790,"entity_type":"player","id":45,"created_at":1718470091,"company":"M17","price":175},{"type":"pass","entity":790,"entity_type":"player","id":46,"created_at":1718470091},{"type":"bid","entity":14958,"entity_type":"player","id":47,"created_at":1718470091,"company":"P6","price":55},{"type":"bid","entity":14958,"entity_type":"player","id":48,"created_at":1718470091,"company":"P1","price":45},{"type":"bid","entity":14958,"entity_type":"player","id":49,"created_at":1718470091,"company":"P21","price":5},{"type":"bid","entity":17678,"entity_type":"player","id":50,"created_at":1718470091,"company":"M20","price":120},{"type":"bid","entity":17678,"entity_type":"player","id":51,"created_at":1718470091,"company":"P1","price":60},{"type":"bid","entity":17678,"entity_type":"player","id":52,"created_at":1718470091,"company":"M6","price":160},{"type":"bid","entity":1339,"entity_type":"player","id":53,"created_at":1718470091,"company":"M17","price":180},{"type":"bid","entity":1339,"entity_type":"player","id":54,"created_at":1718470091,"company":"P21","price":10},{"type":"pass","entity":1339,"entity_type":"player","id":55,"created_at":1718470091},{"type":"bid","entity":790,"entity_type":"player","id":56,"created_at":1718470091,"company":"M17","price":185},{"type":"bid","entity":790,"entity_type":"player","id":57,"created_at":1718470091,"company":"M6","price":165},{"type":"pass","entity":790,"entity_type":"player","id":58,"created_at":1718470091},{"type":"bid","entity":14958,"entity_type":"player","id":59,"created_at":1718470091,"company":"M6","price":170},{"type":"bid","entity":14958,"entity_type":"player","id":60,"created_at":1718470091,"company":"P21","price":15},{"type":"pass","entity":14958,"entity_type":"player","id":61,"created_at":1718470091},{"type":"bid","entity":17678,"entity_type":"player","id":62,"created_at":1718470091,"company":"P6","price":60},{"type":"pass","entity":17678,"entity_type":"player","id":63,"created_at":1718470091},{"type":"bid","entity":1339,"entity_type":"player","id":64,"created_at":1718470091,"company":"P21","price":20},{"type":"bid","entity":1339,"entity_type":"player","id":65,"created_at":1718470091,"company":"M6","price":175},{"type":"pass","entity":1339,"entity_type":"player","id":66,"created_at":1718470091},{"type":"bid","entity":790,"entity_type":"player","id":67,"created_at":1718470091,"company":"M20","price":125},{"type":"pass","entity":790,"entity_type":"player","id":68,"created_at":1718470091},{"type":"bid","entity":14958,"entity_type":"player","id":69,"created_at":1718470091,"company":"M6","price":180},{"type":"bid","entity":14958,"entity_type":"player","id":70,"created_at":1718470091,"company":"P6","price":65},{"type":"bid","entity":14958,"entity_type":"player","id":71,"created_at":1718470091,"company":"P21","price":25},{"type":"bid","entity":17678,"entity_type":"player","id":72,"created_at":1718470091,"company":"M20","price":135},{"type":"pass","entity":17678,"entity_type":"player","id":73,"created_at":1718470091},{"type":"bid","entity":1339,"entity_type":"player","id":74,"created_at":1718470091,"company":"P21","price":30},{"type":"bid","entity":1339,"entity_type":"player","id":75,"created_at":1718470091,"company":"M6","price":185},{"type":"pass","entity":1339,"entity_type":"player","id":76,"created_at":1718470091},{"type":"bid","entity":790,"entity_type":"player","id":77,"created_at":1718470091,"company":"P6","price":70},{"type":"pass","entity":790,"entity_type":"player","id":78,"created_at":1718470091},{"type":"bid","entity":14958,"entity_type":"player","id":79,"created_at":1718470091,"company":"P6","price":75},{"type":"bid","entity":14958,"entity_type":"player","id":80,"created_at":1718470091,"company":"M6","price":190},{"type":"pass","entity":14958,"entity_type":"player","id":81,"created_at":1718470091},{"type":"program_share_pass","entity":17678,"entity_type":"player","id":82,"created_at":1718470091,"auto_actions":[{"type":"pass","entity":17678,"entity_type":"player","created_at":1717424022}],"unconditional":false,"indefinite":false},{"type":"bid","entity":1339,"entity_type":"player","id":83,"created_at":1718470091,"company":"M17","price":190},{"type":"pass","entity":1339,"entity_type":"player","id":84,"created_at":1718470091},{"type":"bid","entity":790,"entity_type":"player","id":85,"created_at":1718470091,"company":"M17","price":195},{"type":"pass","entity":790,"entity_type":"player","id":86,"created_at":1718470091},{"type":"bid","entity":14958,"entity_type":"player","id":87,"created_at":1718470091,"company":"P21","price":35},{"type":"pass","entity":14958,"entity_type":"player","id":88,"created_at":1718470091,"auto_actions":[{"type":"pass","entity":17678,"entity_type":"player","created_at":1717455158}]},{"type":"bid","entity":1339,"entity_type":"player","id":89,"created_at":1718470091,"company":"P21","price":40},{"type":"pass","entity":1339,"entity_type":"player","id":90,"created_at":1718470091},{"type":"pass","entity":790,"entity_type":"player","id":91,"created_at":1718470091},{"type":"program_share_pass","entity":14958,"entity_type":"player","id":92,"created_at":1718470091,"auto_actions":[{"type":"pass","entity":14958,"entity_type":"player","created_at":1717461584},{"type":"pass","entity":17678,"entity_type":"player","created_at":1717461584}],"unconditional":false,"indefinite":false},{"type":"bid","entity":1339,"entity_type":"player","id":93,"created_at":1718470091,"company":"P1","price":65},{"type":"pass","entity":1339,"entity_type":"player","id":94,"created_at":1718470091},{"type":"pass","entity":790,"entity_type":"player","id":95,"created_at":1718470091,"auto_actions":[{"type":"pass","entity":14958,"entity_type":"player","created_at":1717502525},{"type":"program_disable","entity":17678,"entity_type":"player","created_at":1717502525,"reason":"No longer winning bid on P1"}]},{"type":"program_share_pass","entity":17678,"entity_type":"player","id":96,"created_at":1718470091,"auto_actions":[{"type":"pass","entity":17678,"entity_type":"player","created_at":1717506176}],"unconditional":false,"indefinite":false},{"type":"pass","entity":1339,"entity_type":"player","id":97,"created_at":1718470091},{"type":"buy_train","entity":"17","entity_type":"corporation","id":98,"created_at":1718470091,"train":"L-0","price":60,"variant":"L"},{"type":"lay_tile","entity":"17","entity_type":"corporation","id":99,"created_at":1718470091,"hex":"O8","tile":"X24-0","rotation":0},{"type":"run_routes","entity":"17","entity_type":"corporation","id":100,"created_at":1718470091,"routes":[{"train":"L-1","connections":[["local","O8"]],"hexes":["O8"],"revenue":40,"revenue_str":"O8","nodes":[]}],"extra_revenue":0},{"type":"buy_train","entity":"6","entity_type":"corporation","id":101,"created_at":1718470091,"train":"L-0","price":60,"variant":"L"},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":102,"created_at":1718470091,"hex":"G8","tile":"4-0","rotation":0},{"type":"run_routes","entity":"6","entity_type":"corporation","id":103,"created_at":1718470091,"routes":[{"train":"L-2","connections":[["F9","G8"]],"hexes":["F9","G8"],"revenue":40,"revenue_str":"F9-G8","nodes":["F9-0","G8-0"]}],"extra_revenue":0},{"type":"pass","entity":"6","entity_type":"corporation","id":104,"created_at":1718470091},{"type":"buy_train","entity":"20","entity_type":"corporation","id":105,"created_at":1718470091,"train":"L-0","price":60,"variant":"L"},{"type":"lay_tile","entity":"20","entity_type":"corporation","id":106,"created_at":1718470091,"hex":"O20","tile":"6-0","rotation":4},{"type":"run_routes","entity":"20","entity_type":"corporation","id":107,"created_at":1718470091,"routes":[{"train":"L-3","connections":[["local","O20"]],"hexes":["O20"],"revenue":20,"revenue_str":"O20","nodes":["O20-0"]}],"extra_revenue":0},{"type":"pass","entity":"20","entity_type":"corporation","id":108,"created_at":1718470091},{"type":"bid","entity":1339,"entity_type":"player","id":109,"created_at":1718470091,"company":"M10","price":100},{"type":"bid","entity":1339,"entity_type":"player","id":110,"created_at":1718470091,"company":"P2","price":30},{"type":"pass","entity":1339,"entity_type":"player","id":111,"created_at":1718470091},{"type":"bid","entity":17678,"entity_type":"player","id":112,"created_at":1718470091,"company":"P18","price":0},{"type":"bid","entity":17678,"entity_type":"player","id":113,"created_at":1718470091,"company":"P2","price":50},{"type":"pass","entity":17678,"entity_type":"player","id":114,"created_at":1718470091},{"type":"bid","entity":790,"entity_type":"player","id":115,"created_at":1718470091,"company":"M10","price":105},{"type":"bid","entity":790,"entity_type":"player","id":116,"created_at":1718470091,"company":"P13","price":10},{"type":"bid","entity":790,"entity_type":"player","id":117,"created_at":1718470091,"company":"P18","price":10},{"type":"bid","entity":14958,"entity_type":"player","id":118,"created_at":1718470091,"company":"P18","price":15},{"type":"bid","entity":14958,"entity_type":"player","id":119,"created_at":1718470091,"company":"P13","price":15},{"type":"pass","entity":14958,"entity_type":"player","id":120,"created_at":1718470091},{"type":"bid","entity":1339,"entity_type":"player","id":121,"created_at":1718470091,"company":"M10","price":110},{"type":"bid","entity":1339,"entity_type":"player","id":122,"created_at":1718470091,"company":"P2","price":55},{"type":"pass","entity":1339,"entity_type":"player","id":123,"created_at":1718470091},{"type":"bid","entity":17678,"entity_type":"player","id":124,"created_at":1718470091,"company":"P18","price":25},{"type":"bid","entity":17678,"entity_type":"player","id":125,"created_at":1718470091,"company":"P2","price":70},{"type":"pass","entity":17678,"entity_type":"player","id":126,"created_at":1718470091},{"type":"bid","entity":790,"entity_type":"player","id":127,"created_at":1718470091,"company":"M10","price":115},{"type":"pass","entity":790,"entity_type":"player","id":128,"created_at":1718470091},{"type":"bid","entity":14958,"entity_type":"player","id":129,"created_at":1718470091,"company":"P18","price":30},{"type":"pass","entity":14958,"entity_type":"player","id":130,"created_at":1718470091},{"type":"bid","entity":1339,"entity_type":"player","id":131,"created_at":1718470091,"company":"M10","price":120},{"type":"pass","entity":1339,"entity_type":"player","id":132,"created_at":1718470091},{"type":"bid","entity":17678,"entity_type":"player","id":133,"created_at":1718470091,"company":"P18","price":40},{"type":"pass","entity":17678,"entity_type":"player","id":134,"created_at":1718470091},{"type":"bid","entity":790,"entity_type":"player","id":135,"created_at":1718470091,"company":"M10","price":125},{"type":"pass","entity":790,"entity_type":"player","id":136,"created_at":1718470091},{"type":"bid","entity":14958,"entity_type":"player","id":137,"created_at":1718470091,"company":"P18","price":45},{"type":"pass","entity":14958,"entity_type":"player","id":138,"created_at":1718470091},{"type":"bid","entity":1339,"entity_type":"player","id":139,"created_at":1718470091,"company":"M10","price":130},{"type":"pass","entity":1339,"entity_type":"player","id":140,"created_at":1718470091},{"type":"bid","entity":17678,"entity_type":"player","id":141,"created_at":1718470091,"company":"P18","price":50},{"type":"pass","entity":17678,"entity_type":"player","id":142,"created_at":1718470091},{"type":"bid","entity":790,"entity_type":"player","id":143,"created_at":1718470091,"company":"M10","price":135},{"type":"bid","entity":790,"entity_type":"player","id":144,"created_at":1718470091,"company":"P13","price":20},{"type":"pass","entity":790,"entity_type":"player","id":145,"created_at":1718470091},{"type":"bid","entity":14958,"entity_type":"player","id":146,"created_at":1718470091,"company":"M10","price":140},{"type":"pass","entity":14958,"entity_type":"player","id":147,"created_at":1718470091},{"type":"bid","entity":1339,"entity_type":"player","id":148,"created_at":1718470091,"company":"M10","price":145},{"type":"bid","entity":1339,"entity_type":"player","id":149,"created_at":1718470091,"company":"P2","price":75},{"type":"pass","entity":1339,"entity_type":"player","id":150,"created_at":1718470091},{"type":"bid","entity":17678,"entity_type":"player","id":151,"created_at":1718470091,"company":"P2","price":80},{"type":"pass","entity":17678,"entity_type":"player","id":152,"created_at":1718470091},{"type":"bid","entity":790,"entity_type":"player","id":153,"created_at":1718470091,"company":"M10","price":150},{"type":"pass","entity":790,"entity_type":"player","id":154,"created_at":1718470091},{"type":"bid","entity":14958,"entity_type":"player","id":155,"created_at":1718470091,"company":"P13","price":25},{"type":"bid","entity":14958,"entity_type":"player","id":156,"created_at":1718470091,"company":"P18","price":55},{"type":"pass","entity":14958,"entity_type":"player","id":157,"created_at":1718470091},{"type":"bid","entity":1339,"entity_type":"player","id":158,"created_at":1718470091,"company":"M10","price":155},{"type":"pass","entity":1339,"entity_type":"player","id":159,"created_at":1718470091},{"type":"bid","entity":17678,"entity_type":"player","id":160,"created_at":1718470091,"company":"M12","price":100},{"type":"pass","entity":17678,"entity_type":"player","id":161,"created_at":1718470091},{"type":"bid","entity":790,"entity_type":"player","id":162,"created_at":1718470092,"company":"M10","price":160},{"type":"pass","entity":790,"entity_type":"player","id":163,"created_at":1718470092},{"type":"pass","entity":14958,"entity_type":"player","id":164,"created_at":1718470092},{"type":"bid","entity":1339,"entity_type":"player","id":165,"created_at":1718470092,"company":"M11","price":100},{"type":"pass","entity":1339,"entity_type":"player","id":166,"created_at":1718470092},{"type":"program_share_pass","entity":17678,"entity_type":"player","id":167,"created_at":1718470092,"auto_actions":[{"type":"pass","entity":17678,"entity_type":"player","created_at":1717607758}],"unconditional":false,"indefinite":false},{"type":"pass","entity":790,"entity_type":"player","id":168,"created_at":1718470092},{"type":"program_share_pass","entity":14958,"entity_type":"player","id":169,"created_at":1718470092,"auto_actions":[{"type":"pass","entity":14958,"entity_type":"player","created_at":1717611529}],"unconditional":false,"indefinite":false},{"type":"bid","entity":1339,"entity_type":"player","id":170,"created_at":1718470092,"company":"P13","price":30},{"type":"pass","entity":1339,"entity_type":"player","id":171,"created_at":1718470092,"auto_actions":[{"type":"pass","entity":17678,"entity_type":"player","created_at":1717621823}]},{"type":"pass","entity":790,"entity_type":"player","id":172,"created_at":1718470092,"auto_actions":[{"type":"program_disable","entity":14958,"entity_type":"player","created_at":1717622333,"reason":"No longer winning bid on P13"}]},{"type":"bid","entity":14958,"entity_type":"player","id":173,"created_at":1718470092,"company":"P13","price":35},{"type":"pass","entity":14958,"entity_type":"player","id":174,"created_at":1718470092},{"type":"pass","entity":1339,"entity_type":"player","id":175,"created_at":1718470092,"auto_actions":[{"type":"pass","entity":17678,"entity_type":"player","created_at":1717626241}]},{"type":"pass","entity":790,"entity_type":"player","id":176,"created_at":1718470092},{"type":"pass","entity":14958,"entity_type":"player","id":177,"created_at":1718470092},{"type":"lay_tile","entity":"17","entity_type":"corporation","id":178,"created_at":1718470092,"hex":"P11","tile":"9-0","rotation":1},{"type":"run_routes","entity":"17","entity_type":"corporation","id":179,"created_at":1718470092,"routes":[{"train":"L-1","connections":[["local","O8"]],"hexes":["O8"],"revenue":40,"revenue_str":"O8","nodes":[]}],"extra_revenue":0},{"type":"pass","entity":"17","entity_type":"corporation","id":180,"created_at":1718470092},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":181,"created_at":1718470092,"hex":"F7","tile":"BC-0","rotation":0},{"type":"run_routes","entity":"6","entity_type":"corporation","id":182,"created_at":1718470092,"routes":[{"train":"L-2","connections":[["F9","G8"]],"hexes":["F9","G8"],"revenue":40,"revenue_str":"F9-G8","nodes":["F9-0","G8-0"]}],"extra_revenue":0},{"type":"buy_train","entity":"6","entity_type":"corporation","id":183,"created_at":1718470092,"train":"L-2","price":80,"variant":"2","exchange":"L-2"},{"type":"pass","entity":"20","entity_type":"corporation","id":184,"created_at":1718470092},{"type":"lay_tile","entity":"20","entity_type":"corporation","id":185,"created_at":1718470092,"hex":"P19","tile":"58-0","rotation":1},{"type":"run_routes","entity":"20","entity_type":"corporation","id":186,"created_at":1718470092,"routes":[{"train":"L-3","connections":[["O20","P19"]],"hexes":["O20","P19"],"revenue":30,"revenue_str":"O20-P19","nodes":["O20-0","P19-0"]}],"extra_revenue":0},{"type":"pass","entity":"20","entity_type":"corporation","id":187,"created_at":1718470092},{"type":"buy_train","entity":"10","entity_type":"corporation","id":188,"created_at":1718470092,"train":"L-0","price":60,"variant":"L"},{"type":"pass","entity":"10","entity_type":"corporation","id":189,"created_at":1718470092},{"type":"lay_tile","entity":"10","entity_type":"corporation","id":190,"created_at":1718470092,"hex":"J13","tile":"3-0","rotation":2},{"type":"run_routes","entity":"10","entity_type":"corporation","id":191,"created_at":1718470092,"routes":[{"train":"L-6","connections":[["J13","I12"]],"hexes":["I12","J13"],"revenue":30,"revenue_str":"I12-J13","nodes":["J13-0","I12-0"]}],"extra_revenue":0},{"type":"pass","entity":"10","entity_type":"corporation","id":192,"created_at":1718470092},{"type":"buy_train","entity":"12","entity_type":"corporation","id":193,"created_at":1718470092,"train":"L-0","price":60,"variant":"L"},{"type":"pass","entity":"12","entity_type":"corporation","id":194,"created_at":1718470092},{"type":"lay_tile","entity":"12","entity_type":"corporation","id":195,"created_at":1718470092,"hex":"J23","tile":"6-1","rotation":0},{"type":"run_routes","entity":"12","entity_type":"corporation","id":196,"created_at":1718470092,"routes":[{"train":"L-7","connections":[["local","J23"]],"hexes":["J23"],"revenue":20,"revenue_str":"J23","nodes":["J23-0"]}],"extra_revenue":0},{"type":"pass","entity":"12","entity_type":"corporation","id":197,"created_at":1718470092},{"type":"buy_train","entity":"11","entity_type":"corporation","id":198,"created_at":1718470092,"train":"L-0","price":60,"variant":"L"},{"type":"pass","entity":"11","entity_type":"corporation","id":199,"created_at":1718470092},{"type":"lay_tile","entity":"11","entity_type":"corporation","id":200,"created_at":1718470092,"hex":"J5","tile":"5-0","rotation":4},{"type":"run_routes","entity":"11","entity_type":"corporation","id":201,"created_at":1718470092,"routes":[{"train":"L-8","connections":[["local","J5"]],"hexes":["J5"],"revenue":20,"revenue_str":"J5","nodes":["J5-0"]}],"extra_revenue":0},{"type":"pass","entity":"11","entity_type":"corporation","id":202,"created_at":1718470092},{"type":"bid","entity":1339,"entity_type":"player","id":203,"created_at":1718470092,"company":"M18","price":120},{"type":"bid","entity":1339,"entity_type":"player","id":204,"created_at":1718470092,"company":"P16","price":10},{"type":"pass","entity":1339,"entity_type":"player","id":205,"created_at":1718470092},{"type":"bid","entity":17678,"entity_type":"player","id":206,"created_at":1718470092,"company":"P5","price":0},{"type":"bid","entity":17678,"entity_type":"player","id":207,"created_at":1718470092,"company":"P10","price":0},{"type":"program_share_pass","entity":17678,"entity_type":"player","id":208,"created_at":1718470092,"auto_actions":[{"type":"pass","entity":17678,"entity_type":"player","created_at":1717684554}],"unconditional":false,"indefinite":false},{"type":"bid","entity":14958,"entity_type":"player","id":209,"created_at":1718470092,"company":"P16","price":15},{"type":"bid","entity":14958,"entity_type":"player","id":210,"created_at":1718470092,"company":"P10","price":5},{"type":"bid","entity":14958,"entity_type":"player","id":211,"created_at":1718470092,"company":"P5","price":5},{"type":"bid","entity":790,"entity_type":"player","id":212,"created_at":1718470092,"company":"P5","price":30},{"type":"bid","entity":790,"entity_type":"player","id":213,"created_at":1718470092,"company":"P10","price":20},{"type":"pass","entity":790,"entity_type":"player","id":214,"created_at":1718470092},{"type":"bid","entity":1339,"entity_type":"player","id":215,"created_at":1718470092,"company":"P16","price":20},{"type":"pass","entity":1339,"entity_type":"player","id":216,"created_at":1718470092,"auto_actions":[{"type":"program_disable","entity":17678,"entity_type":"player","created_at":1717686097,"reason":"No longer winning bid on P10"}]},{"type":"bid","entity":17678,"entity_type":"player","id":217,"created_at":1718470092,"company":"P5","price":40},{"type":"bid","entity":17678,"entity_type":"player","id":218,"created_at":1718470092,"company":"P10","price":25},{"type":"program_share_pass","entity":17678,"entity_type":"player","id":219,"created_at":1718470092,"auto_actions":[{"type":"pass","entity":17678,"entity_type":"player","created_at":1717686708}],"unconditional":false,"indefinite":false},{"type":"bid","entity":14958,"entity_type":"player","id":220,"created_at":1718470092,"company":"P5","price":45},{"type":"bid","entity":14958,"entity_type":"player","id":221,"created_at":1718470092,"company":"P10","price":30},{"type":"bid","entity":14958,"entity_type":"player","id":222,"created_at":1718470092,"company":"P16","price":25},{"type":"bid","entity":790,"entity_type":"player","id":223,"created_at":1718470092,"company":"P5","price":50},{"type":"pass","entity":790,"entity_type":"player","id":224,"created_at":1718470092},{"type":"bid","entity":1339,"entity_type":"player","id":225,"created_at":1718470092,"company":"P16","price":30},{"type":"pass","entity":1339,"entity_type":"player","id":226,"created_at":1718470092,"auto_actions":[{"type":"program_disable","entity":17678,"entity_type":"player","created_at":1717692726,"reason":"No longer winning bid on P5"}]},{"type":"program_share_pass","entity":17678,"entity_type":"player","id":227,"created_at":1718470092,"auto_actions":[{"type":"pass","entity":17678,"entity_type":"player","created_at":1717693226}],"unconditional":false,"indefinite":false},{"type":"bid","entity":14958,"entity_type":"player","id":228,"created_at":1718470092,"company":"P16","price":35},{"type":"program_share_pass","entity":14958,"entity_type":"player","id":229,"created_at":1718470092,"auto_actions":[{"type":"pass","entity":14958,"entity_type":"player","created_at":1717695523}],"unconditional":false,"indefinite":false},{"type":"pass","entity":790,"entity_type":"player","id":230,"created_at":1718470092},{"type":"bid","entity":1339,"entity_type":"player","id":231,"created_at":1718470092,"company":"P16","price":40},{"type":"pass","entity":1339,"entity_type":"player","id":232,"created_at":1718470092,"auto_actions":[{"type":"pass","entity":17678,"entity_type":"player","created_at":1717737169},{"type":"program_disable","entity":14958,"entity_type":"player","created_at":1717737169,"reason":"No longer winning bid on P16"}]},{"type":"pass","entity":14958,"entity_type":"player","id":233,"created_at":1718470092},{"type":"pass","entity":790,"entity_type":"player","id":234,"created_at":1718470092},{"type":"pass","entity":1339,"entity_type":"player","id":235,"created_at":1718470092},{"type":"pass","entity":"17","entity_type":"corporation","id":236,"created_at":1718470092},{"type":"lay_tile","entity":"17","entity_type":"corporation","id":237,"created_at":1718470092,"hex":"P13","tile":"58-1","rotation":1},{"type":"run_routes","entity":"17","entity_type":"corporation","id":238,"created_at":1718470092,"routes":[{"train":"L-1","connections":[["P13","P11","P9","O8"]],"hexes":["O8","P13"],"revenue":50,"revenue_str":"O8-P13","nodes":["P13-0","O8-0"]}],"extra_revenue":0},{"type":"buy_train","entity":"17","entity_type":"corporation","id":239,"created_at":1718470092,"train":"L-1","price":80,"variant":"2","exchange":"L-1"},{"type":"pass","entity":"17","entity_type":"corporation","id":240,"created_at":1718470092},{"type":"pass","entity":"6","entity_type":"corporation","id":241,"created_at":1718470092},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":242,"created_at":1718470092,"hex":"F7","tile":"8-0","rotation":4},{"type":"run_routes","entity":"6","entity_type":"corporation","id":243,"created_at":1718470092,"routes":[{"train":"L-2","connections":[["F9","G8"]],"hexes":["F9","G8"],"revenue":40,"revenue_str":"F9-G8","nodes":["F9-0","G8-0"]}],"extra_revenue":0},{"type":"pass","entity":"6","entity_type":"corporation","id":244,"created_at":1718470092},{"type":"pass","entity":"20","entity_type":"corporation","id":245,"created_at":1718470092},{"type":"lay_tile","entity":"20","entity_type":"corporation","id":246,"created_at":1718470092,"hex":"P17","tile":"57-0","rotation":1},{"type":"run_routes","entity":"20","entity_type":"corporation","id":247,"created_at":1718470092,"routes":[{"train":"L-3","connections":[["O20","P19"]],"hexes":["O20","P19"],"revenue":30,"revenue_str":"O20-P19","nodes":["O20-0","P19-0"]}],"extra_revenue":0},{"type":"buy_train","entity":"20","entity_type":"corporation","id":248,"created_at":1718470092,"train":"L-3","price":80,"variant":"2","exchange":"L-3"},{"type":"buy_train","entity":"18","entity_type":"corporation","id":249,"created_at":1718470092,"train":"L-0","price":60,"variant":"L"},{"type":"pass","entity":"18","entity_type":"corporation","id":250,"created_at":1718470092},{"type":"lay_tile","entity":"18","entity_type":"corporation","id":251,"created_at":1718470092,"hex":"P15","tile":"8-1","rotation":2},{"type":"run_routes","entity":"18","entity_type":"corporation","id":252,"created_at":1718470092,"routes":[{"train":"L-13","connections":[["O8","P9","P11","P13"]],"hexes":["O8","P13"],"revenue":50,"revenue_str":"O8-P13","nodes":["O8-0","P13-0"]}],"extra_revenue":0},{"type":"buy_train","entity":"18","entity_type":"corporation","id":253,"created_at":1718470092,"train":"L-13","price":80,"variant":"2","exchange":"L-13"},{"type":"pass","entity":"18","entity_type":"corporation","id":254,"created_at":1718470092},{"type":"pass","entity":"10","entity_type":"corporation","id":255,"created_at":1718470092},{"type":"lay_tile","entity":"10","entity_type":"corporation","id":256,"created_at":1718470092,"hex":"J11","tile":"9-1","rotation":0},{"type":"run_routes","entity":"10","entity_type":"corporation","id":257,"created_at":1718470092,"routes":[{"train":"L-6","connections":[["J13","I12"]],"hexes":["J13","I12"],"revenue":30,"revenue_str":"J13-I12","nodes":["J13-0","I12-0"]}],"extra_revenue":0},{"type":"pass","entity":"10","entity_type":"corporation","id":258,"created_at":1718470092},{"type":"pass","entity":"12","entity_type":"corporation","id":259,"created_at":1718470092},{"type":"lay_tile","entity":"12","entity_type":"corporation","id":260,"created_at":1718470092,"hex":"K22","tile":"58-2","rotation":1},{"type":"run_routes","entity":"12","entity_type":"corporation","id":261,"created_at":1718470092,"routes":[{"train":"L-7","connections":[["J23","K22"]],"hexes":["J23","K22"],"revenue":30,"revenue_str":"J23-K22","nodes":["J23-0","K22-0"]}],"extra_revenue":0},{"type":"pass","entity":"12","entity_type":"corporation","id":262,"created_at":1718470092},{"type":"pass","entity":"11","entity_type":"corporation","id":263,"created_at":1718470092},{"type":"lay_tile","entity":"11","entity_type":"corporation","id":264,"created_at":1718470092,"hex":"J7","tile":"4-1","rotation":1},{"type":"run_routes","entity":"11","entity_type":"corporation","id":265,"created_at":1718470092,"routes":[{"train":"L-8","connections":[["J5","J7"]],"hexes":["J5","J7"],"revenue":30,"revenue_str":"J5-J7","nodes":["J5-0","J7-0"]}],"extra_revenue":0},{"type":"pass","entity":"11","entity_type":"corporation","id":266,"created_at":1718470092},{"type":"pass","entity":"17","entity_type":"corporation","id":267,"created_at":1718470092},{"type":"lay_tile","entity":"17","entity_type":"corporation","id":268,"created_at":1718470092,"hex":"O10","tile":"BC-0","rotation":0},{"type":"run_routes","entity":"17","entity_type":"corporation","id":269,"created_at":1718470092,"routes":[{"train":"L-1","connections":[["P13","P11","P9","O8"]],"hexes":["P13","O8"],"revenue":50,"revenue_str":"P13-O8","nodes":["P13-0","O8-0"]}],"extra_revenue":0},{"type":"pass","entity":"17","entity_type":"corporation","id":270,"created_at":1718470092},{"type":"pass","entity":"6","entity_type":"corporation","id":271,"created_at":1718470092},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":272,"created_at":1718470092,"hex":"G6","tile":"7-0","rotation":2},{"type":"run_routes","entity":"6","entity_type":"corporation","id":273,"created_at":1718470092,"routes":[{"train":"L-2","connections":[["F9","G8"]],"hexes":["F9","G8"],"revenue":40,"revenue_str":"F9-G8","nodes":["F9-0","G8-0"]}],"extra_revenue":0},{"type":"pass","entity":"6","entity_type":"corporation","id":274,"created_at":1718470092},{"type":"pass","entity":"20","entity_type":"corporation","id":275,"created_at":1718470092},{"type":"lay_tile","entity":"20","entity_type":"corporation","id":276,"created_at":1718470092,"hex":"O10","tile":"BC-0","rotation":0},{"type":"run_routes","entity":"20","entity_type":"corporation","id":277,"created_at":1718470092,"routes":[{"train":"L-3","connections":[["O20","O22"]],"hexes":["O20","O22"],"revenue":40,"revenue_str":"O20-O22","nodes":["O20-0","O22-0"]}],"extra_revenue":0},{"type":"pass","entity":"20","entity_type":"corporation","id":278,"created_at":1718470092},{"type":"acquire_company","entity":"18","entity_type":"corporation","id":279,"created_at":1718470092,"company":"P16"},{"type":"pass","entity":"18","entity_type":"corporation","id":280,"created_at":1718470092},{"type":"lay_tile","entity":"P16","entity_type":"company","id":281,"created_at":1718470092,"hex":"N9","tile":"PNW2-0","rotation":0},{"type":"lay_tile","entity":"P16","entity_type":"company","id":282,"created_at":1718470092,"hex":"M8","tile":"PNW1-0","rotation":2},{"type":"pass","entity":"18","entity_type":"corporation","id":283,"created_at":1718470092},{"type":"run_routes","entity":"18","entity_type":"corporation","id":284,"created_at":1718470092,"routes":[{"train":"L-13","connections":[["O8","P9","P11","P13"]],"hexes":["O8","P13"],"revenue":50,"revenue_str":"O8-P13","nodes":["O8-0","P13-0"]}],"extra_revenue":0},{"type":"pass","entity":"18","entity_type":"corporation","id":285,"created_at":1718470092},{"type":"pass","entity":"10","entity_type":"corporation","id":286,"created_at":1718470092},{"type":"lay_tile","entity":"10","entity_type":"corporation","id":287,"created_at":1718470092,"hex":"K10","tile":"7-1","rotation":2},{"type":"run_routes","entity":"10","entity_type":"corporation","id":288,"created_at":1718470092,"routes":[{"train":"L-6","connections":[["J13","I12"]],"hexes":["J13","I12"],"revenue":30,"revenue_str":"J13-I12","nodes":["J13-0","I12-0"]}],"extra_revenue":0},{"type":"buy_train","entity":"10","entity_type":"corporation","id":289,"created_at":1718470092,"train":"L-6","price":80,"variant":"2","exchange":"L-6"},{"type":"pass","entity":"10","entity_type":"corporation","id":290,"created_at":1718470092},{"type":"pass","entity":"12","entity_type":"corporation","id":291,"created_at":1718470092},{"type":"lay_tile","entity":"12","entity_type":"corporation","id":292,"created_at":1718470092,"hex":"K20","tile":"8-2","rotation":4},{"type":"run_routes","entity":"12","entity_type":"corporation","id":293,"created_at":1718470092,"routes":[{"train":"L-7","connections":[["J23","K22"]],"hexes":["J23","K22"],"revenue":30,"revenue_str":"J23-K22","nodes":["J23-0","K22-0"]}],"extra_revenue":0},{"type":"buy_train","entity":"12","entity_type":"corporation","id":294,"created_at":1718470092,"train":"L-7","price":80,"variant":"2","exchange":"L-7"},{"type":"pass","entity":"11","entity_type":"corporation","id":295,"created_at":1718470092},{"type":"lay_tile","entity":"11","entity_type":"corporation","id":296,"created_at":1718470092,"hex":"K6","tile":"9-2","rotation":2},{"type":"run_routes","entity":"11","entity_type":"corporation","id":297,"created_at":1718470092,"routes":[{"train":"L-8","connections":[["J5","J7"]],"hexes":["J5","J7"],"revenue":30,"revenue_str":"J5-J7","nodes":["J5-0","J7-0"]}],"extra_revenue":0},{"type":"buy_train","entity":"11","entity_type":"corporation","id":298,"created_at":1718470092,"train":"L-8","price":80,"variant":"2","exchange":"L-8"},{"type":"bid","entity":17678,"entity_type":"player","id":299,"created_at":1718470092,"company":"P15","price":15},{"type":"bid","entity":17678,"entity_type":"player","id":300,"created_at":1718470092,"company":"P19","price":15},{"type":"pass","entity":17678,"entity_type":"player","id":301,"created_at":1718470092},{"type":"bid","entity":14958,"entity_type":"player","id":302,"created_at":1718470092,"company":"P15","price":20},{"type":"bid","entity":14958,"entity_type":"player","id":303,"created_at":1718470092,"company":"P17","price":0},{"type":"bid","entity":14958,"entity_type":"player","id":304,"created_at":1718470092,"company":"P19","price":20},{"type":"bid","entity":1339,"entity_type":"player","id":305,"created_at":1718470092,"company":"M16","price":130},{"type":"pass","entity":1339,"entity_type":"player","id":306,"created_at":1718470092},{"type":"bid","entity":790,"entity_type":"player","id":307,"created_at":1718470092,"company":"P17","price":20},{"type":"bid","entity":790,"entity_type":"player","id":308,"created_at":1718470092,"company":"P19","price":25},{"type":"pass","entity":790,"entity_type":"player","id":309,"created_at":1718470092},{"type":"bid","entity":17678,"entity_type":"player","id":310,"created_at":1718470092,"company":"P15","price":25},{"type":"bid","entity":17678,"entity_type":"player","id":311,"created_at":1718470092,"company":"P19","price":30},{"type":"pass","entity":17678,"entity_type":"player","id":312,"created_at":1718470092},{"type":"bid","entity":14958,"entity_type":"player","id":313,"created_at":1718470092,"company":"P19","price":35},{"type":"bid","entity":14958,"entity_type":"player","id":314,"created_at":1718470092,"company":"P17","price":25},{"type":"bid","entity":14958,"entity_type":"player","id":315,"created_at":1718470092,"company":"P15","price":30},{"type":"pass","entity":1339,"entity_type":"player","id":316,"created_at":1718470092},{"type":"bid","entity":790,"entity_type":"player","id":317,"created_at":1718470092,"company":"P17","price":30},{"type":"bid","entity":790,"entity_type":"player","id":318,"created_at":1718470092,"company":"P19","price":40},{"type":"pass","entity":790,"entity_type":"player","id":319,"created_at":1718470092},{"type":"bid","entity":17678,"entity_type":"player","id":320,"created_at":1718470092,"company":"M2","price":120},{"type":"pass","entity":17678,"entity_type":"player","id":321,"created_at":1718470092},{"type":"bid","entity":14958,"entity_type":"player","id":322,"created_at":1718470092,"company":"P17","price":35},{"type":"program_share_pass","entity":14958,"entity_type":"player","id":323,"created_at":1718470092,"auto_actions":[{"type":"pass","entity":14958,"entity_type":"player","created_at":1717987581}],"unconditional":false,"indefinite":false},{"type":"pass","entity":1339,"entity_type":"player","id":324,"created_at":1718470092},{"type":"pass","entity":790,"entity_type":"player","id":325,"created_at":1718470092},{"type":"bid","entity":17678,"entity_type":"player","id":326,"created_at":1718470092,"company":"P15","price":35},{"type":"pass","entity":17678,"entity_type":"player","id":327,"created_at":1718470092,"auto_actions":[{"type":"program_disable","entity":14958,"entity_type":"player","created_at":1718029447,"reason":"No longer winning bid on P15"}]},{"type":"program_share_pass","entity":14958,"entity_type":"player","id":328,"created_at":1718470092,"auto_actions":[{"type":"pass","entity":14958,"entity_type":"player","created_at":1718031632}],"unconditional":false,"indefinite":false},{"type":"pass","entity":1339,"entity_type":"player","id":329,"created_at":1718470092},{"type":"pass","entity":790,"entity_type":"player","id":330,"created_at":1718470092},{"type":"pass","entity":17678,"entity_type":"player","id":331,"created_at":1718470092},{"type":"pass","entity":"17","entity_type":"corporation","id":332,"created_at":1718470092},{"type":"lay_tile","entity":"17","entity_type":"corporation","id":333,"created_at":1718470092,"hex":"L7","tile":"8-3","rotation":3},{"type":"run_routes","entity":"17","entity_type":"corporation","id":334,"created_at":1718470092,"routes":[{"train":"L-1","connections":[["P13","P11","P9","O8"]],"hexes":["P13","O8"],"revenue":50,"revenue_str":"P13-O8","nodes":["P13-0","O8-0"]}],"extra_revenue":0},{"type":"pass","entity":"17","entity_type":"corporation","id":335,"created_at":1718470092},{"type":"pass","entity":"6","entity_type":"corporation","id":336,"created_at":1718470092},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":337,"created_at":1718470092,"hex":"F5","tile":"58-3","rotation":5},{"type":"run_routes","entity":"6","entity_type":"corporation","id":338,"created_at":1718470092,"routes":[{"train":"L-2","connections":[["F9","F7","G6","F5"]],"hexes":["F9","F5"],"revenue":60,"revenue_str":"F9-F5","nodes":["F9-0","F5-0"]}],"extra_revenue":0},{"type":"buy_train","entity":"6","entity_type":"corporation","id":339,"created_at":1718470092,"train":"L-16","price":60,"variant":"L"},{"type":"pass","entity":"20","entity_type":"corporation","id":340,"created_at":1718470092},{"type":"pass","entity":"20","entity_type":"corporation","id":341,"created_at":1718470092},{"type":"run_routes","entity":"20","entity_type":"corporation","id":342,"created_at":1718470092,"routes":[{"train":"L-3","connections":[["O20","O22"]],"hexes":["O20","O22"],"revenue":40,"revenue_str":"O20-O22","nodes":["O20-0","O22-0"]}],"extra_revenue":0},{"type":"pass","entity":"20","entity_type":"corporation","id":343,"created_at":1718470092},{"type":"pass","entity":"18","entity_type":"corporation","id":344,"created_at":1718470092},{"type":"lay_tile","entity":"18","entity_type":"corporation","id":345,"created_at":1718470092,"hex":"N7","tile":"8-4","rotation":5},{"type":"run_routes","entity":"18","entity_type":"corporation","id":346,"created_at":1718470092,"routes":[{"train":"L-13","connections":[["O8","P9","P11","P13"]],"hexes":["O8","P13"],"revenue":50,"revenue_str":"O8-P13","nodes":["O8-0","P13-0"]}],"extra_revenue":0},{"type":"pass","entity":"18","entity_type":"corporation","id":347,"created_at":1718470092},{"type":"pass","entity":"10","entity_type":"corporation","id":348,"created_at":1718470092},{"type":"lay_tile","entity":"10","entity_type":"corporation","id":349,"created_at":1718470092,"hex":"I14","tile":"9-3","rotation":1},{"type":"run_routes","entity":"10","entity_type":"corporation","id":350,"created_at":1718470092,"routes":[{"train":"L-6","connections":[["J13","I12"]],"hexes":["J13","I12"],"revenue":30,"revenue_str":"J13-I12","nodes":["J13-0","I12-0"]}],"extra_revenue":0},{"type":"pass","entity":"10","entity_type":"corporation","id":351,"created_at":1718470092},{"type":"pass","entity":"12","entity_type":"corporation","id":352,"created_at":1718470092},{"type":"lay_tile","entity":"12","entity_type":"corporation","id":353,"created_at":1718470092,"hex":"I22","tile":"9-4","rotation":2},{"type":"run_routes","entity":"12","entity_type":"corporation","id":354,"created_at":1718470092,"routes":[{"train":"L-7","connections":[["J23","K22"]],"hexes":["J23","K22"],"revenue":30,"revenue_str":"J23-K22","nodes":["J23-0","K22-0"]}],"extra_revenue":0},{"type":"pass","entity":"12","entity_type":"corporation","id":355,"created_at":1718470092},{"type":"pass","entity":"11","entity_type":"corporation","id":356,"created_at":1718470092},{"type":"pass","entity":"11","entity_type":"corporation","id":357,"created_at":1718470092},{"type":"run_routes","entity":"11","entity_type":"corporation","id":358,"created_at":1718470092,"routes":[{"train":"L-8","connections":[["J5","J7"]],"hexes":["J5","J7"],"revenue":30,"revenue_str":"J5-J7","nodes":["J5-0","J7-0"]}],"extra_revenue":0},{"type":"pass","entity":"11","entity_type":"corporation","id":359,"created_at":1718470092},{"type":"buy_train","entity":"16","entity_type":"corporation","id":360,"created_at":1718470092,"train":"L-0","price":60,"variant":"L"},{"type":"pass","entity":"16","entity_type":"corporation","id":361,"created_at":1718470092},{"type":"lay_tile","entity":"16","entity_type":"corporation","id":362,"created_at":1718470092,"hex":"N5","tile":"6-2","rotation":4},{"type":"run_routes","entity":"16","entity_type":"corporation","id":363,"created_at":1718470092,"routes":[{"train":"L-17","connections":[["local","N5"]],"hexes":["N5"],"revenue":20,"revenue_str":"N5","nodes":["N5-0"]}],"extra_revenue":0},{"type":"buy_train","entity":"16","entity_type":"corporation","id":364,"created_at":1718470092,"train":"L-17","price":80,"variant":"2","exchange":"L-17"},{"type":"buy_train","entity":"2","entity_type":"corporation","id":365,"created_at":1718470092,"train":"L-0","price":60,"variant":"L"},{"type":"pass","entity":"2","entity_type":"corporation","id":366,"created_at":1718470092},{"type":"lay_tile","entity":"2","entity_type":"corporation","id":367,"created_at":1718470092,"hex":"B19","tile":"6-3","rotation":3},{"type":"run_routes","entity":"2","entity_type":"corporation","id":368,"created_at":1718470092,"routes":[{"train":"L-18","connections":[["local","B19"]],"hexes":["B19"],"revenue":20,"revenue_str":"B19","nodes":["B19-0"]}],"extra_revenue":0},{"type":"pass","entity":"2","entity_type":"corporation","id":369,"created_at":1718470092},{"type":"pass","entity":"18","entity_type":"corporation","id":370,"created_at":1718470092},{"type":"pass","entity":"16","entity_type":"corporation","id":371,"user":790,"created_at":1718470092},{"type":"pass","entity":"17","entity_type":"corporation","id":372,"created_at":1718470092},{"type":"lay_tile","entity":"17","entity_type":"corporation","id":373,"created_at":1718470092,"hex":"O10","tile":"BC-0","rotation":0},{"type":"run_routes","entity":"17","entity_type":"corporation","id":374,"created_at":1718470092,"routes":[{"train":"L-1","connections":[["N5","N7","O8"]],"hexes":["O8","N5"],"revenue":60,"revenue_str":"O8-N5","nodes":["N5-0","O8-0"]}],"extra_revenue":0},{"type":"pass","entity":"17","entity_type":"corporation","id":375,"created_at":1718470092},{"type":"pass","entity":"6","entity_type":"corporation","id":376,"created_at":1718470092},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":377,"created_at":1718470092,"hex":"H7","tile":"BC-0","rotation":0},{"type":"run_routes","entity":"6","entity_type":"corporation","id":378,"created_at":1718470092,"routes":[{"train":"L-16","connections":[["F9","G8"]],"hexes":["F9","G8"],"revenue":40,"revenue_str":"F9-G8","nodes":["F9-0","G8-0"]},{"train":"L-2","connections":[["F9","F7","G6","F5"]],"hexes":["F9","F5"],"revenue":60,"revenue_str":"F9-F5","nodes":["F9-0","F5-0"]}],"extra_revenue":0},{"type":"pass","entity":"20","entity_type":"corporation","id":379,"created_at":1718470092},{"type":"lay_tile","entity":"20","entity_type":"corporation","id":380,"created_at":1718470092,"hex":"P7","tile":"9-5","rotation":0},{"type":"run_routes","entity":"20","entity_type":"corporation","id":381,"created_at":1718470092,"routes":[{"train":"L-3","connections":[["O20","O22"]],"hexes":["O20","O22"],"revenue":40,"revenue_str":"O20-O22","nodes":["O20-0","O22-0"]}],"extra_revenue":0},{"type":"pass","entity":"20","entity_type":"corporation","id":382,"created_at":1718470092},{"type":"pass","entity":"18","entity_type":"corporation","id":383,"created_at":1718470092},{"type":"lay_tile","entity":"18","entity_type":"corporation","id":384,"created_at":1718470092,"hex":"O10","tile":"BC-0","rotation":0},{"type":"run_routes","entity":"18","entity_type":"corporation","id":385,"created_at":1718470092,"routes":[{"train":"L-13","connections":[["N5","N7","O8"]],"hexes":["O8","N5"],"revenue":60,"revenue_str":"O8-N5","nodes":["N5-0","O8-0"]}],"extra_revenue":0},{"type":"buy_train","entity":"18","entity_type":"corporation","id":386,"created_at":1718470092,"train":"L-19","price":60,"variant":"L"},{"type":"pass","entity":"10","entity_type":"corporation","id":387,"created_at":1718470092},{"type":"lay_tile","entity":"10","entity_type":"corporation","id":388,"created_at":1718470092,"hex":"I16","tile":"7-2","rotation":0},{"type":"run_routes","entity":"10","entity_type":"corporation","id":389,"created_at":1718470092,"routes":[{"train":"L-6","connections":[["J9","K10","J11","I12"]],"hexes":["I12","J9"],"revenue":50,"revenue_str":"I12-J9","nodes":["J9-0","I12-0"]}],"extra_revenue":0},{"type":"pass","entity":"10","entity_type":"corporation","id":390,"created_at":1718470092},{"type":"pass","entity":"12","entity_type":"corporation","id":391,"created_at":1718470092},{"type":"lay_tile","entity":"12","entity_type":"corporation","id":392,"created_at":1718470092,"hex":"H21","tile":"57-1","rotation":2},{"type":"run_routes","entity":"12","entity_type":"corporation","id":393,"created_at":1718470092,"routes":[{"train":"L-7","connections":[["J23","I22","H21"]],"hexes":["J23","H21"],"revenue":40,"revenue_str":"J23-H21","nodes":["J23-0","H21-0"]}],"extra_revenue":0},{"type":"pass","entity":"12","entity_type":"corporation","id":394,"created_at":1718470092},{"type":"pass","entity":"11","entity_type":"corporation","id":395,"created_at":1718470092},{"type":"pass","entity":"11","entity_type":"corporation","id":396,"created_at":1718470092},{"type":"run_routes","entity":"11","entity_type":"corporation","id":397,"created_at":1718470092,"routes":[{"train":"L-8","connections":[["J5","J7"]],"hexes":["J5","J7"],"revenue":30,"revenue_str":"J5-J7","nodes":["J5-0","J7-0"]}],"extra_revenue":0},{"type":"pass","entity":"11","entity_type":"corporation","id":398,"created_at":1718470092},{"type":"pass","entity":"16","entity_type":"corporation","id":399,"created_at":1718470092},{"type":"lay_tile","entity":"16","entity_type":"corporation","id":400,"created_at":1718470092,"hex":"N5","tile":"BC-0","rotation":0},{"type":"run_routes","entity":"16","entity_type":"corporation","id":401,"created_at":1718470092,"routes":[{"train":"L-17","connections":[["N5","N7","O8"]],"hexes":["N5","O8"],"revenue":60,"revenue_str":"N5-O8","nodes":["N5-0","O8-0"]}],"extra_revenue":0},{"type":"pass","entity":"16","entity_type":"corporation","id":402,"created_at":1718470092},{"type":"pass","entity":"2","entity_type":"corporation","id":403,"created_at":1718470092},{"type":"lay_tile","entity":"2","entity_type":"corporation","id":404,"created_at":1718470092,"hex":"A20","tile":"58-4","rotation":4},{"type":"run_routes","entity":"2","entity_type":"corporation","id":405,"created_at":1718470092,"routes":[{"train":"L-18","connections":[["B19","A20"]],"hexes":["B19","A20"],"revenue":30,"revenue_str":"B19-A20","nodes":["B19-0","A20-0"]}],"extra_revenue":0},{"type":"buy_train","entity":"2","entity_type":"corporation","id":406,"created_at":1718470092,"train":"L-18","price":80,"variant":"2","exchange":"L-18"},{"type":"pass","entity":"2","entity_type":"corporation","id":407,"created_at":1718470092},{"type":"merge","entity":"18","entity_type":"corporation","id":408,"created_at":1718470092,"corporation":"16"},{"type":"choose","entity":"18","entity_type":"corporation","id":409,"created_at":1718470092,"choice":"100"},{"type":"choose","entity":"18","entity_type":"corporation","id":410,"created_at":1718470092,"choice":"4"},{"type":"choose","entity":"18","entity_type":"corporation","id":411,"created_at":1718470092,"choice":"exchange"},{"type":"buy_shares","entity":14958,"entity_type":"player","id":412,"created_at":1718470092,"shares":["ORNC_3"],"percent":10},{"type":"bid","entity":790,"entity_type":"player","id":413,"created_at":1718470092,"company":"P9","price":30},{"type":"bid","entity":790,"entity_type":"player","id":414,"created_at":1718470092,"company":"P3","price":30},{"type":"pass","entity":790,"entity_type":"player","id":415,"created_at":1718470092},{"type":"bid","entity":1339,"entity_type":"player","id":416,"created_at":1718470092,"company":"P3","price":50},{"type":"bid","entity":1339,"entity_type":"player","id":417,"created_at":1718470092,"company":"P9","price":35},{"type":"pass","entity":1339,"entity_type":"player","id":418,"created_at":1718470092},{"type":"bid","entity":17678,"entity_type":"player","id":419,"created_at":1718470092,"company":"P9","price":80},{"type":"pass","entity":17678,"entity_type":"player","id":420,"created_at":1718470092},{"type":"bid","entity":14958,"entity_type":"player","id":421,"created_at":1718470092,"company":"P3","price":55},{"type":"bid","entity":14958,"entity_type":"player","id":422,"created_at":1718470092,"company":"P11","price":0},{"type":"pass","entity":14958,"entity_type":"player","id":423,"created_at":1718470092},{"type":"bid","entity":790,"entity_type":"player","id":424,"created_at":1718470092,"company":"P3","price":60},{"type":"bid","entity":790,"entity_type":"player","id":425,"created_at":1718470092,"company":"P9","price":85},{"type":"pass","entity":790,"entity_type":"player","id":426,"created_at":1718470092},{"type":"bid","entity":1339,"entity_type":"player","id":427,"created_at":1718470092,"company":"P3","price":65},{"type":"bid","entity":1339,"entity_type":"player","id":428,"created_at":1718470092,"company":"P11","price":10},{"type":"pass","entity":1339,"entity_type":"player","id":429,"created_at":1718470092},{"type":"bid","entity":17678,"entity_type":"player","id":430,"created_at":1718470092,"company":"P9","price":90},{"type":"bid","entity":17678,"entity_type":"player","id":431,"created_at":1718470092,"company":"P11","price":15},{"type":"pass","entity":17678,"entity_type":"player","id":432,"created_at":1718470092},{"type":"bid","entity":14958,"entity_type":"player","id":433,"created_at":1718470092,"company":"P3","price":80},{"type":"bid","entity":14958,"entity_type":"player","id":434,"created_at":1718470092,"company":"P11","price":20},{"type":"pass","entity":14958,"entity_type":"player","id":435,"created_at":1718470092},{"type":"bid","entity":790,"entity_type":"player","id":436,"created_at":1718470092,"company":"P3","price":85},{"type":"pass","entity":790,"entity_type":"player","id":437,"created_at":1718470092},{"type":"bid","entity":1339,"entity_type":"player","id":438,"created_at":1718470092,"company":"P3","price":90},{"type":"pass","entity":1339,"entity_type":"player","id":439,"created_at":1718470092},{"type":"program_share_pass","entity":17678,"entity_type":"player","id":440,"created_at":1718470092,"auto_actions":[{"type":"pass","entity":17678,"entity_type":"player","created_at":1718306328}],"unconditional":false,"indefinite":false},{"type":"bid","entity":14958,"entity_type":"player","id":441,"created_at":1718470092,"company":"P3","price":100},{"type":"pass","entity":14958,"entity_type":"player","id":442,"created_at":1718470092},{"type":"buy_shares","entity":790,"entity_type":"player","id":443,"created_at":1718470092,"shares":["ORNC_4"],"percent":10},{"type":"bid","entity":1339,"entity_type":"player","id":444,"created_at":1718470092,"company":"P11","price":25},{"type":"pass","entity":1339,"entity_type":"player","id":445,"created_at":1718470092,"auto_actions":[{"type":"pass","entity":17678,"entity_type":"player","created_at":1718329046}]},{"type":"pass","entity":14958,"entity_type":"player","id":446,"created_at":1718470093},{"type":"pass","entity":790,"entity_type":"player","id":447,"created_at":1718470093},{"type":"pass","entity":1339,"entity_type":"player","id":448,"created_at":1718470093},{"type":"pass","entity":"17","entity_type":"corporation","id":449,"created_at":1718470093},{"type":"lay_tile","entity":"17","entity_type":"corporation","id":450,"created_at":1718470093,"hex":"O10","tile":"622-0","rotation":1},{"type":"run_routes","entity":"17","entity_type":"corporation","id":451,"created_at":1718470093,"routes":[{"train":"L-1","connections":[["O10","O8"]],"hexes":["O8","O10"],"revenue":80,"revenue_str":"O8-O10","nodes":["O10-0","O8-0"]}],"extra_revenue":0},{"type":"pass","entity":"17","entity_type":"corporation","id":452,"created_at":1718470093},{"type":"acquire_company","entity":"6","entity_type":"corporation","id":453,"created_at":1718470093,"company":"P6"},{"type":"acquire_company","entity":"6","entity_type":"corporation","id":454,"created_at":1718470093,"company":"P3"},{"type":"pass","entity":"6","entity_type":"corporation","id":455,"created_at":1718470093},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":456,"created_at":1718470093,"hex":"F3","tile":"8-5","rotation":2},{"type":"choose","entity":"6","entity_type":"corporation","id":457,"created_at":1718470093,"choice":"0"},{"type":"run_routes","entity":"6","entity_type":"corporation","id":458,"created_at":1718470093,"routes":[{"train":"LP-0","connections":[["local","F9"]],"hexes":["F9"],"revenue":30,"revenue_str":"F9","nodes":["F9-0"]},{"train":"L-2","connections":[["E2","F3","F5"],["F5","G6","F7","F9"],["F9","G8"]],"hexes":["E2","F5","F9","G8"],"revenue":100,"revenue_str":"E2-F5-F9-G8","nodes":["E2-0","F5-0","F9-0","G8-0"]}],"extra_revenue":0},{"type":"pass","entity":"6","entity_type":"corporation","id":459,"created_at":1718470093},{"type":"pass","entity":"20","entity_type":"corporation","id":460,"created_at":1718470093},{"type":"lay_tile","entity":"20","entity_type":"corporation","id":461,"created_at":1718470093,"hex":"O20","tile":"619-0","rotation":0},{"type":"run_routes","entity":"20","entity_type":"corporation","id":462,"created_at":1718470093,"routes":[{"train":"L-3","connections":[["O20","O22"]],"hexes":["O20","O22"],"revenue":60,"revenue_str":"O20-O22","nodes":["O20-0","O22-0"]}],"extra_revenue":0},{"type":"pass","entity":"20","entity_type":"corporation","id":463,"created_at":1718470093},{"type":"pass","entity":"10","entity_type":"corporation","id":464,"created_at":1718470093},{"type":"lay_tile","entity":"10","entity_type":"corporation","id":465,"created_at":1718470093,"hex":"J9","tile":"207-0","rotation":4},{"type":"run_routes","entity":"10","entity_type":"corporation","id":466,"created_at":1718470093,"routes":[{"train":"L-6","connections":[["J9","K10","J11","I12"]],"hexes":["J9","I12"],"revenue":70,"revenue_str":"J9-I12","nodes":["J9-0","I12-0"]}],"extra_revenue":0},{"type":"pass","entity":"10","entity_type":"corporation","id":467,"created_at":1718470093},{"type":"pass","entity":"12","entity_type":"corporation","id":468,"created_at":1718470093},{"type":"lay_tile","entity":"12","entity_type":"corporation","id":469,"created_at":1718470093,"hex":"L19","tile":"57-2","rotation":0},{"type":"run_routes","entity":"12","entity_type":"corporation","id":470,"created_at":1718470093,"routes":[{"train":"L-7","connections":[["J23","I22","H21"]],"hexes":["J23","H21"],"revenue":40,"revenue_str":"J23-H21","nodes":["J23-0","H21-0"]}],"extra_revenue":0},{"type":"pass","entity":"12","entity_type":"corporation","id":471,"created_at":1718470093},{"type":"acquire_company","entity":"11","entity_type":"corporation","id":472,"created_at":1718470093,"company":"P11"},{"type":"pass","entity":"11","entity_type":"corporation","id":473,"created_at":1718470093},{"type":"lay_tile","entity":"11","entity_type":"corporation","id":474,"created_at":1718470093,"hex":"L7","tile":"82-0","rotation":2},{"type":"lay_tile","entity":"P11","entity_type":"company","id":475,"created_at":1718470093,"hex":"O8","tile":"X25-0","rotation":0},{"type":"run_routes","entity":"11","entity_type":"corporation","id":476,"created_at":1718470093,"routes":[{"train":"L-8","connections":[["J5","K6","L7","M8","N9","O8"]],"hexes":["J5","O8"],"revenue":60,"revenue_str":"J5-O8 (-$20 Portage) ","nodes":["J5-0","O8-0"]}],"extra_revenue":0},{"type":"pass","entity":"11","entity_type":"corporation","id":477,"created_at":1718470093},{"type":"pass","entity":"2","entity_type":"corporation","id":478,"created_at":1718470093},{"type":"lay_tile","entity":"2","entity_type":"corporation","id":479,"created_at":1718470093,"hex":"C20","tile":"9-6","rotation":2},{"type":"run_routes","entity":"2","entity_type":"corporation","id":480,"created_at":1718470093,"routes":[{"train":"L-18","connections":[["B19","A20"]],"hexes":["B19","A20"],"revenue":30,"revenue_str":"B19-A20","nodes":["B19-0","A20-0"]}],"extra_revenue":0},{"type":"pass","entity":"2","entity_type":"corporation","id":481,"created_at":1718470093},{"type":"pass","entity":"ORNC","entity_type":"corporation","id":482,"created_at":1718470093},{"type":"lay_tile","entity":"ORNC","entity_type":"corporation","id":483,"created_at":1718470093,"hex":"K8","tile":"9-7","rotation":0},{"type":"pass","entity":"ORNC","entity_type":"corporation","id":484,"created_at":1718470093,"auto_actions":[{"type":"hex_token","entity":"ORNC","entity_type":"corporation","created_at":1718398700,"hex":"O20","token_type":"destination"}]},{"type":"place_token","entity":"ORNC","entity_type":"corporation","id":485,"created_at":1718470093,"city":"I12-0-0","slot":2,"tokener":"ORNC"},{"type":"run_routes","entity":"ORNC","entity_type":"corporation","id":486,"created_at":1718470093,"routes":[{"train":"L-17","connections":[["O8","N9","M8","L7","K8","J9"]],"hexes":["O8","J9"],"revenue":100,"revenue_str":"O8-J9","nodes":["O8-0","J9-0"]},{"train":"L-13","connections":[["O8","O10"]],"hexes":["O8","O10"],"revenue":100,"revenue_str":"O8-O10","nodes":["O8-0","O10-0"]}],"extra_revenue":0},{"type":"dividend","entity":"ORNC","entity_type":"corporation","id":487,"created_at":1718470093,"kind":"payout"},{"type":"buy_train","entity":"ORNC","entity_type":"corporation","id":488,"created_at":1718470093,"train":"3-1","price":200,"variant":"3"},{"type":"pass","entity":"ORNC","entity_type":"corporation","id":489,"created_at":1718470093},{"type":"merge","entity":"17","entity_type":"corporation","id":490,"created_at":1718470093,"corporation":"10"},{"type":"choose","entity":"17","entity_type":"corporation","id":491,"created_at":1718470093,"choice":"100"},{"type":"choose","entity":"17","entity_type":"corporation","id":492,"created_at":1718470093,"choice":"4"},{"type":"choose","entity":"17","entity_type":"corporation","id":493,"created_at":1718470093,"choice":"replace"},{"type":"pass","entity":"6","entity_type":"corporation","id":494,"created_at":1718470093},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":495,"created_at":1718470093,"hex":"H7","tile":"8-6","rotation":3},{"type":"choose","entity":"6","entity_type":"corporation","id":496,"created_at":1718470093,"choice":"0"},{"type":"run_routes","entity":"6","entity_type":"corporation","id":497,"created_at":1718470093,"routes":[{"train":"LP-0","connections":[["local","F9"]],"hexes":["F9"],"revenue":30,"revenue_str":"F9","nodes":["F9-0"]},{"train":"L-2","connections":[["E2","F3","F5"],["F5","G6","F7","F9"],["F9","G8"]],"hexes":["E2","F5","F9","G8"],"revenue":100,"revenue_str":"E2-F5-F9-G8","nodes":["E2-0","F5-0","F9-0","G8-0"]}],"extra_revenue":0},{"type":"pass","entity":"6","entity_type":"corporation","id":498,"created_at":1718470093},{"type":"pass","entity":"20","entity_type":"corporation","id":499,"created_at":1718470093},{"type":"lay_tile","entity":"20","entity_type":"corporation","id":500,"created_at":1718470093,"hex":"N19","tile":"9-8","rotation":2},{"type":"run_routes","entity":"20","entity_type":"corporation","id":501,"created_at":1718470093,"routes":[{"train":"L-3","connections":[["O20","O22"]],"hexes":["O20","O22"],"revenue":60,"revenue_str":"O20-O22","nodes":["O20-0","O22-0"]}],"extra_revenue":0},{"type":"pass","entity":"20","entity_type":"corporation","id":502,"created_at":1718470093},{"type":"pass","entity":"12","entity_type":"corporation","id":503,"created_at":1718470093},{"type":"lay_tile","entity":"12","entity_type":"corporation","id":504,"created_at":1718470093,"hex":"M18","tile":"8-3","rotation":3},{"type":"run_routes","entity":"12","entity_type":"corporation","id":505,"created_at":1718470093,"routes":[{"train":"L-7","connections":[["J23","I22","H21"]],"hexes":["J23","H21"],"revenue":40,"revenue_str":"J23-H21","nodes":["J23-0","H21-0"]}],"extra_revenue":0},{"type":"pass","entity":"12","entity_type":"corporation","id":506,"created_at":1718470093},{"type":"pass","entity":"11","entity_type":"corporation","id":507,"created_at":1718470093},{"type":"lay_tile","entity":"11","entity_type":"corporation","id":508,"created_at":1718470093,"hex":"J5","tile":"15-0","rotation":3},{"type":"run_routes","entity":"11","entity_type":"corporation","id":509,"created_at":1718470093,"routes":[{"train":"L-8","connections":[["J5","K6","L7","M8","N9","O8"]],"hexes":["J5","O8"],"revenue":70,"revenue_str":"J5-O8 (-$20 Portage) ","nodes":["J5-0","O8-0"]}],"extra_revenue":0},{"type":"pass","entity":"11","entity_type":"corporation","id":510,"created_at":1718470093},{"type":"pass","entity":"2","entity_type":"corporation","id":511,"created_at":1718470093},{"type":"lay_tile","entity":"2","entity_type":"corporation","id":512,"created_at":1718470093,"hex":"D21","tile":"7-3","rotation":1},{"type":"run_routes","entity":"2","entity_type":"corporation","id":513,"created_at":1718470093,"routes":[{"train":"L-18","connections":[["B19","A20"]],"hexes":["B19","A20"],"revenue":30,"revenue_str":"B19-A20","nodes":["B19-0","A20-0"]}],"extra_revenue":0},{"type":"pass","entity":"2","entity_type":"corporation","id":514,"created_at":1718470093},{"type":"pass","entity":"ORNC","entity_type":"corporation","id":515,"created_at":1718470093},{"type":"lay_tile","entity":"ORNC","entity_type":"corporation","id":516,"created_at":1718470093,"hex":"P11","tile":"82-1","rotation":1},{"type":"pass","entity":"ORNC","entity_type":"corporation","id":517,"created_at":1718470093},{"type":"run_routes","entity":"ORNC","entity_type":"corporation","id":518,"created_at":1718470093,"routes":[{"train":"3-1","connections":[["O8","N9","M8","L7","K8","J9"],["J9","K10","J11","I12"]],"hexes":["O8","J9","I12"],"revenue":130,"revenue_str":"O8-J9-I12","nodes":["O8-0","J9-0","I12-0"]},{"train":"L-17","connections":[["O8","O10"]],"hexes":["O8","O10"],"revenue":100,"revenue_str":"O8-O10","nodes":["O8-0","O10-0"]},{"train":"L-13","connections":[["O8","P9","P11","O10"]],"hexes":["O8","O10"],"revenue":100,"revenue_str":"O8-O10","nodes":["O8-0","O10-0"]}],"extra_revenue":0},{"type":"dividend","entity":"ORNC","entity_type":"corporation","id":519,"created_at":1718470093,"kind":"payout"},{"type":"buy_train","entity":"ORNC","entity_type":"corporation","id":520,"created_at":1718470093,"train":"3-2","price":200,"variant":"3"},{"type":"pass","entity":"ORNC","entity_type":"corporation","id":521,"created_at":1718470093},{"type":"pass","entity":"ORNC","entity_type":"corporation","id":522,"created_at":1718470093},{"type":"acquire_company","entity":"SPS","entity_type":"corporation","id":523,"created_at":1718470093,"company":"P5"},{"type":"pass","entity":"SPS","entity_type":"corporation","id":524,"created_at":1718470093},{"type":"lay_tile","entity":"SPS","entity_type":"corporation","id":525,"created_at":1718470093,"hex":"N11","tile":"8-7","rotation":4},{"type":"pass","entity":"SPS","entity_type":"corporation","id":526,"created_at":1718470093,"auto_actions":[{"type":"pass","entity":"SPS","entity_type":"corporation","created_at":1718405851}]},{"type":"place_token","entity":"SPS","entity_type":"corporation","id":527,"created_at":1718470093,"city":"622-0-0","slot":1,"tokener":"SPS"},{"type":"choose","entity":"SPS","entity_type":"corporation","id":528,"created_at":1718470093,"choice":"1"},{"type":"run_routes","entity":"SPS","entity_type":"corporation","id":529,"created_at":1718470093,"routes":[{"train":"L-6","connections":[["O8","O10"],["O10","O12"]],"hexes":["O8","O10","O12"],"revenue":110,"revenue_str":"O8-O10-O12","nodes":["O8-0","O10-0","O12-0"]},{"train":"L-1","connections":[["O8","P9","P11","O10"]],"hexes":["O8","O10"],"revenue":100,"revenue_str":"O8-O10","nodes":["O8-0","O10-0"]}],"extra_revenue":0},{"type":"dividend","entity":"SPS","entity_type":"corporation","id":530,"created_at":1718470093,"kind":"payout"},{"type":"buy_train","entity":"SPS","entity_type":"corporation","id":531,"created_at":1718470093,"train":"3-3","price":200,"variant":"3"},{"type":"pass","entity":"SPS","entity_type":"corporation","id":532,"created_at":1718470093},{"type":"merge","entity":"20","entity_type":"corporation","id":533,"created_at":1718470093,"corporation":"12"},{"type":"choose","entity":"20","entity_type":"corporation","id":534,"created_at":1718470093,"choice":"100"},{"type":"choose","entity":"20","entity_type":"corporation","id":535,"created_at":1718470093,"choice":"4"},{"type":"choose","entity":"20","entity_type":"corporation","id":536,"created_at":1718470093,"choice":"replace"},{"type":"buy_shares","entity":14958,"entity_type":"player","id":537,"created_at":1718470093,"shares":["ORNC_5"],"percent":10},{"type":"bid","entity":790,"entity_type":"player","id":538,"created_at":1718470093,"company":"P4","price":45},{"type":"pass","entity":790,"entity_type":"player","id":539,"created_at":1718470093},{"type":"buy_shares","entity":1339,"entity_type":"player","id":540,"created_at":1718470093,"shares":["ORNC_6"],"percent":10},{"type":"buy_shares","entity":17678,"entity_type":"player","id":541,"created_at":1718470093,"shares":["NP_3"],"percent":10},{"type":"buy_shares","entity":14958,"entity_type":"player","id":542,"created_at":1718470093,"shares":["SPS_3"],"percent":10},{"type":"bid","entity":790,"entity_type":"player","id":543,"created_at":1718470093,"company":"P12","price":15},{"type":"bid","entity":790,"entity_type":"player","id":544,"created_at":1718470093,"company":"P7","price":15},{"type":"pass","entity":790,"entity_type":"player","id":545,"created_at":1718470093},{"type":"buy_shares","entity":1339,"entity_type":"player","id":546,"created_at":1718470093,"shares":["SPS_4"],"percent":10},{"type":"bid","entity":17678,"entity_type":"player","id":547,"created_at":1718470093,"company":"P4","price":60},{"type":"pass","entity":17678,"entity_type":"player","id":548,"created_at":1718470093},{"type":"buy_shares","entity":14958,"entity_type":"player","id":549,"created_at":1718470093,"shares":["SPS_5"],"percent":10},{"type":"program_share_pass","entity":14958,"entity_type":"player","id":550,"created_at":1718470093,"unconditional":false,"indefinite":false},{"type":"buy_shares","entity":790,"entity_type":"player","id":551,"created_at":1718470093,"shares":["SPS_6"],"percent":10},{"type":"bid","entity":1339,"entity_type":"player","id":552,"created_at":1718470513,"company":"P4","price":65},{"type":"bid","entity":1339,"entity_type":"player","id":553,"created_at":1718470516,"company":"P12","price":20},{"type":"bid","entity":1339,"entity_type":"player","id":554,"created_at":1718470518,"company":"P7","price":20},{"type":"bid","entity":17678,"entity_type":"player","id":555,"created_at":1718471163,"company":"P4","price":85},{"type":"pass","entity":17678,"entity_type":"player","id":556,"created_at":1718471168,"auto_actions":[{"type":"pass","entity":14958,"entity_type":"player","created_at":1718471167}]},{"type":"buy_shares","entity":790,"shares":["SPS_7"],"percent":10,"entity_type":"player","id":557,"user":790,"created_at":1718537898},{"type":"undo","entity":1339,"entity_type":"player","id":558,"user":790,"created_at":1718537902},{"type":"bid","entity":790,"entity_type":"player","id":559,"created_at":1718537909,"company":"P4","price":90},{"type":"pass","entity":790,"entity_type":"player","id":560,"created_at":1718537912},{"type":"bid","entity":1339,"entity_type":"player","id":561,"created_at":1718549801,"company":"P4","price":95},{"type":"pass","entity":1339,"entity_type":"player","id":562,"created_at":1718549806},{"type":"bid","entity":17678,"entity_type":"player","id":563,"created_at":1718550023,"company":"P7","price":30},{"type":"program_share_pass","entity":17678,"entity_type":"player","id":564,"created_at":1718550027,"auto_actions":[{"type":"pass","entity":17678,"entity_type":"player","created_at":1718550025},{"type":"pass","entity":14958,"entity_type":"player","created_at":1718550025}],"unconditional":false,"indefinite":false},{"type":"bid","entity":790,"entity_type":"player","id":565,"created_at":1718556499,"company":"P12","price":25},{"type":"pass","entity":790,"entity_type":"player","id":566,"created_at":1718556501},{"type":"pass","entity":1339,"entity_type":"player","id":567,"created_at":1718557622,"auto_actions":[{"type":"pass","entity":17678,"entity_type":"player","created_at":1718557621},{"type":"pass","entity":14958,"entity_type":"player","created_at":1718557621}]},{"type":"buy_shares","entity":790,"entity_type":"player","id":568,"created_at":1718566666,"shares":["ORNC_7"],"percent":10},{"type":"program_share_pass","entity":790,"entity_type":"player","id":569,"created_at":1718566672,"unconditional":false,"indefinite":false},{"type":"pass","entity":1339,"entity_type":"player","id":570,"created_at":1718571924,"auto_actions":[{"type":"pass","entity":17678,"entity_type":"player","created_at":1718571923},{"type":"pass","entity":14958,"entity_type":"player","created_at":1718571923},{"type":"pass","entity":790,"entity_type":"player","created_at":1718571923}]},{"type":"pass","entity":"6","entity_type":"corporation","id":571,"created_at":1718577368},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":572,"created_at":1718577374,"hex":"I8","tile":"58-5","rotation":0},{"type":"choose","entity":"6","entity_type":"corporation","id":573,"created_at":1718577377,"choice":"0"},{"type":"run_routes","entity":"6","entity_type":"corporation","id":574,"created_at":1718577380,"routes":[{"train":"LP-0","connections":[["local","F9"]],"hexes":["F9"],"revenue":30,"revenue_str":"F9","nodes":["F9-0"]},{"train":"L-2","connections":[["E2","F3","F5"],["F5","G6","F7","F9"],["F9","G8"],["G8","H7","I8"]],"hexes":["E2","F5","F9","G8","I8"],"revenue":120,"revenue_str":"E2-F5-F9-G8-I8","nodes":["E2-0","F5-0","F9-0","G8-0","I8-0"]}],"extra_revenue":0},{"type":"buy_train","entity":"6","entity_type":"corporation","id":575,"created_at":1718577383,"train":"3-5","price":200,"variant":"3"},{"type":"pass","entity":"11","entity_type":"corporation","id":576,"created_at":1718579012},{"type":"lay_tile","entity":"11","entity_type":"corporation","id":577,"created_at":1718579114,"hex":"N13","tile":"9-9","rotation":1},{"type":"run_routes","entity":"11","entity_type":"corporation","id":578,"created_at":1718579117,"routes":[{"train":"L-8","connections":[["J5","K6","L7","M8","N9","O8"]],"hexes":["J5","O8"],"revenue":70,"revenue_str":"J5-O8 (-$20 Portage) ","nodes":["J5-0","O8-0"]}],"extra_revenue":0},{"type":"pass","entity":"11","entity_type":"corporation","id":579,"created_at":1718579146},{"type":"pass","entity":"2","entity_type":"corporation","id":580,"created_at":1718590769},{"type":"lay_tile","entity":"2","entity_type":"corporation","id":581,"created_at":1718590787,"hex":"D19","tile":"57-3","rotation":1},{"type":"run_routes","entity":"2","entity_type":"corporation","id":582,"created_at":1718590799,"routes":[{"train":"L-18","connections":[["B19","C20","D21","D19"]],"hexes":["D19","B19"],"revenue":40,"revenue_str":"D19-B19","nodes":["B19-0","D19-0"]}],"extra_revenue":0},{"type":"pass","entity":"2","entity_type":"corporation","id":583,"created_at":1718590802},{"type":"acquire_company","entity":"ORNC","entity_type":"corporation","id":584,"created_at":1718597216,"company":"P4"},{"type":"pass","entity":"ORNC","entity_type":"corporation","id":585,"created_at":1718597219},{"type":"lay_tile","entity":"ORNC","entity_type":"corporation","id":586,"created_at":1718597234,"hex":"N15","tile":"9-0","rotation":1},{"type":"pass","entity":"ORNC","entity_type":"corporation","id":587,"created_at":1718597249},{"type":"pass","entity":"ORNC","entity_type":"corporation","id":588,"created_at":1718597263},{"type":"undo","entity":"ORNC","action_id":583,"entity_type":"corporation","id":589,"user":1339,"created_at":1718597631},{"type":"redo","entity":"ORNC","entity_type":"corporation","id":590,"user":1339,"created_at":1718603232},{"type":"run_routes","entity":"ORNC","routes":[{"hexes":["O8"],"nodes":["O8-0"],"train":"LP-1","revenue":60,"connections":[["local","O8"]],"revenue_str":"O8"},{"hexes":["O8","O10","O12"],"nodes":["O8-0","O10-0","O12-0"],"train":"3-2","revenue":110,"connections":[["O8","O10"],["O10","O12"]],"revenue_str":"O8-O10-O12"},{"hexes":["O8","J9","I12"],"nodes":["O8-0","J9-0","I12-0"],"train":"3-1","revenue":130,"connections":[["O8","N9","M8","L7","K8","J9"],["J9","K10","J11","I12"]],"revenue_str":"O8-J9-I12"},{"hexes":["O8","N5"],"nodes":["O8-0","N5-0"],"train":"L-17","revenue":80,"connections":[["O8","N7","N5"]],"revenue_str":"O8-N5"},{"hexes":["O8","O10"],"nodes":["O8-0","O10-0"],"train":"L-13","revenue":100,"connections":[["O8","P9","P11","O10"]],"revenue_str":"O8-O10"}],"entity_type":"corporation","extra_revenue":0,"id":591,"user":1339,"created_at":1718603272},{"type":"undo","entity":"ORNC","entity_type":"corporation","id":592,"user":1339,"created_at":1718603276},{"type":"run_routes","entity":"ORNC","entity_type":"corporation","id":593,"created_at":1718603448,"routes":[{"train":"LP-1","connections":[["local","O8"]],"hexes":["O8"],"revenue":60,"revenue_str":"O8","nodes":[]},{"train":"3-2","connections":[["O8","O10"],["O10","O12"]],"hexes":["O8","O10","O12"],"revenue":110,"revenue_str":"O8-O10-O12","nodes":["O8-0","O10-0","O12-0"]},{"train":"3-1","connections":[["O8","N9","M8","L7","K8","J9"],["J9","K10","J11","I12"]],"hexes":["O8","J9","I12"],"revenue":130,"revenue_str":"O8-J9-I12","nodes":["O8-0","J9-0","I12-0"]},{"train":"L-17","connections":[["O8","N7","N5"]],"hexes":["O8","N5"],"revenue":80,"revenue_str":"O8-N5","nodes":["O8-0","N5-0"]},{"train":"L-13","connections":[["O8","P9","P11","O10"]],"hexes":["O10","O8"],"revenue":100,"revenue_str":"O10-O8","nodes":["O8-0","O10-0"]}],"extra_revenue":0},{"type":"choose","choice":"withhold","entity":"ORNC","entity_type":"corporation","id":594,"user":1339,"created_at":1718603452},{"type":"undo","entity":"ORNC","entity_type":"corporation","id":595,"user":1339,"created_at":1718603455},{"type":"choose","entity":"ORNC","entity_type":"corporation","id":596,"created_at":1718603456,"choice":"half"},{"type":"dividend","entity":"ORNC","entity_type":"corporation","id":597,"created_at":1718603462,"kind":"payout"},{"type":"merge","entity":"ORNC","entity_type":"corporation","id":598,"created_at":1718603484,"corporation":"11"},{"type":"choose","entity":"ORNC","entity_type":"corporation","id":599,"created_at":1718603486,"choice":"one_share"},{"type":"choose","entity":"ORNC","entity_type":"corporation","id":600,"created_at":1718603491,"choice":"exchange"},{"type":"discard_train","entity":"ORNC","entity_type":"corporation","id":601,"created_at":1718603502,"train":"L-8"},{"type":"acquire_company","entity":"SPS","entity_type":"corporation","id":602,"created_at":1718717840,"company":"P12"},{"type":"pass","entity":"SPS","entity_type":"corporation","id":603,"user":790,"created_at":1718717842},{"type":"undo","entity":"SPS","entity_type":"corporation","id":604,"user":790,"created_at":1718717863},{"type":"pass","entity":"SPS","entity_type":"corporation","id":605,"created_at":1718717869},{"type":"undo","entity":"SPS","entity_type":"corporation","id":606,"user":790,"created_at":1718717872},{"type":"redo","entity":"SPS","entity_type":"corporation","id":607,"user":790,"created_at":1718717873},{"type":"lay_tile","entity":"SPS","entity_type":"corporation","id":608,"created_at":1718717912,"hex":"J7","tile":"142-0","rotation":4},{"type":"pass","entity":"SPS","entity_type":"corporation","id":609,"created_at":1718717926,"auto_actions":[{"type":"pass","entity":"SPS","entity_type":"corporation","created_at":1718717926}]},{"type":"choose","entity":"SPS","entity_type":"corporation","id":610,"created_at":1718717930,"choice":"2"},{"type":"run_routes","entity":"SPS","entity_type":"corporation","id":611,"created_at":1718717954,"routes":[{"train":"3-3","connections":[["G8","H7","I8"],["I8","J7"],["J7","J5"],["J5","K6","L7","K8","J9"],["J9","K10","J11","I12"],["I12","J13"]],"hexes":["G8","I8","J7","J5","J9","I12","J13"],"revenue":150,"revenue_str":"G8-I8-J7-J5-J9-I12-J13","nodes":["G8-0","I8-0","J7-0","J5-0","J9-0","I12-0","J13-0"]},{"train":"L-6","connections":[["O8","O10"]],"hexes":["O8","O10"],"revenue":100,"revenue_str":"O8-O10","nodes":["O8-0","O10-0"]},{"train":"L-1","connections":[["O8","P9","P11","O10"]],"hexes":["O8","O10"],"revenue":100,"revenue_str":"O8-O10","nodes":["O8-0","O10-0"]}],"extra_revenue":0},{"type":"dividend","entity":"SPS","entity_type":"corporation","id":612,"created_at":1718717961,"kind":"payout"},{"type":"buy_train","entity":"SPS","entity_type":"corporation","id":613,"created_at":1718717977,"train":"3-6","price":200,"variant":"3"},{"type":"pass","entity":"SPS","entity_type":"corporation","id":614,"created_at":1718717981},{"type":"pass","entity":"SPS","entity_type":"corporation","id":615,"created_at":1718717983},{"type":"acquire_company","entity":"NP","entity_type":"corporation","id":616,"created_at":1718722546,"company":"P9"},{"type":"acquire_company","entity":"NP","entity_type":"corporation","id":617,"created_at":1718722549,"company":"P2"},{"type":"acquire_company","entity":"NP","entity_type":"corporation","id":618,"created_at":1718722560,"company":"P7"},{"type":"pass","entity":"NP","entity_type":"corporation","id":619,"created_at":1718722562},{"type":"lay_tile","entity":"NP","entity_type":"corporation","id":620,"created_at":1718722623,"hex":"G20","tile":"9-10","rotation":2},{"type":"lay_tile","entity":"NP","entity_type":"corporation","id":621,"created_at":1718722628,"hex":"F19","tile":"BC-0","rotation":0},{"type":"pass","entity":"NP","entity_type":"corporation","id":622,"created_at":1718722635,"auto_actions":[{"type":"hex_token","entity":"NP","entity_type":"corporation","created_at":1718722635,"hex":"I12","token_type":"destination"}]},{"type":"pass","entity":"NP","entity_type":"corporation","id":623,"created_at":1718722661},{"type":"run_routes","entity":"NP","entity_type":"corporation","id":624,"created_at":1718722697,"routes":[{"train":"L-7","connections":[["I12","H11"]],"hexes":["I12","H11"],"revenue":50,"revenue_str":"I12-H11","nodes":["I12-0","H11-0"]},{"train":"L-3","connections":[["O20","O22"]],"hexes":["O20","O22"],"revenue":60,"revenue_str":"O20-O22","nodes":["O20-0","O22-0"]},{"train":"2P-0","connections":[["I12","J11","K10","J9"]],"hexes":["I12","J9"],"revenue":70,"revenue_str":"I12-J9","nodes":["I12-0","J9-0"]}],"extra_revenue":0},{"type":"dividend","entity":"NP","entity_type":"corporation","id":625,"created_at":1718722702,"kind":"payout"},{"type":"pass","entity":"NP","entity_type":"corporation","id":626,"created_at":1718722729},{"type":"acquire_company","entity":"6","entity_type":"corporation","id":627,"created_at":1718722859,"company":"P18"},{"type":"pass","entity":"6","entity_type":"corporation","id":628,"created_at":1718722869},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":629,"created_at":1718722878,"hex":"F1","tile":"8-8","rotation":3},{"type":"lay_tile","entity":"P18","entity_type":"company","id":630,"created_at":1718722899,"hex":"J11","tile":"PNW3-0","rotation":0},{"type":"choose","entity":"6","entity_type":"corporation","id":631,"created_at":1718722901,"choice":"1"},{"type":"run_routes","entity":"6","entity_type":"corporation","id":632,"created_at":1718722925,"routes":[{"train":"LP-0","connections":[["local","F9"]],"hexes":["F9"],"revenue":30,"revenue_str":"F9","nodes":["F9-0"]},{"train":"3-5","connections":[["E2","F3","F5"],["F5","G6","F7","F9"],["F9","G8"],["G8","H7","I8"],["I8","J7"],["J7","J9"],["J9","K10","J11"],["J11","I12"],["I12","J13"]],"hexes":["E2","F5","F9","G8","I8","J7","J9","J11","I12","J13"],"revenue":240,"revenue_str":"E2-F5-F9-G8-I8-J7-J9-J11-I12-J13","nodes":["E2-0","F5-0","F9-0","G8-0","I8-0","J7-0","J9-0","J11-0","I12-0","J13-0"]}],"extra_revenue":0},{"type":"pass","entity":"2","entity_type":"corporation","id":633,"created_at":1718723064},{"type":"lay_tile","entity":"2","entity_type":"corporation","id":634,"created_at":1718723080,"hex":"D17","tile":"7-4","rotation":4},{"type":"run_routes","entity":"2","entity_type":"corporation","id":635,"created_at":1718723096,"routes":[{"train":"L-18","connections":[["B19","C20","D21","D19"]],"hexes":["B19","D19"],"revenue":40,"revenue_str":"B19-D19","nodes":["B19-0","D19-0"]}],"extra_revenue":0},{"type":"pass","entity":"2","entity_type":"corporation","id":636,"created_at":1718723105},{"type":"acquire_company","entity":"ORNC","entity_type":"corporation","id":637,"created_at":1718725736,"company":"P21"},{"type":"pass","entity":"ORNC","entity_type":"corporation","id":638,"created_at":1718725738},{"type":"choose_ability","entity":"P21","entity_type":"company","id":639,"created_at":1718725744,"choice":"M21_bottom"},{"type":"lay_tile","entity":"ORNC","entity_type":"corporation","id":640,"created_at":1718725875,"hex":"O4","tile":"7-5","rotation":3},{"hex":"O6","tile":"8-9","type":"lay_tile","entity":"ORNC","rotation":1,"entity_type":"corporation","id":641,"user":1339,"created_at":1718725889},{"type":"undo","entity":"ORNC","entity_type":"corporation","id":642,"user":1339,"created_at":1718725896},{"type":"lay_tile","entity":"ORNC","entity_type":"corporation","id":643,"created_at":1718725905,"hex":"O6","tile":"8-9","rotation":5},{"type":"place_token","entity":"ORNC","entity_type":"corporation","id":644,"created_at":1718725908,"city":"H11-0-0","slot":1,"tokener":"ORNC"},{"type":"run_routes","entity":"ORNC","entity_type":"corporation","id":645,"created_at":1718725974,"routes":[{"train":"LP-1","connections":[["local","O8"]],"hexes":["O8"],"revenue":60,"revenue_str":"O8","nodes":["O8-0"]},{"train":"3-2","connections":[["I12","J11"],["J11","J9"]],"hexes":["I12","J11","J9"],"revenue":100,"revenue_str":"I12-J11-J9","nodes":["I12-0","J11-0","J9-0"]},{"train":"3-1","connections":[["O8","N9","M8","L7","K8","J9"],["J9","K10","J11"]],"hexes":["O8","J9","J11"],"revenue":130,"revenue_str":"O8-J9-J11","nodes":["O8-0","J9-0","J11-0"]},{"train":"L-17","connections":[["O8","O10"]],"hexes":["O8","O10"],"revenue":100,"revenue_str":"O8-O10","nodes":["O8-0","O10-0"]},{"train":"L-13","connections":[["O8","P9","P11","O10"]],"hexes":["O8","O10"],"revenue":100,"revenue_str":"O8-O10","nodes":["O8-0","O10-0"]}],"extra_revenue":0},{"type":"choose","entity":"ORNC","entity_type":"corporation","id":646,"created_at":1718725979,"choice":"withhold"},{"type":"dividend","entity":"ORNC","entity_type":"corporation","id":647,"created_at":1718725985,"kind":"payout"},{"type":"pass","entity":"ORNC","entity_type":"corporation","id":648,"created_at":1718726001},{"type":"pass","entity":"SPS","entity_type":"corporation","id":649,"created_at":1718829202},{"type":"lay_tile","entity":"P12","entity_type":"company","id":650,"created_at":1718829217,"hex":"I10","tile":"P1-0","rotation":4},{"type":"lay_tile","entity":"SPS","entity_type":"corporation","id":651,"created_at":1718829243,"auto_actions":[{"type":"pass","entity":"SPS","entity_type":"corporation","created_at":1718829242}],"hex":"F9","tile":"14-0","rotation":0},{"type":"choose","entity":"SPS","entity_type":"corporation","id":652,"created_at":1718829246,"choice":"3"},{"type":"run_routes","entity":"SPS","entity_type":"corporation","id":653,"created_at":1718829278,"routes":[{"train":"3-6","connections":[["E2","F3","F5"],["F5","G6","F7","F9"],["F9","G8"],["G8","H7","I8"],["I8","J7"],["J7","J9"],["J9","J11"],["J11","I12"],["I12","J13"]],"hexes":["E2","F5","F9","G8","I8","J7","J9","J11","I12","J13"],"revenue":240,"revenue_str":"E2-F5-F9-G8-I8-J7-J9-J11-I12-J13","nodes":["E2-0","F5-0","F9-0","G8-0","I8-0","J7-0","J9-0","J11-0","I12-0","J13-0"]},{"train":"3-3","connections":[["O8","N9","M8","L7","K8","J9"],["J9","K10","J11"]],"hexes":["O8","J9","J11"],"revenue":110,"revenue_str":"O8-J9-J11 (-$20 Portage) ","nodes":["O8-0","J9-0","J11-0"]},{"train":"L-6","connections":[["O8","O10"]],"hexes":["O8","O10"],"revenue":100,"revenue_str":"O8-O10","nodes":["O8-0","O10-0"]},{"train":"L-1","connections":[["O8","P9","P11","O10"]],"hexes":["O8","O10"],"revenue":100,"revenue_str":"O8-O10","nodes":["O8-0","O10-0"]}],"extra_revenue":0},{"type":"dividend","entity":"SPS","entity_type":"corporation","id":654,"created_at":1718829286,"kind":"payout"},{"type":"pass","entity":"SPS","entity_type":"corporation","id":655,"created_at":1718829297},{"type":"pass","entity":"SPS","entity_type":"corporation","id":656,"created_at":1718829303},{"type":"acquire_company","entity":"NP","entity_type":"corporation","id":657,"created_at":1718939114,"company":"P15"},{"type":"pass","entity":"NP","entity_type":"corporation","id":658,"created_at":1718939115},{"type":"lay_tile","entity":"NP","entity_type":"corporation","id":659,"created_at":1718939126,"hex":"F19","tile":"9-11","rotation":2},{"type":"lay_tile","entity":"NP","entity_type":"corporation","id":660,"created_at":1718939132,"hex":"E18","tile":"9-12","rotation":2},{"type":"assign","entity":"P15","entity_type":"company","id":661,"created_at":1718939144,"target":"D19","target_type":"hex"},{"type":"pass","entity":"NP","entity_type":"corporation","id":662,"created_at":1718939148},{"type":"pass","entity":"NP","entity_type":"corporation","id":663,"created_at":1718939159},{"type":"run_routes","entity":"NP","entity_type":"corporation","id":664,"created_at":1718939226,"routes":[{"train":"L-7","connections":[["O20","O22"]],"hexes":["O20","O22"],"revenue":60,"revenue_str":"O20-O22","nodes":["O20-0","O22-0"]},{"train":"L-3","connections":[["I12","J11"]],"hexes":["I12","J11"],"revenue":60,"revenue_str":"I12-J11","nodes":["I12-0","J11-0"]},{"train":"2P-0","connections":[["I12","I10"]],"hexes":["I12","I10"],"revenue":70,"revenue_str":"I12-I10","nodes":["I12-0","I10-0"]}],"extra_revenue":0},{"type":"dividend","entity":"NP","entity_type":"corporation","id":665,"created_at":1718939243,"kind":"payout"},{"type":"buy_train","entity":"NP","entity_type":"corporation","id":666,"created_at":1718939248,"train":"4-0","price":300,"variant":"4"},{"type":"pass","entity":"NP","entity_type":"corporation","id":667,"created_at":1718939254},{"type":"merge","entity":"NP","entity_type":"corporation","id":668,"created_at":1718939257,"corporation":"2"},{"type":"choose","entity":"NP","entity_type":"corporation","id":669,"created_at":1718939269,"choice":"two_shares"},{"type":"choose","entity":"NP","entity_type":"corporation","id":670,"created_at":1718939272,"choice":"replace"},{"type":"pass","entity":"NP","entity_type":"corporation","id":671,"created_at":1718939276},{"type":"pass","entity":17678,"entity_type":"player","id":672,"created_at":1718939308},{"type":"buy_shares","entity":1339,"entity_type":"player","id":673,"created_at":1718947320,"shares":["NP_6"],"percent":10},{"type":"buy_shares","entity":14958,"entity_type":"player","id":674,"created_at":1718947553,"shares":["NP_7"],"percent":10},{"type":"bid","entity":790,"entity_type":"player","id":675,"created_at":1718963889,"company":"P14","price":45},{"type":"bid","entity":790,"entity_type":"player","id":676,"created_at":1718963967,"company":"P20","price":5},{"type":"pass","entity":790,"entity_type":"player","id":677,"created_at":1718963970},{"type":"pass","entity":17678,"entity_type":"player","id":678,"created_at":1718977351},{"type":"buy_shares","entity":1339,"entity_type":"player","id":679,"created_at":1718986548,"shares":["NP_8"],"percent":10},{"type":"buy_shares","entity":14958,"entity_type":"player","id":680,"created_at":1718986611,"shares":["SPS_7"],"percent":10},{"type":"buy_shares","entity":790,"entity_type":"player","id":681,"created_at":1719016142,"shares":["SPS_8"],"percent":10},{"type":"undo","entity":17678,"action_id":680,"entity_type":"player","id":682,"user":17678,"created_at":1719065207},{"type":"undo","entity":790,"entity_type":"player","id":683,"user":17678,"created_at":1719065245},{"type":"undo","entity":14958,"entity_type":"player","id":684,"user":17678,"created_at":1719065256},{"type":"undo","entity":1339,"entity_type":"player","id":685,"user":17678,"created_at":1719065259},{"type":"redo","entity":17678,"entity_type":"player","id":686,"user":17678,"created_at":1719065285},{"type":"redo","entity":1339,"entity_type":"player","id":687,"user":17678,"created_at":1719065288},{"type":"redo","entity":14958,"entity_type":"player","id":688,"user":17678,"created_at":1719065291},{"type":"redo","entity":790,"entity_type":"player","id":689,"user":17678,"created_at":1719065295},{"type":"bid","entity":17678,"entity_type":"player","id":690,"created_at":1719065371,"company":"P14","price":75},{"type":"pass","entity":17678,"entity_type":"player","id":691,"created_at":1719065395},{"type":"bid","entity":1339,"entity_type":"player","id":692,"created_at":1719067920,"company":"M8","price":200},{"type":"bid","entity":1339,"entity_type":"player","id":693,"created_at":1719067926,"company":"P8","price":0},{"type":"pass","entity":1339,"entity_type":"player","id":694,"created_at":1719067930},{"type":"bid","entity":14958,"entity_type":"player","id":695,"created_at":1719073531,"company":"M8","price":205},{"type":"bid","entity":14958,"entity_type":"player","id":696,"created_at":1719073534,"company":"P14","price":80},{"type":"pass","entity":14958,"entity_type":"player","id":697,"created_at":1719073547},{"type":"bid","entity":790,"entity_type":"player","id":698,"created_at":1719076490,"company":"P14","price":85},{"type":"pass","entity":790,"entity_type":"player","id":699,"created_at":1719076497},{"type":"bid","entity":17678,"entity_type":"player","id":700,"created_at":1719154942,"company":"P14","price":90},{"type":"bid","entity":17678,"entity_type":"player","id":701,"created_at":1719155025,"company":"P20","price":10},{"type":"pass","entity":17678,"entity_type":"player","id":702,"created_at":1719155030},{"type":"bid","entity":1339,"entity_type":"player","id":703,"created_at":1719155544,"company":"M8","price":210},{"type":"pass","entity":1339,"entity_type":"player","id":704,"created_at":1719155549},{"type":"bid","price":215,"entity":14958,"company":"M8","entity_type":"player","id":705,"user":14958,"created_at":1719157703},{"type":"undo","entity":14958,"entity_type":"player","id":706,"user":14958,"created_at":1719157779},{"type":"undo","entity":14958,"entity_type":"player","id":707,"user":14958,"created_at":1719157780},{"type":"redo","entity":1339,"entity_type":"player","id":708,"user":14958,"created_at":1719157781},{"type":"bid","entity":14958,"entity_type":"player","id":709,"created_at":1719157791,"company":"P20","price":15},{"type":"bid","entity":14958,"entity_type":"player","id":710,"created_at":1719157793,"company":"P14","price":95},{"type":"bid","entity":14958,"entity_type":"player","id":711,"created_at":1719157795,"company":"P8","price":5},{"type":"bid","entity":790,"entity_type":"player","id":712,"created_at":1719158261,"company":"P20","price":20},{"type":"pass","entity":790,"entity_type":"player","id":713,"created_at":1719158264},{"type":"bid","entity":17678,"entity_type":"player","id":714,"created_at":1719199221,"company":"P14","price":100},{"type":"bid","entity":17678,"entity_type":"player","id":715,"created_at":1719199240,"company":"P8","price":25},{"type":"program_share_pass","entity":17678,"entity_type":"player","id":716,"created_at":1719199261,"auto_actions":[{"type":"pass","entity":17678,"entity_type":"player","created_at":1719199260}],"unconditional":false,"indefinite":false},{"type":"bid","entity":1339,"entity_type":"player","id":717,"created_at":1719205683,"company":"P8","price":30},{"type":"pass","entity":1339,"entity_type":"player","id":718,"created_at":1719205688},{"type":"bid","entity":14958,"entity_type":"player","id":719,"created_at":1719205955,"company":"P20","price":25},{"type":"bid","entity":14958,"entity_type":"player","id":720,"created_at":1719205960,"company":"P14","price":105},{"type":"bid","entity":14958,"entity_type":"player","id":721,"created_at":1719205968,"company":"P8","price":35},{"type":"bid","entity":790,"entity_type":"player","id":722,"created_at":1719225670,"company":"P20","price":30},{"type":"pass","entity":790,"entity_type":"player","id":723,"created_at":1719225673,"auto_actions":[{"type":"program_disable","entity":17678,"entity_type":"player","created_at":1719225672,"reason":"No longer winning bid on P8"}]},{"type":"bid","entity":17678,"entity_type":"player","id":724,"created_at":1719241273,"company":"P14","price":110},{"type":"pass","entity":17678,"entity_type":"player","id":725,"created_at":1719241286},{"type":"pass","entity":1339,"entity_type":"player","id":726,"created_at":1719245659},{"type":"bid","entity":14958,"entity_type":"player","id":727,"created_at":1719245830,"company":"P14","price":115},{"type":"bid","entity":14958,"entity_type":"player","id":728,"created_at":1719245832,"company":"P20","price":35},{"type":"pass","entity":14958,"entity_type":"player","id":729,"created_at":1719245835},{"type":"bid","entity":790,"entity_type":"player","id":730,"created_at":1719248845,"company":"M8","price":300},{"type":"pass","entity":790,"entity_type":"player","id":731,"created_at":1719248847},{"type":"bid","entity":17678,"entity_type":"player","id":732,"created_at":1719293010,"company":"P14","price":120},{"type":"pass","entity":17678,"entity_type":"player","id":733,"created_at":1719293018},{"type":"bid","entity":1339,"entity_type":"player","id":734,"created_at":1719295108,"company":"M8","price":305},{"type":"pass","entity":1339,"entity_type":"player","id":735,"created_at":1719295109},{"type":"bid","entity":14958,"entity_type":"player","id":736,"created_at":1719324848,"company":"P14","price":125},{"type":"pass","entity":14958,"entity_type":"player","id":737,"created_at":1719324853},{"type":"bid","entity":790,"entity_type":"player","id":738,"created_at":1719329590,"company":"M8","price":310},{"type":"pass","entity":790,"entity_type":"player","id":739,"created_at":1719329592},{"type":"bid","entity":17678,"entity_type":"player","id":740,"created_at":1719330793,"company":"P14","price":130},{"type":"bid","entity":17678,"entity_type":"player","id":741,"created_at":1719330801,"company":"P20","price":40},{"type":"pass","entity":17678,"entity_type":"player","id":742,"created_at":1719330806},{"type":"bid","entity":1339,"entity_type":"player","id":743,"created_at":1719332110,"company":"M8","price":315},{"type":"pass","entity":1339,"entity_type":"player","id":744,"created_at":1719332112},{"type":"bid","entity":14958,"entity_type":"player","id":745,"created_at":1719332652,"company":"P14","price":135},{"type":"bid","entity":14958,"entity_type":"player","id":746,"created_at":1719332657,"company":"P20","price":45},{"type":"pass","entity":14958,"entity_type":"player","id":747,"created_at":1719332666},{"type":"bid","entity":790,"entity_type":"player","id":748,"created_at":1719340008,"company":"M8","price":320},{"type":"pass","entity":790,"entity_type":"player","id":749,"created_at":1719340010},{"type":"bid","entity":17678,"entity_type":"player","id":750,"created_at":1719350653,"company":"P14","price":140},{"type":"pass","entity":17678,"entity_type":"player","id":751,"created_at":1719350684},{"type":"bid","entity":1339,"entity_type":"player","id":752,"created_at":1719351948,"company":"M8","price":325},{"type":"pass","entity":1339,"entity_type":"player","id":753,"created_at":1719351951},{"type":"bid","entity":14958,"entity_type":"player","id":754,"created_at":1719352855,"company":"P14","price":145},{"type":"pass","entity":14958,"entity_type":"player","id":755,"created_at":1719352864},{"type":"bid","entity":790,"entity_type":"player","id":756,"created_at":1719355116,"company":"MC","price":100},{"type":"pass","entity":790,"entity_type":"player","id":757,"created_at":1719355140},{"type":"bid","entity":17678,"entity_type":"player","id":758,"created_at":1719356473,"company":"P14","price":150},{"type":"pass","entity":17678,"entity_type":"player","id":759,"created_at":1719356478},{"type":"pass","entity":1339,"entity_type":"player","id":760,"created_at":1719379001},{"type":"bid","entity":14958,"entity_type":"player","id":761,"created_at":1719380353,"company":"P14","price":155},{"type":"pass","entity":14958,"entity_type":"player","id":762,"created_at":1719380359},{"type":"pass","entity":790,"entity_type":"player","id":763,"created_at":1719407243},{"type":"bid","entity":17678,"entity_type":"player","id":764,"created_at":1719409097,"company":"P14","price":160},{"type":"pass","entity":17678,"entity_type":"player","id":765,"created_at":1719409104},{"type":"pass","entity":1339,"entity_type":"player","id":766,"created_at":1719414076},{"type":"bid","entity":14958,"entity_type":"player","id":767,"created_at":1719416453,"company":"P14","price":165},{"type":"pass","entity":14958,"entity_type":"player","id":768,"created_at":1719416460},{"type":"pass","entity":790,"entity_type":"player","id":769,"created_at":1719449826},{"type":"bid","entity":17678,"entity_type":"player","id":770,"created_at":1719451209,"company":"P14","price":170},{"type":"pass","entity":17678,"entity_type":"player","id":771,"created_at":1719451211},{"type":"pass","entity":1339,"entity_type":"player","id":772,"created_at":1719463798},{"type":"bid","entity":14958,"entity_type":"player","id":773,"created_at":1719464126,"company":"P14","price":175},{"type":"pass","entity":14958,"entity_type":"player","id":774,"created_at":1719464129},{"type":"pass","entity":790,"entity_type":"player","id":775,"created_at":1719489114},{"type":"bid","entity":17678,"entity_type":"player","id":776,"created_at":1719498382,"company":"P14","price":180},{"type":"pass","entity":17678,"entity_type":"player","id":777,"created_at":1719498406},{"type":"pass","entity":1339,"entity_type":"player","id":778,"created_at":1719501959},{"type":"bid","entity":14958,"entity_type":"player","id":779,"created_at":1719502606,"company":"P14","price":185},{"type":"pass","entity":14958,"entity_type":"player","id":780,"created_at":1719502631},{"type":"program_share_pass","entity":790,"entity_type":"player","id":781,"created_at":1719515634,"auto_actions":[{"type":"pass","entity":790,"entity_type":"player","created_at":1719515633}],"unconditional":false,"indefinite":false},{"type":"bid","entity":17678,"entity_type":"player","id":782,"created_at":1719518684,"company":"P14","price":190},{"type":"pass","entity":17678,"entity_type":"player","id":783,"created_at":1719518698},{"type":"pass","entity":1339,"entity_type":"player","id":784,"created_at":1719535356},{"type":"pass","entity":14958,"entity_type":"player","id":785,"created_at":1719535482,"auto_actions":[{"type":"pass","entity":790,"entity_type":"player","created_at":1719535481}]},{"type":"pass","entity":17678,"entity_type":"player","id":786,"created_at":1719535610},{"type":"acquire_company","entity":"6","company":"P20","entity_type":"corporation","id":787,"user":14958,"created_at":1719535805},{"type":"undo","entity":"6","entity_type":"corporation","id":788,"user":14958,"created_at":1719535856},{"type":"acquire_company","entity":"6","entity_type":"corporation","id":789,"created_at":1719535879,"company":"P8"},{"type":"pass","entity":"6","entity_type":"corporation","id":790,"created_at":1719535882},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":791,"created_at":1719535895,"hex":"G2","tile":"3-1","rotation":2},{"type":"pass","entity":"6","entity_type":"corporation","id":792,"created_at":1719535898},{"type":"choose","entity":"6","entity_type":"corporation","id":793,"created_at":1719535900,"choice":"0"},{"type":"run_routes","entity":"6","entity_type":"corporation","id":794,"created_at":1719535905,"routes":[{"train":"LP-0","connections":[["local","F9"]],"hexes":["F9"],"revenue":30,"revenue_str":"F9","nodes":["F9-0"]},{"train":"3-5","connections":[["J13","I12"],["I12","J11"],["J11","J9"],["J9","J7"],["J7","I8"],["I8","H7","G8"],["G8","F9"],["F9","F7","G6","F5"],["F5","F3","E2"],["E2","F1","G2"]],"hexes":["J13","I12","J11","J9","J7","I8","G8","F9","F5","E2","G2"],"revenue":260,"revenue_str":"J13-I12-J11-J9-J7-I8-G8-F9-F5-E2-G2","nodes":["J13-0","I12-0","J11-0","J9-0","J7-0","I8-0","G8-0","F9-0","F5-0","E2-0","G2-0"]}],"extra_revenue":0},{"type":"pass","entity":"8","entity_type":"corporation","id":795,"user":1339,"created_at":1719543503},{"hex":"H11","tile":"X20-0","type":"lay_tile","entity":"8","rotation":0,"entity_type":"corporation","id":796,"user":1339,"created_at":1719543517},{"type":"buy_train","price":300,"train":"4-2","entity":"8","variant":"4","entity_type":"corporation","id":797,"user":1339,"created_at":1719543521},{"type":"pass","entity":"ORNC","entity_type":"corporation","id":798,"user":1339,"created_at":1719543525},{"hex":"J15","tile":"9-1","type":"lay_tile","entity":"ORNC","rotation":0,"entity_type":"corporation","id":799,"user":1339,"created_at":1719543552},{"type":"undo","entity":"ORNC","action_id":797,"entity_type":"corporation","id":800,"user":1339,"created_at":1719543571},{"type":"undo","entity":"ORNC","action_id":794,"entity_type":"corporation","id":801,"user":1339,"created_at":1719543573},{"type":"pass","entity":"8","entity_type":"corporation","id":802,"created_at":1719543574},{"type":"lay_tile","entity":"8","entity_type":"corporation","id":803,"created_at":1719543578,"hex":"J15","tile":"9-1","rotation":0},{"type":"buy_train","entity":"8","entity_type":"corporation","id":804,"created_at":1719543595,"train":"4-2","price":300,"variant":"4"},{"type":"pass","entity":"ORNC","entity_type":"corporation","id":805,"created_at":1719543597},{"type":"lay_tile","entity":"ORNC","entity_type":"corporation","id":806,"created_at":1719543603,"hex":"K14","tile":"9-13","rotation":0},{"type":"lay_tile","entity":"ORNC","entity_type":"corporation","id":807,"created_at":1719543607,"hex":"L13","tile":"9-14","rotation":0},{"type":"pass","entity":"ORNC","entity_type":"corporation","id":808,"created_at":1719543617},{"type":"run_routes","entity":"ORNC","entity_type":"corporation","id":809,"created_at":1719543632,"routes":[{"train":"LP-1","connections":[["I12","J11"]],"hexes":["I12","J11"],"revenue":60,"revenue_str":"I12-J11","nodes":["I12-0","J11-0"]},{"train":"3-2","connections":[["O10","O8"],["O8","N7","N5"]],"hexes":["O10","O8","N5"],"revenue":120,"revenue_str":"O10-O8-N5","nodes":["O10-0","O8-0","N5-0"]},{"train":"3-1","connections":[["J9","K8","L7","M8","N9","O8"],["O8","P9","P11","O10"]],"hexes":["J9","O8","O10"],"revenue":140,"revenue_str":"J9-O8-O10","nodes":["J9-0","O8-0","O10-0"]}],"extra_revenue":0},{"type":"choose","entity":"ORNC","entity_type":"corporation","id":810,"created_at":1719543634,"choice":"half"},{"type":"dividend","entity":"ORNC","entity_type":"corporation","id":811,"created_at":1719543646,"kind":"payout"},{"type":"pass","entity":"ORNC","entity_type":"corporation","id":812,"created_at":1719543649},{"type":"pass","entity":"ORNC","entity_type":"corporation","id":813,"created_at":1719543652},{"type":"pass","entity":"SPS","entity_type":"corporation","id":814,"created_at":1719579030},{"type":"lay_tile","entity":"SPS","entity_type":"corporation","id":815,"created_at":1719579077,"hex":"N17","tile":"7-6","rotation":1},{"type":"lay_tile","entity":"SPS","entity_type":"corporation","id":816,"created_at":1719579086,"auto_actions":[{"type":"pass","entity":"SPS","entity_type":"corporation","created_at":1719579084}],"hex":"M16","tile":"8-10","rotation":5},{"type":"choose","entity":"SPS","entity_type":"corporation","id":817,"created_at":1719579096,"choice":"1"},{"type":"run_routes","entity":"SPS","entity_type":"corporation","id":818,"created_at":1719579129,"routes":[{"train":"3-6","connections":[["G2","F1","E2"],["E2","F3","F5"],["F5","G6","F7","F9"],["F9","G8"],["G8","H7","I8"],["I8","J7"],["J7","J9"],["J9","K10","J11"],["J11","I12"],["I12","J13"]],"hexes":["G2","E2","F5","F9","G8","I8","J7","J9","J11","I12","J13"],"revenue":260,"revenue_str":"G2-E2-F5-F9-G8-I8-J7-J9-J11-I12-J13","nodes":["G2-0","E2-0","F5-0","F9-0","G8-0","I8-0","J7-0","J9-0","J11-0","I12-0","J13-0"]},{"train":"3-3","connections":[["O10","P11","P9","O8"],["O8","N9","M8","L7","K8","J9"]],"hexes":["O10","O8","J9"],"revenue":120,"revenue_str":"O10-O8-J9 (-$20 Portage) ","nodes":["O10-0","O8-0","J9-0"]}],"extra_revenue":0},{"type":"dividend","entity":"SPS","entity_type":"corporation","id":819,"created_at":1719579131,"kind":"payout"},{"type":"buy_train","entity":"SPS","entity_type":"corporation","id":820,"created_at":1719579134,"train":"4-3","price":300,"variant":"4"},{"type":"pass","entity":"SPS","entity_type":"corporation","id":821,"created_at":1719579140},{"type":"acquire_company","entity":"NP","company":"P14","entity_type":"corporation","id":822,"user":17678,"created_at":1719580334},{"type":"pass","entity":"NP","entity_type":"corporation","id":823,"user":17678,"created_at":1719580336},{"hex":"M12","tile":"8-11","type":"lay_tile","entity":"NP","rotation":3,"entity_type":"corporation","id":824,"user":17678,"created_at":1719580360},{"type":"pass","entity":"NP","entity_type":"corporation","id":825,"user":17678,"created_at":1719580379},{"type":"pass","entity":"NP","entity_type":"corporation","id":826,"user":17678,"created_at":1719580391},{"type":"undo","entity":"NP","entity_type":"corporation","id":827,"user":17678,"created_at":1719580429},{"type":"undo","entity":"NP","action_id":821,"entity_type":"corporation","id":828,"user":17678,"created_at":1719580432},{"type":"acquire_company","entity":"NP","entity_type":"corporation","id":829,"created_at":1719580435,"company":"P14"},{"type":"pass","entity":"NP","entity_type":"corporation","id":830,"created_at":1719580437},{"hex":"B19","tile":"14-1","type":"lay_tile","entity":"NP","rotation":2,"entity_type":"corporation","id":831,"user":17678,"created_at":1719580458},{"type":"undo","entity":"NP","entity_type":"corporation","id":832,"user":17678,"created_at":1719580510},{"type":"lay_tile","entity":"P7","entity_type":"company","id":833,"created_at":1719580538,"hex":"K22","tile":"81-0","rotation":1},{"type":"pass","entity":"NP","entity_type":"corporation","id":834,"created_at":1719580544},{"type":"run_routes","entity":"NP","entity_type":"corporation","id":835,"created_at":1719580568,"routes":[{"train":"4-0","connections":[["D19","D17","E18","F19","G20","H21"],["H21","I22","J23"],["J23","K22","K20","L19"]],"hexes":["D19","H21","J23","L19"],"revenue":150,"revenue_str":"D19-H21-J23-L19 (+$10 Mill) (+$30 LB) ","nodes":["D19-0","H21-0","J23-0","L19-0"]},{"train":"2P-0","connections":[["I12","I10"]],"hexes":["I12","I10"],"revenue":70,"revenue_str":"I12-I10","nodes":["I12-0","I10-0"]}],"extra_revenue":0},{"type":"choose","entity":"NP","entity_type":"corporation","id":836,"created_at":1719580628,"choice":"withhold"},{"type":"dividend","entity":"NP","entity_type":"corporation","id":837,"created_at":1719580637,"kind":"payout"},{"type":"buy_train","entity":"NP","entity_type":"corporation","id":838,"created_at":1719580708,"train":"5-0","price":500,"variant":"5"},{"type":"discard_train","entity":"SPS","entity_type":"corporation","id":839,"created_at":1719614096,"train":"3-3"},{"type":"pass","entity":"NP","entity_type":"corporation","id":840,"created_at":1719614827},{"type":"acquire_company","entity":"6","company":"P20","entity_type":"corporation","id":841,"user":14958,"created_at":1719615014},{"type":"undo","entity":"6","entity_type":"corporation","id":842,"user":14958,"created_at":1719615020},{"type":"pass","entity":"6","entity_type":"corporation","id":843,"created_at":1719615065},{"hex":"J13","tile":"143-0","type":"lay_tile","entity":"6","rotation":1,"entity_type":"corporation","id":844,"user":14958,"created_at":1719615080},{"type":"pass","entity":"6","entity_type":"corporation","id":845,"user":14958,"created_at":1719615086},{"type":"choose","choice":"0","entity":"6","entity_type":"corporation","id":846,"user":14958,"created_at":1719615088},{"type":"undo","entity":"6","entity_type":"corporation","id":847,"user":14958,"created_at":1719615115},{"type":"undo","entity":"6","entity_type":"corporation","id":848,"user":14958,"created_at":1719615118},{"type":"undo","entity":"6","entity_type":"corporation","id":849,"user":14958,"created_at":1719615120},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":850,"created_at":1719615149,"hex":"M12","tile":"7-7","rotation":3},{"type":"pass","entity":"6","entity_type":"corporation","id":851,"created_at":1719615157},{"type":"choose","entity":"6","entity_type":"corporation","id":852,"created_at":1719615159,"choice":"0"},{"type":"run_routes","entity":"6","entity_type":"corporation","id":853,"created_at":1719615168,"routes":[{"train":"LP-0","connections":[["local","F9"]],"hexes":["F9"],"revenue":30,"revenue_str":"F9","nodes":["F9-0"]},{"train":"3-5","connections":[["J13","I12"],["I12","J11"],["J11","J9"],["J9","J7"],["J7","I8"],["I8","H7","G8"],["G8","F9"],["F9","F7","G6","F5"],["F5","F3","E2"],["E2","F1","G2"]],"hexes":["J13","I12","J11","J9","J7","I8","G8","F9","F5","E2","G2"],"revenue":270,"revenue_str":"J13-I12-J11-J9-J7-I8-G8-F9-F5-E2-G2","nodes":["J13-0","I12-0","J11-0","J9-0","J7-0","I8-0","G8-0","F9-0","F5-0","E2-0","G2-0"]}],"extra_revenue":0},{"type":"pass","entity":"8","entity_type":"corporation","id":854,"created_at":1719620711},{"type":"lay_tile","entity":"8","entity_type":"corporation","id":855,"created_at":1719620743,"hex":"O14","tile":"BC-0","rotation":0},{"type":"run_routes","entity":"8","entity_type":"corporation","id":856,"created_at":1719620752,"routes":[{"train":"4-2","connections":[["H11","I12"],["I12","J11"],["J11","J9"]],"hexes":["H11","I12","J11","J9"],"revenue":130,"revenue_str":"H11-I12-J11-J9","nodes":["H11-0","I12-0","J11-0","J9-0"]}],"extra_revenue":0},{"type":"acquire_company","entity":"ORNC","entity_type":"corporation","id":857,"created_at":1719627965,"company":"P1"},{"type":"pass","entity":"ORNC","entity_type":"corporation","id":858,"created_at":1719627970},{"type":"discard_train","entity":"ORNC","entity_type":"corporation","id":859,"created_at":1719627973,"train":"3-2"},{"hex":"M14","tile":"9-15","type":"lay_tile","entity":"ORNC","rotation":1,"entity_type":"corporation","id":860,"user":1339,"created_at":1719627985},{"type":"undo","entity":"ORNC","action_id":856,"entity_type":"corporation","id":861,"user":1339,"created_at":1719628003},{"type":"redo","entity":"ORNC","entity_type":"corporation","id":862,"user":1339,"created_at":1719628005},{"type":"undo","entity":"ORNC","entity_type":"corporation","id":863,"user":1339,"created_at":1719628008},{"hex":"O8","tile":"X26-0","type":"lay_tile","entity":"ORNC","rotation":0,"entity_type":"corporation","id":864,"user":1339,"created_at":1719628012},{"type":"undo","entity":"ORNC","entity_type":"corporation","id":865,"user":1339,"created_at":1719628028},{"type":"lay_tile","entity":"ORNC","entity_type":"corporation","id":866,"created_at":1719628032,"hex":"O10","tile":"X5-0","rotation":1},{"type":"place_token","entity":"ORNC","entity_type":"corporation","id":867,"created_at":1719628033,"city":"X5-0-0","slot":2,"tokener":"ORNC"},{"type":"run_routes","entity":"ORNC","entity_type":"corporation","id":868,"created_at":1719628061,"routes":[{"train":"LP-1","connections":[["O10","O12"]],"hexes":["O10","O12"],"revenue":60,"revenue_str":"O10-O12","nodes":["O10-0","O12-0"]},{"train":"5P-0","connections":[["O10","O8"],["O8","N9","M8","L7","K8","J9"],["J9","K10","J11"],["J11","I12"]],"hexes":["O10","O8","J9","J11","I12"],"revenue":220,"revenue_str":"O10-O8-J9-J11-I12","nodes":["O10-0","O8-0","J9-0","J11-0","I12-0"]},{"train":"3-1","connections":[["O10","P11","P9","O8"],["O8","N7","N5"]],"hexes":["O10","O8","N5"],"revenue":130,"revenue_str":"O10-O8-N5","nodes":["O10-0","O8-0","N5-0"]}],"extra_revenue":0},{"type":"choose","entity":"ORNC","entity_type":"corporation","id":869,"created_at":1719628063,"choice":"withhold"},{"type":"dividend","entity":"ORNC","entity_type":"corporation","id":870,"created_at":1719628064,"kind":"payout"},{"type":"pass","entity":"ORNC","entity_type":"corporation","id":871,"created_at":1719628068},{"type":"pass","entity":"SPS","entity_type":"corporation","id":872,"user":790,"created_at":1719657176},{"type":"undo","entity":"SPS","entity_type":"corporation","id":873,"user":790,"created_at":1719657196},{"type":"acquire_company","entity":"SPS","entity_type":"corporation","id":874,"created_at":1719657198,"company":"P19"},{"type":"pass","entity":"SPS","entity_type":"corporation","id":875,"user":790,"created_at":1719657201},{"hex":"M14","tile":"9-15","type":"lay_tile","entity":"SPS","rotation":1,"entity_type":"corporation","id":876,"user":790,"created_at":1719657214},{"type":"undo","entity":"SPS","entity_type":"corporation","id":877,"user":790,"created_at":1719657238},{"type":"undo","entity":"SPS","entity_type":"corporation","id":878,"user":790,"created_at":1719657239},{"type":"pass","entity":"SPS","entity_type":"corporation","id":879,"created_at":1719657244},{"type":"lay_tile","entity":"P19","entity_type":"company","id":880,"created_at":1719657250,"hex":"M14","tile":"PNW4-0","rotation":1},{"hex":"K12","tile":"3-2","type":"lay_tile","entity":"SPS","rotation":1,"entity_type":"corporation","auto_actions":[{"type":"pass","entity":"SPS","created_at":1719657263,"entity_type":"corporation"}],"id":881,"user":790,"created_at":1719657264},{"type":"choose","choice":"1","entity":"SPS","entity_type":"corporation","id":882,"user":790,"created_at":1719657277},{"type":"undo","entity":"SPS","entity_type":"corporation","id":883,"user":790,"created_at":1719657303},{"type":"undo","entity":"SPS","entity_type":"corporation","id":884,"user":790,"created_at":1719657307},{"type":"lay_tile","entity":"SPS","entity_type":"corporation","id":885,"created_at":1719657312,"auto_actions":[{"type":"pass","entity":"SPS","entity_type":"corporation","created_at":1719657311}],"hex":"K12","tile":"3-2","rotation":2},{"type":"choose","entity":"SPS","entity_type":"corporation","id":886,"created_at":1719657325,"choice":"1"},{"type":"run_routes","entity":"SPS","entity_type":"corporation","id":887,"created_at":1719657328,"routes":[{"train":"4-3","connections":[["M14","M12","L13","K14","J15","I16","I14","I12"],["I12","J11"],["J11","J9"],["J9","J7"],["J7","I8"],["I8","H7","G8"],["G8","F9"],["F9","F7","G6","F5"],["F5","F3","E2"],["E2","F1","G2"]],"hexes":["M14","I12","J11","J9","J7","I8","G8","F9","F5","E2","G2"],"revenue":320,"revenue_str":"M14-I12-J11-J9-J7-I8-G8-F9-F5-E2-G2","nodes":["M14-0","I12-0","J11-0","J9-0","J7-0","I8-0","G8-0","F9-0","F5-0","E2-0","G2-0"]},{"train":"3-6","connections":[["O8","P9","P11","O10"],["O10","N11","N13","N15","N17","M16","M14"]],"hexes":["O8","O10","M14"],"revenue":150,"revenue_str":"O8-O10-M14","nodes":["O8-0","O10-0","M14-0"]}],"extra_revenue":0},{"type":"dividend","entity":"SPS","entity_type":"corporation","id":888,"created_at":1719657338,"kind":"payout"},{"type":"pass","entity":"SPS","entity_type":"corporation","id":889,"created_at":1719657342},{"type":"pass","entity":"NP","entity_type":"corporation","id":890,"created_at":1719670750},{"type":"lay_tile","entity":"NP","entity_type":"corporation","id":891,"created_at":1719670781,"hex":"D19","tile":"15-1","rotation":1},{"type":"pass","entity":"NP","entity_type":"corporation","id":892,"created_at":1719670783},{"type":"run_routes","entity":"NP","entity_type":"corporation","id":893,"created_at":1719670823,"routes":[{"train":"5-0","connections":[["I12","J11"],["J11","J9"],["J9","K8","L7","M8","N9","O8"],["O8","P9","P11","O10"]],"hexes":["I12","J11","J9","O8","O10"],"revenue":200,"revenue_str":"I12-J11-J9-O8-O10 (-$20 Portage) ","nodes":["I12-0","J11-0","J9-0","O8-0","O10-0"]},{"train":"4-0","connections":[["D19","D17","E18","F19","G20","H21"],["H21","I22","J23"],["J23","K22","K20","L19"]],"hexes":["D19","H21","J23","L19"],"revenue":150,"revenue_str":"D19-H21-J23-L19 (+$30 Mill) ","nodes":["D19-0","H21-0","J23-0","L19-0"]},{"train":"2P-0","connections":[["I12","I14","I16","J15","K14","L13","M12","M14"]],"hexes":["I12","M14"],"revenue":130,"revenue_str":"I12-M14 (+$30 LB) ","nodes":["I12-0","M14-0"]}],"extra_revenue":0},{"type":"dividend","entity":"NP","entity_type":"corporation","id":894,"created_at":1719670830,"kind":"payout"},{"type":"pass","entity":"NP","entity_type":"corporation","id":895,"created_at":1719670838},{"type":"par","entity":790,"entity_type":"player","id":896,"created_at":1719703948,"corporation":"CMPS","share_price":"100,0,9"},{"type":"buy_shares","entity":14958,"entity_type":"player","id":897,"created_at":1719704235,"shares":["CMPS_1"],"percent":10},{"type":"par","entity":1339,"entity_type":"player","id":898,"created_at":1719720810,"corporation":"SWW","share_price":"100,0,9"},{"type":"choose","entity":1339,"entity_type":"player","id":899,"created_at":1719720814,"choice":"2"},{"type":"par","entity":17678,"entity_type":"player","id":900,"created_at":1719758404,"corporation":"GNR","share_price":"100,0,9"},{"type":"buy_shares","entity":790,"entity_type":"player","id":901,"created_at":1719759059,"shares":["CMPS_2"],"percent":10},{"type":"buy_shares","entity":14958,"entity_type":"player","id":902,"created_at":1719761343,"shares":["SWW_1"],"percent":10},{"type":"buy_shares","entity":1339,"entity_type":"player","id":903,"created_at":1719761488,"shares":["SWW_2"],"percent":10},{"type":"buy_shares","entity":17678,"entity_type":"player","id":904,"created_at":1719761641,"shares":["GNR_1"],"percent":10},{"type":"program_buy_shares","entity":17678,"entity_type":"player","id":905,"created_at":1719761653,"corporation":"GNR","until_condition":"float","from_market":false,"auto_pass_after":false},{"type":"buy_shares","entity":790,"entity_type":"player","id":906,"created_at":1719763105,"shares":["CMPS_3"],"percent":10},{"type":"buy_shares","entity":14958,"entity_type":"player","id":907,"created_at":1719763474,"shares":["SWW_3"],"percent":10},{"type":"buy_shares","entity":1339,"entity_type":"player","id":908,"created_at":1719766546,"auto_actions":[{"type":"buy_shares","entity":17678,"entity_type":"player","created_at":1719766545,"shares":["GNR_2"],"percent":10}],"shares":["SWW_4"],"percent":10},{"type":"buy_shares","entity":790,"entity_type":"player","id":909,"created_at":1719785277,"shares":["SWW_5"],"percent":10},{"type":"buy_shares","entity":14958,"entity_type":"player","id":910,"created_at":1719788106,"shares":["SWW_6"],"percent":10},{"type":"buy_shares","entity":1339,"entity_type":"player","id":911,"created_at":1719791601,"auto_actions":[{"type":"buy_shares","entity":17678,"entity_type":"player","created_at":1719791600,"shares":["GNR_3"],"percent":10}],"shares":["SWW_7"],"percent":10},{"type":"buy_shares","entity":790,"entity_type":"player","id":912,"created_at":1719797680,"shares":["SWW_8"],"percent":10},{"type":"pass","entity":14958,"entity_type":"player","id":913,"created_at":1719797821},{"type":"buy_shares","entity":1339,"entity_type":"player","id":914,"created_at":1719801244,"auto_actions":[{"type":"program_disable","entity":17678,"entity_type":"player","created_at":1719801243,"reason":"GNR is floated"}],"shares":["CMPS_4"],"percent":10},{"type":"program_share_pass","entity":17678,"entity_type":"player","id":915,"created_at":1719801321,"auto_actions":[{"type":"pass","entity":17678,"entity_type":"player","created_at":1719801320}],"unconditional":false,"indefinite":false},{"type":"buy_shares","entity":790,"entity_type":"player","id":916,"created_at":1719803177,"shares":["CMPS_5"],"percent":10},{"type":"program_share_pass","entity":14958,"entity_type":"player","id":917,"created_at":1719803262,"auto_actions":[{"type":"pass","entity":14958,"entity_type":"player","created_at":1719803261}],"unconditional":false,"indefinite":false},{"type":"buy_shares","entity":1339,"entity_type":"player","id":918,"created_at":1719812339,"auto_actions":[{"type":"pass","entity":17678,"entity_type":"player","created_at":1719812338}],"shares":["GNR_4"],"percent":10},{"type":"buy_shares","entity":790,"entity_type":"player","id":919,"created_at":1719833084,"auto_actions":[{"type":"pass","entity":14958,"entity_type":"player","created_at":1719833083}],"shares":["CMPS_6"],"percent":10},{"type":"bid","entity":1339,"entity_type":"player","id":920,"created_at":1719847816,"company":"M14","price":200},{"type":"pass","entity":1339,"entity_type":"player","id":921,"created_at":1719847818,"auto_actions":[{"type":"pass","entity":17678,"entity_type":"player","created_at":1719847814}]},{"type":"program_share_pass","entity":790,"entity_type":"player","id":922,"created_at":1719851901,"auto_actions":[{"type":"pass","entity":790,"entity_type":"player","created_at":1719851900},{"type":"pass","entity":14958,"entity_type":"player","created_at":1719851900}],"unconditional":false,"indefinite":false},{"type":"pass","entity":1339,"entity_type":"player","id":923,"created_at":1719852295},{"type":"pass","entity":"6","entity_type":"corporation","id":924,"created_at":1719888501},{"type":"undo","entity":"6","entity_type":"corporation","id":925,"created_at":1719888504},{"type":"acquire_company","entity":"6","entity_type":"corporation","id":926,"created_at":1719888894,"company":"P20"},{"type":"end_game","entity":"6","entity_type":"corporation","id":927,"created_at":1719890986}],"id":"165580","players":[{"id":1339,"name":"plinkb"},{"id":790,"name":"tgg"},{"id":14958,"name":"merlinofchaos"},{"id":17678,"name":"StrangeLuck"}],"title":"1822PNW","description":"valid choices for P20, issue #10996","min_players":3,"max_players":4,"user":{"id":0,"name":"You"},"settings":{"seed":1020547416,"is_async":true,"unlisted":false,"auto_routing":true,"player_order":null,"optional_rules":[]},"user_settings":null,"turn":8,"round":"Operating Round","acting":[14958],"result":{"790":3801,"1339":3935,"14958":3275,"17678":2081},"loaded":true,"created_at":"2024-07-01","updated_at":1719890986,"finished_at":null,"mode":"hotseat","manually_ended":true} \ No newline at end of file diff --git a/spec/game_state_spec.rb b/spec/game_state_spec.rb index fe99cdf6d6..e05e98a7d2 100644 --- a/spec/game_state_spec.rb +++ b/spec/game_state_spec.rb @@ -872,6 +872,20 @@ module Engine end end + describe '1822PNW' do + describe 165_580 do + it 'does not include associated minors for majors that were started '\ + 'directly as valid choices for P20' do + game = game_at_action(game_file, 926) + + actual = game.active_step.p20_targets + expected = [game.corporation_by_id('1')] + + expect(actual).to eq(expected) + end + end + end + describe '1868 Wyoming' do describe 144_719 do it 'Big Boy' do From 29c80e301e002b329a3efdfbe1dd475ff5dce2aa Mon Sep 17 00:00:00 2001 From: Michael Brandt Date: Mon, 1 Jul 2024 22:14:07 -0600 Subject: [PATCH 09/54] attempt to fix rake failures https://github.com/tobymao/18xx/pull/10998/checks?check_run_id=26921801947 --- lib/engine/game/g_1822_pnw/step/acquire_company.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/engine/game/g_1822_pnw/step/acquire_company.rb b/lib/engine/game/g_1822_pnw/step/acquire_company.rb index 12235c505a..68ee8195cf 100644 --- a/lib/engine/game/g_1822_pnw/step/acquire_company.rb +++ b/lib/engine/game/g_1822_pnw/step/acquire_company.rb @@ -95,7 +95,7 @@ def process_choose(action) end def p20_targets - bidbox_corporations = Set.new(@game.bidbox_minors) { |c| @game.corporation_from_company(c) } + bidbox_corporations = ::Set.new(@game.bidbox_minors) { |c| @game.corporation_from_company(c) } @game.minor_associations.each_with_object([]) do |(minor_id, major_id), targets| company = @game.company_by_id("M#{minor_id}") From c4f021e0a0a84a17739fa68ea2dd547fcfd03726 Mon Sep 17 00:00:00 2001 From: Phil Campeau Date: Tue, 2 Jul 2024 08:56:35 -0400 Subject: [PATCH 10/54] [1826] change 'can_buy_trains' from status to event --- lib/engine/game/g_1826/game.rb | 13 +++++++++---- lib/engine/game/g_1826/step/buy_train.rb | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/engine/game/g_1826/game.rb b/lib/engine/game/g_1826/game.rb index 921e903084..2734caa25c 100644 --- a/lib/engine/game/g_1826/game.rb +++ b/lib/engine/game/g_1826/game.rb @@ -64,7 +64,6 @@ class Game < Game::Base train_limit: { five_share: 1, ten_share: 3 }, tiles: %i[yellow green], operating_rounds: 2, - status: ['can_buy_trains'], }, { name: '10H', @@ -72,7 +71,6 @@ class Game < Game::Base train_limit: 2, tiles: %i[yellow green brown], operating_rounds: 3, - status: ['can_buy_trains'], }, { name: 'E', @@ -80,7 +78,6 @@ class Game < Game::Base train_limit: 2, tiles: %i[yellow green brown blue], operating_rounds: 3, - status: ['can_buy_trains'], }, { name: 'TVG', @@ -88,7 +85,6 @@ class Game < Game::Base train_limit: 2, tiles: %i[yellow green brown blue gray], operating_rounds: 3, - status: ['can_buy_trains'], }].freeze TRAINS = [ @@ -161,6 +157,10 @@ def operating_round(round_num) ], round_num: round_num) end + def setup + @can_buy_trains = false + end + def regie @regie ||= company_by_id('P2') end @@ -203,6 +203,11 @@ def event_remove_abilities! @log << "-- Event: #{corp}'s #{company_by_id(company).name} ability is removed --" end end + + def event_can_buy_trains! + @can_buy_trains = true + @log << 'Corporations can buy trains from other corporations' + end end end end diff --git a/lib/engine/game/g_1826/step/buy_train.rb b/lib/engine/game/g_1826/step/buy_train.rb index 30f74c0b3b..85f1245911 100644 --- a/lib/engine/game/g_1826/step/buy_train.rb +++ b/lib/engine/game/g_1826/step/buy_train.rb @@ -10,7 +10,7 @@ module Step class BuyTrain < Engine::Step::BuyTrain def buyable_trains(entity) # Can't buy trains from other corporations until phase 6H - return super if @game.phase.status.include?('can_buy_trains') + return super if @game.can_buy_trains super.select(&:from_depot?) end From 469a97c321f96b6492ea1606052371b0c79ddf48 Mon Sep 17 00:00:00 2001 From: Phil Campeau Date: Tue, 2 Jul 2024 08:58:41 -0400 Subject: [PATCH 11/54] [1826] entities tweaks --- lib/engine/game/g_1826/entities.rb | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/lib/engine/game/g_1826/entities.rb b/lib/engine/game/g_1826/entities.rb index d419dc272c..6b0ccf790d 100644 --- a/lib/engine/game/g_1826/entities.rb +++ b/lib/engine/game/g_1826/entities.rb @@ -16,10 +16,10 @@ module Entities abilities: [ { type: 'tile_discount', - owner_type: 'player', discount: 40, count: 1, terrain: 'water', + owner_type: 'player', }, ], }, @@ -34,14 +34,14 @@ module Entities abilities: [ { type: 'assign_hexes', - when: 'any', + when: 'owning_player_track', hexes: %w[B12 C11 C13 C15 E5 E15 F12 G9 G19 I1 I7 I13 K17 L14 M3 M13], count: 1, owner_type: 'player', }, { type: 'assign_corporation', - when: 'any', + when: 'owning_player_track', count: 1, owner_type: 'player', }, @@ -57,9 +57,9 @@ module Entities 'when the first E train is purchased.', abilities: [{ type: 'train_limit', - owner_type: 'player', increase: 1, count: 1, + owner_type: 'player', }], }, { @@ -105,7 +105,7 @@ module Entities sym: 'Paris', name: 'Chemin de Fer de Paris', logo: '1826/Paris', - simple_logo: '1826/NYC.alt', + shares: [40, 20, 20, 20], tokens: [0, 20, 20, 20], coordinates: 'G9', city: 2, @@ -117,7 +117,7 @@ module Entities sym: 'PO', name: 'Chemin de Fer de Paris-Orléans', logo: '1826/PO', - simple_logo: '1826/PO.alt', + shares: [40, 20, 20, 20], tokens: [0, 20, 20, 20], coordinates: 'G9', city: 0, @@ -130,7 +130,7 @@ module Entities sym: 'N', name: 'Chemin de Fer du Nord', logo: '1826/N', - simple_logo: '1826/N.alt', + shares: [40, 20, 20, 20], tokens: [0, 20, 20], coordinates: 'G9', city: 3, @@ -142,7 +142,7 @@ module Entities sym: 'Est', name: "Chemin de Fer de l'Est", logo: '1826/Est', - simple_logo: '1826/Est.alt', + shares: [40, 20, 20, 20], tokens: [0, 20, 20], coordinates: 'G9', city: 4, @@ -154,7 +154,7 @@ module Entities sym: 'O', name: "Chemin de Fer de l'Ouest", logo: '1846/O', - simple_logo: '1826/O.alt', + shares: [40, 20, 20, 20], tokens: [0, 20, 20], coordinates: 'G9', city: 1, @@ -167,7 +167,7 @@ module Entities sym: 'Midi', name: 'Chemin de Fer du Midi', logo: '1826/Midi', - simple_logo: '1826/Midi.alt', + shares: [40, 20, 20, 20], tokens: [0, 20], coordinates: 'M3', city: 0, @@ -179,7 +179,7 @@ module Entities sym: 'GC', name: 'Grand Central de France', logo: '1826/GC', - simple_logo: '1826/GC.alt', + shares: [40, 20, 20, 20], tokens: [0, 20], coordinates: 'L14', type: 'five_share', @@ -191,7 +191,7 @@ module Entities sym: 'PLM', name: 'Chemin de Fer Paris-Lyon-Méditerranée', logo: '1826/PLM', - simple_logo: '1826/PLM.alt', + shares: [40, 20, 20, 20], tokens: [0, 20, 20, 20], coordinates: 'G9', city: 5, @@ -204,7 +204,7 @@ module Entities sym: 'Al', name: "Chemin de Fer d'Alsace", logo: '1826/Al', - simple_logo: '1826/Al.alt', + shares: [40, 20, 20, 20], tokens: [0, 20, 20, 20], coordinates: 'G19', type: 'five_share', @@ -215,7 +215,7 @@ module Entities sym: 'B', name: "Chemins de Fer de l'Etat Belge", logo: '1826/B', - simple_logo: '1826/B.alt', + shares: [40, 20, 20, 20], tokens: [0, 20, 20, 20], coordinates: 'C13', type: 'ten_share', @@ -234,7 +234,6 @@ module Entities sym: 'Etat', name: "Chemins de Fer de l'Etat", logo: '1826/Etat', - simple_logo: '1826/Etat.alt', tokens: [0, 20, 20, 20], type: 'ten_share', shares: [10, 10, 10, 10, 10, 10, 10, 10, 10, 10], @@ -257,7 +256,6 @@ module Entities sym: 'SNCF', name: 'Société Nationale des Chemins de Fer Français', logo: '1826/SNCF', - simple_logo: '1826/SNCF.alt', tokens: [0, 20, 20, 20], type: 'ten_share', shares: [10, 10, 10, 10, 10, 10, 10, 10, 10, 10], From 60d6802e22ee283c26ce439b47d1f4460337e9e8 Mon Sep 17 00:00:00 2001 From: Phil Campeau Date: Tue, 2 Jul 2024 21:07:55 -0400 Subject: [PATCH 12/54] [1826] reserves hexes around Paris --- lib/engine/game/g_1826/entities.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/engine/game/g_1826/entities.rb b/lib/engine/game/g_1826/entities.rb index 6b0ccf790d..89b31dfaeb 100644 --- a/lib/engine/game/g_1826/entities.rb +++ b/lib/engine/game/g_1826/entities.rb @@ -109,6 +109,7 @@ module Entities tokens: [0, 20, 20, 20], coordinates: 'G9', city: 2, + abilities: [{ type: 'blocks_hexes_consent', owner_type: 'player', hexes: ['F8'], hidden: true }], type: 'five_share', color: 'sand', }, @@ -122,6 +123,7 @@ module Entities coordinates: 'G9', city: 0, type: 'five_share', + abilities: [{ type: 'blocks_hexes_consent', owner_type: 'player', hexes: ['H8'], hidden: true }], color: '#lightishBlue', text_color: 'black', }, @@ -135,6 +137,7 @@ module Entities coordinates: 'G9', city: 3, type: 'five_share', + abilities: [{ type: 'blocks_hexes_consent', owner_type: 'player', hexes: ['F10'], hidden: true }], color: 'red', }, { @@ -147,6 +150,7 @@ module Entities coordinates: 'G9', city: 4, type: 'five_share', + abilities: [{ type: 'blocks_hexes_consent', owner_type: 'player', hexes: ['G11'], hidden: true }], color: 'orange', }, { @@ -159,6 +163,7 @@ module Entities coordinates: 'G9', city: 1, type: 'five_share', + abilities: [{ type: 'blocks_hexes_consent', owner_type: 'player', hexes: ['G7'], hidden: true }], color: 'pink', text_color: 'black', }, @@ -196,6 +201,7 @@ module Entities coordinates: 'G9', city: 5, type: 'five_share', + abilities: [{ type: 'blocks_hexes_consent', owner_type: 'player', hexes: ['H10'], hidden: true }], color: 'violet', text_color: 'black', }, From d7df054a2af412a5f837d59c9384c8b317641b98 Mon Sep 17 00:00:00 2001 From: Steve Undy Date: Wed, 3 Jul 2024 17:58:49 -0600 Subject: [PATCH 13/54] S18: UK map updates --- assets/app/view/game/part/city_slot.rb | 2 + lib/engine/game/g_system18/game.rb | 18 +++++ .../map_uk_limited_customization.rb | 73 ++++++++++++++++--- lib/engine/game/g_system18/uk_depot.rb | 17 ----- lib/engine/part/city.rb | 3 +- lib/engine/tile.rb | 1 + 6 files changed, 85 insertions(+), 29 deletions(-) delete mode 100644 lib/engine/game/g_system18/uk_depot.rb diff --git a/assets/app/view/game/part/city_slot.rb b/assets/app/view/game/part/city_slot.rb index bb4867b9c8..d3bf9e7007 100644 --- a/assets/app/view/game/part/city_slot.rb +++ b/assets/app/view/game/part/city_slot.rb @@ -74,6 +74,8 @@ def render_part token_attrs[:stroke] = 'black' token_attrs[:'stroke-width'] = '3px' token_attrs[:'stroke-dasharray'] = '4' + elsif @city&.outline + token_attrs[:'fill-opacity'] = '0' end children = [h(:circle, attrs: token_attrs)] diff --git a/lib/engine/game/g_system18/game.rb b/lib/engine/game/g_system18/game.rb index 8ea6f49ccf..178489385c 100644 --- a/lib/engine/game/g_system18/game.rb +++ b/lib/engine/game/g_system18/game.rb @@ -521,12 +521,24 @@ def upgrades_to_correct_color?(from, to, selected_company: nil) COLOR_SEQUENCE.index(to.color) == (COLOR_SEQUENCE.index(from.color) + 1) end + def upgrade_ignore_num_cities(from) + return false unless respond_to?("map_#{map_name}_upgrade_ignore_num_cities") + + send("map_#{map_name}_upgrade_ignore_num_cities", from) + end + def or_round_finished return unless respond_to?("map_#{map_name}_or_round_finished") send("map_#{map_name}_or_round_finished") end + def rust_trains!(train, entity) + return super unless respond_to?("map#{map_name}_rust_trains!") + + send("map_#{map_name}_rust_trains!", train, entity) + end + def close_corporation(corporation, quiet: false) super @@ -603,6 +615,12 @@ def revenue_str(route) revenue_str + send("map_#{map_name}_extra_revenue_str", route) end + + def timeline + return super unless respond_to?("map_#{map_name}_timeline") + + send("map_#{map_name}_timeline") + end end end end diff --git a/lib/engine/game/g_system18/map_uk_limited_customization.rb b/lib/engine/game/g_system18/map_uk_limited_customization.rb index db35e04a1a..52439035e3 100644 --- a/lib/engine/game/g_system18/map_uk_limited_customization.rb +++ b/lib/engine/game/g_system18/map_uk_limited_customization.rb @@ -41,7 +41,7 @@ def map_uk_limited_game_hexes gray: { ['A2'] => 'junction;path=a:5,b:_0,terminal:1', ['A4'] => 'path=a:0,b:5', - ['B1'] => 'junction;path=a:4,b:_0,terminal:1', + %w[B1 H1] => 'junction;path=a:4,b:_0,terminal:1', ['B7'] => 'path=a:0,b:1', ['C2'] => 'path=a:3,b:4', ['C8'] => 'path=a:0,b:1', @@ -49,19 +49,25 @@ def map_uk_limited_game_hexes ['F3'] => 'path=a:3,b:4;path=a:4,b:5', ['G2'] => 'path=a:4,b:5', ['H7'] => 'city=revenue:yellow_20|green_30|brown_40|gray_50,loc:1.5;path=a:1,b:_0;path=a:2,b:_0;path=a:3,b:_0,terminal:1', + ['I2'] => 'junction;path=a:3,b:_0,terminal:1', + ['I4'] => 'path=a:2,b:3', + ['I6'] => 'junction;path=a:2,b:_0,terminal:1', }, white: { %w[C4 D5 E8 F9 G8] => '', - %w[D7 H3 H5] => 'town=revenue:0', + %w[D7 H3 H5] => 'city=revenue:0,outline:1', ['F7'] => 'town=revenue:0;town=revenue:0', %w[C6 G4 G6] => 'city=revenue:0', }, yellow: { - %w[B5 E4] => 'city=revenue:0;city=revenue:0;label=OO', - ['B3'] => 'city=revenue:20;path=a:4,b:_0;path=a:5,b:_0', + %w[E4] => 'city=revenue:0;city=revenue:0;label=OO', ['E6'] => 'city=revenue:30;path=a:0,b:_0;path=a:2,b:_0;path=a:4,b:_0;label=B', ['F5'] => 'city=revenue:30;path=a:2,b:_0;path=a:4,b:_0;label=B', }, + green: { + ['B3'] => 'city=revenue:30,slots:2;path=a:0,b:_0;path=a:4,b:_0;path=a:4,b:_0;path=a:5,b:_0', + ['B5'] => 'city=revenue:40,loc:2;city=revenue:40;path=a:1,b:_0;path=a:5,b:_1;label=OO', + }, } end # rubocop:enable Layout/LineLength @@ -95,18 +101,16 @@ def map_uk_limited_game_market self.class::MARKET_2D end - def map_uk_limited_custom_depot - GSystem18::UKDepot - end - def map_uk_limited_game_trains(trains) # don't use 8 trains trains.delete(find_train(trains, '8')) - find_train(trains, '4')[:rusts_on] = 'D' # udpate quantities find_train(trains, '2')[:num] = 5 + find_train(trains, '2')[:rusts_on] = 'OR3' find_train(trains, '3')[:num] = 4 + find_train(trains, '3')[:rusts_on] = 'OR4' find_train(trains, '4')[:num] = 3 + find_train(trains, '4')[:rusts_on] = 'OR5' find_train(trains, '5')[:num] = 2 find_train(trains, '6')[:num] = 1 find_train(trains, 'D')[:num] = 10 @@ -121,11 +125,58 @@ def map_uk_limited_constants redef_const(:CURRENCY_FORMAT_STR, '£%s') end + def map_uk_limited_setup + @uk_or_count = 0 + end + + def map_uk_limited_rust_trains!(_train, _entity); end + + def map_uk_limited_rust?(train, sym) + train.rusts_on == sym + end + def map_uk_limited_or_round_finished + @uk_or_count += 1 return if @phase.name == 'D' + return unless [3, 4, 5].include?(@uk_or_count) + + rust_event = "OR#{@uk_or_count}" + + rusted_trains = [] + owners = Hash.new(0) + + trains.each do |t| + next if t.rusted + next unless t.rusts_on == rust_event + + rusted_trains << t.name + owners[t.owner.name] += 1 + rust(t) + end + + @crowded_corps = nil + + return if rusted_trains.empty? + + @log << "-- Event: #{rusted_trains.uniq.join(', ')} trains rust " \ + "( #{owners.map { |c, t| "#{c} x#{t}" }.join(', ')}) --" + end + + def map_uk_limited_upgrade_ignore_num_cities(from) + return false if from.cities.none? + return false unless from.color == :white + + from.cities[0].outline + end - @depot.export_all!(@phase.name) - @phase.buying_train!(nil, @depot.upcoming.first, self) + def map_uk_limited_timeline + @timeline ||= [ + 'After the 3rd OR, all 2 trains are rusted', + 'After the 4rd OR, all 3 trains are rusted', + 'After the 5rd OR, all 4 trains are rusted', + '(Note that the rusting occurs after a certain number of ORs, not OR sets)', + ].freeze + @timeline end end end diff --git a/lib/engine/game/g_system18/uk_depot.rb b/lib/engine/game/g_system18/uk_depot.rb deleted file mode 100644 index 4ae81f6045..0000000000 --- a/lib/engine/game/g_system18/uk_depot.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -require_relative '../../depot' - -module Engine - module Game - module GSystem18 - class UKDepot < Engine::Depot - def depot_trains(clear: false) - @depot_trains = nil if clear - @depot_trains ||= @upcoming.select { |t| @game.phase.available?(t.name) }.compact.uniq(&:name) + - @discarded.uniq(&:name) - end - end - end - end -end diff --git a/lib/engine/part/city.rb b/lib/engine/part/city.rb index e0c17e080e..769c5bd247 100644 --- a/lib/engine/part/city.rb +++ b/lib/engine/part/city.rb @@ -7,7 +7,7 @@ module Engine module Part class City < RevenueCenter attr_accessor :reservations, :slot_icons - attr_reader :tokens, :extra_tokens, :boom + attr_reader :tokens, :extra_tokens, :boom, :outline def initialize(revenue, **opts) super @@ -17,6 +17,7 @@ def initialize(revenue, **opts) @extra_tokens = [] @reservations = [] @boom = opts[:boom] + @outline = opts[:outline] @slot_icons = {} end diff --git a/lib/engine/tile.rb b/lib/engine/tile.rb index e4a59996bb..96211aadd5 100644 --- a/lib/engine/tile.rb +++ b/lib/engine/tile.rb @@ -118,6 +118,7 @@ def self.part(type, params, cache) route: params['route'], format: params['format'], boom: params['boom'], + outline: params['outline'], loc: params['loc']) cache << city city From f185376d5f6f658a059b362c262acc468ca72a14 Mon Sep 17 00:00:00 2001 From: Michael Brandt Date: Mon, 1 Jul 2024 22:08:06 -0600 Subject: [PATCH 14/54] [1822PNW scenarios] fix M21, MB, MC in SRS; fix P+ trains Fixes #10994 Fixes #10999 Fixes #11003 --- lib/engine/game/g_1822_pnw_short/game.rb | 2 +- lib/engine/game/g_1822_pnw_short/trains.rb | 2 +- lib/engine/game/g_1822_pnw_srs/game.rb | 11 +++++++---- lib/engine/game/g_1822_pnw_srs/trains.rb | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/engine/game/g_1822_pnw_short/game.rb b/lib/engine/game/g_1822_pnw_short/game.rb index ca469eefca..e4b6ad24fb 100644 --- a/lib/engine/game/g_1822_pnw_short/game.rb +++ b/lib/engine/game/g_1822_pnw_short/game.rb @@ -89,7 +89,7 @@ def setup_companies @company_trains['P1'] = find_and_remove_train_by_id('5P-0') @company_trains['P2'] = find_and_remove_train_by_id('2P-0', buyable: false) @company_trains['P3'] = find_and_remove_train_by_id('LP-0', buyable: false) - @company_trains['P5'] = find_and_remove_train_by_id('P-0', buyable: false) + @company_trains['P5'] = find_and_remove_train_by_id('P+-0', buyable: false) end def stock_round diff --git a/lib/engine/game/g_1822_pnw_short/trains.rb b/lib/engine/game/g_1822_pnw_short/trains.rb index 9ef941415b..f41de11fcc 100644 --- a/lib/engine/game/g_1822_pnw_short/trains.rb +++ b/lib/engine/game/g_1822_pnw_short/trains.rb @@ -117,7 +117,7 @@ module Trains price: 500, }, { - name: 'P', + name: 'P+', distance: [ { 'nodes' => ['city'], diff --git a/lib/engine/game/g_1822_pnw_srs/game.rb b/lib/engine/game/g_1822_pnw_srs/game.rb index eb9abadfe9..8bbf9824cb 100644 --- a/lib/engine/game/g_1822_pnw_srs/game.rb +++ b/lib/engine/game/g_1822_pnw_srs/game.rb @@ -16,7 +16,7 @@ class Game < G1822PNW::Game STARTING_COMPANIES = %w[P1 P2 P3 P5 P7 P9 P10 P11 P14 P15 P16 P18 M6 M7 M8 M9 M10 M11 M12 M13 M14 M15 M16 M17 M18 M19 M20 M21 MB MC].freeze - STARTING_CORPORATIONS = %w[6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + STARTING_CORPORATIONS = %w[6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 B C CMPS NP ORNC SPS SWW ].freeze EXCHANGE_TOKENS = { @@ -46,19 +46,22 @@ class Game < G1822PNW::Game GAME_END_ON_NOTHING_SOLD_IN_SR1 = false def setup_companies + # unchaged from 1822PNW setup_associated_minors @companies.sort_by! { rand } + # unchanged from 1822PNW privates = @companies.select { |c| c.id[0] == self.class::COMPANY_PRIVATE_PREFIX } private_1 = privates.find { |c| c.id == 'P1' } privates.delete(private_1) privates.unshift(private_1) + # unchanged from 1822PNW, just no starting packet variant minors = @companies.select { |c| c.id[0] == self.class::COMPANY_MINOR_PREFIX } minor_6, minors = minors.partition { |c| c.id == 'M6' } minors_assoc, minors = minors.partition { |c| @minor_associations.key?(corp_id_from_company_id(c.id)) } - # Clear and add the companies in the correct randomize order sorted by type + # different numbers of minors in the mini-decks that get combined @companies.clear @companies.concat(minor_6) stack_1 = (minors_assoc[0..1] + minors[0..3]).sort_by! { rand } @@ -69,12 +72,12 @@ def setup_companies @companies.concat(stack_3) @companies.concat(privates) - # Setup company abilities + # same as 1822PNW except for no P4 or P6 @company_trains = {} @company_trains['P1'] = find_and_remove_train_by_id('5P-0') @company_trains['P2'] = find_and_remove_train_by_id('2P-0', buyable: false) @company_trains['P3'] = find_and_remove_train_by_id('LP-0', buyable: false) - @company_trains['P5'] = find_and_remove_train_by_id('P-0', buyable: false) + @company_trains['P5'] = find_and_remove_train_by_id('P+-0', buyable: false) end def setup_game_specific diff --git a/lib/engine/game/g_1822_pnw_srs/trains.rb b/lib/engine/game/g_1822_pnw_srs/trains.rb index ee15239da7..da0fba2587 100644 --- a/lib/engine/game/g_1822_pnw_srs/trains.rb +++ b/lib/engine/game/g_1822_pnw_srs/trains.rb @@ -117,7 +117,7 @@ module Trains price: 500, }, { - name: 'P', + name: 'P+', distance: [ { 'nodes' => ['city'], From 0f723cc331c3778a4c4881d63cce19e814b27f28 Mon Sep 17 00:00:00 2001 From: Michael Brandt Date: Wed, 3 Jul 2024 22:42:14 -0600 Subject: [PATCH 15/54] [1822CA/core] add `same_hex_allowed` to token abilities, use for P10 Fixes #11004 --- lib/engine/ability/README.md | 58 ++++++++++--------- lib/engine/ability/token.rb | 5 +- lib/engine/game/base.rb | 2 + lib/engine/game/g_1822_ca/entities.rb | 1 + .../game/g_1822_ca/step/special_token.rb | 5 ++ 5 files changed, 41 insertions(+), 30 deletions(-) diff --git a/lib/engine/ability/README.md b/lib/engine/ability/README.md index 434dda9641..626d0f5b39 100644 --- a/lib/engine/ability/README.md +++ b/lib/engine/ability/README.md @@ -1,10 +1,10 @@ # Abilities -This page documents the different ability types and the attributes which may be +This page documents the different ability types and the attributes which may be set for each type. -Abilities are mainly used to describe private company powers, but may also apply -to other entities such as corporations. Examples of how their use can be seen in +Abilities are mainly used to describe private company powers, but may also apply +to other entities such as corporations. Examples of how their use can be seen in the [game configuration directory](../config/game). ## Generic attributes @@ -38,12 +38,12 @@ These attributes may be set for all ability types. - `buying_train`: train buying step. - `has_train`: when the owning corporation owns at least one train. - `never`: use with `close` abilities to prevent a company from closing. - - `operated`: when the owning corporation has finished the dividend step + - `operated`: when the owning corporation has finished the dividend step on their first turn. - `or_between_turns`: usable at the start of any corporation's OR turn, before that corporation has acted. - `owning_corp_or_turn`: usable at any point during the owning corporation's OR turn. - - `owning_player_or_turn`: usable at any point during any of the owning player's + - `owning_player_or_turn`: usable at any point during any of the owning player's OR turns. - `owning_player_sr_turn`: usable at any point during any of the owning player's SR turns. @@ -78,8 +78,8 @@ When a company with this ability is sold to a corporation, the company is automatically assigned to the new owning corporation. - `closed_when_used_up`: This ability has a count that is decreased each time - it is used. If this attribute is true the private is closed when count reaches - zero, if false the private remains open but the discount can no longer be used. + it is used. If this attribute is true the private is closed when count reaches + zero, if false the private remains open but the discount can no longer be used. Default false. With this configuration, the automatic assignment will happen and the company @@ -157,7 +157,7 @@ during a step that allows exchange. - `corporations`: An array with corporation names, whose share may be exchanged. Use a simple `"any"` (no array) to allow for any corporation. Use a simple `"ipoed"` (no array) to allow from any company that has been IPOed. -- `from`: Where the share may be take from, either `"ipo"`, `"market"`, or an +- `from`: Where the share may be take from, either `"ipo"`, `"market"`, or an array containing both. ## hex_bonus @@ -189,7 +189,7 @@ Reserve a token slot. Take a station token off the board and place back on the charter in the most expensive open location. -- `reimburse`: If true, the corporation is reimbursed the token cost of the +- `reimburse`: If true, the corporation is reimbursed the token cost of the location where the token is placed. ## revenue_change @@ -239,7 +239,7 @@ Discount the cost for laying tiles in the specified terrain type. - `exact_match`: Tile may only contain specified terrain type. Default true. - `hexes`: If not specified, all applicable hexes qualifies for the discount. If specified, only specified hexes qualify. -- `terrain`: If set, type of terrain for which discount is provided, otherwise +- `terrain`: If set, type of terrain for which discount is provided, otherwise the discount is off the total cost. ## tile_income @@ -247,7 +247,7 @@ Discount the cost for laying tiles in the specified terrain type. Generate extra revenue when tiles are laid on specified terrain types. - `income`: Extra income per tile lay. -- `owner_only`: Does this income apply to any tile lay (1882 Tresle Bridge) or +- `owner_only`: Does this income apply to any tile lay (1882 Tresle Bridge) or just the owner (1817 Mountain Engineers). - `terrain`: Terrain type for this ability. @@ -256,19 +256,19 @@ Generate extra revenue when tiles are laid on specified terrain types. Lay or upgrade one or more track tiles without connectivity, in addition to normal tile lay actions. -- `blocks`: If true and `when` is `sold`, then the step `TrackLayWhenCompanySold` +- `blocks`: If true and `when` is `sold`, then the step `TrackLayWhenCompanySold` will require a tile lay. Default false. - `closed_when_used_up`: This ability has a count that is decreased each time it - is used. If this attribute is true the private is closed when count reaches - zero, if false the private remains open but the discount can no longer be used. + is used. If this attribute is true the private is closed when count reaches + zero, if false the private remains open but the discount can no longer be used. Default false. -- `connect`: If true, and `count` is greater than 1, tiles laid must connect to +- `connect`: If true, and `count` is greater than 1, tiles laid must connect to each other. Default true unless `count_per_or` is used, in which case `connect` isn't checked by default. -- `consume_tile_lay`: If true, using this private counts as a corporations tile - lay and must follow lay/upgrade rules. Upgrade's also count towards the +- `consume_tile_lay`: If true, using this private counts as a corporations tile + lay and must follow lay/upgrade rules. Upgrade's also count towards the corporations 'upgrade' lays. Default false. -- `count_per_or`: used if private ability limits the amount of tile lays that +- `count_per_or`: used if private ability limits the amount of tile lays that you can use per OR. - `cost`: Cost to use the ability. - `discount`: Discount the cost of laying the tile by the given @@ -277,8 +277,8 @@ normal tile lay actions. - `hexes`: Array of hex coordinates where tiles may be laid. - `lay_count` and `upgrade_count` - Use as an alternative to `count`. `lay_count` is the number of yellow tile lays, and `upgrade_count` is the number of green - or higher tile upgrades. When these are set, the ability cannot be used for - both new tile lays and upgrades. With these set, you need to make sure the + or higher tile upgrades. When these are set, the ability cannot be used for + both new tile lays and upgrades. With these set, you need to make sure the `ability.use!` call includes an `upgrade` kwarg. - `must_lay_all`: If true and `count` is greater than 1 and `must_lay_together` is true, all the tile lays must be used; if false, then some tile lays may be @@ -289,7 +289,7 @@ normal tile lay actions. - `reachable`: If true, when tile laid, a check is done if one of the controlling corporation's station tokens are reachable; if not a game error is triggered. Default false. -- `special`: If true, do not check that the tile upgrade preserves labels and +- `special`: If true, do not check that the tile upgrade preserves labels and city count. Default true. - `tiles`: Array of tile numbers which may be laid. @@ -312,16 +312,16 @@ Modified station token placement. - `city`: Index of the city on the hex where this ability may be used, if multiple cities are there. - `connected`: If true, when token placed, a check is done if the desired token - slot is connected by track with another city that has a token of the + slot is connected by track with another city that has a token of the corporation; if not a game error is triggered. Default false. - `discount`: ratio discount from the normal price, e.g., `0.25` takes 25% off the token price. - `extra_action`: If true, this ability may be used in addition to the turn's normal token placement step. Default false. - `extra_slot`: Simlar to `cheater` except this token does not take a slot - - When `cheater` is used, when the city gets an extra city slot the 'cheater' + When `cheater` is used, when the city gets an extra city slot the 'cheater' token goes into the newly opened slot. If `extra_slot` is used, when the city - gets an extra token slot, the new token slot is open - the extra token does + gets an extra token slot, the new token slot is open - the extra token does not consume it. This also means that an `extra_slot` token lay in an city with an open slot does not use up the open slot. - `from_owner`: If true, this ability uses a token from the owning corporation's @@ -337,6 +337,8 @@ Modified station token placement. placed in a location that the ability is allowed to use. Default false. - `teleport_price`: If present, this ability may be used to place a token without connectivity, for the given price. +- `same_hex_allowed`: If `true`, a token may be placed on a hex where the owning + corporation already has a token in a different city. ## train_buy @@ -347,21 +349,21 @@ Modify train buy in some way. ## train_discount -Discount the train buy cost. The `count` attribute specify how many times the +Discount the train buy cost. The `count` attribute specify how many times the discount can be used. - `closed_when_used_up`: This ability has a count that is decreased each time it - is used. If this attribute is true the private is closed when count reaches + is used. If this attribute is true the private is closed when count reaches zero, if false the private remains open but the discount can no longer be used. Default false. -- `discount`: Discount amount. If > 1 this is an absolute amount. +- `discount`: Discount amount. If > 1 this is an absolute amount. If 0 < amount < 1 it is the fraction, e.g. 0.75 is a 75% discount. - `trains`: An array of all train names that the discount applies to. ## train_limit Modify train limit in some way. -For performance reasons, the supporting code needs to be added directly to the +For performance reasons, the supporting code needs to be added directly to the game class. See G18MEX#train_limit for an example. - `increase`: If positive, this will increase the train limit with this diff --git a/lib/engine/ability/token.rb b/lib/engine/ability/token.rb index e90e1e237b..54c2ffb31f 100644 --- a/lib/engine/ability/token.rb +++ b/lib/engine/ability/token.rb @@ -7,12 +7,12 @@ module Ability class Token < Base attr_reader :hexes, :teleport_price, :extra_action, :from_owner, :discount, :city, :neutral, :cheater, :special_only, :extra_slot, :check_tokenable, - :closed_when_used_up, :connected + :closed_when_used_up, :connected, :same_hex_allowed def setup(hexes:, price: nil, teleport_price: nil, extra_action: nil, from_owner: nil, discount: nil, city: nil, neutral: nil, cheater: nil, extra_slot: nil, special_only: nil, check_tokenable: nil, - closed_when_used_up: nil, connected: nil) + closed_when_used_up: nil, connected: nil, same_hex_allowed: nil) @hexes = hexes @price = price @teleport_price = teleport_price @@ -27,6 +27,7 @@ def setup(hexes:, price: nil, teleport_price: nil, extra_action: nil, @check_tokenable = check_tokenable.nil? ? true : check_tokenable @closed_when_used_up = closed_when_used_up || false @connected = connected || false + @same_hex_allowed = same_hex_allowed || false end def price(token = nil) diff --git a/lib/engine/game/base.rb b/lib/engine/game/base.rb index d1eb824d86..be9c06665c 100644 --- a/lib/engine/game/base.rb +++ b/lib/engine/game/base.rb @@ -3227,6 +3227,8 @@ def ability_usable?(ability) return false unless token_ability_from_owner_usable?(ability, corporation) + return true if ability.same_hex_allowed + tokened_hexes = [] corporation.tokens.each do |token| diff --git a/lib/engine/game/g_1822_ca/entities.rb b/lib/engine/game/g_1822_ca/entities.rb index d5afd16bb2..23e48c5b71 100644 --- a/lib/engine/game/g_1822_ca/entities.rb +++ b/lib/engine/game/g_1822_ca/entities.rb @@ -162,6 +162,7 @@ module Entities price: 0, special_only: true, teleport_price: 0, + same_hex_allowed: true, when: 'owning_corp_or_turn', }, ], diff --git a/lib/engine/game/g_1822_ca/step/special_token.rb b/lib/engine/game/g_1822_ca/step/special_token.rb index 02fa0cf10f..de5e79d91f 100644 --- a/lib/engine/game/g_1822_ca/step/special_token.rb +++ b/lib/engine/game/g_1822_ca/step/special_token.rb @@ -29,6 +29,11 @@ def available_tokens(entity) def process_place_token(action) entity = action.entity.owner + if (city = action.city).tokened_by?(entity) + raise GameError, + "#{entity.name} already has a token in #{city.hex.location_name} (#{city.hex.id}) city #{city.index}" + end + super @game.remove_exchange_token(entity) From 4128afbbf01d574253cc07e24acd6e1219f79125 Mon Sep 17 00:00:00 2001 From: Michael Brandt Date: Wed, 3 Jul 2024 23:12:02 -0600 Subject: [PATCH 16/54] [1822/1822CA] fix tax haven value The problem is the copmany's `@value` is modified in `company_status_str`, which is only called in certain cases for the UI. This change doesn't fix that issue, but works around it, by subtracting the company's `@value`, whatever it may be, before adding in the true value Fixes #11007 Originally reported in #5200 --- lib/engine/game/g_1822/game.rb | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/engine/game/g_1822/game.rb b/lib/engine/game/g_1822/game.rb index 5239c3b74a..1425ffc1c7 100644 --- a/lib/engine/game/g_1822/game.rb +++ b/lib/engine/game/g_1822/game.rb @@ -1038,7 +1038,13 @@ def place_home_token(corporation) end def player_value(player) - player.value - @player_debts[player] + tax_haven_value(player) + # tax_haven_company.value can sometimes be zero and sometimes the same + # as tax_haven_value() (issues #5200 and #11007) because it is only + # set in company_status_str, which is only called by some views, so + # substract that value and include only the correct calculation + tax_haven_val = tax_haven_value(player) - (tax_haven_company&.value || 0) + + player.value - @player_debts[player] + tax_haven_val end def purchasable_companies(entity = nil) @@ -2015,10 +2021,12 @@ def pending_home_tokeners self.class::PENDING_HOME_TOKENERS end - def share_owning_players + def tax_haven_company @tax_haven_company ||= company_by_id(self.class::COMPANY_OSTH) + end - if @tax_haven_company&.owned_by_player? + def share_owning_players + if tax_haven_company&.owned_by_player? [*@players, @tax_haven] else @players From b23e1771a498776a0ec9c1d0471effede003ac16 Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Sun, 12 May 2024 13:33:44 +0100 Subject: [PATCH 17/54] [18Ardennes] Remove duplicate tokens when cities join A public company is allowed to have tokens in two cities on the same hex. If these cities join together when the tile is upgraded to brown, then one of the tokens is returned to the company. --- lib/engine/game/g_18_ardennes/step/track.rb | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/lib/engine/game/g_18_ardennes/step/track.rb b/lib/engine/game/g_18_ardennes/step/track.rb index 8aa584b383..d55e4d922d 100644 --- a/lib/engine/game/g_18_ardennes/step/track.rb +++ b/lib/engine/game/g_18_ardennes/step/track.rb @@ -33,6 +33,25 @@ def process_lay_tile(action) super @game.after_lay_tile(action.hex, action.tile, action.entity) end + + def update_token!(action, entity, tile, old_tile) + super + + # Might need to remove a token if two cities have joined together. + return if !tile.cities.one? || old_tile.cities.size != 2 + + corp_tokens = tile.cities.first.tokens.compact.group_by(&:corporation) + corp_tokens.each do |corporation, tokens| + next if tokens.one? + + # This can only happen in Amsterdam, Basel, Frankfurt-am-Main and + # Rotterdam. These all have two slots in brown, so there's never + # more than one token to remove. + tokens.last.remove! + @game.log << "#{corporation.id} token removed from " \ + "#{tile.hex.name} (#{tile.hex.location_name})." + end + end end end end From 5e472e593e3dd434c65d1de67c8fcace01009878 Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Sun, 12 May 2024 17:49:23 +0100 Subject: [PATCH 18/54] [18Ardennes] Don't allow presidency to be sold to the market The implementation of `can_dump?` in Step::BuySellParSharesCompanies is for games where the president's certificate can be sold to the market. This isn't true in 18Ardennes, the method implemented in Step::BuySellParShares is correct. --- .../g_18_ardennes/step/buy_sell_par_shares_companies.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/engine/game/g_18_ardennes/step/buy_sell_par_shares_companies.rb b/lib/engine/game/g_18_ardennes/step/buy_sell_par_shares_companies.rb index 76cc097c2f..23cad59bb5 100644 --- a/lib/engine/game/g_18_ardennes/step/buy_sell_par_shares_companies.rb +++ b/lib/engine/game/g_18_ardennes/step/buy_sell_par_shares_companies.rb @@ -100,6 +100,15 @@ def can_gain?(entity, bundle, exchange: false) exchange || super end + # Can this ShareBundle be sold to the open market? + def can_dump?(entity, bundle) + # The implementation of this method in Step::BuySellParSharesCompanies + # is for games where the president's certificate can be sold to the + # market. This isn't true in 18Ardennes, the method implemented in + # Step::BuySellParShares is correct. + bundle.can_dump?(entity) + end + # Checks whether a player can afford to exchange one of their minors # for a share in a major corporation. # If `check_connection` is false this method does not check whether From 247d413a35bf7ec783b5c0662d15832dba27512e Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Sun, 12 May 2024 17:59:37 +0100 Subject: [PATCH 19/54] [18Ardennes] No stock round after the initial auction There's no point having a stock round after the auction of the minor companies. The rules aren't clear on whether there should be a stock round between the auction and the first operating round, but in three- and five-player games nobody can do anything apart from pass, and in a four-player game the only legal move is to sell the GL minor, and that's utterly stupid. So go straight to the operating round. --- lib/engine/game/g_18_ardennes/game.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/engine/game/g_18_ardennes/game.rb b/lib/engine/game/g_18_ardennes/game.rb index 980ce3354a..3388ef8bc5 100644 --- a/lib/engine/game/g_18_ardennes/game.rb +++ b/lib/engine/game/g_18_ardennes/game.rb @@ -62,7 +62,7 @@ def next_round! when Engine::Round::Auction init_round_finished reorder_players - new_stock_round + new_operating_round when G18Ardennes::Round::Stock @operating_rounds = @phase.operating_rounds reorder_players From 0cdc979f4ae58fb683702840fafb292d250713bf Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Mon, 20 May 2024 21:34:22 +0100 Subject: [PATCH 20/54] [18Ardennes] Can go above 60% in corporation is buying from the market There is a 60% limit on shares in a public company, but you are able to go over this limit by buying shares from the open market, as well as by exchanging minor companies for shares. --- .../g_18_ardennes/step/buy_sell_par_shares_companies.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/engine/game/g_18_ardennes/step/buy_sell_par_shares_companies.rb b/lib/engine/game/g_18_ardennes/step/buy_sell_par_shares_companies.rb index 23cad59bb5..1a872eb5c5 100644 --- a/lib/engine/game/g_18_ardennes/step/buy_sell_par_shares_companies.rb +++ b/lib/engine/game/g_18_ardennes/step/buy_sell_par_shares_companies.rb @@ -96,8 +96,13 @@ def can_buy_any?(entity) end def can_gain?(entity, bundle, exchange: false) - # Can go above 60% ownership if exchanging a minor for a share. - exchange || super + # Can go above 60% ownership if exchanging a minor for a share or + # if buying a share from the open market. + return true if exchange + return true if (bundle.owner == @game.share_pool) && + (@game.num_certs(entity) < @game.cert_limit) + + super end # Can this ShareBundle be sold to the open market? From d70d74948096668a1f0b2c12431b65a1ab5299fb Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Sun, 9 Jun 2024 22:50:44 +0100 Subject: [PATCH 21/54] [18Ardennes] Don't have to buy the cheapest train in EMR --- lib/engine/game/g_18_ardennes/game.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/engine/game/g_18_ardennes/game.rb b/lib/engine/game/g_18_ardennes/game.rb index 3388ef8bc5..6fa82b3d1d 100644 --- a/lib/engine/game/g_18_ardennes/game.rb +++ b/lib/engine/game/g_18_ardennes/game.rb @@ -41,6 +41,7 @@ class Game < Game::Base HOME_TOKEN_TIMING = :par MUST_BUY_TRAIN = :always # Just for majors, minors are handled in #must_buy_train? + EBUY_DEPOT_TRAIN_MUST_BE_CHEAPEST = false BANKRUPTCY_ALLOWED = true BANKRUPTCY_ENDS_GAME_AFTER = :all_but_one From a9f9f3d5c252ad039d4f3107d314d8c2823cca6b Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Thu, 27 Jun 2024 21:19:23 +0100 Subject: [PATCH 22/54] [18Ardennes] Allow autorouter to route 4D on same track as other trains --- lib/engine/game/g_18_ardennes/game.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/engine/game/g_18_ardennes/game.rb b/lib/engine/game/g_18_ardennes/game.rb index 6fa82b3d1d..677c44d61b 100644 --- a/lib/engine/game/g_18_ardennes/game.rb +++ b/lib/engine/game/g_18_ardennes/game.rb @@ -45,6 +45,10 @@ class Game < Game::Base BANKRUPTCY_ALLOWED = true BANKRUPTCY_ENDS_GAME_AFTER = :all_but_one + # 4D trains can share track with other trains. Put them in their own + # autoroute group so that the autorouter works correctly. + TRAIN_AUTOROUTE_GROUPS = [['4D']].freeze + # The maximum number of tokens a major can have on the map. LIMIT_TOKENS_AFTER_MERGER = 6 From 243d2c6efcceb23e2edcb1bf59252d881b12efe9 Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Thu, 27 Jun 2024 22:00:00 +0100 Subject: [PATCH 23/54] [18Ardennes] Don't log a skip message after exchanging a minor Exchanging a minor for a share ends a player's stock turn. There was a '[player] has no valid actions and passes' message being logged each time a minor was exchanged, which is unneccessary and confusing. --- .../g_18_ardennes/step/buy_sell_par_shares_companies.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/engine/game/g_18_ardennes/step/buy_sell_par_shares_companies.rb b/lib/engine/game/g_18_ardennes/step/buy_sell_par_shares_companies.rb index 1a872eb5c5..945dbf0751 100644 --- a/lib/engine/game/g_18_ardennes/step/buy_sell_par_shares_companies.rb +++ b/lib/engine/game/g_18_ardennes/step/buy_sell_par_shares_companies.rb @@ -192,6 +192,12 @@ def process_bankrupt(action) @game.declare_bankrupt(player) end + def log_skip(entity) + # Don't print a '[player] has no valid actions and passes' message + # after exchanging a minor for a share. + super if @round.current_actions.empty? + end + private def sell_bankrupt_shares(player) From 84f86c92ae9722f0cb93310044f815a1f7aee9c2 Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Thu, 27 Jun 2024 22:29:25 +0100 Subject: [PATCH 24/54] [18Ardennes] Change pass button text in post-conversion shares step Make the button read 'done' instead of 'pass'. --- lib/engine/game/g_18_ardennes/step/post_conversion_shares.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/engine/game/g_18_ardennes/step/post_conversion_shares.rb b/lib/engine/game/g_18_ardennes/step/post_conversion_shares.rb index d34f504ba5..9157822d4a 100644 --- a/lib/engine/game/g_18_ardennes/step/post_conversion_shares.rb +++ b/lib/engine/game/g_18_ardennes/step/post_conversion_shares.rb @@ -22,6 +22,10 @@ def description 'Buy shares' end + def pass_description + 'Done (buy shares)' + end + def log_skip(_entity); end def active_entities From 6bd1569d9193f7c2197d35ba2afddc26d33e30b5 Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Thu, 27 Jun 2024 22:38:24 +0100 Subject: [PATCH 25/54] [18Ardennes] Invalidate game graph after exchanging minor When a minor company is exchanged for a public company share, it's tokens are either removed or swapped for the public company's tokens. This can mean that the graph is out-of-date, so clear it to make sure it is recalculated before the public company's track laying step. Fixes ollybh#135. --- lib/engine/game/g_18_ardennes/step/minor_exchange.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/engine/game/g_18_ardennes/step/minor_exchange.rb b/lib/engine/game/g_18_ardennes/step/minor_exchange.rb index 7c697e7a0a..ce910d1d86 100644 --- a/lib/engine/game/g_18_ardennes/step/minor_exchange.rb +++ b/lib/engine/game/g_18_ardennes/step/minor_exchange.rb @@ -41,6 +41,10 @@ def exchange_minor(minor, bundle, transfer = :all) # If there are tokens that may optionally be rejected the minor # needs to be left open for the DeclineTokens step. @game.close_corporation(minor) unless @round.corporations_removing_tokens + + # The game graph might be invalid after station tokens have been + # exchanged or removed. + @game.clear_graph_for_entity(major) end # Discards a minor company's assets. From d2fe2be6e203f2bc36b9dc99276f5c7951cc0d37 Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Fri, 28 Jun 2024 18:40:02 +0100 Subject: [PATCH 26/54] [Core/18Ardennes] Show notes on corporation card If a player has bid to start a public company, show which minor they must use to start the public company on its corporation card. --- assets/app/view/game/corporation.rb | 6 ++++++ lib/engine/game/g_18_ardennes/entities.rb | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/assets/app/view/game/corporation.rb b/assets/app/view/game/corporation.rb index dfb1eb5354..4eb4168dc4 100644 --- a/assets/app/view/game/corporation.rb +++ b/assets/app/view/game/corporation.rb @@ -96,6 +96,7 @@ def render end extras << render_capitalization_type if @corporation.corporation? && @corporation.respond_to?(:capitalization_type_desc) extras << render_escrow_account if @corporation.corporation? && @corporation.respond_to?(:escrow) && @corporation.escrow + extras << render_corporation_notes if @game.respond_to?(:corporation_notes) && @game.corporation_notes(@corporation) if extras.any? props = { style: { borderCollapse: 'collapse' } } children << h('table.center', props, [h(:tbody, extras)]) @@ -677,6 +678,11 @@ def render_escrow_account ]) end + def render_corporation_notes + notes = @game.corporation_notes(@corporation).map { |note| h(:div, note) } + h('tr.left', notes) + end + def render_buying_power h('tr.ipo', [ h('td.right', 'Buying Power'), diff --git a/lib/engine/game/g_18_ardennes/entities.rb b/lib/engine/game/g_18_ardennes/entities.rb index a2db5c4007..1ae553ec5d 100644 --- a/lib/engine/game/g_18_ardennes/entities.rb +++ b/lib/engine/game/g_18_ardennes/entities.rb @@ -482,6 +482,18 @@ def init_concessions end end + def corporation_notes(corporation) + return if corporation.floated? + return unless (minor = @pledged_minors[corporation]) + + player = minor.presidents_share.owner + verb = @round.auction? ? 'bid' : 'won the right' + [ + "#{player.name} has #{verb} to start this company using " \ + "minor #{minor.id}." + ] + end + # The minimum amount of cash needed to start one of the corporations # that the player is under obligation for. def cash_needed(player) From fed6cef0f349ed5ecad17d6c4ddfe51b290a6d70 Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Sat, 29 Jun 2024 10:07:02 +0100 Subject: [PATCH 27/54] [18Ardennes] Rubocop fix --- lib/engine/game/g_18_ardennes/entities.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/engine/game/g_18_ardennes/entities.rb b/lib/engine/game/g_18_ardennes/entities.rb index 1ae553ec5d..756eac95bf 100644 --- a/lib/engine/game/g_18_ardennes/entities.rb +++ b/lib/engine/game/g_18_ardennes/entities.rb @@ -490,7 +490,7 @@ def corporation_notes(corporation) verb = @round.auction? ? 'bid' : 'won the right' [ "#{player.name} has #{verb} to start this company using " \ - "minor #{minor.id}." + "minor #{minor.id}.", ] end From 2e458d067bed72cdf28f7508ebb4dbe2d5c1456c Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Sun, 30 Jun 2024 10:39:09 +0100 Subject: [PATCH 28/54] Revert "[18Ardennes] Rubocop fix" This reverts commit 60c5084ed387f3b08e40feaf20725327e6e01a5f. --- lib/engine/game/g_18_ardennes/entities.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/engine/game/g_18_ardennes/entities.rb b/lib/engine/game/g_18_ardennes/entities.rb index 756eac95bf..1ae553ec5d 100644 --- a/lib/engine/game/g_18_ardennes/entities.rb +++ b/lib/engine/game/g_18_ardennes/entities.rb @@ -490,7 +490,7 @@ def corporation_notes(corporation) verb = @round.auction? ? 'bid' : 'won the right' [ "#{player.name} has #{verb} to start this company using " \ - "minor #{minor.id}.", + "minor #{minor.id}." ] end From 82edd879c0b5998af67b84266883be7ab21a0a0c Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Sun, 30 Jun 2024 10:39:21 +0100 Subject: [PATCH 29/54] Revert "[Core/18Ardennes] Show notes on corporation card" This reverts commit 63acc07e7d9bd4a9554e16293dac92cc9170c232. --- assets/app/view/game/corporation.rb | 6 ------ lib/engine/game/g_18_ardennes/entities.rb | 12 ------------ 2 files changed, 18 deletions(-) diff --git a/assets/app/view/game/corporation.rb b/assets/app/view/game/corporation.rb index 4eb4168dc4..dfb1eb5354 100644 --- a/assets/app/view/game/corporation.rb +++ b/assets/app/view/game/corporation.rb @@ -96,7 +96,6 @@ def render end extras << render_capitalization_type if @corporation.corporation? && @corporation.respond_to?(:capitalization_type_desc) extras << render_escrow_account if @corporation.corporation? && @corporation.respond_to?(:escrow) && @corporation.escrow - extras << render_corporation_notes if @game.respond_to?(:corporation_notes) && @game.corporation_notes(@corporation) if extras.any? props = { style: { borderCollapse: 'collapse' } } children << h('table.center', props, [h(:tbody, extras)]) @@ -678,11 +677,6 @@ def render_escrow_account ]) end - def render_corporation_notes - notes = @game.corporation_notes(@corporation).map { |note| h(:div, note) } - h('tr.left', notes) - end - def render_buying_power h('tr.ipo', [ h('td.right', 'Buying Power'), diff --git a/lib/engine/game/g_18_ardennes/entities.rb b/lib/engine/game/g_18_ardennes/entities.rb index 1ae553ec5d..a2db5c4007 100644 --- a/lib/engine/game/g_18_ardennes/entities.rb +++ b/lib/engine/game/g_18_ardennes/entities.rb @@ -482,18 +482,6 @@ def init_concessions end end - def corporation_notes(corporation) - return if corporation.floated? - return unless (minor = @pledged_minors[corporation]) - - player = minor.presidents_share.owner - verb = @round.auction? ? 'bid' : 'won the right' - [ - "#{player.name} has #{verb} to start this company using " \ - "minor #{minor.id}." - ] - end - # The minimum amount of cash needed to start one of the corporations # that the player is under obligation for. def cash_needed(player) From 9bed23686096740cfe957c99d5365eb9c26dee3c Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Sun, 30 Jun 2024 10:41:00 +0100 Subject: [PATCH 30/54] [18Ardennes] Show which minors were used in bids for public companies If a player has bid to start a public company, show which minor they must use to start the public company on its corporation card. --- lib/engine/game/g_18_ardennes/entities.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/engine/game/g_18_ardennes/entities.rb b/lib/engine/game/g_18_ardennes/entities.rb index a2db5c4007..2c34bc03d2 100644 --- a/lib/engine/game/g_18_ardennes/entities.rb +++ b/lib/engine/game/g_18_ardennes/entities.rb @@ -482,6 +482,18 @@ def init_concessions end end + def status_array(corporation) + return if corporation.floated? + return unless (minor = @pledged_minors[corporation]) + + player = minor.presidents_share.owner + verb = @round.auction? ? 'bid' : 'won the right' + [ + "#{player.name} has #{verb} to start this company using " \ + "minor #{minor.id}.", + ] + end + # The minimum amount of cash needed to start one of the corporations # that the player is under obligation for. def cash_needed(player) From 5bc20cb29b4f206cdf7bf95c5f8efdfd41d9f4b7 Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Sun, 30 Jun 2024 18:14:10 +0100 Subject: [PATCH 31/54] [18Ardennes] The GL minor can be sold when over cert limit The game was only allowing a player to sell public company shares when they were over the certificate limit. If they own the GL minor this should also be available to be sold. This wasn't possible as it is implemented as a private company, and the inherited implementation wasn't including `sell_company` as an action. Fixes ollybh#136. --- .../step/buy_sell_par_shares_companies.rb | 40 +++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/lib/engine/game/g_18_ardennes/step/buy_sell_par_shares_companies.rb b/lib/engine/game/g_18_ardennes/step/buy_sell_par_shares_companies.rb index 945dbf0751..1b1abbe423 100644 --- a/lib/engine/game/g_18_ardennes/step/buy_sell_par_shares_companies.rb +++ b/lib/engine/game/g_18_ardennes/step/buy_sell_par_shares_companies.rb @@ -11,20 +11,13 @@ class BuySellParSharesCompanies < Engine::Step::BuySellParSharesCompanies include MinorExchange def actions(entity) - return super if bought? - return super unless @game.under_obligation?(entity) + return [] unless entity == current_entity + return [] if bought? return %w[bankrupt] if @game.bankrupt?(entity) + return limit_actions(entity) if must_sell?(entity) + return par_actions(entity) if @game.under_obligation?(entity) - actions = [] - actions << 'par' if under_limit?(entity) - actions << 'sell_shares' if can_sell_any?(entity) - actions << 'sell_company' if can_sell_any_companies?(entity) - # TODO: handle this properly. - # Maybe stop the player from bidding for a major if they are at - # certificate limit and do not have any sellable shares. - raise GameError, 'Cannot sell shares or start major company' if actions.empty? - - actions + super end def auto_actions(entity) @@ -200,6 +193,29 @@ def log_skip(entity) private + # Actions when a player is under obligation to start a public company. + def par_actions(entity) + actions = [] + actions << 'par' if under_limit?(entity) + actions << 'sell_shares' if can_sell_any?(entity) + actions << 'sell_company' if can_sell_any_companies?(entity) + # TODO: handle this properly. + # Maybe stop the player from bidding for a major if they are at + # certificate limit and do not have any sellable shares. + raise GameError, 'Cannot sell shares or start major company' if actions.empty? + + actions + end + + # Actions when a player is over the certificate limit. + def limit_actions(entity) + if can_sell_any_companies?(entity) + %w[sell_shares sell_company] + else + %w[sell_shares] + end + end + def sell_bankrupt_shares(player) @log << "-- #{player.name} goes bankrupt and sells remaining shares --" From 981adf998ff8f3395762b9e717976c808f916f62 Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Mon, 1 Jul 2024 19:18:59 +0100 Subject: [PATCH 32/54] [18Ardennes] Include GL value in liquidity calculation The GL minor can be sold in the same way as public company shares, so it should be included when calculating liquidity. --- lib/engine/game/g_18_ardennes/game.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/engine/game/g_18_ardennes/game.rb b/lib/engine/game/g_18_ardennes/game.rb index 677c44d61b..a979b8fc0a 100644 --- a/lib/engine/game/g_18_ardennes/game.rb +++ b/lib/engine/game/g_18_ardennes/game.rb @@ -147,6 +147,12 @@ def operating_order major_corporations.select(&:ipoed).sort end + def liquidity(player, emergency: false) + return player.cash unless sellable_turn? + + super + player.companies.sum(&:value) + end + # Checks whether a player really is bankrupt. def can_go_bankrupt?(player, _corporation) return super if @round.operating? From 706c723195b66a426485159eec5d9fe2ef958d79 Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Mon, 1 Jul 2024 21:33:47 +0100 Subject: [PATCH 33/54] [18Ardennes] Allow the GL to be sold when in EMR Fixes ollybh#137. --- lib/engine/game/g_18_ardennes/entities.rb | 4 +++ .../game/g_18_ardennes/step/buy_train.rb | 26 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/lib/engine/game/g_18_ardennes/entities.rb b/lib/engine/game/g_18_ardennes/entities.rb index 2c34bc03d2..7a46d0eb96 100644 --- a/lib/engine/game/g_18_ardennes/entities.rb +++ b/lib/engine/game/g_18_ardennes/entities.rb @@ -450,6 +450,10 @@ def buyable_bank_owned_companies @round.operating? ? [] : super end + def company_sale_price(company) + company.value + end + # Has the player won any auctions for public companies in the # preceding auction round? If they have then they must start these # majors before they can buy any other shares or pass. diff --git a/lib/engine/game/g_18_ardennes/step/buy_train.rb b/lib/engine/game/g_18_ardennes/step/buy_train.rb index 88e03462c7..919b7d2f59 100644 --- a/lib/engine/game/g_18_ardennes/step/buy_train.rb +++ b/lib/engine/game/g_18_ardennes/step/buy_train.rb @@ -7,11 +7,37 @@ module Game module G18Ardennes module Step class BuyTrain < Engine::Step::BuyTrain + def actions(entity) + actions = super + actions << 'sell_company' if actions.include?('sell_shares') && + can_sell_any_companies?(entity) + actions + end + def train_variant_helper(train, entity) return super if @game.can_buy_4d?(entity) super.reject { |v| v[:name] == '4D' } end + + def process_sell_company(action) + player = action.entity + company = action.company + price = company.value + company.owner = @game.bank + player.companies.delete(company) + @game.bank.spend(price, player) + @log << "#{player.name} sells #{company.name} to bank for #{@game.format_currency(price)}" + end + + private + + def can_sell_any_companies?(entity) + player = entity.owner + return false unless player&.player? + + !player.companies.select { |c| c.type == :minor }.empty? + end end end end From 19e81a79dcd0dfa4f25a1ef05f55aa7b8f9bc14c Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Mon, 20 May 2024 19:37:46 +0100 Subject: [PATCH 34/54] [18Ardennes] No share price change on non-president sales --- lib/engine/game/g_18_ardennes/game.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/engine/game/g_18_ardennes/game.rb b/lib/engine/game/g_18_ardennes/game.rb index a979b8fc0a..23209ff46d 100644 --- a/lib/engine/game/g_18_ardennes/game.rb +++ b/lib/engine/game/g_18_ardennes/game.rb @@ -36,6 +36,7 @@ class Game < Game::Base SELL_BUY_ORDER = :sell_buy SELL_AFTER = :operate + SELL_MOVEMENT = :left_block_pres CAPITALIZATION = :incremental HOME_TOKEN_TIMING = :par From c475a24452829a70a439a08004b377799e02e7a4 Mon Sep 17 00:00:00 2001 From: Alexander Vansach Date: Fri, 5 Jul 2024 23:25:46 +0200 Subject: [PATCH 35/54] 22Mars: Add map and tiles --- lib/engine/game/g_22_mars.rb | 8 + lib/engine/game/g_22_mars/entities.rb | 11 + lib/engine/game/g_22_mars/game.rb | 141 ++++++++++ lib/engine/game/g_22_mars/map.rb | 385 ++++++++++++++++++++++++++ lib/engine/game/g_22_mars/meta.rb | 23 ++ 5 files changed, 568 insertions(+) create mode 100644 lib/engine/game/g_22_mars.rb create mode 100644 lib/engine/game/g_22_mars/entities.rb create mode 100644 lib/engine/game/g_22_mars/game.rb create mode 100644 lib/engine/game/g_22_mars/map.rb create mode 100644 lib/engine/game/g_22_mars/meta.rb diff --git a/lib/engine/game/g_22_mars.rb b/lib/engine/game/g_22_mars.rb new file mode 100644 index 0000000000..28a302abcc --- /dev/null +++ b/lib/engine/game/g_22_mars.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +module Engine + module Game + module G22Mars + end + end +end diff --git a/lib/engine/game/g_22_mars/entities.rb b/lib/engine/game/g_22_mars/entities.rb new file mode 100644 index 0000000000..a339074043 --- /dev/null +++ b/lib/engine/game/g_22_mars/entities.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module Engine + module Game + module G22Mars + module Entities + COMPANIES = [].freeze + end + end + end +end diff --git a/lib/engine/game/g_22_mars/game.rb b/lib/engine/game/g_22_mars/game.rb new file mode 100644 index 0000000000..02c6d108f3 --- /dev/null +++ b/lib/engine/game/g_22_mars/game.rb @@ -0,0 +1,141 @@ +# frozen_string_literal: true + +require_relative '../base' +require_relative 'meta' +require_relative 'entities' +require_relative 'map' + +module Engine + module Game + module G22Mars + class Game < Game::Base + include_meta(G22Mars::Meta) + include Entities + include Map + + CURRENCY_FORMAT_STR = '%sc' + BANK_CASH = 9999 + + STARTING_CASH = { 3 => 300, 4 => 225, 5 => 180 }.freeze + + MARKET = [ + %w[90 100 110 120 130 145 160 175 195 215 235 255 275 300e], + %w[80 90p 100 110 120 130 145 160 175 195 215 235 255], + %w[70 80p 90 100 110 120 130 145 160 175 195 215], + %w[60 70p 80 90 100 110 120 130 145 160 175], + %w[50 60p 70 80 90 100 110 120 130 145], + %w[45 50p 55 65 75 85 95 105], + %w[40 45 50 55 65 75], + %w[35r 40r 45r 50r], + %w[0c], + ].freeze + + CERT_LIMIT = { 2 => 12, 3 => 12, 4 => 9, 5 => 7 }.freeze + + PHASES = [ + { + name: '2', + train_limit: 3, + tiles: [:yellow], + operating_rounds: 2, + status: [], + }, + { + name: '3', + on: '3', + train_limit: 3, + tiles: %i[yellow green], + operating_rounds: 2, + status: [], + }, + { + name: '4', + on: '4', + train_limit: 3, + tiles: %i[yellow green], + operating_rounds: 2, + status: [], + }, + { + name: '5', + on: '5', + train_limit: 3, + tiles: %i[yellow green brown], + operating_rounds: 2, + status: [], + }, + { + name: '7', + on: '6+S', + train_limit: 3, + tiles: %i[yellow green brown gray], + operating_rounds: 2, + status: [], + }, + { + name: '8', + on: '6+SS', + train_limit: 3, + tiles: %i[yellow green brown gray black], + operating_rounds: 2, + status: [], + }, + ].freeze + + TRAINS = [ + { + name: '2', + distance: 2, + price: 100, + rusts_on: '4', + num: 6, + }, + { + name: '3', + distance: 3, + price: 17, + rusts_on: '5', + num: 4, + }, + { + name: '4', + distance: 4, + price: 250, + rusts_on: '6+S', + num: 3, + }, + { + name: '5', + distance: 5, + price: 340, + rusts_on: '6+SS', + num: 3, + }, + { + name: '6+S', + distance: 6, + price: 440, + rusts_on: '4', + num: 4, + }, + { + name: '6+SS', + distance: 6, + price: 560, + rusts_on: '4', + num: 6, + discount: { '5' => 400 }, + }, + ].freeze + + CAPITALIZATION = :incremental + + SELL_BUY_ORDER = :sell_buy + SELL_MOVEMENT = :down_share + HOME_TOKEN_TIMING = :float + + CLOSED_CORP_RESERVATIONS_REMOVED = false + end + end + end +end diff --git a/lib/engine/game/g_22_mars/map.rb b/lib/engine/game/g_22_mars/map.rb new file mode 100644 index 0000000000..9130f4b4b2 --- /dev/null +++ b/lib/engine/game/g_22_mars/map.rb @@ -0,0 +1,385 @@ +# frozen_string_literal: true + +module Engine + module Game + module G22Mars + module Map + TILES = { + '3' => 2, + '4' => 2, + '7' => 2, + '8' => 2, + '9' => 2, + '58' => 2, + '19' => 1, + '20' => 1, + '23' => 1, + '24' => 1, + '25' => 1, + '26' => 1, + '27' => 1, + '28' => 1, + '29' => 1, + '624' => 1, + '39' => 1, + '40' => 1, + '41' => 1, + '42' => 1, + '44' => 1, + '47' => 1, + 'M1' => { + 'count' => 2, + 'color' => 'yellow', + 'code' => 'city=revenue:10;path=a:0,b:_0;path=a:1,b:_0', + }, + 'M2' => { + 'count' => 3, + 'color' => 'yellow', + 'code' => 'city=revenue:10;path=a:0,b:_0;path=a:2,b:_0', + }, + 'M3' => { + 'count' => 3, + 'color' => 'yellow', + 'code' => 'city=revenue:10;path=a:0,b:_0;path=a:3,b:_0', + }, + 'M4' => { + 'count' => 3, + 'color' => 'green', + 'code' => 'city=revenue:20,slots:2;path=a:0,b:_0;path=a:3,b:_0;path=a:4,b:_0', + }, + 'M5' => { + 'count' => 2, + 'color' => 'green', + 'code' => 'city=revenue:20,slots:2;path=a:2,b:_0;path=a:3,b:_0;path=a:4,b:_0', + }, + 'M6' => { + 'count' => 3, + 'color' => 'green', + 'code' => 'city=revenue:20,slots:2;path=a:0,b:_0;path=a:2,b:_0;path=a:3,b:_0', + }, + 'M7' => { + 'count' => 2, + 'color' => 'green', + 'code' => 'city=revenue:20,slots:2;path=a:0,b:_0;path=a:2,b:_0;path=a:4,b:_0', + }, + 'M8' => { + 'count' => 1, + 'color' => 'brown', + 'code' => 'city=revenue:30,slots:2;path=a:0,b:_0;path=a:2,b:_0;path=a:3,b:_0;path=a:4,b:_0', + }, + 'M9' => { + 'count' => 2, + 'color' => 'brown', + 'code' => 'city=revenue:30,slots:3;path=a:0,b:_0;path=a:2,b:_0;path=a:3,b:_0;path=a:4,b:_0', + }, + 'M10' => { + 'count' => 1, + 'color' => 'brown', + 'code' => 'city=revenue:30,slots:2;path=a:0,b:_0;path=a:1,b:_0;path=a:2,b:_0;path=a:3,b:_0', + }, + 'M11' => { + 'count' => 1, + 'color' => 'brown', + 'code' => 'city=revenue:30,slots:3;path=a:0,b:_0;path=a:1,b:_0;path=a:2,b:_0;path=a:3,b:_0', + }, + 'M12' => { + 'count' => 1, + 'color' => 'brown', + 'code' => 'city=revenue:30,slots:2;path=a:0,b:_0;path=a:1,b:_0;path=a:3,b:_0;path=a:4,b:_0', + }, + 'M13' => { + 'count' => 1, + 'color' => 'brown', + 'code' => 'city=revenue:30,slots:3;path=a:0,b:_0;path=a:1,b:_0;path=a:3,b:_0;path=a:4,b:_0', + }, + 'M14' => { + 'count' => 2, + 'color' => 'gray', + 'code' => 'city=revenue:40,slots:3;path=a:0,b:_0;path=a:2,b:_0;path=a:3,b:_0;path=a:4,b:_0;path=a:5,b:_0', + }, + 'M15' => { + 'count' => 1, + 'color' => 'gray', + 'code' => 'city=revenue:40,slots:3;'\ + 'path=a:0,b:_0;path=a:1,b:_0;path=a:2,b:_0;path=a:3,b:_0;path=a:4,b:_0;path=a:5,b:_0', + }, + 'M16' => { + 'count' => 1, + 'color' => 'gray', + 'code' => 'city=revenue:40,slots:2;path=a:0,b:_0;path=a:2,b:_0;path=a:3,b:_0;path=a:4,b:_0;path=a:5,b:_0', + }, + 'CC1' => { + 'count' => 2, + 'color' => 'yellow', + 'code' => 'label=CC;city=revenue:20;city=revenue:20;path=a:0,b:_0;path=a:4,b:_1', + }, + 'CC2' => { + 'count' => 1, + 'color' => 'yellow', + 'code' => 'label=CC;city=revenue:20,loc:0;city=revenue:20,loc:3;path=a:5,b:_0;path=a:4,b:_1', + }, + 'CC3' => { + 'count' => 2, + 'color' => 'yellow', + 'code' => 'label=CC;city=revenue:20;city=revenue:20;path=a:0,b:_0;path=a:3,b:_1', + }, + 'CC4' => { + 'count' => 1, + 'color' => 'green', + 'code' => 'label=CC;city=revenue:30,loc:0;city=revenue:30,slots:2,loc:2;'\ + 'path=a:0,b:_0;path=a:4,b:_0;path=a:1,b:_1;path=a:3,b:_1', + }, + 'CC5' => { + 'count' => 1, + 'color' => 'green', + 'code' => 'label=CC;city=revenue:30,loc:3.5;city=revenue:30,slots:2,loc:0;'\ + 'path=a:3,b:_0;path=a:4,b:_0;path=a:0,b:_1;path=a:5,b:_1', + }, + 'CC6' => { + 'count' => 1, + 'color' => 'green', + 'code' => 'label=CC;city=revenue:30;city=revenue:30,slots:2;'\ + 'path=a:1,b:_0;path=a:4,b:_0;path=a:0,b:_1;path=a:5,b:_1', + }, + 'CC7' => { + 'count' => 1, + 'color' => 'green', + 'code' => 'label=CC;city=revenue:30;city=revenue:30,slots:2;'\ + 'path=a:3,b:_0;path=a:5,b:_0;path=a:0,b:_1;path=a:4,b:_1', + }, + 'CC8' => { + 'count' => 1, + 'color' => 'green', + 'code' => 'label=CC;city=revenue:30,slots:2;city=revenue:30;'\ + 'path=a:3,b:_0;path=a:5,b:_0;path=a:0,b:_1;path=a:4,b:_1', + }, + 'CC9' => { + 'count' => 1, + 'color' => 'green', + 'code' => 'label=CC;city=revenue:30,slots:2;city=revenue:30;'\ + 'path=a:1,b:_0;path=a:4,b:_0;path=a:0,b:_1;path=a:5,b:_1', + }, + 'CC10' => { + 'count' => 1, + 'color' => 'green', + 'code' => 'label=CC;city=revenue:30,slots:2;city=revenue:30;path=a:0,b:_0;path=a:4,b:_0;path=a:1,b:_1;path=a:3,b:_1', + }, + 'CC11' => { + 'count' => 1, + 'color' => 'green', + 'code' => 'label=CC;city=revenue:30,slots:2;city=revenue:30;path=a:3,b:_0;path=a:4,b:_0;path=a:0,b:_1;path=a:5,b:_1', + }, + 'CC12' => { + 'count' => 2, + 'color' => 'brown', + 'code' => 'label=CC;city=revenue:40,slots:2,loc:0;city=revenue:40,slots:2,loc:3;'\ + 'path=a:0,b:_0;path=a:1,b:_0;path=a:2,b:_1;path=a:3,b:_1;path=a:4,b:_1;path=a:5,b:_0', + }, + 'CC13' => { + 'count' => 1, + 'color' => 'brown', + 'code' => 'label=CC;city=revenue:40,slots:2;city=revenue:40,slots:2;'\ + 'path=a:0,b:_0;path=a:4,b:_0;path=a:5,b:_0;path=a:3,b:_1;path=a:4,b:_1;path=a:5,b:_1', + }, + 'CC14' => { + 'count' => 1, + 'color' => 'brown', + 'code' => 'label=CC;city=revenue:40,slots:2,loc:0;city=revenue:40,slots:2,loc:3;'\ + 'path=a:0,b:_0;path=a:5,b:_0;path=a:1,b:_1;path=a:2,b:_1;path=a:4,b:_1', + }, + 'CC15' => { + 'count' => 1, + 'color' => 'brown', + 'code' => 'label=CC;city=revenue:40,slots:2,loc:0;city=revenue:40,slots:2,loc:3;'\ + 'path=a:0,b:_0;path=a:5,b:_0;path=a:1,b:_1;path=a:3,b:_1;path=a:4,b:_1', + }, + 'CC16' => { + 'count' => 1, + 'color' => 'gray', + 'code' => 'label=CC;city=revenue:50,slots:2,loc:0;city=revenue:50,slots:2,loc:3;'\ + 'path=a:0,b:_0;path=a:1,b:_0;path=a:2,b:_1;path=a:3,b:_1;path=a:4,b:_1;path=a:5,b:_0;path=a:_0,b:_1', + }, + 'CC17' => { + 'count' => 1, + 'color' => 'gray', + 'code' => 'label=CC;city=revenue:50,slots:2,loc:0;city=revenue:50,slots:2,loc:3;'\ + 'path=a:0,b:_0;path=a:5,b:_0;path=a:1,b:_1;path=a:2,b:_1;path=a:3,b:_1;path=a:4,b:_1', + }, + 'CC18' => { + 'count' => 1, + 'color' => 'gray', + 'code' => 'label=CC;city=revenue:50,slots:2,loc:0.5;city=revenue:50,slots:2;'\ + 'path=a:0,b:_0;path=a:1,b:_0;path=a:4,b:_0;path=a:5,b:_0;path=a:3,b:_1;path=a:4,b:_1;path=a:5,b:_1', + }, + 'AA' => { + 'count' => 1, + 'color' => 'green', + 'code' => 'label=CC;town=revenue:30;path=a:0,b:_0;path=a:2,b:_0;path=a:3,b:_0;path=a:4,b:_0', + }, + }.freeze + + LOCATION_NAMES = { + 'D13' => 'Mining Area Gamma', + 'H15' => 'Mining Area Alpha', + }.freeze + + HEXES = { + white: { + # Board 1 + ['C6'] => 'city=revenue:20;city=revenue:20;label=CC', + ['C8'] => 'city=revenue:10', + ['D5'] => '', + ['D7'] => 'town=revenue:10', + ['D9'] => 'city=revenue:10', + ['E6'] => '', + ['E8'] => 'city=revenue:20;city=revenue:20;label=CC', + # Board 2 + ['C12'] => 'city=revenue:10', + ['C14'] => 'city=revenue:10', + ['D11'] => 'city=revenue:10', + ['D13'] => 'frame=color:#00aa00', + ['D15'] => 'town=revenue:10', + ['E12'] => '', + ['E14'] => 'city=revenue:10', + # Board 3 + ['G6'] => '', + ['G8'] => 'city=revenue:10', + ['H5'] => 'city=revenue:20;city=revenue:20;label=CC', + ['H7'] => 'city=revenue:20;city=revenue:20;label=CC', + ['H9'] => 'town=revenue:10', + ['I6'] => '', + ['I8'] => 'city=revenue:10', + # Board 4 + ['G12'] => '', + ['G14'] => 'city=revenue:10', + ['H11'] => 'city=revenue:20;city=revenue:20;label=CC', + ['H13'] => 'city=revenue:10', + ['H15'] => 'frame=color:#aa0000', + ['I12'] => 'town=revenue:10', + ['I14'] => 'city=revenue:10', + }, + gray: { + ['A4'] => 'path=a:4,b:0,lanes:5', + %w[A6 A8 A10 A12 A14 K6 K8 K10 K12 K14] => 'path=a:3,b:0,lanes:5', + ['A16'] => 'path=a:3,b:5,lanes:5', + ['B3'] => 'path=a:5,b:1,a_lane:4.0,b_lane:5.4;'\ + 'path=a:5,b:1,a_lane:4.1,b_lane:5.3 + path=a:4,b:1,a_lane:3.0,b_lane:5.2;'\ + 'path=a:4,b:1,a_lane:3.1,b_lane:5.1;'\ + 'path=a:4,b:1,a_lane:3.2,b_lane:5.0', + ['B5'] => 'path=a:5,b:4,b_lane:4.0;'\ + 'path=a:0,b:4,a_lane:4.3,b_lane:4.1;'\ + 'path=a:0,b:4,a_lane:4.2,b_lane:4.2;'\ + 'path=a:0,b:4,a_lane:4.1,b_lane:4.3', + ['B7'] => 'path=a:4,b:3,b_lane:4.0;'\ + 'path=a:5,b:3,b_lane:4.1;'\ + 'path=a:0,b:3,b_lane:4.2', + ['B9'] => 'path=a:4,b:3', + ['B11'] => 'path=a:0,b:5', + ['B13'] => 'path=a:5,b:0,b_lane:4.3;'\ + 'path=a:4,b:0,b_lane:4.2;'\ + 'path=a:3,b:0,b_lane:4.1', + ['B15'] => 'path=a:4,b:5,b_lane:4.3;'\ + 'path=a:3,b:5,a_lane:4.0,b_lane:4.2;'\ + 'path=a:3,b:5,a_lane:4.1,b_lane:4.1;'\ + 'path=a:3,b:5,a_lane:4.2,b_lane:4.0', + ['B17'] => 'path=a:4,b:2,a_lane:4.3,b_lane:5.0;'\ + 'path=a:4,b:2,a_lane:4.2,b_lane:5.1;'\ + 'path=a:5,b:2,a_lane:3.2,b_lane:5.2;'\ + 'path=a:5,b:2,a_lane:3.1,b_lane:5.3;'\ + 'path=a:5,b:2,a_lane:3.0,b_lane:5.4', + ['C2'] => 'path=a:5,b:1,lanes:3', + ['C4'] => 'path=a:1,b:4,lanes:4;'\ + 'path=a:0,b:2,b_lane:4.3;'\ + 'path=a:5,b:2,b_lane:4.2', + %w[C10 G10] => 'path=a:0,b:3;'\ + 'path=a:4,b:5', + ['C16'] => 'path=a:2,b:5,lanes:4;'\ + 'path=a:3,b:1,b_lane:4.0;'\ + 'path=a:4,b:1,b_lane:4.1;', + ['C18'] => 'path=a:4,b:2,lanes:3', + %w[D1 H1] => '', + ['D3'] => 'path=a:1,b:4,lanes:4;'\ + 'path=a:0,b:2,b_lane:3.2;'\ + 'path=a:5,a_lane:2.0,b:2,b_lane:3.1;'\ + 'path=a:5,a_lane:2.1,b:2,b_lane:3.0', + ['D17'] => 'path=a:2,b:5,lanes:4;'\ + 'path=a:3,b:1,b_lane:3.0;'\ + 'path=a:4,b:1,a_lane:2.1,b_lane:3.1;'\ + 'path=a:4,b:1,a_lane:2.0,b_lane:3.2', + ['D19'] => '', + ['E2'] => 'path=a:1,b:4,lanes:4', + ['E4'] => 'path=a:1,b:2,b_lane:2.1;'\ + 'path=a:0,b:2,b_lane:2.0', + %w[E10 I10] => 'path=a:0,b:3;'\ + 'path=a:1,b:2', + ['E16'] => 'path=a:2,b:1,b_lane:2.0;'\ + 'path=a:3,b:1,b_lane:2.1', + ['E18'] => 'path=a:2,b:5,lanes:4', + ['F1'] => 'path=a:1,b:5,lanes:4', + ['F3'] => '', + %w[F5 F11] => 'path=a:1,b:5', + %w[F7 F13] => 'path=a:2,b:4;'\ + 'path=a:1,b:5', + %w[F9 F15] => 'path=a:2,b:4', + ['F17'] => '', + ['F19'] => 'path=a:2,b:4,lanes:4', + ['G2'] => 'path=a:2,b:5,lanes:4', + ['G4'] => 'path=a:0,b:4,b_lane:2.1;'\ + 'path=a:5,b:4,b_lane:2.0', + ['G16'] => 'path=a:3,b:5,b_lane:2.0;'\ + 'path=a:4,b:5,b_lane:2.1', + ['G18'] => 'path=a:1,b:4,lanes:4', + ['H3'] => 'path=a:2,b:5,lanes:4;'\ + 'path=a:0,b:4,b_lane:3.0;'\ + 'path=a:1,b:4,a_lane:2.1,b_lane:3.1;'\ + 'path=a:1,b:4,a_lane:2.0,b_lane:3.2', + ['H17'] => 'path=a:1,b:4,lanes:4;'\ + 'path=a:2,b:5,a_lane:2.1,b_lane:3.0;'\ + 'path=a:2,b:5,a_lane:2.0,b_lane:3.1;'\ + 'path=a:3,b:5,b_lane:3.2;', + ['H19'] => '', + ['I2'] => 'path=a:5,b:1,lanes:3', + ['I4'] => 'path=a:2,b:5,lanes:4;'\ + 'path=a:1,b:4,b_lane:4.1;'\ + 'path=a:0,b:4,b_lane:4.0', + ['I16'] => 'path=a:1,b:4,lanes:4;'\ + 'path=a:2,b:5,b_lane:4.2;'\ + 'path=a:3,b:5,b_lane:4.3', + ['I18'] => 'path=a:4,b:2,lanes:3', + ['J3'] => 'path=a:1,b:5,a_lane:4.3,b_lane:5.0;'\ + 'path=a:1,b:5,a_lane:4.2,b_lane:5.1;'\ + 'path=a:2,b:5,a_lane:3.2,b_lane:5.2;'\ + 'path=a:2,b:5,a_lane:3.1,b_lane:5.3;'\ + 'path=a:2,b:5,a_lane:3.0,b_lane:5.4', + ['J5'] => 'path=a:1,b:2,b_lane:4.3;'\ + 'path=a:0,b:2,a_lane:3.0,b_lane:4.2;'\ + 'path=a:0,b:2,a_lane:3.1,b_lane:4.1;'\ + 'path=a:0,b:2,a_lane:3.2,b_lane:4.0', + ['J7'] => 'path=a:2,b:3,b_lane:3.2;'\ + 'path=a:1,b:3,b_lane:3.1;'\ + 'path=a:0,b:3,b_lane:3.0', + ['J9'] => 'path=a:2,b:3', + ['J11'] => 'path=a:1,b:0', + ['J13'] => 'path=a:1,b:0,b_lane:3.0;'\ + 'path=a:2,b:0,b_lane:3.1;'\ + 'path=a:3,b:0,b_lane:3.2', + ['J15'] => 'path=a:2,b:1,b_lane:4.0;'\ + 'path=a:3,b:1,a_lane:3.2,b_lane:4.1;'\ + 'path=a:3,b:1,a_lane:3.1,b_lane:4.2;'\ + 'path=a:3,b:1,a_lane:3.0,b_lane:4.3', + ['J17'] => 'path=a:1,b:4,a_lane:3.2,b_lane:5.0;'\ + 'path=a:1,b:4,a_lane:3.1,b_lane:5.1;'\ + 'path=a:1,b:4,a_lane:3.0,b_lane:5.2;'\ + 'path=a:2,b:4,a_lane:4.1,b_lane:5.3;'\ + 'path=a:2,b:4,a_lane:4.0,b_lane:5.4', + ['K4'] => 'path=a:2,b:0,lanes:5', + ['K16'] => 'path=a:3,b:1,lanes:5', + }, + }.freeze + + LAYOUT = :flat + end + end + end +end diff --git a/lib/engine/game/g_22_mars/meta.rb b/lib/engine/game/g_22_mars/meta.rb new file mode 100644 index 0000000000..fd04138f1d --- /dev/null +++ b/lib/engine/game/g_22_mars/meta.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +require_relative '../meta' + +module Engine + module Game + module G22Mars + module Meta + include Game::Meta + + DEV_STAGE = :alpha + PROTOTYPE = true + + GAME_DESIGNER = 'Jonas Jones' + GAME_LOCATION = 'Mars' + GAME_RULES_URL = 'https://boardgamegeek.com/filepage/270966/22mars-rules' + GAME_INFO_URL = 'https://github.com/tobymao/18xx/wiki/22Mars' + + PLAYER_RANGE = [3, 5].freeze + end + end + end +end From 1cd6ce1e4719b11adae755be5f71ed8e570c9320 Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Sat, 18 May 2024 09:46:42 +0100 Subject: [PATCH 36/54] [18Ardennes] Change minor tokens to show associated public companies In the first round of starting public companies, these can only be started using minro companies that have tokens in certain cities. To make the association between cities and public comanies visible to players, this commit changes minor companies' tokens when they are placed in cities, to give them the colours of the associated public companies. - A token in Rotterdam will be yellow, as this one could only be used to start the NL public company. - A token in Lille-Roubaix will be half green and half brown, as this is associated with both the BE and N public companies. - A token in Aachen will be yellow, green and dark blue, as all of NL, BE and P can be started from there. --- lib/engine/game/g_18_ardennes/entities.rb | 44 +++++++++++++++++++++ lib/engine/game/g_18_ardennes/step/token.rb | 9 ++++- public/logos/18_ardennes/1-BE+N.svg | 14 +++++++ public/logos/18_ardennes/1-BE+NL+P.svg | 23 +++++++++++ public/logos/18_ardennes/1-BE+NL.svg | 14 +++++++ public/logos/18_ardennes/1-BE.svg | 4 ++ public/logos/18_ardennes/1-BY+E.svg | 14 +++++++ public/logos/18_ardennes/1-BY+P.svg | 14 +++++++ public/logos/18_ardennes/1-BY.svg | 4 ++ public/logos/18_ardennes/1-E.svg | 4 ++ public/logos/18_ardennes/1-N.svg | 4 ++ public/logos/18_ardennes/1-NL.svg | 4 ++ public/logos/18_ardennes/1-P.svg | 4 ++ public/logos/18_ardennes/10-BE+N.svg | 14 +++++++ public/logos/18_ardennes/10-BE+NL+P.svg | 23 +++++++++++ public/logos/18_ardennes/10-BE+NL.svg | 14 +++++++ public/logos/18_ardennes/10-BE.svg | 4 ++ public/logos/18_ardennes/10-BY+E.svg | 14 +++++++ public/logos/18_ardennes/10-BY+P.svg | 14 +++++++ public/logos/18_ardennes/10-BY.svg | 4 ++ public/logos/18_ardennes/10-E.svg | 4 ++ public/logos/18_ardennes/10-N.svg | 4 ++ public/logos/18_ardennes/10-NL.svg | 4 ++ public/logos/18_ardennes/10-P.svg | 4 ++ public/logos/18_ardennes/11-BE+N.svg | 14 +++++++ public/logos/18_ardennes/11-BE+NL+P.svg | 23 +++++++++++ public/logos/18_ardennes/11-BE+NL.svg | 14 +++++++ public/logos/18_ardennes/11-BE.svg | 4 ++ public/logos/18_ardennes/11-BY+E.svg | 14 +++++++ public/logos/18_ardennes/11-BY+P.svg | 14 +++++++ public/logos/18_ardennes/11-BY.svg | 4 ++ public/logos/18_ardennes/11-E.svg | 4 ++ public/logos/18_ardennes/11-N.svg | 4 ++ public/logos/18_ardennes/11-NL.svg | 4 ++ public/logos/18_ardennes/11-P.svg | 4 ++ public/logos/18_ardennes/12-BE+N.svg | 14 +++++++ public/logos/18_ardennes/12-BE+NL+P.svg | 23 +++++++++++ public/logos/18_ardennes/12-BE+NL.svg | 14 +++++++ public/logos/18_ardennes/12-BE.svg | 4 ++ public/logos/18_ardennes/12-BY+E.svg | 14 +++++++ public/logos/18_ardennes/12-BY+P.svg | 14 +++++++ public/logos/18_ardennes/12-BY.svg | 4 ++ public/logos/18_ardennes/12-E.svg | 4 ++ public/logos/18_ardennes/12-N.svg | 4 ++ public/logos/18_ardennes/12-NL.svg | 4 ++ public/logos/18_ardennes/12-P.svg | 4 ++ public/logos/18_ardennes/13-BE+N.svg | 14 +++++++ public/logos/18_ardennes/13-BE+NL+P.svg | 23 +++++++++++ public/logos/18_ardennes/13-BE+NL.svg | 14 +++++++ public/logos/18_ardennes/13-BE.svg | 4 ++ public/logos/18_ardennes/13-BY+E.svg | 14 +++++++ public/logos/18_ardennes/13-BY+P.svg | 14 +++++++ public/logos/18_ardennes/13-BY.svg | 4 ++ public/logos/18_ardennes/13-E.svg | 4 ++ public/logos/18_ardennes/13-N.svg | 4 ++ public/logos/18_ardennes/13-NL.svg | 4 ++ public/logos/18_ardennes/13-P.svg | 4 ++ public/logos/18_ardennes/14-BE+N.svg | 14 +++++++ public/logos/18_ardennes/14-BE+NL+P.svg | 23 +++++++++++ public/logos/18_ardennes/14-BE+NL.svg | 14 +++++++ public/logos/18_ardennes/14-BE.svg | 4 ++ public/logos/18_ardennes/14-BY+E.svg | 14 +++++++ public/logos/18_ardennes/14-BY+P.svg | 14 +++++++ public/logos/18_ardennes/14-BY.svg | 4 ++ public/logos/18_ardennes/14-E.svg | 4 ++ public/logos/18_ardennes/14-N.svg | 4 ++ public/logos/18_ardennes/14-NL.svg | 4 ++ public/logos/18_ardennes/14-P.svg | 4 ++ public/logos/18_ardennes/15-BE+N.svg | 14 +++++++ public/logos/18_ardennes/15-BE+NL+P.svg | 23 +++++++++++ public/logos/18_ardennes/15-BE+NL.svg | 14 +++++++ public/logos/18_ardennes/15-BE.svg | 4 ++ public/logos/18_ardennes/15-BY+E.svg | 14 +++++++ public/logos/18_ardennes/15-BY+P.svg | 14 +++++++ public/logos/18_ardennes/15-BY.svg | 4 ++ public/logos/18_ardennes/15-E.svg | 4 ++ public/logos/18_ardennes/15-N.svg | 4 ++ public/logos/18_ardennes/15-NL.svg | 4 ++ public/logos/18_ardennes/15-P.svg | 4 ++ public/logos/18_ardennes/2-BE+N.svg | 14 +++++++ public/logos/18_ardennes/2-BE+NL+P.svg | 23 +++++++++++ public/logos/18_ardennes/2-BE+NL.svg | 14 +++++++ public/logos/18_ardennes/2-BE.svg | 4 ++ public/logos/18_ardennes/2-BY+E.svg | 14 +++++++ public/logos/18_ardennes/2-BY+P.svg | 14 +++++++ public/logos/18_ardennes/2-BY.svg | 4 ++ public/logos/18_ardennes/2-E.svg | 4 ++ public/logos/18_ardennes/2-N.svg | 4 ++ public/logos/18_ardennes/2-NL.svg | 4 ++ public/logos/18_ardennes/2-P.svg | 4 ++ public/logos/18_ardennes/3-BE+N.svg | 14 +++++++ public/logos/18_ardennes/3-BE+NL+P.svg | 23 +++++++++++ public/logos/18_ardennes/3-BE+NL.svg | 14 +++++++ public/logos/18_ardennes/3-BE.svg | 4 ++ public/logos/18_ardennes/3-BY+E.svg | 14 +++++++ public/logos/18_ardennes/3-BY+P.svg | 14 +++++++ public/logos/18_ardennes/3-BY.svg | 4 ++ public/logos/18_ardennes/3-E.svg | 4 ++ public/logos/18_ardennes/3-N.svg | 4 ++ public/logos/18_ardennes/3-NL.svg | 4 ++ public/logos/18_ardennes/3-P.svg | 4 ++ public/logos/18_ardennes/4-BE+N.svg | 14 +++++++ public/logos/18_ardennes/4-BE+NL+P.svg | 23 +++++++++++ public/logos/18_ardennes/4-BE+NL.svg | 14 +++++++ public/logos/18_ardennes/4-BE.svg | 4 ++ public/logos/18_ardennes/4-BY+E.svg | 14 +++++++ public/logos/18_ardennes/4-BY+P.svg | 14 +++++++ public/logos/18_ardennes/4-BY.svg | 4 ++ public/logos/18_ardennes/4-E.svg | 4 ++ public/logos/18_ardennes/4-N.svg | 4 ++ public/logos/18_ardennes/4-NL.svg | 4 ++ public/logos/18_ardennes/4-P.svg | 4 ++ public/logos/18_ardennes/5-BE+N.svg | 14 +++++++ public/logos/18_ardennes/5-BE+NL+P.svg | 23 +++++++++++ public/logos/18_ardennes/5-BE+NL.svg | 14 +++++++ public/logos/18_ardennes/5-BE.svg | 4 ++ public/logos/18_ardennes/5-BY+E.svg | 14 +++++++ public/logos/18_ardennes/5-BY+P.svg | 14 +++++++ public/logos/18_ardennes/5-BY.svg | 4 ++ public/logos/18_ardennes/5-E.svg | 4 ++ public/logos/18_ardennes/5-N.svg | 4 ++ public/logos/18_ardennes/5-NL.svg | 4 ++ public/logos/18_ardennes/5-P.svg | 4 ++ public/logos/18_ardennes/6-BE+N.svg | 14 +++++++ public/logos/18_ardennes/6-BE+NL+P.svg | 23 +++++++++++ public/logos/18_ardennes/6-BE+NL.svg | 14 +++++++ public/logos/18_ardennes/6-BE.svg | 4 ++ public/logos/18_ardennes/6-BY+E.svg | 14 +++++++ public/logos/18_ardennes/6-BY+P.svg | 14 +++++++ public/logos/18_ardennes/6-BY.svg | 4 ++ public/logos/18_ardennes/6-E.svg | 4 ++ public/logos/18_ardennes/6-N.svg | 4 ++ public/logos/18_ardennes/6-NL.svg | 4 ++ public/logos/18_ardennes/6-P.svg | 4 ++ public/logos/18_ardennes/7-BE+N.svg | 14 +++++++ public/logos/18_ardennes/7-BE+NL+P.svg | 23 +++++++++++ public/logos/18_ardennes/7-BE+NL.svg | 14 +++++++ public/logos/18_ardennes/7-BE.svg | 4 ++ public/logos/18_ardennes/7-BY+E.svg | 14 +++++++ public/logos/18_ardennes/7-BY+P.svg | 14 +++++++ public/logos/18_ardennes/7-BY.svg | 4 ++ public/logos/18_ardennes/7-E.svg | 4 ++ public/logos/18_ardennes/7-N.svg | 4 ++ public/logos/18_ardennes/7-NL.svg | 4 ++ public/logos/18_ardennes/7-P.svg | 4 ++ public/logos/18_ardennes/8-BE+N.svg | 14 +++++++ public/logos/18_ardennes/8-BE+NL+P.svg | 23 +++++++++++ public/logos/18_ardennes/8-BE+NL.svg | 14 +++++++ public/logos/18_ardennes/8-BE.svg | 4 ++ public/logos/18_ardennes/8-BY+E.svg | 14 +++++++ public/logos/18_ardennes/8-BY+P.svg | 14 +++++++ public/logos/18_ardennes/8-BY.svg | 4 ++ public/logos/18_ardennes/8-E.svg | 4 ++ public/logos/18_ardennes/8-N.svg | 4 ++ public/logos/18_ardennes/8-NL.svg | 4 ++ public/logos/18_ardennes/8-P.svg | 4 ++ public/logos/18_ardennes/9-BE+N.svg | 14 +++++++ public/logos/18_ardennes/9-BE+NL+P.svg | 23 +++++++++++ public/logos/18_ardennes/9-BE+NL.svg | 14 +++++++ public/logos/18_ardennes/9-BE.svg | 4 ++ public/logos/18_ardennes/9-BY+E.svg | 14 +++++++ public/logos/18_ardennes/9-BY+P.svg | 14 +++++++ public/logos/18_ardennes/9-BY.svg | 4 ++ public/logos/18_ardennes/9-E.svg | 4 ++ public/logos/18_ardennes/9-N.svg | 4 ++ public/logos/18_ardennes/9-NL.svg | 4 ++ public/logos/18_ardennes/9-P.svg | 4 ++ 167 files changed, 1597 insertions(+), 1 deletion(-) create mode 100644 public/logos/18_ardennes/1-BE+N.svg create mode 100644 public/logos/18_ardennes/1-BE+NL+P.svg create mode 100644 public/logos/18_ardennes/1-BE+NL.svg create mode 100644 public/logos/18_ardennes/1-BE.svg create mode 100644 public/logos/18_ardennes/1-BY+E.svg create mode 100644 public/logos/18_ardennes/1-BY+P.svg create mode 100644 public/logos/18_ardennes/1-BY.svg create mode 100644 public/logos/18_ardennes/1-E.svg create mode 100644 public/logos/18_ardennes/1-N.svg create mode 100644 public/logos/18_ardennes/1-NL.svg create mode 100644 public/logos/18_ardennes/1-P.svg create mode 100644 public/logos/18_ardennes/10-BE+N.svg create mode 100644 public/logos/18_ardennes/10-BE+NL+P.svg create mode 100644 public/logos/18_ardennes/10-BE+NL.svg create mode 100644 public/logos/18_ardennes/10-BE.svg create mode 100644 public/logos/18_ardennes/10-BY+E.svg create mode 100644 public/logos/18_ardennes/10-BY+P.svg create mode 100644 public/logos/18_ardennes/10-BY.svg create mode 100644 public/logos/18_ardennes/10-E.svg create mode 100644 public/logos/18_ardennes/10-N.svg create mode 100644 public/logos/18_ardennes/10-NL.svg create mode 100644 public/logos/18_ardennes/10-P.svg create mode 100644 public/logos/18_ardennes/11-BE+N.svg create mode 100644 public/logos/18_ardennes/11-BE+NL+P.svg create mode 100644 public/logos/18_ardennes/11-BE+NL.svg create mode 100644 public/logos/18_ardennes/11-BE.svg create mode 100644 public/logos/18_ardennes/11-BY+E.svg create mode 100644 public/logos/18_ardennes/11-BY+P.svg create mode 100644 public/logos/18_ardennes/11-BY.svg create mode 100644 public/logos/18_ardennes/11-E.svg create mode 100644 public/logos/18_ardennes/11-N.svg create mode 100644 public/logos/18_ardennes/11-NL.svg create mode 100644 public/logos/18_ardennes/11-P.svg create mode 100644 public/logos/18_ardennes/12-BE+N.svg create mode 100644 public/logos/18_ardennes/12-BE+NL+P.svg create mode 100644 public/logos/18_ardennes/12-BE+NL.svg create mode 100644 public/logos/18_ardennes/12-BE.svg create mode 100644 public/logos/18_ardennes/12-BY+E.svg create mode 100644 public/logos/18_ardennes/12-BY+P.svg create mode 100644 public/logos/18_ardennes/12-BY.svg create mode 100644 public/logos/18_ardennes/12-E.svg create mode 100644 public/logos/18_ardennes/12-N.svg create mode 100644 public/logos/18_ardennes/12-NL.svg create mode 100644 public/logos/18_ardennes/12-P.svg create mode 100644 public/logos/18_ardennes/13-BE+N.svg create mode 100644 public/logos/18_ardennes/13-BE+NL+P.svg create mode 100644 public/logos/18_ardennes/13-BE+NL.svg create mode 100644 public/logos/18_ardennes/13-BE.svg create mode 100644 public/logos/18_ardennes/13-BY+E.svg create mode 100644 public/logos/18_ardennes/13-BY+P.svg create mode 100644 public/logos/18_ardennes/13-BY.svg create mode 100644 public/logos/18_ardennes/13-E.svg create mode 100644 public/logos/18_ardennes/13-N.svg create mode 100644 public/logos/18_ardennes/13-NL.svg create mode 100644 public/logos/18_ardennes/13-P.svg create mode 100644 public/logos/18_ardennes/14-BE+N.svg create mode 100644 public/logos/18_ardennes/14-BE+NL+P.svg create mode 100644 public/logos/18_ardennes/14-BE+NL.svg create mode 100644 public/logos/18_ardennes/14-BE.svg create mode 100644 public/logos/18_ardennes/14-BY+E.svg create mode 100644 public/logos/18_ardennes/14-BY+P.svg create mode 100644 public/logos/18_ardennes/14-BY.svg create mode 100644 public/logos/18_ardennes/14-E.svg create mode 100644 public/logos/18_ardennes/14-N.svg create mode 100644 public/logos/18_ardennes/14-NL.svg create mode 100644 public/logos/18_ardennes/14-P.svg create mode 100644 public/logos/18_ardennes/15-BE+N.svg create mode 100644 public/logos/18_ardennes/15-BE+NL+P.svg create mode 100644 public/logos/18_ardennes/15-BE+NL.svg create mode 100644 public/logos/18_ardennes/15-BE.svg create mode 100644 public/logos/18_ardennes/15-BY+E.svg create mode 100644 public/logos/18_ardennes/15-BY+P.svg create mode 100644 public/logos/18_ardennes/15-BY.svg create mode 100644 public/logos/18_ardennes/15-E.svg create mode 100644 public/logos/18_ardennes/15-N.svg create mode 100644 public/logos/18_ardennes/15-NL.svg create mode 100644 public/logos/18_ardennes/15-P.svg create mode 100644 public/logos/18_ardennes/2-BE+N.svg create mode 100644 public/logos/18_ardennes/2-BE+NL+P.svg create mode 100644 public/logos/18_ardennes/2-BE+NL.svg create mode 100644 public/logos/18_ardennes/2-BE.svg create mode 100644 public/logos/18_ardennes/2-BY+E.svg create mode 100644 public/logos/18_ardennes/2-BY+P.svg create mode 100644 public/logos/18_ardennes/2-BY.svg create mode 100644 public/logos/18_ardennes/2-E.svg create mode 100644 public/logos/18_ardennes/2-N.svg create mode 100644 public/logos/18_ardennes/2-NL.svg create mode 100644 public/logos/18_ardennes/2-P.svg create mode 100644 public/logos/18_ardennes/3-BE+N.svg create mode 100644 public/logos/18_ardennes/3-BE+NL+P.svg create mode 100644 public/logos/18_ardennes/3-BE+NL.svg create mode 100644 public/logos/18_ardennes/3-BE.svg create mode 100644 public/logos/18_ardennes/3-BY+E.svg create mode 100644 public/logos/18_ardennes/3-BY+P.svg create mode 100644 public/logos/18_ardennes/3-BY.svg create mode 100644 public/logos/18_ardennes/3-E.svg create mode 100644 public/logos/18_ardennes/3-N.svg create mode 100644 public/logos/18_ardennes/3-NL.svg create mode 100644 public/logos/18_ardennes/3-P.svg create mode 100644 public/logos/18_ardennes/4-BE+N.svg create mode 100644 public/logos/18_ardennes/4-BE+NL+P.svg create mode 100644 public/logos/18_ardennes/4-BE+NL.svg create mode 100644 public/logos/18_ardennes/4-BE.svg create mode 100644 public/logos/18_ardennes/4-BY+E.svg create mode 100644 public/logos/18_ardennes/4-BY+P.svg create mode 100644 public/logos/18_ardennes/4-BY.svg create mode 100644 public/logos/18_ardennes/4-E.svg create mode 100644 public/logos/18_ardennes/4-N.svg create mode 100644 public/logos/18_ardennes/4-NL.svg create mode 100644 public/logos/18_ardennes/4-P.svg create mode 100644 public/logos/18_ardennes/5-BE+N.svg create mode 100644 public/logos/18_ardennes/5-BE+NL+P.svg create mode 100644 public/logos/18_ardennes/5-BE+NL.svg create mode 100644 public/logos/18_ardennes/5-BE.svg create mode 100644 public/logos/18_ardennes/5-BY+E.svg create mode 100644 public/logos/18_ardennes/5-BY+P.svg create mode 100644 public/logos/18_ardennes/5-BY.svg create mode 100644 public/logos/18_ardennes/5-E.svg create mode 100644 public/logos/18_ardennes/5-N.svg create mode 100644 public/logos/18_ardennes/5-NL.svg create mode 100644 public/logos/18_ardennes/5-P.svg create mode 100644 public/logos/18_ardennes/6-BE+N.svg create mode 100644 public/logos/18_ardennes/6-BE+NL+P.svg create mode 100644 public/logos/18_ardennes/6-BE+NL.svg create mode 100644 public/logos/18_ardennes/6-BE.svg create mode 100644 public/logos/18_ardennes/6-BY+E.svg create mode 100644 public/logos/18_ardennes/6-BY+P.svg create mode 100644 public/logos/18_ardennes/6-BY.svg create mode 100644 public/logos/18_ardennes/6-E.svg create mode 100644 public/logos/18_ardennes/6-N.svg create mode 100644 public/logos/18_ardennes/6-NL.svg create mode 100644 public/logos/18_ardennes/6-P.svg create mode 100644 public/logos/18_ardennes/7-BE+N.svg create mode 100644 public/logos/18_ardennes/7-BE+NL+P.svg create mode 100644 public/logos/18_ardennes/7-BE+NL.svg create mode 100644 public/logos/18_ardennes/7-BE.svg create mode 100644 public/logos/18_ardennes/7-BY+E.svg create mode 100644 public/logos/18_ardennes/7-BY+P.svg create mode 100644 public/logos/18_ardennes/7-BY.svg create mode 100644 public/logos/18_ardennes/7-E.svg create mode 100644 public/logos/18_ardennes/7-N.svg create mode 100644 public/logos/18_ardennes/7-NL.svg create mode 100644 public/logos/18_ardennes/7-P.svg create mode 100644 public/logos/18_ardennes/8-BE+N.svg create mode 100644 public/logos/18_ardennes/8-BE+NL+P.svg create mode 100644 public/logos/18_ardennes/8-BE+NL.svg create mode 100644 public/logos/18_ardennes/8-BE.svg create mode 100644 public/logos/18_ardennes/8-BY+E.svg create mode 100644 public/logos/18_ardennes/8-BY+P.svg create mode 100644 public/logos/18_ardennes/8-BY.svg create mode 100644 public/logos/18_ardennes/8-E.svg create mode 100644 public/logos/18_ardennes/8-N.svg create mode 100644 public/logos/18_ardennes/8-NL.svg create mode 100644 public/logos/18_ardennes/8-P.svg create mode 100644 public/logos/18_ardennes/9-BE+N.svg create mode 100644 public/logos/18_ardennes/9-BE+NL+P.svg create mode 100644 public/logos/18_ardennes/9-BE+NL.svg create mode 100644 public/logos/18_ardennes/9-BE.svg create mode 100644 public/logos/18_ardennes/9-BY+E.svg create mode 100644 public/logos/18_ardennes/9-BY+P.svg create mode 100644 public/logos/18_ardennes/9-BY.svg create mode 100644 public/logos/18_ardennes/9-E.svg create mode 100644 public/logos/18_ardennes/9-N.svg create mode 100644 public/logos/18_ardennes/9-NL.svg create mode 100644 public/logos/18_ardennes/9-P.svg diff --git a/lib/engine/game/g_18_ardennes/entities.rb b/lib/engine/game/g_18_ardennes/entities.rb index a2db5c4007..3b3e991cf7 100644 --- a/lib/engine/game/g_18_ardennes/entities.rb +++ b/lib/engine/game/g_18_ardennes/entities.rb @@ -459,6 +459,25 @@ def under_obligation?(entity) entity.companies.any? { |company| company.type == :concession } end + def place_home_token(corporation) + city = cities.find { |c| c.reserved_by?(corporation) } + token = corporation.find_token_by_type + super + change_token_icon(city, token, corporation) + end + + # Set a minor company's token logo to show which public companies can be + # started from the city it is in. + def change_token_icon(city, token, minor) + # TODO: return if after first public company auction round + return unless minor.type == :minor + + majors = associated_majors(city) + return if majors.empty? # Basel + + token.logo = logo_path(majors, minor.id) + end + private # Creates a concession company for each major corporations @@ -497,6 +516,31 @@ def lowest_major_par pp.types.include?(:par_2) end end + + # Finds which public companies can be started from a minor company + # that has a token in this city. + # @param city [City] The city with a minor company's token. + # @return [Array] IDs of the public companies that could be + # started by a minor company with a token in this city. + def associated_majors(city) + coords = city.hex.coordinates + if coords == PARIS_HEX + Array(PARIS_CITIES.key(city.tile.cities.index(city))) + else + PUBLIC_COMPANY_HEXES.select { |_, hexes| hexes.include?(coords) }.keys + end + end + + # Returns the path to a token logo indicating which public companies + # can be started in a city. If minor is not nil, then this logo also + # has the minor company number on it. + # @param majors [Array] The IDs of the major companies. + # @param minor [String] The ID of the minor company (optional). + # @return [String] Path to the logo file. + def logo_path(majors, minor = nil) + minor += '-' if minor + "/logos/18_ardennes/#{minor}#{majors.join('+')}.svg" + end end end end diff --git a/lib/engine/game/g_18_ardennes/step/token.rb b/lib/engine/game/g_18_ardennes/step/token.rb index 7e0428970c..43475fc31e 100644 --- a/lib/engine/game/g_18_ardennes/step/token.rb +++ b/lib/engine/game/g_18_ardennes/step/token.rb @@ -63,12 +63,19 @@ def process_remove_token(action) old_token = city.tokens[action.slot] token_type = @game.dummy_token_type(old_token) old_token.remove! - place_token(corp, city, available_tokens(corp).first) + new_token = available_tokens(corp).first + place_token(corp, city, new_token) + @game.change_token_icon(city, new_token, corp) corp.assign!(city.hex.coordinates) @game.log << "#{corp.id} collects a #{token_type} token from " \ "hex #{hex.coordinates} (#{hex.location_name})" pass! end + + def process_place_token(action) + super + @game.change_token_icon(action.city, action.city.tokens[action.slot], action.entity) + end end end end diff --git a/public/logos/18_ardennes/1-BE+N.svg b/public/logos/18_ardennes/1-BE+N.svg new file mode 100644 index 0000000000..1169a3ac34 --- /dev/null +++ b/public/logos/18_ardennes/1-BE+N.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 1 + diff --git a/public/logos/18_ardennes/1-BE+NL+P.svg b/public/logos/18_ardennes/1-BE+NL+P.svg new file mode 100644 index 0000000000..be90029b55 --- /dev/null +++ b/public/logos/18_ardennes/1-BE+NL+P.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + 1 + diff --git a/public/logos/18_ardennes/1-BE+NL.svg b/public/logos/18_ardennes/1-BE+NL.svg new file mode 100644 index 0000000000..c8d0acddaa --- /dev/null +++ b/public/logos/18_ardennes/1-BE+NL.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 1 + diff --git a/public/logos/18_ardennes/1-BE.svg b/public/logos/18_ardennes/1-BE.svg new file mode 100644 index 0000000000..f99f8df83a --- /dev/null +++ b/public/logos/18_ardennes/1-BE.svg @@ -0,0 +1,4 @@ + + + 1 + diff --git a/public/logos/18_ardennes/1-BY+E.svg b/public/logos/18_ardennes/1-BY+E.svg new file mode 100644 index 0000000000..46b2bb81f4 --- /dev/null +++ b/public/logos/18_ardennes/1-BY+E.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 1 + diff --git a/public/logos/18_ardennes/1-BY+P.svg b/public/logos/18_ardennes/1-BY+P.svg new file mode 100644 index 0000000000..9f9bc08660 --- /dev/null +++ b/public/logos/18_ardennes/1-BY+P.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 1 + diff --git a/public/logos/18_ardennes/1-BY.svg b/public/logos/18_ardennes/1-BY.svg new file mode 100644 index 0000000000..dd249ae251 --- /dev/null +++ b/public/logos/18_ardennes/1-BY.svg @@ -0,0 +1,4 @@ + + + 1 + diff --git a/public/logos/18_ardennes/1-E.svg b/public/logos/18_ardennes/1-E.svg new file mode 100644 index 0000000000..3e9afa1e19 --- /dev/null +++ b/public/logos/18_ardennes/1-E.svg @@ -0,0 +1,4 @@ + + + 1 + diff --git a/public/logos/18_ardennes/1-N.svg b/public/logos/18_ardennes/1-N.svg new file mode 100644 index 0000000000..ff479a73f5 --- /dev/null +++ b/public/logos/18_ardennes/1-N.svg @@ -0,0 +1,4 @@ + + + 1 + diff --git a/public/logos/18_ardennes/1-NL.svg b/public/logos/18_ardennes/1-NL.svg new file mode 100644 index 0000000000..58b6fb5993 --- /dev/null +++ b/public/logos/18_ardennes/1-NL.svg @@ -0,0 +1,4 @@ + + + 1 + diff --git a/public/logos/18_ardennes/1-P.svg b/public/logos/18_ardennes/1-P.svg new file mode 100644 index 0000000000..a68bd02af2 --- /dev/null +++ b/public/logos/18_ardennes/1-P.svg @@ -0,0 +1,4 @@ + + + 1 + diff --git a/public/logos/18_ardennes/10-BE+N.svg b/public/logos/18_ardennes/10-BE+N.svg new file mode 100644 index 0000000000..ac5e133cb4 --- /dev/null +++ b/public/logos/18_ardennes/10-BE+N.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 10 + diff --git a/public/logos/18_ardennes/10-BE+NL+P.svg b/public/logos/18_ardennes/10-BE+NL+P.svg new file mode 100644 index 0000000000..79ac309c26 --- /dev/null +++ b/public/logos/18_ardennes/10-BE+NL+P.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + 10 + diff --git a/public/logos/18_ardennes/10-BE+NL.svg b/public/logos/18_ardennes/10-BE+NL.svg new file mode 100644 index 0000000000..06abce2d93 --- /dev/null +++ b/public/logos/18_ardennes/10-BE+NL.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 10 + diff --git a/public/logos/18_ardennes/10-BE.svg b/public/logos/18_ardennes/10-BE.svg new file mode 100644 index 0000000000..bd0eae91a1 --- /dev/null +++ b/public/logos/18_ardennes/10-BE.svg @@ -0,0 +1,4 @@ + + + 10 + diff --git a/public/logos/18_ardennes/10-BY+E.svg b/public/logos/18_ardennes/10-BY+E.svg new file mode 100644 index 0000000000..30d548de8d --- /dev/null +++ b/public/logos/18_ardennes/10-BY+E.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 10 + diff --git a/public/logos/18_ardennes/10-BY+P.svg b/public/logos/18_ardennes/10-BY+P.svg new file mode 100644 index 0000000000..0af4d8bcc7 --- /dev/null +++ b/public/logos/18_ardennes/10-BY+P.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 10 + diff --git a/public/logos/18_ardennes/10-BY.svg b/public/logos/18_ardennes/10-BY.svg new file mode 100644 index 0000000000..358bc785c3 --- /dev/null +++ b/public/logos/18_ardennes/10-BY.svg @@ -0,0 +1,4 @@ + + + 10 + diff --git a/public/logos/18_ardennes/10-E.svg b/public/logos/18_ardennes/10-E.svg new file mode 100644 index 0000000000..a8f61ee0a2 --- /dev/null +++ b/public/logos/18_ardennes/10-E.svg @@ -0,0 +1,4 @@ + + + 10 + diff --git a/public/logos/18_ardennes/10-N.svg b/public/logos/18_ardennes/10-N.svg new file mode 100644 index 0000000000..9afa0291f1 --- /dev/null +++ b/public/logos/18_ardennes/10-N.svg @@ -0,0 +1,4 @@ + + + 10 + diff --git a/public/logos/18_ardennes/10-NL.svg b/public/logos/18_ardennes/10-NL.svg new file mode 100644 index 0000000000..b290a1ec4e --- /dev/null +++ b/public/logos/18_ardennes/10-NL.svg @@ -0,0 +1,4 @@ + + + 10 + diff --git a/public/logos/18_ardennes/10-P.svg b/public/logos/18_ardennes/10-P.svg new file mode 100644 index 0000000000..d8dfb178c0 --- /dev/null +++ b/public/logos/18_ardennes/10-P.svg @@ -0,0 +1,4 @@ + + + 10 + diff --git a/public/logos/18_ardennes/11-BE+N.svg b/public/logos/18_ardennes/11-BE+N.svg new file mode 100644 index 0000000000..1d7290ee2f --- /dev/null +++ b/public/logos/18_ardennes/11-BE+N.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 11 + diff --git a/public/logos/18_ardennes/11-BE+NL+P.svg b/public/logos/18_ardennes/11-BE+NL+P.svg new file mode 100644 index 0000000000..dccefcdea5 --- /dev/null +++ b/public/logos/18_ardennes/11-BE+NL+P.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + 11 + diff --git a/public/logos/18_ardennes/11-BE+NL.svg b/public/logos/18_ardennes/11-BE+NL.svg new file mode 100644 index 0000000000..b8b5a06c14 --- /dev/null +++ b/public/logos/18_ardennes/11-BE+NL.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 11 + diff --git a/public/logos/18_ardennes/11-BE.svg b/public/logos/18_ardennes/11-BE.svg new file mode 100644 index 0000000000..d722b218d2 --- /dev/null +++ b/public/logos/18_ardennes/11-BE.svg @@ -0,0 +1,4 @@ + + + 11 + diff --git a/public/logos/18_ardennes/11-BY+E.svg b/public/logos/18_ardennes/11-BY+E.svg new file mode 100644 index 0000000000..99edaec7ae --- /dev/null +++ b/public/logos/18_ardennes/11-BY+E.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 11 + diff --git a/public/logos/18_ardennes/11-BY+P.svg b/public/logos/18_ardennes/11-BY+P.svg new file mode 100644 index 0000000000..e956354d81 --- /dev/null +++ b/public/logos/18_ardennes/11-BY+P.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 11 + diff --git a/public/logos/18_ardennes/11-BY.svg b/public/logos/18_ardennes/11-BY.svg new file mode 100644 index 0000000000..3c0defb5a6 --- /dev/null +++ b/public/logos/18_ardennes/11-BY.svg @@ -0,0 +1,4 @@ + + + 11 + diff --git a/public/logos/18_ardennes/11-E.svg b/public/logos/18_ardennes/11-E.svg new file mode 100644 index 0000000000..5581a9f3c8 --- /dev/null +++ b/public/logos/18_ardennes/11-E.svg @@ -0,0 +1,4 @@ + + + 11 + diff --git a/public/logos/18_ardennes/11-N.svg b/public/logos/18_ardennes/11-N.svg new file mode 100644 index 0000000000..a0bd967199 --- /dev/null +++ b/public/logos/18_ardennes/11-N.svg @@ -0,0 +1,4 @@ + + + 11 + diff --git a/public/logos/18_ardennes/11-NL.svg b/public/logos/18_ardennes/11-NL.svg new file mode 100644 index 0000000000..ac3e9af2f0 --- /dev/null +++ b/public/logos/18_ardennes/11-NL.svg @@ -0,0 +1,4 @@ + + + 11 + diff --git a/public/logos/18_ardennes/11-P.svg b/public/logos/18_ardennes/11-P.svg new file mode 100644 index 0000000000..3301666d7f --- /dev/null +++ b/public/logos/18_ardennes/11-P.svg @@ -0,0 +1,4 @@ + + + 11 + diff --git a/public/logos/18_ardennes/12-BE+N.svg b/public/logos/18_ardennes/12-BE+N.svg new file mode 100644 index 0000000000..eb4d6f5ca6 --- /dev/null +++ b/public/logos/18_ardennes/12-BE+N.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 12 + diff --git a/public/logos/18_ardennes/12-BE+NL+P.svg b/public/logos/18_ardennes/12-BE+NL+P.svg new file mode 100644 index 0000000000..dda4611d98 --- /dev/null +++ b/public/logos/18_ardennes/12-BE+NL+P.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + 12 + diff --git a/public/logos/18_ardennes/12-BE+NL.svg b/public/logos/18_ardennes/12-BE+NL.svg new file mode 100644 index 0000000000..eb552063d2 --- /dev/null +++ b/public/logos/18_ardennes/12-BE+NL.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 12 + diff --git a/public/logos/18_ardennes/12-BE.svg b/public/logos/18_ardennes/12-BE.svg new file mode 100644 index 0000000000..854b5ccfca --- /dev/null +++ b/public/logos/18_ardennes/12-BE.svg @@ -0,0 +1,4 @@ + + + 12 + diff --git a/public/logos/18_ardennes/12-BY+E.svg b/public/logos/18_ardennes/12-BY+E.svg new file mode 100644 index 0000000000..27700a9c54 --- /dev/null +++ b/public/logos/18_ardennes/12-BY+E.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 12 + diff --git a/public/logos/18_ardennes/12-BY+P.svg b/public/logos/18_ardennes/12-BY+P.svg new file mode 100644 index 0000000000..a02050725c --- /dev/null +++ b/public/logos/18_ardennes/12-BY+P.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 12 + diff --git a/public/logos/18_ardennes/12-BY.svg b/public/logos/18_ardennes/12-BY.svg new file mode 100644 index 0000000000..58fdc278ff --- /dev/null +++ b/public/logos/18_ardennes/12-BY.svg @@ -0,0 +1,4 @@ + + + 12 + diff --git a/public/logos/18_ardennes/12-E.svg b/public/logos/18_ardennes/12-E.svg new file mode 100644 index 0000000000..ba1abdf80d --- /dev/null +++ b/public/logos/18_ardennes/12-E.svg @@ -0,0 +1,4 @@ + + + 12 + diff --git a/public/logos/18_ardennes/12-N.svg b/public/logos/18_ardennes/12-N.svg new file mode 100644 index 0000000000..2419513e46 --- /dev/null +++ b/public/logos/18_ardennes/12-N.svg @@ -0,0 +1,4 @@ + + + 12 + diff --git a/public/logos/18_ardennes/12-NL.svg b/public/logos/18_ardennes/12-NL.svg new file mode 100644 index 0000000000..ce2d1357f7 --- /dev/null +++ b/public/logos/18_ardennes/12-NL.svg @@ -0,0 +1,4 @@ + + + 12 + diff --git a/public/logos/18_ardennes/12-P.svg b/public/logos/18_ardennes/12-P.svg new file mode 100644 index 0000000000..e25ea81073 --- /dev/null +++ b/public/logos/18_ardennes/12-P.svg @@ -0,0 +1,4 @@ + + + 12 + diff --git a/public/logos/18_ardennes/13-BE+N.svg b/public/logos/18_ardennes/13-BE+N.svg new file mode 100644 index 0000000000..cb93e4cf37 --- /dev/null +++ b/public/logos/18_ardennes/13-BE+N.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 13 + diff --git a/public/logos/18_ardennes/13-BE+NL+P.svg b/public/logos/18_ardennes/13-BE+NL+P.svg new file mode 100644 index 0000000000..05b0399bfa --- /dev/null +++ b/public/logos/18_ardennes/13-BE+NL+P.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + 13 + diff --git a/public/logos/18_ardennes/13-BE+NL.svg b/public/logos/18_ardennes/13-BE+NL.svg new file mode 100644 index 0000000000..a8d7be10d6 --- /dev/null +++ b/public/logos/18_ardennes/13-BE+NL.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 13 + diff --git a/public/logos/18_ardennes/13-BE.svg b/public/logos/18_ardennes/13-BE.svg new file mode 100644 index 0000000000..8f0f19f77f --- /dev/null +++ b/public/logos/18_ardennes/13-BE.svg @@ -0,0 +1,4 @@ + + + 13 + diff --git a/public/logos/18_ardennes/13-BY+E.svg b/public/logos/18_ardennes/13-BY+E.svg new file mode 100644 index 0000000000..3767306abb --- /dev/null +++ b/public/logos/18_ardennes/13-BY+E.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 13 + diff --git a/public/logos/18_ardennes/13-BY+P.svg b/public/logos/18_ardennes/13-BY+P.svg new file mode 100644 index 0000000000..73f2f5b519 --- /dev/null +++ b/public/logos/18_ardennes/13-BY+P.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 13 + diff --git a/public/logos/18_ardennes/13-BY.svg b/public/logos/18_ardennes/13-BY.svg new file mode 100644 index 0000000000..1616bf2acb --- /dev/null +++ b/public/logos/18_ardennes/13-BY.svg @@ -0,0 +1,4 @@ + + + 13 + diff --git a/public/logos/18_ardennes/13-E.svg b/public/logos/18_ardennes/13-E.svg new file mode 100644 index 0000000000..4174a662aa --- /dev/null +++ b/public/logos/18_ardennes/13-E.svg @@ -0,0 +1,4 @@ + + + 13 + diff --git a/public/logos/18_ardennes/13-N.svg b/public/logos/18_ardennes/13-N.svg new file mode 100644 index 0000000000..8d47933301 --- /dev/null +++ b/public/logos/18_ardennes/13-N.svg @@ -0,0 +1,4 @@ + + + 13 + diff --git a/public/logos/18_ardennes/13-NL.svg b/public/logos/18_ardennes/13-NL.svg new file mode 100644 index 0000000000..0f400ad627 --- /dev/null +++ b/public/logos/18_ardennes/13-NL.svg @@ -0,0 +1,4 @@ + + + 13 + diff --git a/public/logos/18_ardennes/13-P.svg b/public/logos/18_ardennes/13-P.svg new file mode 100644 index 0000000000..368d39ee3b --- /dev/null +++ b/public/logos/18_ardennes/13-P.svg @@ -0,0 +1,4 @@ + + + 13 + diff --git a/public/logos/18_ardennes/14-BE+N.svg b/public/logos/18_ardennes/14-BE+N.svg new file mode 100644 index 0000000000..53764563a1 --- /dev/null +++ b/public/logos/18_ardennes/14-BE+N.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 14 + diff --git a/public/logos/18_ardennes/14-BE+NL+P.svg b/public/logos/18_ardennes/14-BE+NL+P.svg new file mode 100644 index 0000000000..cfffd61886 --- /dev/null +++ b/public/logos/18_ardennes/14-BE+NL+P.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + 14 + diff --git a/public/logos/18_ardennes/14-BE+NL.svg b/public/logos/18_ardennes/14-BE+NL.svg new file mode 100644 index 0000000000..1e9f4d6b0f --- /dev/null +++ b/public/logos/18_ardennes/14-BE+NL.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 14 + diff --git a/public/logos/18_ardennes/14-BE.svg b/public/logos/18_ardennes/14-BE.svg new file mode 100644 index 0000000000..902a0b8b37 --- /dev/null +++ b/public/logos/18_ardennes/14-BE.svg @@ -0,0 +1,4 @@ + + + 14 + diff --git a/public/logos/18_ardennes/14-BY+E.svg b/public/logos/18_ardennes/14-BY+E.svg new file mode 100644 index 0000000000..dcb637151e --- /dev/null +++ b/public/logos/18_ardennes/14-BY+E.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 14 + diff --git a/public/logos/18_ardennes/14-BY+P.svg b/public/logos/18_ardennes/14-BY+P.svg new file mode 100644 index 0000000000..83d4824761 --- /dev/null +++ b/public/logos/18_ardennes/14-BY+P.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 14 + diff --git a/public/logos/18_ardennes/14-BY.svg b/public/logos/18_ardennes/14-BY.svg new file mode 100644 index 0000000000..40bf27a92c --- /dev/null +++ b/public/logos/18_ardennes/14-BY.svg @@ -0,0 +1,4 @@ + + + 14 + diff --git a/public/logos/18_ardennes/14-E.svg b/public/logos/18_ardennes/14-E.svg new file mode 100644 index 0000000000..0bcccd3946 --- /dev/null +++ b/public/logos/18_ardennes/14-E.svg @@ -0,0 +1,4 @@ + + + 14 + diff --git a/public/logos/18_ardennes/14-N.svg b/public/logos/18_ardennes/14-N.svg new file mode 100644 index 0000000000..5176c0ee99 --- /dev/null +++ b/public/logos/18_ardennes/14-N.svg @@ -0,0 +1,4 @@ + + + 14 + diff --git a/public/logos/18_ardennes/14-NL.svg b/public/logos/18_ardennes/14-NL.svg new file mode 100644 index 0000000000..3f395ff77b --- /dev/null +++ b/public/logos/18_ardennes/14-NL.svg @@ -0,0 +1,4 @@ + + + 14 + diff --git a/public/logos/18_ardennes/14-P.svg b/public/logos/18_ardennes/14-P.svg new file mode 100644 index 0000000000..ecb150b3d5 --- /dev/null +++ b/public/logos/18_ardennes/14-P.svg @@ -0,0 +1,4 @@ + + + 14 + diff --git a/public/logos/18_ardennes/15-BE+N.svg b/public/logos/18_ardennes/15-BE+N.svg new file mode 100644 index 0000000000..eeb8e33414 --- /dev/null +++ b/public/logos/18_ardennes/15-BE+N.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 15 + diff --git a/public/logos/18_ardennes/15-BE+NL+P.svg b/public/logos/18_ardennes/15-BE+NL+P.svg new file mode 100644 index 0000000000..2a40b7b8a0 --- /dev/null +++ b/public/logos/18_ardennes/15-BE+NL+P.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + 15 + diff --git a/public/logos/18_ardennes/15-BE+NL.svg b/public/logos/18_ardennes/15-BE+NL.svg new file mode 100644 index 0000000000..9fc7928728 --- /dev/null +++ b/public/logos/18_ardennes/15-BE+NL.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 15 + diff --git a/public/logos/18_ardennes/15-BE.svg b/public/logos/18_ardennes/15-BE.svg new file mode 100644 index 0000000000..c4a95cf11f --- /dev/null +++ b/public/logos/18_ardennes/15-BE.svg @@ -0,0 +1,4 @@ + + + 15 + diff --git a/public/logos/18_ardennes/15-BY+E.svg b/public/logos/18_ardennes/15-BY+E.svg new file mode 100644 index 0000000000..66767748be --- /dev/null +++ b/public/logos/18_ardennes/15-BY+E.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 15 + diff --git a/public/logos/18_ardennes/15-BY+P.svg b/public/logos/18_ardennes/15-BY+P.svg new file mode 100644 index 0000000000..fea83a5e4c --- /dev/null +++ b/public/logos/18_ardennes/15-BY+P.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 15 + diff --git a/public/logos/18_ardennes/15-BY.svg b/public/logos/18_ardennes/15-BY.svg new file mode 100644 index 0000000000..ee6c7b8c25 --- /dev/null +++ b/public/logos/18_ardennes/15-BY.svg @@ -0,0 +1,4 @@ + + + 15 + diff --git a/public/logos/18_ardennes/15-E.svg b/public/logos/18_ardennes/15-E.svg new file mode 100644 index 0000000000..2f79e97c64 --- /dev/null +++ b/public/logos/18_ardennes/15-E.svg @@ -0,0 +1,4 @@ + + + 15 + diff --git a/public/logos/18_ardennes/15-N.svg b/public/logos/18_ardennes/15-N.svg new file mode 100644 index 0000000000..7e7e0bc732 --- /dev/null +++ b/public/logos/18_ardennes/15-N.svg @@ -0,0 +1,4 @@ + + + 15 + diff --git a/public/logos/18_ardennes/15-NL.svg b/public/logos/18_ardennes/15-NL.svg new file mode 100644 index 0000000000..367fba50fb --- /dev/null +++ b/public/logos/18_ardennes/15-NL.svg @@ -0,0 +1,4 @@ + + + 15 + diff --git a/public/logos/18_ardennes/15-P.svg b/public/logos/18_ardennes/15-P.svg new file mode 100644 index 0000000000..11861a8862 --- /dev/null +++ b/public/logos/18_ardennes/15-P.svg @@ -0,0 +1,4 @@ + + + 15 + diff --git a/public/logos/18_ardennes/2-BE+N.svg b/public/logos/18_ardennes/2-BE+N.svg new file mode 100644 index 0000000000..3a3524ceb0 --- /dev/null +++ b/public/logos/18_ardennes/2-BE+N.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 2 + diff --git a/public/logos/18_ardennes/2-BE+NL+P.svg b/public/logos/18_ardennes/2-BE+NL+P.svg new file mode 100644 index 0000000000..b7d9ee2a3b --- /dev/null +++ b/public/logos/18_ardennes/2-BE+NL+P.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + 2 + diff --git a/public/logos/18_ardennes/2-BE+NL.svg b/public/logos/18_ardennes/2-BE+NL.svg new file mode 100644 index 0000000000..b1ca61ea5e --- /dev/null +++ b/public/logos/18_ardennes/2-BE+NL.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 2 + diff --git a/public/logos/18_ardennes/2-BE.svg b/public/logos/18_ardennes/2-BE.svg new file mode 100644 index 0000000000..16f935de3e --- /dev/null +++ b/public/logos/18_ardennes/2-BE.svg @@ -0,0 +1,4 @@ + + + 2 + diff --git a/public/logos/18_ardennes/2-BY+E.svg b/public/logos/18_ardennes/2-BY+E.svg new file mode 100644 index 0000000000..547cfda5a0 --- /dev/null +++ b/public/logos/18_ardennes/2-BY+E.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 2 + diff --git a/public/logos/18_ardennes/2-BY+P.svg b/public/logos/18_ardennes/2-BY+P.svg new file mode 100644 index 0000000000..311f6cf256 --- /dev/null +++ b/public/logos/18_ardennes/2-BY+P.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 2 + diff --git a/public/logos/18_ardennes/2-BY.svg b/public/logos/18_ardennes/2-BY.svg new file mode 100644 index 0000000000..6c29274686 --- /dev/null +++ b/public/logos/18_ardennes/2-BY.svg @@ -0,0 +1,4 @@ + + + 2 + diff --git a/public/logos/18_ardennes/2-E.svg b/public/logos/18_ardennes/2-E.svg new file mode 100644 index 0000000000..a86d5ecf1c --- /dev/null +++ b/public/logos/18_ardennes/2-E.svg @@ -0,0 +1,4 @@ + + + 2 + diff --git a/public/logos/18_ardennes/2-N.svg b/public/logos/18_ardennes/2-N.svg new file mode 100644 index 0000000000..5a146885a4 --- /dev/null +++ b/public/logos/18_ardennes/2-N.svg @@ -0,0 +1,4 @@ + + + 2 + diff --git a/public/logos/18_ardennes/2-NL.svg b/public/logos/18_ardennes/2-NL.svg new file mode 100644 index 0000000000..6eb7d9637b --- /dev/null +++ b/public/logos/18_ardennes/2-NL.svg @@ -0,0 +1,4 @@ + + + 2 + diff --git a/public/logos/18_ardennes/2-P.svg b/public/logos/18_ardennes/2-P.svg new file mode 100644 index 0000000000..f50504c872 --- /dev/null +++ b/public/logos/18_ardennes/2-P.svg @@ -0,0 +1,4 @@ + + + 2 + diff --git a/public/logos/18_ardennes/3-BE+N.svg b/public/logos/18_ardennes/3-BE+N.svg new file mode 100644 index 0000000000..ae42a7c366 --- /dev/null +++ b/public/logos/18_ardennes/3-BE+N.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 3 + diff --git a/public/logos/18_ardennes/3-BE+NL+P.svg b/public/logos/18_ardennes/3-BE+NL+P.svg new file mode 100644 index 0000000000..f66e27f74c --- /dev/null +++ b/public/logos/18_ardennes/3-BE+NL+P.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + 3 + diff --git a/public/logos/18_ardennes/3-BE+NL.svg b/public/logos/18_ardennes/3-BE+NL.svg new file mode 100644 index 0000000000..619d932868 --- /dev/null +++ b/public/logos/18_ardennes/3-BE+NL.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 3 + diff --git a/public/logos/18_ardennes/3-BE.svg b/public/logos/18_ardennes/3-BE.svg new file mode 100644 index 0000000000..e4d3f8c75b --- /dev/null +++ b/public/logos/18_ardennes/3-BE.svg @@ -0,0 +1,4 @@ + + + 3 + diff --git a/public/logos/18_ardennes/3-BY+E.svg b/public/logos/18_ardennes/3-BY+E.svg new file mode 100644 index 0000000000..0c041d2a2a --- /dev/null +++ b/public/logos/18_ardennes/3-BY+E.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 3 + diff --git a/public/logos/18_ardennes/3-BY+P.svg b/public/logos/18_ardennes/3-BY+P.svg new file mode 100644 index 0000000000..da77a1e690 --- /dev/null +++ b/public/logos/18_ardennes/3-BY+P.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 3 + diff --git a/public/logos/18_ardennes/3-BY.svg b/public/logos/18_ardennes/3-BY.svg new file mode 100644 index 0000000000..38c7fd6c3c --- /dev/null +++ b/public/logos/18_ardennes/3-BY.svg @@ -0,0 +1,4 @@ + + + 3 + diff --git a/public/logos/18_ardennes/3-E.svg b/public/logos/18_ardennes/3-E.svg new file mode 100644 index 0000000000..1d2b8969b5 --- /dev/null +++ b/public/logos/18_ardennes/3-E.svg @@ -0,0 +1,4 @@ + + + 3 + diff --git a/public/logos/18_ardennes/3-N.svg b/public/logos/18_ardennes/3-N.svg new file mode 100644 index 0000000000..d19012a4a3 --- /dev/null +++ b/public/logos/18_ardennes/3-N.svg @@ -0,0 +1,4 @@ + + + 3 + diff --git a/public/logos/18_ardennes/3-NL.svg b/public/logos/18_ardennes/3-NL.svg new file mode 100644 index 0000000000..0aed758a10 --- /dev/null +++ b/public/logos/18_ardennes/3-NL.svg @@ -0,0 +1,4 @@ + + + 3 + diff --git a/public/logos/18_ardennes/3-P.svg b/public/logos/18_ardennes/3-P.svg new file mode 100644 index 0000000000..b22f8ff04b --- /dev/null +++ b/public/logos/18_ardennes/3-P.svg @@ -0,0 +1,4 @@ + + + 3 + diff --git a/public/logos/18_ardennes/4-BE+N.svg b/public/logos/18_ardennes/4-BE+N.svg new file mode 100644 index 0000000000..31c6a527b3 --- /dev/null +++ b/public/logos/18_ardennes/4-BE+N.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 4 + diff --git a/public/logos/18_ardennes/4-BE+NL+P.svg b/public/logos/18_ardennes/4-BE+NL+P.svg new file mode 100644 index 0000000000..8564a65ca0 --- /dev/null +++ b/public/logos/18_ardennes/4-BE+NL+P.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + 4 + diff --git a/public/logos/18_ardennes/4-BE+NL.svg b/public/logos/18_ardennes/4-BE+NL.svg new file mode 100644 index 0000000000..7c9e7af118 --- /dev/null +++ b/public/logos/18_ardennes/4-BE+NL.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 4 + diff --git a/public/logos/18_ardennes/4-BE.svg b/public/logos/18_ardennes/4-BE.svg new file mode 100644 index 0000000000..dafe2c5452 --- /dev/null +++ b/public/logos/18_ardennes/4-BE.svg @@ -0,0 +1,4 @@ + + + 4 + diff --git a/public/logos/18_ardennes/4-BY+E.svg b/public/logos/18_ardennes/4-BY+E.svg new file mode 100644 index 0000000000..69e0239543 --- /dev/null +++ b/public/logos/18_ardennes/4-BY+E.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 4 + diff --git a/public/logos/18_ardennes/4-BY+P.svg b/public/logos/18_ardennes/4-BY+P.svg new file mode 100644 index 0000000000..ec859a9e00 --- /dev/null +++ b/public/logos/18_ardennes/4-BY+P.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 4 + diff --git a/public/logos/18_ardennes/4-BY.svg b/public/logos/18_ardennes/4-BY.svg new file mode 100644 index 0000000000..a44ea853f9 --- /dev/null +++ b/public/logos/18_ardennes/4-BY.svg @@ -0,0 +1,4 @@ + + + 4 + diff --git a/public/logos/18_ardennes/4-E.svg b/public/logos/18_ardennes/4-E.svg new file mode 100644 index 0000000000..21c0ae4355 --- /dev/null +++ b/public/logos/18_ardennes/4-E.svg @@ -0,0 +1,4 @@ + + + 4 + diff --git a/public/logos/18_ardennes/4-N.svg b/public/logos/18_ardennes/4-N.svg new file mode 100644 index 0000000000..40f7e6187f --- /dev/null +++ b/public/logos/18_ardennes/4-N.svg @@ -0,0 +1,4 @@ + + + 4 + diff --git a/public/logos/18_ardennes/4-NL.svg b/public/logos/18_ardennes/4-NL.svg new file mode 100644 index 0000000000..2795dc60c5 --- /dev/null +++ b/public/logos/18_ardennes/4-NL.svg @@ -0,0 +1,4 @@ + + + 4 + diff --git a/public/logos/18_ardennes/4-P.svg b/public/logos/18_ardennes/4-P.svg new file mode 100644 index 0000000000..3051a00df3 --- /dev/null +++ b/public/logos/18_ardennes/4-P.svg @@ -0,0 +1,4 @@ + + + 4 + diff --git a/public/logos/18_ardennes/5-BE+N.svg b/public/logos/18_ardennes/5-BE+N.svg new file mode 100644 index 0000000000..f1fb23a9c0 --- /dev/null +++ b/public/logos/18_ardennes/5-BE+N.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 5 + diff --git a/public/logos/18_ardennes/5-BE+NL+P.svg b/public/logos/18_ardennes/5-BE+NL+P.svg new file mode 100644 index 0000000000..262eac9aa2 --- /dev/null +++ b/public/logos/18_ardennes/5-BE+NL+P.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + 5 + diff --git a/public/logos/18_ardennes/5-BE+NL.svg b/public/logos/18_ardennes/5-BE+NL.svg new file mode 100644 index 0000000000..0dd1ab881d --- /dev/null +++ b/public/logos/18_ardennes/5-BE+NL.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 5 + diff --git a/public/logos/18_ardennes/5-BE.svg b/public/logos/18_ardennes/5-BE.svg new file mode 100644 index 0000000000..2303f46acd --- /dev/null +++ b/public/logos/18_ardennes/5-BE.svg @@ -0,0 +1,4 @@ + + + 5 + diff --git a/public/logos/18_ardennes/5-BY+E.svg b/public/logos/18_ardennes/5-BY+E.svg new file mode 100644 index 0000000000..a4cf233df7 --- /dev/null +++ b/public/logos/18_ardennes/5-BY+E.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 5 + diff --git a/public/logos/18_ardennes/5-BY+P.svg b/public/logos/18_ardennes/5-BY+P.svg new file mode 100644 index 0000000000..1abf8c8eaa --- /dev/null +++ b/public/logos/18_ardennes/5-BY+P.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 5 + diff --git a/public/logos/18_ardennes/5-BY.svg b/public/logos/18_ardennes/5-BY.svg new file mode 100644 index 0000000000..da4a5f0126 --- /dev/null +++ b/public/logos/18_ardennes/5-BY.svg @@ -0,0 +1,4 @@ + + + 5 + diff --git a/public/logos/18_ardennes/5-E.svg b/public/logos/18_ardennes/5-E.svg new file mode 100644 index 0000000000..fd5ca79846 --- /dev/null +++ b/public/logos/18_ardennes/5-E.svg @@ -0,0 +1,4 @@ + + + 5 + diff --git a/public/logos/18_ardennes/5-N.svg b/public/logos/18_ardennes/5-N.svg new file mode 100644 index 0000000000..d190fe78a8 --- /dev/null +++ b/public/logos/18_ardennes/5-N.svg @@ -0,0 +1,4 @@ + + + 5 + diff --git a/public/logos/18_ardennes/5-NL.svg b/public/logos/18_ardennes/5-NL.svg new file mode 100644 index 0000000000..f25796fb6e --- /dev/null +++ b/public/logos/18_ardennes/5-NL.svg @@ -0,0 +1,4 @@ + + + 5 + diff --git a/public/logos/18_ardennes/5-P.svg b/public/logos/18_ardennes/5-P.svg new file mode 100644 index 0000000000..b6631c96bc --- /dev/null +++ b/public/logos/18_ardennes/5-P.svg @@ -0,0 +1,4 @@ + + + 5 + diff --git a/public/logos/18_ardennes/6-BE+N.svg b/public/logos/18_ardennes/6-BE+N.svg new file mode 100644 index 0000000000..e71c579244 --- /dev/null +++ b/public/logos/18_ardennes/6-BE+N.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 6 + diff --git a/public/logos/18_ardennes/6-BE+NL+P.svg b/public/logos/18_ardennes/6-BE+NL+P.svg new file mode 100644 index 0000000000..b7f511da63 --- /dev/null +++ b/public/logos/18_ardennes/6-BE+NL+P.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + 6 + diff --git a/public/logos/18_ardennes/6-BE+NL.svg b/public/logos/18_ardennes/6-BE+NL.svg new file mode 100644 index 0000000000..7746961ed0 --- /dev/null +++ b/public/logos/18_ardennes/6-BE+NL.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 6 + diff --git a/public/logos/18_ardennes/6-BE.svg b/public/logos/18_ardennes/6-BE.svg new file mode 100644 index 0000000000..822d67b130 --- /dev/null +++ b/public/logos/18_ardennes/6-BE.svg @@ -0,0 +1,4 @@ + + + 6 + diff --git a/public/logos/18_ardennes/6-BY+E.svg b/public/logos/18_ardennes/6-BY+E.svg new file mode 100644 index 0000000000..f700c7891e --- /dev/null +++ b/public/logos/18_ardennes/6-BY+E.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 6 + diff --git a/public/logos/18_ardennes/6-BY+P.svg b/public/logos/18_ardennes/6-BY+P.svg new file mode 100644 index 0000000000..eb7103a948 --- /dev/null +++ b/public/logos/18_ardennes/6-BY+P.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 6 + diff --git a/public/logos/18_ardennes/6-BY.svg b/public/logos/18_ardennes/6-BY.svg new file mode 100644 index 0000000000..c8e1fa9f21 --- /dev/null +++ b/public/logos/18_ardennes/6-BY.svg @@ -0,0 +1,4 @@ + + + 6 + diff --git a/public/logos/18_ardennes/6-E.svg b/public/logos/18_ardennes/6-E.svg new file mode 100644 index 0000000000..d92ede238b --- /dev/null +++ b/public/logos/18_ardennes/6-E.svg @@ -0,0 +1,4 @@ + + + 6 + diff --git a/public/logos/18_ardennes/6-N.svg b/public/logos/18_ardennes/6-N.svg new file mode 100644 index 0000000000..c2768b00f2 --- /dev/null +++ b/public/logos/18_ardennes/6-N.svg @@ -0,0 +1,4 @@ + + + 6 + diff --git a/public/logos/18_ardennes/6-NL.svg b/public/logos/18_ardennes/6-NL.svg new file mode 100644 index 0000000000..a2ce7e1972 --- /dev/null +++ b/public/logos/18_ardennes/6-NL.svg @@ -0,0 +1,4 @@ + + + 6 + diff --git a/public/logos/18_ardennes/6-P.svg b/public/logos/18_ardennes/6-P.svg new file mode 100644 index 0000000000..880ce14d6c --- /dev/null +++ b/public/logos/18_ardennes/6-P.svg @@ -0,0 +1,4 @@ + + + 6 + diff --git a/public/logos/18_ardennes/7-BE+N.svg b/public/logos/18_ardennes/7-BE+N.svg new file mode 100644 index 0000000000..973233c8fd --- /dev/null +++ b/public/logos/18_ardennes/7-BE+N.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 7 + diff --git a/public/logos/18_ardennes/7-BE+NL+P.svg b/public/logos/18_ardennes/7-BE+NL+P.svg new file mode 100644 index 0000000000..7103af2ecf --- /dev/null +++ b/public/logos/18_ardennes/7-BE+NL+P.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + 7 + diff --git a/public/logos/18_ardennes/7-BE+NL.svg b/public/logos/18_ardennes/7-BE+NL.svg new file mode 100644 index 0000000000..7f9bf40422 --- /dev/null +++ b/public/logos/18_ardennes/7-BE+NL.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 7 + diff --git a/public/logos/18_ardennes/7-BE.svg b/public/logos/18_ardennes/7-BE.svg new file mode 100644 index 0000000000..4824317d28 --- /dev/null +++ b/public/logos/18_ardennes/7-BE.svg @@ -0,0 +1,4 @@ + + + 7 + diff --git a/public/logos/18_ardennes/7-BY+E.svg b/public/logos/18_ardennes/7-BY+E.svg new file mode 100644 index 0000000000..ec26722f4e --- /dev/null +++ b/public/logos/18_ardennes/7-BY+E.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 7 + diff --git a/public/logos/18_ardennes/7-BY+P.svg b/public/logos/18_ardennes/7-BY+P.svg new file mode 100644 index 0000000000..d670689f55 --- /dev/null +++ b/public/logos/18_ardennes/7-BY+P.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 7 + diff --git a/public/logos/18_ardennes/7-BY.svg b/public/logos/18_ardennes/7-BY.svg new file mode 100644 index 0000000000..c265efa316 --- /dev/null +++ b/public/logos/18_ardennes/7-BY.svg @@ -0,0 +1,4 @@ + + + 7 + diff --git a/public/logos/18_ardennes/7-E.svg b/public/logos/18_ardennes/7-E.svg new file mode 100644 index 0000000000..d07d95a529 --- /dev/null +++ b/public/logos/18_ardennes/7-E.svg @@ -0,0 +1,4 @@ + + + 7 + diff --git a/public/logos/18_ardennes/7-N.svg b/public/logos/18_ardennes/7-N.svg new file mode 100644 index 0000000000..df46cc6443 --- /dev/null +++ b/public/logos/18_ardennes/7-N.svg @@ -0,0 +1,4 @@ + + + 7 + diff --git a/public/logos/18_ardennes/7-NL.svg b/public/logos/18_ardennes/7-NL.svg new file mode 100644 index 0000000000..e7757594f3 --- /dev/null +++ b/public/logos/18_ardennes/7-NL.svg @@ -0,0 +1,4 @@ + + + 7 + diff --git a/public/logos/18_ardennes/7-P.svg b/public/logos/18_ardennes/7-P.svg new file mode 100644 index 0000000000..bc9bbe11df --- /dev/null +++ b/public/logos/18_ardennes/7-P.svg @@ -0,0 +1,4 @@ + + + 7 + diff --git a/public/logos/18_ardennes/8-BE+N.svg b/public/logos/18_ardennes/8-BE+N.svg new file mode 100644 index 0000000000..6c72bacf32 --- /dev/null +++ b/public/logos/18_ardennes/8-BE+N.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 8 + diff --git a/public/logos/18_ardennes/8-BE+NL+P.svg b/public/logos/18_ardennes/8-BE+NL+P.svg new file mode 100644 index 0000000000..0005f6933a --- /dev/null +++ b/public/logos/18_ardennes/8-BE+NL+P.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + 8 + diff --git a/public/logos/18_ardennes/8-BE+NL.svg b/public/logos/18_ardennes/8-BE+NL.svg new file mode 100644 index 0000000000..5a94943fb0 --- /dev/null +++ b/public/logos/18_ardennes/8-BE+NL.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 8 + diff --git a/public/logos/18_ardennes/8-BE.svg b/public/logos/18_ardennes/8-BE.svg new file mode 100644 index 0000000000..2c5bffe58b --- /dev/null +++ b/public/logos/18_ardennes/8-BE.svg @@ -0,0 +1,4 @@ + + + 8 + diff --git a/public/logos/18_ardennes/8-BY+E.svg b/public/logos/18_ardennes/8-BY+E.svg new file mode 100644 index 0000000000..af59b788bf --- /dev/null +++ b/public/logos/18_ardennes/8-BY+E.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 8 + diff --git a/public/logos/18_ardennes/8-BY+P.svg b/public/logos/18_ardennes/8-BY+P.svg new file mode 100644 index 0000000000..e961ec9243 --- /dev/null +++ b/public/logos/18_ardennes/8-BY+P.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 8 + diff --git a/public/logos/18_ardennes/8-BY.svg b/public/logos/18_ardennes/8-BY.svg new file mode 100644 index 0000000000..81f170a20d --- /dev/null +++ b/public/logos/18_ardennes/8-BY.svg @@ -0,0 +1,4 @@ + + + 8 + diff --git a/public/logos/18_ardennes/8-E.svg b/public/logos/18_ardennes/8-E.svg new file mode 100644 index 0000000000..8dfd9e24db --- /dev/null +++ b/public/logos/18_ardennes/8-E.svg @@ -0,0 +1,4 @@ + + + 8 + diff --git a/public/logos/18_ardennes/8-N.svg b/public/logos/18_ardennes/8-N.svg new file mode 100644 index 0000000000..0e58e12f2e --- /dev/null +++ b/public/logos/18_ardennes/8-N.svg @@ -0,0 +1,4 @@ + + + 8 + diff --git a/public/logos/18_ardennes/8-NL.svg b/public/logos/18_ardennes/8-NL.svg new file mode 100644 index 0000000000..54ce636c9a --- /dev/null +++ b/public/logos/18_ardennes/8-NL.svg @@ -0,0 +1,4 @@ + + + 8 + diff --git a/public/logos/18_ardennes/8-P.svg b/public/logos/18_ardennes/8-P.svg new file mode 100644 index 0000000000..2160707032 --- /dev/null +++ b/public/logos/18_ardennes/8-P.svg @@ -0,0 +1,4 @@ + + + 8 + diff --git a/public/logos/18_ardennes/9-BE+N.svg b/public/logos/18_ardennes/9-BE+N.svg new file mode 100644 index 0000000000..7e7977df74 --- /dev/null +++ b/public/logos/18_ardennes/9-BE+N.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 9 + diff --git a/public/logos/18_ardennes/9-BE+NL+P.svg b/public/logos/18_ardennes/9-BE+NL+P.svg new file mode 100644 index 0000000000..072cd92bba --- /dev/null +++ b/public/logos/18_ardennes/9-BE+NL+P.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + 9 + diff --git a/public/logos/18_ardennes/9-BE+NL.svg b/public/logos/18_ardennes/9-BE+NL.svg new file mode 100644 index 0000000000..7feb4a987f --- /dev/null +++ b/public/logos/18_ardennes/9-BE+NL.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 9 + diff --git a/public/logos/18_ardennes/9-BE.svg b/public/logos/18_ardennes/9-BE.svg new file mode 100644 index 0000000000..b3b899dbdd --- /dev/null +++ b/public/logos/18_ardennes/9-BE.svg @@ -0,0 +1,4 @@ + + + 9 + diff --git a/public/logos/18_ardennes/9-BY+E.svg b/public/logos/18_ardennes/9-BY+E.svg new file mode 100644 index 0000000000..b40e29fe77 --- /dev/null +++ b/public/logos/18_ardennes/9-BY+E.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 9 + diff --git a/public/logos/18_ardennes/9-BY+P.svg b/public/logos/18_ardennes/9-BY+P.svg new file mode 100644 index 0000000000..fd90f37079 --- /dev/null +++ b/public/logos/18_ardennes/9-BY+P.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + 9 + diff --git a/public/logos/18_ardennes/9-BY.svg b/public/logos/18_ardennes/9-BY.svg new file mode 100644 index 0000000000..a3aa8c364e --- /dev/null +++ b/public/logos/18_ardennes/9-BY.svg @@ -0,0 +1,4 @@ + + + 9 + diff --git a/public/logos/18_ardennes/9-E.svg b/public/logos/18_ardennes/9-E.svg new file mode 100644 index 0000000000..29099986e6 --- /dev/null +++ b/public/logos/18_ardennes/9-E.svg @@ -0,0 +1,4 @@ + + + 9 + diff --git a/public/logos/18_ardennes/9-N.svg b/public/logos/18_ardennes/9-N.svg new file mode 100644 index 0000000000..08ccb6d869 --- /dev/null +++ b/public/logos/18_ardennes/9-N.svg @@ -0,0 +1,4 @@ + + + 9 + diff --git a/public/logos/18_ardennes/9-NL.svg b/public/logos/18_ardennes/9-NL.svg new file mode 100644 index 0000000000..bc797e03aa --- /dev/null +++ b/public/logos/18_ardennes/9-NL.svg @@ -0,0 +1,4 @@ + + + 9 + diff --git a/public/logos/18_ardennes/9-P.svg b/public/logos/18_ardennes/9-P.svg new file mode 100644 index 0000000000..2f5eec90af --- /dev/null +++ b/public/logos/18_ardennes/9-P.svg @@ -0,0 +1,4 @@ + + + 9 + From 77741d777d2a4f73da02e84eaecba5cbd0ae25eb Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Sun, 2 Jun 2024 17:29:07 +0100 Subject: [PATCH 37/54] [18Ardennes] Add slot icons showing public company assocations To make it clearer which cities can be used to start each public company, add slot icons to empty city slots that show the colours of the public companies associated with that city.[18Ardennes] Add slot icons showing public company assocations To make it clearer which cities can be used to start each public company, add slot icons to empty city slots that show the colours of the public companies associated with that city.[18Ardennes] Add slot icons showing public company assocations To make it clearer which cities can be used to start each public company, add slot icons to empty city slots that show the colours of the public companies associated with that city.[18Ardennes] Add slot icons showing public company assocations To make it clearer which cities can be used to start each public company, add slot icons to empty city slots that show the colours of the public companies associated with that city.[18Ardennes] Add slot icons showing public company assocations To make it clearer which cities can be used to start each public company, add slot icons to empty city slots that show the colours of the public companies associated with that city.[18Ardennes] Add slot icons showing public company assocations To make it clearer which cities can be used to start each public company, add slot icons to empty city slots that show the colours of the public companies associated with that city.[18Ardennes] Add slot icons showing public company assocations To make it clearer which cities can be used to start each public company, add slot icons to empty city slots that show the colours of the public companies associated with that city.[18Ardennes] Add slot icons showing public company assocations To make it clearer which cities can be used to start each public company, add slot icons to empty city slots that show the colours of the public companies associated with that city. --- lib/engine/game/g_18_ardennes/entities.rb | 14 ++++++++++++++ lib/engine/game/g_18_ardennes/game.rb | 1 + public/icons/18_ardennes/BE+N.svg | 13 +++++++++++++ public/icons/18_ardennes/BE+NL+P.svg | 22 ++++++++++++++++++++++ public/icons/18_ardennes/BE+NL.svg | 13 +++++++++++++ public/icons/18_ardennes/BE.svg | 3 +++ public/icons/18_ardennes/BY+E.svg | 13 +++++++++++++ public/icons/18_ardennes/BY+P.svg | 13 +++++++++++++ public/icons/18_ardennes/BY.svg | 3 +++ public/icons/18_ardennes/E.svg | 3 +++ public/icons/18_ardennes/N.svg | 3 +++ public/icons/18_ardennes/NL.svg | 3 +++ public/icons/18_ardennes/P.svg | 3 +++ 13 files changed, 107 insertions(+) create mode 100644 public/icons/18_ardennes/BE+N.svg create mode 100644 public/icons/18_ardennes/BE+NL+P.svg create mode 100644 public/icons/18_ardennes/BE+NL.svg create mode 100644 public/icons/18_ardennes/BE.svg create mode 100644 public/icons/18_ardennes/BY+E.svg create mode 100644 public/icons/18_ardennes/BY+P.svg create mode 100644 public/icons/18_ardennes/BY.svg create mode 100644 public/icons/18_ardennes/E.svg create mode 100644 public/icons/18_ardennes/N.svg create mode 100644 public/icons/18_ardennes/NL.svg create mode 100644 public/icons/18_ardennes/P.svg diff --git a/lib/engine/game/g_18_ardennes/entities.rb b/lib/engine/game/g_18_ardennes/entities.rb index 3b3e991cf7..b668a87735 100644 --- a/lib/engine/game/g_18_ardennes/entities.rb +++ b/lib/engine/game/g_18_ardennes/entities.rb @@ -369,6 +369,20 @@ def setup_preround @companies.concat(init_concessions) end + def setup_icons + @hexes.map(&:tile).flat_map(&:cities).each do |city| + city.tokens.each_with_index do |token, ix| + next if token || city.reservations[ix] + + majors = associated_majors(city) + next if majors.empty? # Basel does not have an associated public companies + + path = "18_ardennes/#{majors.join('+')}" + city.slot_icons[ix] = Engine::Part::Icon.new(path) + end + end + end + def concession_companies companies.select { |company| company.type == :concession } end diff --git a/lib/engine/game/g_18_ardennes/game.rb b/lib/engine/game/g_18_ardennes/game.rb index 980ce3354a..c72e08274e 100644 --- a/lib/engine/game/g_18_ardennes/game.rb +++ b/lib/engine/game/g_18_ardennes/game.rb @@ -51,6 +51,7 @@ def setup super setup_tokens + setup_icons @pledged_minors = major_corporations.to_h { |corp| [corp, nil] } end diff --git a/public/icons/18_ardennes/BE+N.svg b/public/icons/18_ardennes/BE+N.svg new file mode 100644 index 0000000000..e795f69198 --- /dev/null +++ b/public/icons/18_ardennes/BE+N.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/public/icons/18_ardennes/BE+NL+P.svg b/public/icons/18_ardennes/BE+NL+P.svg new file mode 100644 index 0000000000..5449a6754b --- /dev/null +++ b/public/icons/18_ardennes/BE+NL+P.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/icons/18_ardennes/BE+NL.svg b/public/icons/18_ardennes/BE+NL.svg new file mode 100644 index 0000000000..17fa46ec03 --- /dev/null +++ b/public/icons/18_ardennes/BE+NL.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/public/icons/18_ardennes/BE.svg b/public/icons/18_ardennes/BE.svg new file mode 100644 index 0000000000..0db4968b8f --- /dev/null +++ b/public/icons/18_ardennes/BE.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/18_ardennes/BY+E.svg b/public/icons/18_ardennes/BY+E.svg new file mode 100644 index 0000000000..8cf1b1ef46 --- /dev/null +++ b/public/icons/18_ardennes/BY+E.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/public/icons/18_ardennes/BY+P.svg b/public/icons/18_ardennes/BY+P.svg new file mode 100644 index 0000000000..cdab9be0fb --- /dev/null +++ b/public/icons/18_ardennes/BY+P.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/public/icons/18_ardennes/BY.svg b/public/icons/18_ardennes/BY.svg new file mode 100644 index 0000000000..455980a4f8 --- /dev/null +++ b/public/icons/18_ardennes/BY.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/18_ardennes/E.svg b/public/icons/18_ardennes/E.svg new file mode 100644 index 0000000000..42231e3226 --- /dev/null +++ b/public/icons/18_ardennes/E.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/18_ardennes/N.svg b/public/icons/18_ardennes/N.svg new file mode 100644 index 0000000000..6cf9dbfdd6 --- /dev/null +++ b/public/icons/18_ardennes/N.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/18_ardennes/NL.svg b/public/icons/18_ardennes/NL.svg new file mode 100644 index 0000000000..459b578b5a --- /dev/null +++ b/public/icons/18_ardennes/NL.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/18_ardennes/P.svg b/public/icons/18_ardennes/P.svg new file mode 100644 index 0000000000..59b9092c63 --- /dev/null +++ b/public/icons/18_ardennes/P.svg @@ -0,0 +1,3 @@ + + + From 6ff8782c912fc86fe8737fb44f78f1bfecbf657a Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Sun, 2 Jun 2024 17:49:55 +0100 Subject: [PATCH 38/54] [18Ardennes] Set slot icons when a tile is upgraded Slot icons are used to show which public companies can be started from each city. Add these to empty city slots when a tile is upgraded. --- lib/engine/game/g_18_ardennes/entities.rb | 26 +++++++++++++---------- lib/engine/game/g_18_ardennes/map.rb | 7 +++++- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/lib/engine/game/g_18_ardennes/entities.rb b/lib/engine/game/g_18_ardennes/entities.rb index b668a87735..cb57dc559c 100644 --- a/lib/engine/game/g_18_ardennes/entities.rb +++ b/lib/engine/game/g_18_ardennes/entities.rb @@ -370,17 +370,7 @@ def setup_preround end def setup_icons - @hexes.map(&:tile).flat_map(&:cities).each do |city| - city.tokens.each_with_index do |token, ix| - next if token || city.reservations[ix] - - majors = associated_majors(city) - next if majors.empty? # Basel does not have an associated public companies - - path = "18_ardennes/#{majors.join('+')}" - city.slot_icons[ix] = Engine::Part::Icon.new(path) - end - end + @hexes.map(&:tile).flat_map(&:cities).each { |c| set_slot_icons(c) } end def concession_companies @@ -531,6 +521,20 @@ def lowest_major_par end end + # Adds slot icons to empty city slots, showing which public companies + # can be started using a token in this city. + def set_slot_icons(city) + city.tokens.each_with_index do |token, ix| + next if token || city.reservations[ix] + + majors = associated_majors(city) + next if majors.empty? # Basel does not have an associated public companies + + path = "18_ardennes/#{majors.join('+')}" + city.slot_icons[ix] = Engine::Part::Icon.new(path) + end + end + # Finds which public companies can be started from a minor company # that has a token in this city. # @param city [City] The city with a minor company's token. diff --git a/lib/engine/game/g_18_ardennes/map.rb b/lib/engine/game/g_18_ardennes/map.rb index c10b1ab7dc..c536921315 100644 --- a/lib/engine/game/g_18_ardennes/map.rb +++ b/lib/engine/game/g_18_ardennes/map.rb @@ -349,7 +349,12 @@ def tile_lays(entity) end def after_lay_tile(hex, tile, entity) - # Move mine/port tokens from hex into city if possible. + move_hex_tokens(hex, tile, entity) + tile.cities.each { |city| set_slot_icons(city) } + end + + # Move mine/port tokens from hex into city if possible. + def move_hex_tokens(hex, tile, entity) return if hex.tokens.empty? city = tile.cities.first From 79a169c524d3bb533f2fc32aac2b9370db90a5b8 Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Sun, 2 Jun 2024 18:04:05 +0100 Subject: [PATCH 39/54] [18Ardennes] Delete slot icon when a token is laid --- lib/engine/game/g_18_ardennes/step/token.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/engine/game/g_18_ardennes/step/token.rb b/lib/engine/game/g_18_ardennes/step/token.rb index 43475fc31e..2175e55252 100644 --- a/lib/engine/game/g_18_ardennes/step/token.rb +++ b/lib/engine/game/g_18_ardennes/step/token.rb @@ -73,8 +73,13 @@ def process_remove_token(action) end def process_place_token(action) + entity = action.entity + city = action.city + slot = action.slot + + city.slot_icons.delete(slot) super - @game.change_token_icon(action.city, action.city.tokens[action.slot], action.entity) + @game.change_token_icon(city, city.tokens[slot], entity) end end end From 21729ada5bd7559c525803be3acbbf33f7cf308d Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Mon, 24 Jun 2024 12:55:01 +0100 Subject: [PATCH 40/54] [18Ardennes] Rename method to keep rubocop happy Rubocop doesn't like method names beginning with `set_`, it thinks that these are accesssor methods. Change `set_slot_icons` to `add_slot_icons` to stop this being flagged as an error. --- lib/engine/game/g_18_ardennes/entities.rb | 4 ++-- lib/engine/game/g_18_ardennes/map.rb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/engine/game/g_18_ardennes/entities.rb b/lib/engine/game/g_18_ardennes/entities.rb index cb57dc559c..660c3ef2ff 100644 --- a/lib/engine/game/g_18_ardennes/entities.rb +++ b/lib/engine/game/g_18_ardennes/entities.rb @@ -370,7 +370,7 @@ def setup_preround end def setup_icons - @hexes.map(&:tile).flat_map(&:cities).each { |c| set_slot_icons(c) } + @hexes.map(&:tile).flat_map(&:cities).each { |c| add_slot_icons(c) } end def concession_companies @@ -523,7 +523,7 @@ def lowest_major_par # Adds slot icons to empty city slots, showing which public companies # can be started using a token in this city. - def set_slot_icons(city) + def add_slot_icons(city) city.tokens.each_with_index do |token, ix| next if token || city.reservations[ix] diff --git a/lib/engine/game/g_18_ardennes/map.rb b/lib/engine/game/g_18_ardennes/map.rb index c536921315..1195fe374f 100644 --- a/lib/engine/game/g_18_ardennes/map.rb +++ b/lib/engine/game/g_18_ardennes/map.rb @@ -350,7 +350,7 @@ def tile_lays(entity) def after_lay_tile(hex, tile, entity) move_hex_tokens(hex, tile, entity) - tile.cities.each { |city| set_slot_icons(city) } + tile.cities.each { |city| add_slot_icons(city) } end # Move mine/port tokens from hex into city if possible. From d4a8f8b7de7bea8ceee405970c2a14efae623770 Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Thu, 27 Jun 2024 21:43:57 +0100 Subject: [PATCH 41/54] [18Ardennes] Fix error on tokening multi-slot city An error was occurring when attempting to token the brown Ruhr tile (3-slot city). There was already a token in slot #0. If the player clicks on slot #1 when placing a token this worked correctly, but clicking on slot #2 errored, as the game was then attempting to change the logo of the token in slot #2, but the token had gone to slot #1. Fixes ollybh#133. --- lib/engine/game/g_18_ardennes/step/token.rb | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/engine/game/g_18_ardennes/step/token.rb b/lib/engine/game/g_18_ardennes/step/token.rb index 2175e55252..9f712758e7 100644 --- a/lib/engine/game/g_18_ardennes/step/token.rb +++ b/lib/engine/game/g_18_ardennes/step/token.rb @@ -73,13 +73,12 @@ def process_remove_token(action) end def process_place_token(action) - entity = action.entity - city = action.city - slot = action.slot + super + city = action.city + slot = city.tokens.index(action.token) city.slot_icons.delete(slot) - super - @game.change_token_icon(city, city.tokens[slot], entity) + @game.change_token_icon(city, action.token, action.entity) end end end From e3dedb4c85a405ba925e45d8a64d31b56c32ce0d Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Mon, 8 Jul 2024 12:58:19 +0100 Subject: [PATCH 42/54] [18Ardennes] Change minors' simple logos to show public company colours --- lib/engine/game/g_18_ardennes/entities.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/engine/game/g_18_ardennes/entities.rb b/lib/engine/game/g_18_ardennes/entities.rb index 660c3ef2ff..bc0aa2fd04 100644 --- a/lib/engine/game/g_18_ardennes/entities.rb +++ b/lib/engine/game/g_18_ardennes/entities.rb @@ -480,6 +480,7 @@ def change_token_icon(city, token, minor) return if majors.empty? # Basel token.logo = logo_path(majors, minor.id) + token.simple_logo = logo_path(majors, minor.id) end private From f79ebbdf3ef9296520e20dc389c72dfab068e04c Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Mon, 8 Jul 2024 12:59:38 +0100 Subject: [PATCH 43/54] [18Ardennes] Change colours on mine/port tokens to show public companies Use colours on the port and mine tokens to show which public companies can be started from those cities. --- lib/engine/game/g_18_ardennes/entities.rb | 2 +- lib/engine/game/g_18_ardennes/map.rb | 7 +++++-- public/logos/18_ardennes/mine-BE.svg | 12 ++++++++++++ public/logos/18_ardennes/mine-BY+E.svg | 22 ++++++++++++++++++++++ public/logos/18_ardennes/port-BE.svg | 14 ++++++++++++++ public/logos/18_ardennes/port-N.svg | 14 ++++++++++++++ public/logos/18_ardennes/port-NL.svg | 14 ++++++++++++++ 7 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 public/logos/18_ardennes/mine-BE.svg create mode 100644 public/logos/18_ardennes/mine-BY+E.svg create mode 100644 public/logos/18_ardennes/port-BE.svg create mode 100644 public/logos/18_ardennes/port-N.svg create mode 100644 public/logos/18_ardennes/port-NL.svg diff --git a/lib/engine/game/g_18_ardennes/entities.rb b/lib/engine/game/g_18_ardennes/entities.rb index bc0aa2fd04..254e371d71 100644 --- a/lib/engine/game/g_18_ardennes/entities.rb +++ b/lib/engine/game/g_18_ardennes/entities.rb @@ -474,7 +474,7 @@ def place_home_token(corporation) # started from the city it is in. def change_token_icon(city, token, minor) # TODO: return if after first public company auction round - return unless minor.type == :minor + return if minor.type != :minor && minor.type != :dummy majors = associated_majors(city) return if majors.empty? # Basel diff --git a/lib/engine/game/g_18_ardennes/map.rb b/lib/engine/game/g_18_ardennes/map.rb index 1195fe374f..fa6552f7c1 100644 --- a/lib/engine/game/g_18_ardennes/map.rb +++ b/lib/engine/game/g_18_ardennes/map.rb @@ -246,8 +246,8 @@ module Map }.freeze def setup_tokens - @mine_corp = dummy_corp('Mine', '18_ardennes/mine', MINE_HEXES) - @port_corp = dummy_corp('Port', '18_ardennes/port', PORT_HEXES) + @mine_corp = dummy_corp('mine', '18_ardennes/mine', MINE_HEXES) + @port_corp = dummy_corp('port', '18_ardennes/port', PORT_HEXES) FORT_HEXES.each { |fort, coord| hex_by_id(coord).assign!(fort) } end @@ -268,6 +268,8 @@ def dummy_corp(sym, logo, coords) token = corp.next_token if city.tokenable?(corp) city.place_token(corp, token) + # Show which public companies can be started here. + change_token_icon(city, token, corp) else hex.place_token(token) end @@ -366,6 +368,7 @@ def move_hex_tokens(hex, tile, entity) token, free: true, same_hex_allowed: true) + change_token_icon(city, token, token.corporation) clear_graph_for_entity(entity) end diff --git a/public/logos/18_ardennes/mine-BE.svg b/public/logos/18_ardennes/mine-BE.svg new file mode 100644 index 0000000000..5c3380c2cb --- /dev/null +++ b/public/logos/18_ardennes/mine-BE.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/logos/18_ardennes/mine-BY+E.svg b/public/logos/18_ardennes/mine-BY+E.svg new file mode 100644 index 0000000000..e109e3c719 --- /dev/null +++ b/public/logos/18_ardennes/mine-BY+E.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/logos/18_ardennes/port-BE.svg b/public/logos/18_ardennes/port-BE.svg new file mode 100644 index 0000000000..1f7eb5bae2 --- /dev/null +++ b/public/logos/18_ardennes/port-BE.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/logos/18_ardennes/port-N.svg b/public/logos/18_ardennes/port-N.svg new file mode 100644 index 0000000000..68963c241f --- /dev/null +++ b/public/logos/18_ardennes/port-N.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/logos/18_ardennes/port-NL.svg b/public/logos/18_ardennes/port-NL.svg new file mode 100644 index 0000000000..fe54206cc9 --- /dev/null +++ b/public/logos/18_ardennes/port-NL.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + From c2e4f2dec8f4e91fd8695f3d810500cd39f7bb23 Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Mon, 8 Jul 2024 22:07:36 +0100 Subject: [PATCH 44/54] [18Ardennes] Add missing xlink namespace to SVG href attributes Lots of SVG files with `use` elements had `href` attributes that should have been `xlink:href`, and were missing the XLink namespace declaration. --- public/icons/18_ardennes/BE+N.svg | 6 +++--- public/icons/18_ardennes/BE+NL+P.svg | 20 ++++++++++---------- public/icons/18_ardennes/BE+NL.svg | 6 +++--- public/icons/18_ardennes/BY+E.svg | 6 +++--- public/icons/18_ardennes/BY+P.svg | 6 +++--- public/logos/18_ardennes/1-BE+N.svg | 6 +++--- public/logos/18_ardennes/1-BE+NL+P.svg | 20 ++++++++++---------- public/logos/18_ardennes/1-BE+NL.svg | 6 +++--- public/logos/18_ardennes/1-BY+E.svg | 6 +++--- public/logos/18_ardennes/1-BY+P.svg | 6 +++--- public/logos/18_ardennes/10-BE+N.svg | 6 +++--- public/logos/18_ardennes/10-BE+NL+P.svg | 20 ++++++++++---------- public/logos/18_ardennes/10-BE+NL.svg | 6 +++--- public/logos/18_ardennes/10-BY+E.svg | 6 +++--- public/logos/18_ardennes/10-BY+P.svg | 6 +++--- public/logos/18_ardennes/11-BE+N.svg | 6 +++--- public/logos/18_ardennes/11-BE+NL+P.svg | 20 ++++++++++---------- public/logos/18_ardennes/11-BE+NL.svg | 6 +++--- public/logos/18_ardennes/11-BY+E.svg | 6 +++--- public/logos/18_ardennes/11-BY+P.svg | 6 +++--- public/logos/18_ardennes/12-BE+N.svg | 6 +++--- public/logos/18_ardennes/12-BE+NL+P.svg | 20 ++++++++++---------- public/logos/18_ardennes/12-BE+NL.svg | 6 +++--- public/logos/18_ardennes/12-BY+E.svg | 6 +++--- public/logos/18_ardennes/12-BY+P.svg | 6 +++--- public/logos/18_ardennes/13-BE+N.svg | 6 +++--- public/logos/18_ardennes/13-BE+NL+P.svg | 20 ++++++++++---------- public/logos/18_ardennes/13-BE+NL.svg | 6 +++--- public/logos/18_ardennes/13-BY+E.svg | 6 +++--- public/logos/18_ardennes/13-BY+P.svg | 6 +++--- public/logos/18_ardennes/14-BE+N.svg | 6 +++--- public/logos/18_ardennes/14-BE+NL+P.svg | 20 ++++++++++---------- public/logos/18_ardennes/14-BE+NL.svg | 6 +++--- public/logos/18_ardennes/14-BY+E.svg | 6 +++--- public/logos/18_ardennes/14-BY+P.svg | 6 +++--- public/logos/18_ardennes/15-BE+N.svg | 6 +++--- public/logos/18_ardennes/15-BE+NL+P.svg | 20 ++++++++++---------- public/logos/18_ardennes/15-BE+NL.svg | 6 +++--- public/logos/18_ardennes/15-BY+E.svg | 6 +++--- public/logos/18_ardennes/15-BY+P.svg | 6 +++--- public/logos/18_ardennes/2-BE+N.svg | 6 +++--- public/logos/18_ardennes/2-BE+NL+P.svg | 20 ++++++++++---------- public/logos/18_ardennes/2-BE+NL.svg | 6 +++--- public/logos/18_ardennes/2-BY+E.svg | 6 +++--- public/logos/18_ardennes/2-BY+P.svg | 6 +++--- public/logos/18_ardennes/3-BE+N.svg | 6 +++--- public/logos/18_ardennes/3-BE+NL+P.svg | 20 ++++++++++---------- public/logos/18_ardennes/3-BE+NL.svg | 6 +++--- public/logos/18_ardennes/3-BY+E.svg | 6 +++--- public/logos/18_ardennes/3-BY+P.svg | 6 +++--- public/logos/18_ardennes/4-BE+N.svg | 6 +++--- public/logos/18_ardennes/4-BE+NL+P.svg | 20 ++++++++++---------- public/logos/18_ardennes/4-BE+NL.svg | 6 +++--- public/logos/18_ardennes/4-BY+E.svg | 6 +++--- public/logos/18_ardennes/4-BY+P.svg | 6 +++--- public/logos/18_ardennes/5-BE+N.svg | 6 +++--- public/logos/18_ardennes/5-BE+NL+P.svg | 20 ++++++++++---------- public/logos/18_ardennes/5-BE+NL.svg | 6 +++--- public/logos/18_ardennes/5-BY+E.svg | 6 +++--- public/logos/18_ardennes/5-BY+P.svg | 6 +++--- public/logos/18_ardennes/6-BE+N.svg | 6 +++--- public/logos/18_ardennes/6-BE+NL+P.svg | 20 ++++++++++---------- public/logos/18_ardennes/6-BE+NL.svg | 6 +++--- public/logos/18_ardennes/6-BY+E.svg | 6 +++--- public/logos/18_ardennes/6-BY+P.svg | 6 +++--- public/logos/18_ardennes/7-BE+N.svg | 6 +++--- public/logos/18_ardennes/7-BE+NL+P.svg | 20 ++++++++++---------- public/logos/18_ardennes/7-BE+NL.svg | 6 +++--- public/logos/18_ardennes/7-BY+E.svg | 6 +++--- public/logos/18_ardennes/7-BY+P.svg | 6 +++--- public/logos/18_ardennes/8-BE+N.svg | 6 +++--- public/logos/18_ardennes/8-BE+NL+P.svg | 20 ++++++++++---------- public/logos/18_ardennes/8-BE+NL.svg | 6 +++--- public/logos/18_ardennes/8-BY+E.svg | 6 +++--- public/logos/18_ardennes/8-BY+P.svg | 6 +++--- public/logos/18_ardennes/9-BE+N.svg | 6 +++--- public/logos/18_ardennes/9-BE+NL+P.svg | 20 ++++++++++---------- public/logos/18_ardennes/9-BE+NL.svg | 6 +++--- public/logos/18_ardennes/9-BY+E.svg | 6 +++--- public/logos/18_ardennes/9-BY+P.svg | 6 +++--- public/logos/18_ardennes/fort.svg | 4 ++-- public/logos/18_ardennes/mine-BY+E.svg | 6 +++--- 82 files changed, 357 insertions(+), 357 deletions(-) diff --git a/public/icons/18_ardennes/BE+N.svg b/public/icons/18_ardennes/BE+N.svg index e795f69198..cfb025c3f3 100644 --- a/public/icons/18_ardennes/BE+N.svg +++ b/public/icons/18_ardennes/BE+N.svg @@ -1,4 +1,4 @@ - + @@ -7,7 +7,7 @@ - - + + diff --git a/public/icons/18_ardennes/BE+NL+P.svg b/public/icons/18_ardennes/BE+NL+P.svg index 5449a6754b..999e91a4e2 100644 --- a/public/icons/18_ardennes/BE+NL+P.svg +++ b/public/icons/18_ardennes/BE+NL+P.svg @@ -1,22 +1,22 @@ - + - - - + + + - - - + + + - - - + + + diff --git a/public/icons/18_ardennes/BE+NL.svg b/public/icons/18_ardennes/BE+NL.svg index 17fa46ec03..62f8e09dbd 100644 --- a/public/icons/18_ardennes/BE+NL.svg +++ b/public/icons/18_ardennes/BE+NL.svg @@ -1,4 +1,4 @@ - + @@ -7,7 +7,7 @@ - - + + diff --git a/public/icons/18_ardennes/BY+E.svg b/public/icons/18_ardennes/BY+E.svg index 8cf1b1ef46..e01d2fa3b6 100644 --- a/public/icons/18_ardennes/BY+E.svg +++ b/public/icons/18_ardennes/BY+E.svg @@ -1,4 +1,4 @@ - + @@ -7,7 +7,7 @@ - - + + diff --git a/public/icons/18_ardennes/BY+P.svg b/public/icons/18_ardennes/BY+P.svg index cdab9be0fb..3d4759cfbd 100644 --- a/public/icons/18_ardennes/BY+P.svg +++ b/public/icons/18_ardennes/BY+P.svg @@ -1,4 +1,4 @@ - + @@ -7,7 +7,7 @@ - - + + diff --git a/public/logos/18_ardennes/1-BE+N.svg b/public/logos/18_ardennes/1-BE+N.svg index 1169a3ac34..a6278d2c30 100644 --- a/public/logos/18_ardennes/1-BE+N.svg +++ b/public/logos/18_ardennes/1-BE+N.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 1 diff --git a/public/logos/18_ardennes/1-BE+NL+P.svg b/public/logos/18_ardennes/1-BE+NL+P.svg index be90029b55..d2e6730912 100644 --- a/public/logos/18_ardennes/1-BE+NL+P.svg +++ b/public/logos/18_ardennes/1-BE+NL+P.svg @@ -1,23 +1,23 @@ - + - - - + + + - - - + + + - - - + + + 1 diff --git a/public/logos/18_ardennes/1-BE+NL.svg b/public/logos/18_ardennes/1-BE+NL.svg index c8d0acddaa..f5a9a4a9d7 100644 --- a/public/logos/18_ardennes/1-BE+NL.svg +++ b/public/logos/18_ardennes/1-BE+NL.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 1 diff --git a/public/logos/18_ardennes/1-BY+E.svg b/public/logos/18_ardennes/1-BY+E.svg index 46b2bb81f4..bec5ebf4d1 100644 --- a/public/logos/18_ardennes/1-BY+E.svg +++ b/public/logos/18_ardennes/1-BY+E.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 1 diff --git a/public/logos/18_ardennes/1-BY+P.svg b/public/logos/18_ardennes/1-BY+P.svg index 9f9bc08660..97a7b54c83 100644 --- a/public/logos/18_ardennes/1-BY+P.svg +++ b/public/logos/18_ardennes/1-BY+P.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 1 diff --git a/public/logos/18_ardennes/10-BE+N.svg b/public/logos/18_ardennes/10-BE+N.svg index ac5e133cb4..3efbb6c5de 100644 --- a/public/logos/18_ardennes/10-BE+N.svg +++ b/public/logos/18_ardennes/10-BE+N.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 10 diff --git a/public/logos/18_ardennes/10-BE+NL+P.svg b/public/logos/18_ardennes/10-BE+NL+P.svg index 79ac309c26..d533f0cb99 100644 --- a/public/logos/18_ardennes/10-BE+NL+P.svg +++ b/public/logos/18_ardennes/10-BE+NL+P.svg @@ -1,23 +1,23 @@ - + - - - + + + - - - + + + - - - + + + 10 diff --git a/public/logos/18_ardennes/10-BE+NL.svg b/public/logos/18_ardennes/10-BE+NL.svg index 06abce2d93..483a1d80a9 100644 --- a/public/logos/18_ardennes/10-BE+NL.svg +++ b/public/logos/18_ardennes/10-BE+NL.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 10 diff --git a/public/logos/18_ardennes/10-BY+E.svg b/public/logos/18_ardennes/10-BY+E.svg index 30d548de8d..11800de577 100644 --- a/public/logos/18_ardennes/10-BY+E.svg +++ b/public/logos/18_ardennes/10-BY+E.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 10 diff --git a/public/logos/18_ardennes/10-BY+P.svg b/public/logos/18_ardennes/10-BY+P.svg index 0af4d8bcc7..9e9ec0739f 100644 --- a/public/logos/18_ardennes/10-BY+P.svg +++ b/public/logos/18_ardennes/10-BY+P.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 10 diff --git a/public/logos/18_ardennes/11-BE+N.svg b/public/logos/18_ardennes/11-BE+N.svg index 1d7290ee2f..0d4bb55c19 100644 --- a/public/logos/18_ardennes/11-BE+N.svg +++ b/public/logos/18_ardennes/11-BE+N.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 11 diff --git a/public/logos/18_ardennes/11-BE+NL+P.svg b/public/logos/18_ardennes/11-BE+NL+P.svg index dccefcdea5..1e5d8da0e2 100644 --- a/public/logos/18_ardennes/11-BE+NL+P.svg +++ b/public/logos/18_ardennes/11-BE+NL+P.svg @@ -1,23 +1,23 @@ - + - - - + + + - - - + + + - - - + + + 11 diff --git a/public/logos/18_ardennes/11-BE+NL.svg b/public/logos/18_ardennes/11-BE+NL.svg index b8b5a06c14..6870ed5ec5 100644 --- a/public/logos/18_ardennes/11-BE+NL.svg +++ b/public/logos/18_ardennes/11-BE+NL.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 11 diff --git a/public/logos/18_ardennes/11-BY+E.svg b/public/logos/18_ardennes/11-BY+E.svg index 99edaec7ae..18ba2761e0 100644 --- a/public/logos/18_ardennes/11-BY+E.svg +++ b/public/logos/18_ardennes/11-BY+E.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 11 diff --git a/public/logos/18_ardennes/11-BY+P.svg b/public/logos/18_ardennes/11-BY+P.svg index e956354d81..dfb7672602 100644 --- a/public/logos/18_ardennes/11-BY+P.svg +++ b/public/logos/18_ardennes/11-BY+P.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 11 diff --git a/public/logos/18_ardennes/12-BE+N.svg b/public/logos/18_ardennes/12-BE+N.svg index eb4d6f5ca6..e534f11e27 100644 --- a/public/logos/18_ardennes/12-BE+N.svg +++ b/public/logos/18_ardennes/12-BE+N.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 12 diff --git a/public/logos/18_ardennes/12-BE+NL+P.svg b/public/logos/18_ardennes/12-BE+NL+P.svg index dda4611d98..72f503fba7 100644 --- a/public/logos/18_ardennes/12-BE+NL+P.svg +++ b/public/logos/18_ardennes/12-BE+NL+P.svg @@ -1,23 +1,23 @@ - + - - - + + + - - - + + + - - - + + + 12 diff --git a/public/logos/18_ardennes/12-BE+NL.svg b/public/logos/18_ardennes/12-BE+NL.svg index eb552063d2..ae44419962 100644 --- a/public/logos/18_ardennes/12-BE+NL.svg +++ b/public/logos/18_ardennes/12-BE+NL.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 12 diff --git a/public/logos/18_ardennes/12-BY+E.svg b/public/logos/18_ardennes/12-BY+E.svg index 27700a9c54..f49375f641 100644 --- a/public/logos/18_ardennes/12-BY+E.svg +++ b/public/logos/18_ardennes/12-BY+E.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 12 diff --git a/public/logos/18_ardennes/12-BY+P.svg b/public/logos/18_ardennes/12-BY+P.svg index a02050725c..119c6bfe2e 100644 --- a/public/logos/18_ardennes/12-BY+P.svg +++ b/public/logos/18_ardennes/12-BY+P.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 12 diff --git a/public/logos/18_ardennes/13-BE+N.svg b/public/logos/18_ardennes/13-BE+N.svg index cb93e4cf37..12dfb1b2cb 100644 --- a/public/logos/18_ardennes/13-BE+N.svg +++ b/public/logos/18_ardennes/13-BE+N.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 13 diff --git a/public/logos/18_ardennes/13-BE+NL+P.svg b/public/logos/18_ardennes/13-BE+NL+P.svg index 05b0399bfa..be2c158dc2 100644 --- a/public/logos/18_ardennes/13-BE+NL+P.svg +++ b/public/logos/18_ardennes/13-BE+NL+P.svg @@ -1,23 +1,23 @@ - + - - - + + + - - - + + + - - - + + + 13 diff --git a/public/logos/18_ardennes/13-BE+NL.svg b/public/logos/18_ardennes/13-BE+NL.svg index a8d7be10d6..683ccf4886 100644 --- a/public/logos/18_ardennes/13-BE+NL.svg +++ b/public/logos/18_ardennes/13-BE+NL.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 13 diff --git a/public/logos/18_ardennes/13-BY+E.svg b/public/logos/18_ardennes/13-BY+E.svg index 3767306abb..aed000ea2b 100644 --- a/public/logos/18_ardennes/13-BY+E.svg +++ b/public/logos/18_ardennes/13-BY+E.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 13 diff --git a/public/logos/18_ardennes/13-BY+P.svg b/public/logos/18_ardennes/13-BY+P.svg index 73f2f5b519..56cd02247d 100644 --- a/public/logos/18_ardennes/13-BY+P.svg +++ b/public/logos/18_ardennes/13-BY+P.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 13 diff --git a/public/logos/18_ardennes/14-BE+N.svg b/public/logos/18_ardennes/14-BE+N.svg index 53764563a1..52e27bf6e3 100644 --- a/public/logos/18_ardennes/14-BE+N.svg +++ b/public/logos/18_ardennes/14-BE+N.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 14 diff --git a/public/logos/18_ardennes/14-BE+NL+P.svg b/public/logos/18_ardennes/14-BE+NL+P.svg index cfffd61886..8ca1feb6f5 100644 --- a/public/logos/18_ardennes/14-BE+NL+P.svg +++ b/public/logos/18_ardennes/14-BE+NL+P.svg @@ -1,23 +1,23 @@ - + - - - + + + - - - + + + - - - + + + 14 diff --git a/public/logos/18_ardennes/14-BE+NL.svg b/public/logos/18_ardennes/14-BE+NL.svg index 1e9f4d6b0f..f13534310a 100644 --- a/public/logos/18_ardennes/14-BE+NL.svg +++ b/public/logos/18_ardennes/14-BE+NL.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 14 diff --git a/public/logos/18_ardennes/14-BY+E.svg b/public/logos/18_ardennes/14-BY+E.svg index dcb637151e..7f60cc30fb 100644 --- a/public/logos/18_ardennes/14-BY+E.svg +++ b/public/logos/18_ardennes/14-BY+E.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 14 diff --git a/public/logos/18_ardennes/14-BY+P.svg b/public/logos/18_ardennes/14-BY+P.svg index 83d4824761..cce22cd175 100644 --- a/public/logos/18_ardennes/14-BY+P.svg +++ b/public/logos/18_ardennes/14-BY+P.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 14 diff --git a/public/logos/18_ardennes/15-BE+N.svg b/public/logos/18_ardennes/15-BE+N.svg index eeb8e33414..6119b3d331 100644 --- a/public/logos/18_ardennes/15-BE+N.svg +++ b/public/logos/18_ardennes/15-BE+N.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 15 diff --git a/public/logos/18_ardennes/15-BE+NL+P.svg b/public/logos/18_ardennes/15-BE+NL+P.svg index 2a40b7b8a0..71d45254d6 100644 --- a/public/logos/18_ardennes/15-BE+NL+P.svg +++ b/public/logos/18_ardennes/15-BE+NL+P.svg @@ -1,23 +1,23 @@ - + - - - + + + - - - + + + - - - + + + 15 diff --git a/public/logos/18_ardennes/15-BE+NL.svg b/public/logos/18_ardennes/15-BE+NL.svg index 9fc7928728..7208c66513 100644 --- a/public/logos/18_ardennes/15-BE+NL.svg +++ b/public/logos/18_ardennes/15-BE+NL.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 15 diff --git a/public/logos/18_ardennes/15-BY+E.svg b/public/logos/18_ardennes/15-BY+E.svg index 66767748be..7fd72088d7 100644 --- a/public/logos/18_ardennes/15-BY+E.svg +++ b/public/logos/18_ardennes/15-BY+E.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 15 diff --git a/public/logos/18_ardennes/15-BY+P.svg b/public/logos/18_ardennes/15-BY+P.svg index fea83a5e4c..ffc7edde6c 100644 --- a/public/logos/18_ardennes/15-BY+P.svg +++ b/public/logos/18_ardennes/15-BY+P.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 15 diff --git a/public/logos/18_ardennes/2-BE+N.svg b/public/logos/18_ardennes/2-BE+N.svg index 3a3524ceb0..c8a09e025a 100644 --- a/public/logos/18_ardennes/2-BE+N.svg +++ b/public/logos/18_ardennes/2-BE+N.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 2 diff --git a/public/logos/18_ardennes/2-BE+NL+P.svg b/public/logos/18_ardennes/2-BE+NL+P.svg index b7d9ee2a3b..2185a88722 100644 --- a/public/logos/18_ardennes/2-BE+NL+P.svg +++ b/public/logos/18_ardennes/2-BE+NL+P.svg @@ -1,23 +1,23 @@ - + - - - + + + - - - + + + - - - + + + 2 diff --git a/public/logos/18_ardennes/2-BE+NL.svg b/public/logos/18_ardennes/2-BE+NL.svg index b1ca61ea5e..e75c544d90 100644 --- a/public/logos/18_ardennes/2-BE+NL.svg +++ b/public/logos/18_ardennes/2-BE+NL.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 2 diff --git a/public/logos/18_ardennes/2-BY+E.svg b/public/logos/18_ardennes/2-BY+E.svg index 547cfda5a0..7792d93c32 100644 --- a/public/logos/18_ardennes/2-BY+E.svg +++ b/public/logos/18_ardennes/2-BY+E.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 2 diff --git a/public/logos/18_ardennes/2-BY+P.svg b/public/logos/18_ardennes/2-BY+P.svg index 311f6cf256..5d2e6bc13c 100644 --- a/public/logos/18_ardennes/2-BY+P.svg +++ b/public/logos/18_ardennes/2-BY+P.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 2 diff --git a/public/logos/18_ardennes/3-BE+N.svg b/public/logos/18_ardennes/3-BE+N.svg index ae42a7c366..2f37089bae 100644 --- a/public/logos/18_ardennes/3-BE+N.svg +++ b/public/logos/18_ardennes/3-BE+N.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 3 diff --git a/public/logos/18_ardennes/3-BE+NL+P.svg b/public/logos/18_ardennes/3-BE+NL+P.svg index f66e27f74c..7df03c34d7 100644 --- a/public/logos/18_ardennes/3-BE+NL+P.svg +++ b/public/logos/18_ardennes/3-BE+NL+P.svg @@ -1,23 +1,23 @@ - + - - - + + + - - - + + + - - - + + + 3 diff --git a/public/logos/18_ardennes/3-BE+NL.svg b/public/logos/18_ardennes/3-BE+NL.svg index 619d932868..85d910ac50 100644 --- a/public/logos/18_ardennes/3-BE+NL.svg +++ b/public/logos/18_ardennes/3-BE+NL.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 3 diff --git a/public/logos/18_ardennes/3-BY+E.svg b/public/logos/18_ardennes/3-BY+E.svg index 0c041d2a2a..9299f04514 100644 --- a/public/logos/18_ardennes/3-BY+E.svg +++ b/public/logos/18_ardennes/3-BY+E.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 3 diff --git a/public/logos/18_ardennes/3-BY+P.svg b/public/logos/18_ardennes/3-BY+P.svg index da77a1e690..fc35a6453d 100644 --- a/public/logos/18_ardennes/3-BY+P.svg +++ b/public/logos/18_ardennes/3-BY+P.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 3 diff --git a/public/logos/18_ardennes/4-BE+N.svg b/public/logos/18_ardennes/4-BE+N.svg index 31c6a527b3..07d3ad7704 100644 --- a/public/logos/18_ardennes/4-BE+N.svg +++ b/public/logos/18_ardennes/4-BE+N.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 4 diff --git a/public/logos/18_ardennes/4-BE+NL+P.svg b/public/logos/18_ardennes/4-BE+NL+P.svg index 8564a65ca0..d1e1aada41 100644 --- a/public/logos/18_ardennes/4-BE+NL+P.svg +++ b/public/logos/18_ardennes/4-BE+NL+P.svg @@ -1,23 +1,23 @@ - + - - - + + + - - - + + + - - - + + + 4 diff --git a/public/logos/18_ardennes/4-BE+NL.svg b/public/logos/18_ardennes/4-BE+NL.svg index 7c9e7af118..1e6c7640db 100644 --- a/public/logos/18_ardennes/4-BE+NL.svg +++ b/public/logos/18_ardennes/4-BE+NL.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 4 diff --git a/public/logos/18_ardennes/4-BY+E.svg b/public/logos/18_ardennes/4-BY+E.svg index 69e0239543..a6f27ac1df 100644 --- a/public/logos/18_ardennes/4-BY+E.svg +++ b/public/logos/18_ardennes/4-BY+E.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 4 diff --git a/public/logos/18_ardennes/4-BY+P.svg b/public/logos/18_ardennes/4-BY+P.svg index ec859a9e00..4bbc3337f4 100644 --- a/public/logos/18_ardennes/4-BY+P.svg +++ b/public/logos/18_ardennes/4-BY+P.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 4 diff --git a/public/logos/18_ardennes/5-BE+N.svg b/public/logos/18_ardennes/5-BE+N.svg index f1fb23a9c0..fc21f5e083 100644 --- a/public/logos/18_ardennes/5-BE+N.svg +++ b/public/logos/18_ardennes/5-BE+N.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 5 diff --git a/public/logos/18_ardennes/5-BE+NL+P.svg b/public/logos/18_ardennes/5-BE+NL+P.svg index 262eac9aa2..c9237a5637 100644 --- a/public/logos/18_ardennes/5-BE+NL+P.svg +++ b/public/logos/18_ardennes/5-BE+NL+P.svg @@ -1,23 +1,23 @@ - + - - - + + + - - - + + + - - - + + + 5 diff --git a/public/logos/18_ardennes/5-BE+NL.svg b/public/logos/18_ardennes/5-BE+NL.svg index 0dd1ab881d..615029c29e 100644 --- a/public/logos/18_ardennes/5-BE+NL.svg +++ b/public/logos/18_ardennes/5-BE+NL.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 5 diff --git a/public/logos/18_ardennes/5-BY+E.svg b/public/logos/18_ardennes/5-BY+E.svg index a4cf233df7..371247d3f2 100644 --- a/public/logos/18_ardennes/5-BY+E.svg +++ b/public/logos/18_ardennes/5-BY+E.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 5 diff --git a/public/logos/18_ardennes/5-BY+P.svg b/public/logos/18_ardennes/5-BY+P.svg index 1abf8c8eaa..a4b012bb00 100644 --- a/public/logos/18_ardennes/5-BY+P.svg +++ b/public/logos/18_ardennes/5-BY+P.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 5 diff --git a/public/logos/18_ardennes/6-BE+N.svg b/public/logos/18_ardennes/6-BE+N.svg index e71c579244..9fd8652699 100644 --- a/public/logos/18_ardennes/6-BE+N.svg +++ b/public/logos/18_ardennes/6-BE+N.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 6 diff --git a/public/logos/18_ardennes/6-BE+NL+P.svg b/public/logos/18_ardennes/6-BE+NL+P.svg index b7f511da63..12ff5de086 100644 --- a/public/logos/18_ardennes/6-BE+NL+P.svg +++ b/public/logos/18_ardennes/6-BE+NL+P.svg @@ -1,23 +1,23 @@ - + - - - + + + - - - + + + - - - + + + 6 diff --git a/public/logos/18_ardennes/6-BE+NL.svg b/public/logos/18_ardennes/6-BE+NL.svg index 7746961ed0..2e86081bba 100644 --- a/public/logos/18_ardennes/6-BE+NL.svg +++ b/public/logos/18_ardennes/6-BE+NL.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 6 diff --git a/public/logos/18_ardennes/6-BY+E.svg b/public/logos/18_ardennes/6-BY+E.svg index f700c7891e..099489f604 100644 --- a/public/logos/18_ardennes/6-BY+E.svg +++ b/public/logos/18_ardennes/6-BY+E.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 6 diff --git a/public/logos/18_ardennes/6-BY+P.svg b/public/logos/18_ardennes/6-BY+P.svg index eb7103a948..ef15d529b7 100644 --- a/public/logos/18_ardennes/6-BY+P.svg +++ b/public/logos/18_ardennes/6-BY+P.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 6 diff --git a/public/logos/18_ardennes/7-BE+N.svg b/public/logos/18_ardennes/7-BE+N.svg index 973233c8fd..6ff539daec 100644 --- a/public/logos/18_ardennes/7-BE+N.svg +++ b/public/logos/18_ardennes/7-BE+N.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 7 diff --git a/public/logos/18_ardennes/7-BE+NL+P.svg b/public/logos/18_ardennes/7-BE+NL+P.svg index 7103af2ecf..4d53772852 100644 --- a/public/logos/18_ardennes/7-BE+NL+P.svg +++ b/public/logos/18_ardennes/7-BE+NL+P.svg @@ -1,23 +1,23 @@ - + - - - + + + - - - + + + - - - + + + 7 diff --git a/public/logos/18_ardennes/7-BE+NL.svg b/public/logos/18_ardennes/7-BE+NL.svg index 7f9bf40422..d647b51961 100644 --- a/public/logos/18_ardennes/7-BE+NL.svg +++ b/public/logos/18_ardennes/7-BE+NL.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 7 diff --git a/public/logos/18_ardennes/7-BY+E.svg b/public/logos/18_ardennes/7-BY+E.svg index ec26722f4e..477ddd9ef3 100644 --- a/public/logos/18_ardennes/7-BY+E.svg +++ b/public/logos/18_ardennes/7-BY+E.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 7 diff --git a/public/logos/18_ardennes/7-BY+P.svg b/public/logos/18_ardennes/7-BY+P.svg index d670689f55..bacc55e138 100644 --- a/public/logos/18_ardennes/7-BY+P.svg +++ b/public/logos/18_ardennes/7-BY+P.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 7 diff --git a/public/logos/18_ardennes/8-BE+N.svg b/public/logos/18_ardennes/8-BE+N.svg index 6c72bacf32..e9cde153e8 100644 --- a/public/logos/18_ardennes/8-BE+N.svg +++ b/public/logos/18_ardennes/8-BE+N.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 8 diff --git a/public/logos/18_ardennes/8-BE+NL+P.svg b/public/logos/18_ardennes/8-BE+NL+P.svg index 0005f6933a..c6f3744146 100644 --- a/public/logos/18_ardennes/8-BE+NL+P.svg +++ b/public/logos/18_ardennes/8-BE+NL+P.svg @@ -1,23 +1,23 @@ - + - - - + + + - - - + + + - - - + + + 8 diff --git a/public/logos/18_ardennes/8-BE+NL.svg b/public/logos/18_ardennes/8-BE+NL.svg index 5a94943fb0..3a3d140b9d 100644 --- a/public/logos/18_ardennes/8-BE+NL.svg +++ b/public/logos/18_ardennes/8-BE+NL.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 8 diff --git a/public/logos/18_ardennes/8-BY+E.svg b/public/logos/18_ardennes/8-BY+E.svg index af59b788bf..9024b8ebb2 100644 --- a/public/logos/18_ardennes/8-BY+E.svg +++ b/public/logos/18_ardennes/8-BY+E.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 8 diff --git a/public/logos/18_ardennes/8-BY+P.svg b/public/logos/18_ardennes/8-BY+P.svg index e961ec9243..f7fa16087c 100644 --- a/public/logos/18_ardennes/8-BY+P.svg +++ b/public/logos/18_ardennes/8-BY+P.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 8 diff --git a/public/logos/18_ardennes/9-BE+N.svg b/public/logos/18_ardennes/9-BE+N.svg index 7e7977df74..bd50631f48 100644 --- a/public/logos/18_ardennes/9-BE+N.svg +++ b/public/logos/18_ardennes/9-BE+N.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 9 diff --git a/public/logos/18_ardennes/9-BE+NL+P.svg b/public/logos/18_ardennes/9-BE+NL+P.svg index 072cd92bba..dda4cea9c1 100644 --- a/public/logos/18_ardennes/9-BE+NL+P.svg +++ b/public/logos/18_ardennes/9-BE+NL+P.svg @@ -1,23 +1,23 @@ - + - - - + + + - - - + + + - - - + + + 9 diff --git a/public/logos/18_ardennes/9-BE+NL.svg b/public/logos/18_ardennes/9-BE+NL.svg index 7feb4a987f..07081d6c67 100644 --- a/public/logos/18_ardennes/9-BE+NL.svg +++ b/public/logos/18_ardennes/9-BE+NL.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 9 diff --git a/public/logos/18_ardennes/9-BY+E.svg b/public/logos/18_ardennes/9-BY+E.svg index b40e29fe77..c2dc9cb6ea 100644 --- a/public/logos/18_ardennes/9-BY+E.svg +++ b/public/logos/18_ardennes/9-BY+E.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 9 diff --git a/public/logos/18_ardennes/9-BY+P.svg b/public/logos/18_ardennes/9-BY+P.svg index fd90f37079..9339870b3b 100644 --- a/public/logos/18_ardennes/9-BY+P.svg +++ b/public/logos/18_ardennes/9-BY+P.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + 9 diff --git a/public/logos/18_ardennes/fort.svg b/public/logos/18_ardennes/fort.svg index 30f551be0d..c26b0edeca 100644 --- a/public/logos/18_ardennes/fort.svg +++ b/public/logos/18_ardennes/fort.svg @@ -1,6 +1,6 @@ - + - + diff --git a/public/logos/18_ardennes/mine-BY+E.svg b/public/logos/18_ardennes/mine-BY+E.svg index e109e3c719..66868f4c05 100644 --- a/public/logos/18_ardennes/mine-BY+E.svg +++ b/public/logos/18_ardennes/mine-BY+E.svg @@ -1,4 +1,4 @@ - + @@ -7,8 +7,8 @@ - - + + From 04da94ab6cdfab535640c51494019ffde852eaa9 Mon Sep 17 00:00:00 2001 From: Oliver Burnett-Hall Date: Mon, 8 Jul 2024 22:09:08 +0100 Subject: [PATCH 45/54] [18Ardennes] Reset/clear coloured icons after public companies start Once the first public companies have been auctioned and started, there is no longer any restriction on which cities can be used to start future public companies. This means that the coloured station tokens and slot icons are no longer needed, so these get reset to their default colours (tokens) or removed (slot icons). --- lib/engine/game/g_18_ardennes/entities.rb | 19 ++++++++++++++++++- lib/engine/game/g_18_ardennes/game.rb | 12 ++++++++++++ .../game/g_18_ardennes/step/major_auction.rb | 6 +----- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/lib/engine/game/g_18_ardennes/entities.rb b/lib/engine/game/g_18_ardennes/entities.rb index 254e371d71..b7a87f4c6a 100644 --- a/lib/engine/game/g_18_ardennes/entities.rb +++ b/lib/engine/game/g_18_ardennes/entities.rb @@ -470,10 +470,17 @@ def place_home_token(corporation) change_token_icon(city, token, corporation) end + # If no public companies have yet been started then there are + # geographical restrictions on which minor companies can be used to + # start a public company. + def restricted? + major_corporations.none?(&:floated?) && concession_companies.none?(&:owner) + end + # Set a minor company's token logo to show which public companies can be # started from the city it is in. def change_token_icon(city, token, minor) - # TODO: return if after first public company auction round + return unless restricted? return if minor.type != :minor && minor.type != :dummy majors = associated_majors(city) @@ -483,6 +490,14 @@ def change_token_icon(city, token, minor) token.simple_logo = logo_path(majors, minor.id) end + # Set a minor company's token logo back to its default logo. + def reset_token_icon(token) + return unless token + + token.logo = token.corporation.logo + token.simple_logo = token.corporation.simple_logo + end + private # Creates a concession company for each major corporations @@ -525,6 +540,8 @@ def lowest_major_par # Adds slot icons to empty city slots, showing which public companies # can be started using a token in this city. def add_slot_icons(city) + return unless restricted? + city.tokens.each_with_index do |token, ix| next if token || city.reservations[ix] diff --git a/lib/engine/game/g_18_ardennes/game.rb b/lib/engine/game/g_18_ardennes/game.rb index c72e08274e..0b54533443 100644 --- a/lib/engine/game/g_18_ardennes/game.rb +++ b/lib/engine/game/g_18_ardennes/game.rb @@ -59,6 +59,7 @@ def next_round! @round = case @round when G18Ardennes::Round::Auction + major_auction_finished new_stock_round when Engine::Round::Auction init_round_finished @@ -107,6 +108,17 @@ def new_major_auction_round major_auction_round end + def major_auction_finished + return if restricted? + + # The coloured icons showing which public companies can be started + # from each city are no longer needed. + @cities.each do |city| + city.slot_icons.clear + city.tokens.each { |token| reset_token_icon(token) } + end + end + def stock_round G18Ardennes::Round::Stock.new(self, [ G18Ardennes::Step::Exchange, diff --git a/lib/engine/game/g_18_ardennes/step/major_auction.rb b/lib/engine/game/g_18_ardennes/step/major_auction.rb index 11b3a71b8f..50dbd53853 100644 --- a/lib/engine/game/g_18_ardennes/step/major_auction.rb +++ b/lib/engine/game/g_18_ardennes/step/major_auction.rb @@ -286,11 +286,7 @@ def concession_corporation(concession) # geographical restrictions on which minor companies can be used to # start a public company. def restricted? - if @restricted.nil? - @restricted = @game.corporations.none? do |corporation| - corporation.floated && corporation.type != :minor - end - end + @restricted = @game.restricted? if @restricted.nil? @restricted end From d4882b337251a6a01eeff1a21cacbb9c254014db Mon Sep 17 00:00:00 2001 From: Phil Campeau Date: Tue, 9 Jul 2024 14:36:31 -0400 Subject: [PATCH 46/54] [1849 K2S] fix Societa Marittima description --- lib/engine/game/g_1849_boot/entities.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/engine/game/g_1849_boot/entities.rb b/lib/engine/game/g_1849_boot/entities.rb index d2958dcf48..c331e5a6ea 100644 --- a/lib/engine/game/g_1849_boot/entities.rb +++ b/lib/engine/game/g_1849_boot/entities.rb @@ -66,7 +66,7 @@ module Entities 'this private company in lieu of performing both its tile '\ 'and token placement steps. Performing this action allows '\ 'the corporation to select any coastal city hex (all cities '\ - 'except Foggia, Campobasso, and Potenza), optionally lay or '\ + "except Foggia, Campobasso, L'Aquila, and Potenza), optionally lay or "\ 'upgrade a tile there, and optionally place a station token '\ 'there. This power may be used even if the corporation is '\ 'unable to trace a route to that city, but all other normal '\ From a89fed05b2b7944a3ad7d3608d839d315b71ee79 Mon Sep 17 00:00:00 2001 From: Phil Campeau Date: Wed, 10 Jul 2024 10:17:46 -0400 Subject: [PATCH 47/54] [1830] implements private company cross-buys --- lib/engine/game/g_1830/game.rb | 26 ++++++++++++++++--- .../game/g_1830/step/buy_sell_par_shares.rb | 23 ++++++++++++++++ 2 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 lib/engine/game/g_1830/step/buy_sell_par_shares.rb diff --git a/lib/engine/game/g_1830/game.rb b/lib/engine/game/g_1830/game.rb index ab7a499cd1..bd4fddcfc7 100644 --- a/lib/engine/game/g_1830/game.rb +++ b/lib/engine/game/g_1830/game.rb @@ -109,14 +109,20 @@ class Game < Game::Base ['', '', '', '10b', '20b', '30b', '40o'], ].freeze - PHASES = [{ name: '2', train_limit: 4, tiles: [:yellow], operating_rounds: 1 }, + PHASES = [{ + name: '2', + train_limit: 4, + tiles: [:yellow], + operating_rounds: 1, + status: ['can_buy_companies_from_other_players'], + }, { name: '3', on: '3', train_limit: 4, tiles: %i[yellow green], operating_rounds: 2, - status: ['can_buy_companies'], + status: %w[can_buy_companies can_buy_companies_from_other_players], }, { name: '4', @@ -124,7 +130,7 @@ class Game < Game::Base train_limit: 3, tiles: %i[yellow green], operating_rounds: 2, - status: ['can_buy_companies'], + status: %w[can_buy_companies can_buy_companies_from_other_players], }, { name: '5', @@ -186,6 +192,20 @@ def operating_round(round_num) ], round_num: round_num) end + def stock_round + Round::Stock.new(self, [ + Engine::Step::DiscardTrain, + Engine::Step::Exchange, + Engine::Step::SpecialTrack, + G1830::Step::BuySellParShares, + ]) + end + + STATUS_TEXT = Base::STATUS_TEXT.merge( + 'can_buy_companies_from_other_players' => ['Interplayer Company Buy', + 'Companies can be bought between players after first stock round'], + ).freeze + def multiple_buy_only_from_market? !optional_rules&.include?(:multiple_brown_from_ipo) end diff --git a/lib/engine/game/g_1830/step/buy_sell_par_shares.rb b/lib/engine/game/g_1830/step/buy_sell_par_shares.rb new file mode 100644 index 0000000000..9bdce59821 --- /dev/null +++ b/lib/engine/game/g_1830/step/buy_sell_par_shares.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +require_relative '../../../step/buy_sell_par_shares' + +module Engine + module Game + module G1830 + module Step + class BuySellParShares < Engine::Step::BuySellParShares + def purchasable_companies(entity) + return [] if bought? || + !available_cash(entity).positive? || + !@game.phase || + !@game.phase.status.include?('can_buy_companies_from_other_players') || + @game.turn == 1 + + @game.purchasable_companies(entity) + end + end + end + end + end +end From 13752b9c918b3316e36555e634a8aff9dc3a8a16 Mon Sep 17 00:00:00 2001 From: Alexander Vansach Date: Sat, 13 Jul 2024 22:09:44 +0000 Subject: [PATCH 48/54] 22Mars: post-review fixes --- lib/engine/game/g_22_mars/game.rb | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/engine/game/g_22_mars/game.rb b/lib/engine/game/g_22_mars/game.rb index 02c6d108f3..3ef994c59e 100644 --- a/lib/engine/game/g_22_mars/game.rb +++ b/lib/engine/game/g_22_mars/game.rb @@ -30,7 +30,7 @@ class Game < Game::Base %w[0c], ].freeze - CERT_LIMIT = { 2 => 12, 3 => 12, 4 => 9, 5 => 7 }.freeze + CERT_LIMIT = { 3 => 12, 4 => 9, 5 => 7 }.freeze PHASES = [ { @@ -93,7 +93,7 @@ class Game < Game::Base { name: '3', distance: 3, - price: 17, + price: 170, rusts_on: '5', num: 4, }, @@ -115,16 +115,14 @@ class Game < Game::Base name: '6+S', distance: 6, price: 440, - rusts_on: '4', num: 4, }, { name: '6+SS', distance: 6, price: 560, - rusts_on: '4', num: 6, - discount: { '5' => 400 }, + discount: { '5' => 160 }, }, ].freeze From c141ea513d56932ac12e1543ceaf0b7f33a10de6 Mon Sep 17 00:00:00 2001 From: Michael Brandt Date: Sun, 14 Jul 2024 12:11:43 -0600 Subject: [PATCH 49/54] [18Norway] use `count` instead of `sum` to count nationalized corps Co-authored-by: Oliver Burnett-Hall --- lib/engine/game/g_18_norway/game.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/engine/game/g_18_norway/game.rb b/lib/engine/game/g_18_norway/game.rb index aa3086d7fa..9a96531414 100644 --- a/lib/engine/game/g_18_norway/game.rb +++ b/lib/engine/game/g_18_norway/game.rb @@ -490,7 +490,7 @@ def update_cert_limit_to(new_cert_limit) end def update_cert_limit - nr = @corporations.sum(0) { |corporation| nationalized?(corporation) ? 1 : 0 } + nr = @corporations.count(&:nationalized?) new_cert_limit = CERT_LIMIT[@players.size][nr] update_cert_limit_to(new_cert_limit) unless @cert_limit == new_cert_limit end From 61e8975a51d6b5f708c47991cf3f830ca140482a Mon Sep 17 00:00:00 2001 From: Michael Brandt Date: Sun, 14 Jul 2024 12:23:37 -0600 Subject: [PATCH 50/54] use bidbox_minors directly instead of mapping to a set --- lib/engine/game/g_1822_pnw/step/acquire_company.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/engine/game/g_1822_pnw/step/acquire_company.rb b/lib/engine/game/g_1822_pnw/step/acquire_company.rb index 68ee8195cf..07c842dd7e 100644 --- a/lib/engine/game/g_1822_pnw/step/acquire_company.rb +++ b/lib/engine/game/g_1822_pnw/step/acquire_company.rb @@ -95,7 +95,7 @@ def process_choose(action) end def p20_targets - bidbox_corporations = ::Set.new(@game.bidbox_minors) { |c| @game.corporation_from_company(c) } + bidbox_minors = @game.bidbox_minors @game.minor_associations.each_with_object([]) do |(minor_id, major_id), targets| company = @game.company_by_id("M#{minor_id}") @@ -105,7 +105,7 @@ def p20_targets already_discarded = (!company.owner && company.closed? && minor.closed?) minor_available = !minor.owner && - (already_discarded || !bidbox_corporations.include?(minor)) + (already_discarded || !bidbox_minors.include?(company)) major_available = !major.owner && !major.floated? targets << minor if minor_available && major_available From 5f61f40cb864eaefd877492b5838661c8af5a7f6 Mon Sep 17 00:00:00 2001 From: Michael Brandt Date: Sun, 14 Jul 2024 12:30:09 -0600 Subject: [PATCH 51/54] [18Norway] Fix update_cert_limit fixes c141ea513d56932ac12e1543ceaf0b7f33a10de6 --- lib/engine/game/g_18_norway/game.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/engine/game/g_18_norway/game.rb b/lib/engine/game/g_18_norway/game.rb index 683d67665e..ab9d9842c7 100644 --- a/lib/engine/game/g_18_norway/game.rb +++ b/lib/engine/game/g_18_norway/game.rb @@ -492,7 +492,7 @@ def update_cert_limit_to(new_cert_limit) end def update_cert_limit - nr = @corporations.count(&:nationalized?) + nr = @corporations.count { |c| nationalized?(c) } new_cert_limit = CERT_LIMIT[@players.size][nr] update_cert_limit_to(new_cert_limit) unless @cert_limit == new_cert_limit end From d00cb96c24c94e9401933382aea7c1d3fe2783af Mon Sep 17 00:00:00 2001 From: Michael Brandt Date: Sun, 14 Jul 2024 13:12:14 -0600 Subject: [PATCH 52/54] Update welcome page for 18Uruguay to alpha --- assets/app/view/welcome.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/assets/app/view/welcome.rb b/assets/app/view/welcome.rb index 5543e54370..9a1d7cd246 100644 --- a/assets/app/view/welcome.rb +++ b/assets/app/view/welcome.rb @@ -16,9 +16,7 @@ def render def render_notification message = <<~MESSAGE -

18Neb, 1844, and 1847 AE are in production.

- -

18RoyalGorge and 18Hiawatha are in alpha.

+

18Uruguay is in alpha.

Report bugs and make feature requests on GitHub.

MESSAGE From e7e7b9338f3b29abc9cefee975bafcd7aef253e7 Mon Sep 17 00:00:00 2001 From: Michael Brandt Date: Sun, 14 Jul 2024 15:29:28 -0600 Subject: [PATCH 53/54] 22Mars to prealpha --- lib/engine/game/g_22_mars/meta.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/engine/game/g_22_mars/meta.rb b/lib/engine/game/g_22_mars/meta.rb index fd04138f1d..02b496d706 100644 --- a/lib/engine/game/g_22_mars/meta.rb +++ b/lib/engine/game/g_22_mars/meta.rb @@ -8,7 +8,7 @@ module G22Mars module Meta include Game::Meta - DEV_STAGE = :alpha + DEV_STAGE = :prealpha PROTOTYPE = true GAME_DESIGNER = 'Jonas Jones' From 8535b695beda18c04fdcec9764cc5bf241d253de Mon Sep 17 00:00:00 2001 From: Michael Brandt Date: Sun, 14 Jul 2024 15:53:35 -0600 Subject: [PATCH 54/54] [1822/MX] track rights around London/Mexico City only apply for yellow tiles Fixes #11031 --- lib/engine/game/g_1822/game.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/engine/game/g_1822/game.rb b/lib/engine/game/g_1822/game.rb index 1425ffc1c7..d88bfb300a 100644 --- a/lib/engine/game/g_1822/game.rb +++ b/lib/engine/game/g_1822/game.rb @@ -1962,6 +1962,7 @@ def preprocess_action(action) def hex_blocked_by_ability?(entity, ability, hex, tile) return false if tile.name == 'BC' + return false unless hex.tile.color == :white return false unless ability.player return false if entity.player == ability.player return false if ability.hexes.none? { |h| h.id == hex.id }