diff --git a/assets/app/view/game/bid.rb b/assets/app/view/game/bid.rb index 66c893a099..8bd5744bf2 100644 --- a/assets/app/view/game/bid.rb +++ b/assets/app/view/game/bid.rb @@ -8,14 +8,18 @@ module Round class Bid < Snabberb::Component include Actionable needs :entity - needs :corporation + needs :biddable def render step = @game.round.step_for(@entity, 'bid') + + children = [] + children << h(:div, [step.bid_description]) if step.respond_to?(:bid_description) && step.bid_description + min_increment = step.min_increment - min_bid = step.min_bid(@corporation) - max_bid = step.max_bid(@entity, @corporation) + min_bid = step.min_bid(@biddable) + max_bid = step.max_bid(@entity, @biddable) price_input = h(:input, style: { marginRight: '1rem' }, props: { value: min_bid, step: min_increment, @@ -28,15 +32,16 @@ def render place_bid = lambda do process_action(Engine::Action::Bid.new( @entity, - corporation: @corporation.corporation? ? @corporation : nil, - company: @corporation.company? ? @corporation : nil, + corporation: @biddable.corporation? ? @biddable : nil, + company: @biddable.company? ? @biddable : nil, price: Native(price_input)[:elm][:value].to_i, )) end bid_button = h(:button, { on: { click: place_bid } }, 'Place Bid') + children << h(:div, [price_input, bid_button]) - h('div.center', [price_input, bid_button]) + h('div.center', children) end end end diff --git a/assets/app/view/game/buy_trains.rb b/assets/app/view/game/buy_trains.rb index 97fbdba731..b13103e0b3 100644 --- a/assets/app/view/game/buy_trains.rb +++ b/assets/app/view/game/buy_trains.rb @@ -214,7 +214,15 @@ def render if (@step.can_buy_train?(@corporation, @active_shell) && @step.room?(@corporation, @active_shell)) || @must_buy_train - children << h(:div, "#{@corporation.name} must buy an available train") if @must_buy_train + if @must_buy_train + children << if @step.must_issue_before_ebuy?(@corporation) + h(:div, "#{@corporation.name} must buy a train from another corporation, "\ + 'or issue shares and then buy an available train ') + else + h(:div, "#{@corporation.name} must buy an available train") + end + end + if @should_buy_train == :liquidation children << h(:div, "#{@corporation.name} must buy a train or it will be liquidated") end @@ -576,7 +584,7 @@ def remaining_trains }, } - rows = @depot.upcoming.group_by(&:name).flat_map do |_, trains| + rows = @depot.upcoming.reject(&:reserved).group_by(&:name).flat_map do |_, trains| [h(:div, @game.info_train_name(trains.first)), h(:div, @game.info_train_price(trains.first)), h(:div, trains.size)] diff --git a/assets/app/view/game/choose.rb b/assets/app/view/game/choose.rb index cc0b16f674..12bf6cf4e8 100644 --- a/assets/app/view/game/choose.rb +++ b/assets/app/view/game/choose.rb @@ -10,14 +10,15 @@ class Choose < Snabberb::Component needs :entity, default: nil def render - choices = if @game.round.active_step.respond_to?(:entity_choices) - @game.round.active_step.entity_choices(@entity) + step = @game.round.active_step + choices = if step.respond_to?(:entity_choices) + step.entity_choices(@entity) else - @game.round.active_step.choices + step.choices end - choice_is_amount = if @game.round.active_step.respond_to?(:choice_is_amount?) - @game.round.active_step.choice_is_amount? + choice_is_amount = if step.respond_to?(:choice_is_amount?) + step.choice_is_amount? else false end @@ -50,14 +51,11 @@ def render h('button', props, label) end - div_class = choice_buttons.size < 5 ? '.inline' : '' children = [] - children << h("div#{div_class}", - { style: { marginTop: '0.5rem' } }, - "#{@game.round.active_step.choice_name}: ") + div_class = choice_buttons.size < 5 ? '.inline' : '' + children << h("div#{div_class}", { style: { marginTop: '0.5rem' } }, "#{step.choice_name}: ") if step.choice_name children << h(:div, choice_buttons) - if @game.round.active_step.respond_to?(:choice_explanation) && - (explanation = @game.round.active_step.choice_explanation) + if step.respond_to?(:choice_explanation) && (explanation = step.choice_explanation) paragraphs = explanation.map { |text_block| h(:p, text_block) } children << h(:div, { style: { marginTop: '0.5rem' } }, paragraphs) end diff --git a/assets/app/view/game/part/town_dot.rb b/assets/app/view/game/part/town_dot.rb index 1b4a59e1c4..f7c698c131 100644 --- a/assets/app/view/game/part/town_dot.rb +++ b/assets/app/view/game/part/town_dot.rb @@ -123,7 +123,9 @@ def render_part children << h(:circle, attrs: dot_attrs) children << render_boom if @town.boom - children << render_revenue if @show_revenue + if @show_revenue && (rendered = render_revenue) + children << rendered + end children << h(HitBox, click: -> { touch_node(@town) }, transform: translate) unless @town.solo? h(:g, { key: "#{@town.id}-d" }, children) end diff --git a/assets/app/view/game/round/merger.rb b/assets/app/view/game/round/merger.rb index 641e80e4cf..f7ee8ce944 100644 --- a/assets/app/view/game/round/merger.rb +++ b/assets/app/view/game/round/merger.rb @@ -67,7 +67,7 @@ def render if auctioning_corporation && !actions.include?('merge') inner = [] inner << h(Corporation, corporation: auctioning_corporation || corporation_to_merge_into, selectable: false) - inner << h(Bid, entity: entity, corporation: auctioning_corporation) if actions.include?('bid') + inner << h(Bid, entity: entity, biddable: auctioning_corporation) if actions.include?('bid') children << h(:div, props, inner) if @step.respond_to?(:show_bidding_corporation?) && @step.show_bidding_corporation? diff --git a/assets/app/view/game/round/stock.rb b/assets/app/view/game/round/stock.rb index 20d94ac718..81ac13b88e 100644 --- a/assets/app/view/game/round/stock.rb +++ b/assets/app/view/game/round/stock.rb @@ -74,6 +74,7 @@ def render end children.concat(render_buttons) + children << render_bid if @current_actions.include?('bid') children << h(SpecialBuy) if @current_actions.include?('special_buy') children.concat(render_failed_merge) if @current_actions.include?('failed_merge') children.concat(render_bank_companies) if @bank_first @@ -203,7 +204,7 @@ def render_pre_ipo(corporation) when :par children << h(Par, corporation: corporation) if @current_actions.include?('par') when :bid - children << h(Bid, entity: @current_entity, corporation: corporation) if @current_actions.include?('bid') + children << h(Bid, entity: @current_entity, biddable: corporation) if @current_actions.include?('bid') when :form children << h(FormCorporation, corporation: corporation) if @current_actions.include?('par') when String @@ -330,7 +331,7 @@ def render_bank_companies if @selected_company == company inputs = [] inputs.concat(render_buy_input(company)) if @current_actions.include?('buy_company') - inputs.concat(render_bid_input(company)) if @current_actions.include?('bid') + inputs.concat(render_company_bid_input(company)) if @current_actions.include?('bid') children << h('div.margined_bottom', { style: { width: '20rem' } }, inputs) end h(:div, props, children) @@ -384,10 +385,10 @@ def render_buy_input_interval(company) ])] end - def render_bid_input(company) + def render_company_bid_input(company) return [] if !@step.respond_to?(:can_bid_company?) || !@step.can_bid_company?(@current_entity, company) - [h(Bid, entity: @current_entity, corporation: company)] + [h(Bid, entity: @current_entity, biddable: company)] end def render_bank @@ -423,6 +424,14 @@ def render_payoff_loan end [h(:button, { on: { click: payoff_loan } }, "Payoff Loan (#{@game.format_currency(@game.loan_amount)})")] end + + def render_bid + children = [] + if @step.respond_to?(:can_bid?) && @step.can_bid?(@current_entity) + children << h(Bid, entity: @current_entity, biddable: @step.bid_entity) + end + h(:div, children) + end end end end diff --git a/assets/app/view/game/scrap_trains.rb b/assets/app/view/game/scrap_trains.rb index faee20490c..aaefb8a4ad 100644 --- a/assets/app/view/game/scrap_trains.rb +++ b/assets/app/view/game/scrap_trains.rb @@ -10,12 +10,12 @@ class ScrapTrains < Snabberb::Component def render @corporation ||= @game.round.active_step.current_entity - step = @game.round.step_for(@corporation, 'scrap_train') + @step = @game.round.step_for(@corporation, 'scrap_train') - scrappable_trains = step.scrappable_trains(@corporation) + scrappable_trains = @step.scrappable_trains(@corporation) return nil if scrappable_trains.empty? - if step.respond_to?(:scrap_trains_button_only?) && step.scrap_trains_button_only? + if @step.respond_to?(:scrap_trains_button_only?) && @step.scrap_trains_button_only? render_buttons(scrappable_trains) else render_section(scrappable_trains) @@ -23,8 +23,8 @@ def render end def render_buttons(scrappable_trains) - h(:div, generate_scrap_train_actions(scrappable_trains) do |scrap, train, step| - h(:button, { on: { click: scrap } }, step.scrap_info(train)) + h(:div, generate_scrap_train_actions(scrappable_trains) do |scrap, train| + h(:button, { on: { click: scrap } }, @step.scrap_info(train)) end) end @@ -38,21 +38,24 @@ def render_section(scrappable_trains) }, } h(:div, - [h(:h3, 'Trains to Scrap'), + [h(:h3, scrap_trains_header_text), h(:div, div_props, scrap_trains(scrappable_trains))]) end + def scrap_trains_header_text + @step.respond_to?(:scrap_header_text) ? @step.scrap_header_text : 'Trains to Scrap' + end + def scrap_trains(scrappable_trains) - generate_scrap_train_actions(scrappable_trains) do |scrap, train, step| + generate_scrap_train_actions(scrappable_trains) do |scrap, train| [h(:div, train.name), h('div.nowrap', train.owner.name), - h('div.right', step.scrap_info(train)), - h('button.no_margin', { on: { click: scrap } }, step.scrap_button_text(train))] + h('div.right', @step.scrap_info(train)), + h('button.no_margin', { on: { click: scrap } }, @step.scrap_button_text(train))] end end def generate_scrap_train_actions(scrappable_trains) - step = @game.round.step_for(@corporation, 'scrap_train') scrappable_trains.flat_map do |train| scrap = lambda do process_action(Engine::Action::ScrapTrain.new( @@ -60,7 +63,7 @@ def generate_scrap_train_actions(scrappable_trains) train: train, )) end - yield(scrap, train, step) + yield(scrap, train) end end end diff --git a/assets/app/view/game/spreadsheet.rb b/assets/app/view/game/spreadsheet.rb index af6014d87f..809c8a2e9d 100644 --- a/assets/app/view/game/spreadsheet.rb +++ b/assets/app/view/game/spreadsheet.rb @@ -63,6 +63,7 @@ def render_player_table h(:thead), h('tbody#player_details', [ render_player_cash, + render_player_loans, render_player_value, render_player_liquidity, render_player_shares, @@ -649,6 +650,15 @@ def render_player_cert_count(player, cert_limit, props) h('td.padded_number', num_certs > cert_limit ? props : '', num_certs) end + def render_player_loans + return '' unless @game.respond_to?(:player_loans) + + h(:tr, tr_default_props, [ + h('th.left', 'Loans'), + *@game.players.map { |p| h('td.padded_number', @game.player_loans(p)) }, + ]) + end + def tr_default_props { style: { diff --git a/assets/app/view/game/train_schedule.rb b/assets/app/view/game/train_schedule.rb index 1b551549ce..61dc435cf0 100644 --- a/assets/app/view/game/train_schedule.rb +++ b/assets/app/view/game/train_schedule.rb @@ -56,7 +56,7 @@ def render trs = if @game.depot.upcoming.empty? 'No Upcoming Trains' else - @game.depot.upcoming.group_by(&:name).map do |name, trains| + @game.depot.upcoming.reject(&:reserved).group_by(&:name).map do |name, trains| events = [] events << h('div.left', "rusts #{rust_schedule[name].join(', ')}") if rust_schedule[name] events << h('div.left', "obsoletes #{obsolete_schedule[name].join(', ')}") if obsolete_schedule[name] diff --git a/assets/app/view/game_page.rb b/assets/app/view/game_page.rb index aadb1963ee..e04ea536fb 100644 --- a/assets/app/view/game_page.rb +++ b/assets/app/view/game_page.rb @@ -133,6 +133,7 @@ def render if n_id == o_id + 1 game_data['actions'] << data + store(:selected_company, nil, skip: true) store(:game_data, game_data, skip: true) store(:game, game.process_action(data)) else diff --git a/assets/app/view/welcome.rb b/assets/app/view/welcome.rb index 97b883932e..1e76284f75 100644 --- a/assets/app/view/welcome.rb +++ b/assets/app/view/welcome.rb @@ -17,7 +17,8 @@ def render def render_notification message = <<~MESSAGE -

1822Africa is now in alpha.

+

1840 is now (finally) in production.

+

1868 Wyoming is now in alpha.

Learn how to get notifications by email, Slack, Discord, and Telegram.

Please submit problem reports and make suggestions for improvements on GitHub. Join the diff --git a/lib/engine/game/base.rb b/lib/engine/game/base.rb index 56757893ad..7b33118923 100644 --- a/lib/engine/game/base.rb +++ b/lib/engine/game/base.rb @@ -168,6 +168,7 @@ class Base # operate -- after operation # p_any_operate -- pres any time, share holders after operation # any_time -- at any time + # round -- after the stock round the share was purchased in SELL_AFTER = :first # down_share -- down one row per share @@ -1057,8 +1058,9 @@ def check_sale_timing(entity, bundle) when :p_any_operate corporation.operated? || corporation.president?(entity) when :round - @round.stock? && - corporation.share_holders[entity] - @round.players_bought[entity][corporation] >= bundle.percent + (@round.stock? && + corporation.share_holders[entity] - @round.players_bought[entity][corporation] >= bundle.percent) || + @round.operating? when :any_time true else @@ -1202,9 +1204,8 @@ def log_share_price(entity, from, steps = nil, log_steps: false) return unless from != to jumps = '' - if steps - steps = share_jumps(steps) - jumps = " (#{steps} step#{steps == 1 ? '' : 's'})" if (steps > 1) || log_steps + if steps && ((steps > 1) || log_steps) + jumps = " (#{steps} step#{steps == 1 ? '' : 's'})" end r1, c1 = from.coordinates @@ -1220,16 +1221,6 @@ def log_share_price(entity, from, steps = nil, log_steps: false) "to #{format_currency(to_price)}#{jumps}" end - def share_jumps(steps) - return steps unless @stock_market.zigzag - - if steps > 1 - steps / 2 - else - steps - end - end - # A hook to allow a game to request a consent check for a share exchange # or purchase. If consent is needed then this method should return the # player that needs to consent to this action. Returning nil or false @@ -2247,7 +2238,7 @@ def init_bank cash = self.class::BANK_CASH cash = cash[players.size] if cash.is_a?(Hash) - Bank.new(cash, log: @log) + Bank.new(cash, log: @log, check: game_end_check_values.include?(:bank)) end def init_cert_limit diff --git a/lib/engine/game/g_1817/entities.rb b/lib/engine/game/g_1817/entities.rb index 43e9458926..d7c53c5798 100644 --- a/lib/engine/game/g_1817/entities.rb +++ b/lib/engine/game/g_1817/entities.rb @@ -515,7 +515,6 @@ module Entities tokens: [0], always_market_price: true, color: '#ee3e80', - reservation_color: nil, }, { float_percent: 20, @@ -528,7 +527,6 @@ module Entities tokens: [0], always_market_price: true, color: '#904098', - reservation_color: nil, }, { float_percent: 20, @@ -542,7 +540,6 @@ module Entities always_market_price: true, text_color: 'black', color: '#f2a847', - reservation_color: nil, }, { float_percent: 20, @@ -555,7 +552,6 @@ module Entities tokens: [0], always_market_price: true, color: '#16190e', - reservation_color: nil, }, { float_percent: 20, @@ -568,7 +564,6 @@ module Entities tokens: [0], always_market_price: true, color: '#ef4223', - reservation_color: nil, }, { float_percent: 20, @@ -581,7 +576,6 @@ module Entities tokens: [0], always_market_price: true, color: '#984573', - reservation_color: nil, }, { float_percent: 20, @@ -595,7 +589,6 @@ module Entities always_market_price: true, text_color: 'black', color: '#bedb86', - reservation_color: nil, }, { float_percent: 20, @@ -608,7 +601,6 @@ module Entities tokens: [0], always_market_price: true, color: '#e48329', - reservation_color: nil, }, { float_percent: 20, @@ -622,7 +614,6 @@ module Entities always_market_price: true, text_color: 'black', color: '#bedef3', - reservation_color: nil, }, { float_percent: 20, @@ -636,7 +627,6 @@ module Entities always_market_price: true, color: '#ffdea8', text_color: 'black', - reservation_color: nil, }, { float_percent: 20, @@ -649,7 +639,6 @@ module Entities tokens: [0], always_market_price: true, color: '#0095da', - reservation_color: nil, }, { float_percent: 20, @@ -663,7 +652,6 @@ module Entities always_market_price: true, color: '#fff36b', text_color: 'black', - reservation_color: nil, }, { float_percent: 20, @@ -676,7 +664,6 @@ module Entities tokens: [0], always_market_price: true, color: '#0a884b', - reservation_color: nil, }, { float_percent: 20, @@ -689,7 +676,6 @@ module Entities tokens: [0], always_market_price: true, color: '#00afad', - reservation_color: nil, }, { float_percent: 20, @@ -703,7 +689,6 @@ module Entities always_market_price: true, text_color: 'black', color: '#bec8cc', - reservation_color: nil, }, { float_percent: 20, @@ -716,7 +701,6 @@ module Entities tokens: [0], always_market_price: true, color: '#165633', - reservation_color: nil, }, { float_percent: 20, @@ -729,7 +713,6 @@ module Entities tokens: [0], always_market_price: true, color: '#e31f21', - reservation_color: nil, }, { float_percent: 20, @@ -742,7 +725,6 @@ module Entities tokens: [0], always_market_price: true, color: '#003d84', - reservation_color: nil, }, { float_percent: 20, @@ -755,7 +737,6 @@ module Entities tokens: [0], always_market_price: true, color: '#e96f2c', - reservation_color: nil, }, { float_percent: 20, @@ -768,7 +749,6 @@ module Entities tokens: [0], always_market_price: true, color: '#984d2d', - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_1817_de/entities.rb b/lib/engine/game/g_1817_de/entities.rb index 21e10d5041..b65f78fd89 100644 --- a/lib/engine/game/g_1817_de/entities.rb +++ b/lib/engine/game/g_1817_de/entities.rb @@ -176,7 +176,6 @@ module Entities tokens: [0], always_market_price: true, color: 'maroon', - reservation_color: nil, }, { float_percent: 20, @@ -188,7 +187,6 @@ module Entities tokens: [0], always_market_price: true, color: 'dodgerblue', - reservation_color: nil, }, { @@ -201,7 +199,6 @@ module Entities tokens: [0], always_market_price: true, color: 'darkgreen', - reservation_color: nil, }, { @@ -214,7 +211,6 @@ module Entities tokens: [0], always_market_price: true, color: 'darkgray', - reservation_color: nil, }, { float_percent: 20, sym: 'MS', @@ -225,7 +221,6 @@ module Entities tokens: [0], always_market_price: true, color: 'indigo', - reservation_color: nil, }, { float_percent: 20, sym: 'SX', @@ -236,7 +231,6 @@ module Entities tokens: [0], always_market_price: true, color: 'red', - reservation_color: nil, }, { float_percent: 20, @@ -249,7 +243,6 @@ module Entities always_market_price: true, color: 'yellow', text_color: 'black', - reservation_color: nil, }, { float_percent: 20, sym: 'BM', @@ -261,7 +254,6 @@ module Entities always_market_price: true, color: 'lime', text_color: 'black', - reservation_color: nil, }, { float_percent: 20, @@ -273,7 +265,6 @@ module Entities tokens: [0], always_market_price: true, color: 'hotpink', - reservation_color: nil, }, { float_percent: 20, @@ -285,7 +276,6 @@ module Entities tokens: [0], always_market_price: true, color: '#003d84', - reservation_color: nil, }, { float_percent: 20, sym: 'KM', @@ -296,7 +286,6 @@ module Entities tokens: [0], always_market_price: true, color: 'black', - reservation_color: nil, }, { float_percent: 20, @@ -309,7 +298,6 @@ module Entities always_market_price: true, color: '#ADD8E6', text_color: 'black', - reservation_color: nil, }, { float_percent: 20, @@ -322,7 +310,6 @@ module Entities always_market_price: true, color: 'Burlywood', text_color: 'black', - reservation_color: nil, }, { float_percent: 20, @@ -334,7 +321,6 @@ module Entities tokens: [0], always_market_price: true, color: '#e48329', - reservation_color: nil, }, { float_percent: 20, @@ -347,7 +333,6 @@ module Entities always_market_price: true, text_color: 'black', color: '#bedb86', - reservation_color: nil, } ].freeze end diff --git a/lib/engine/game/g_1817_na/entities.rb b/lib/engine/game/g_1817_na/entities.rb new file mode 100644 index 0000000000..445618b779 --- /dev/null +++ b/lib/engine/game/g_1817_na/entities.rb @@ -0,0 +1,367 @@ +# frozen_string_literal: true + +module Engine + module Game + module G1817NA + module Entities + COMPANIES = [ + { + name: 'Denver Telecommunications', + value: 40, + revenue: 0, + desc: 'Owning corp may place special Denver yellow tile during tile-laying, '\ + 'regardless of connectivity. The hex is not reserved, and the '\ + 'power is lost if another company builds there first.', + sym: 'DTC', + abilities: [ + { + type: 'tile_lay', + hexes: ['F14'], + tiles: ['X00'], + when: 'track', + owner_type: 'corporation', + count: 1, + closed_when_used_up: true, + consume_tile_lay: true, + special: true, + }, + ], + color: nil, + }, + { + name: 'Mountain Engineers', + value: 40, + revenue: 0, + desc: 'Owning company receives $20 after laying a yellow tile in a '\ + 'mountain hex. Any fees must be paid first.', + sym: 'ME', + abilities: [ + { + type: 'tile_income', + income: 20, + terrain: 'mountain', + owner_type: 'corporation', + owner_only: true, + }, + ], + color: nil, + }, + { + name: 'Union Bridge Company', + value: 80, + revenue: 0, + desc: 'Comes with two $10 bridge token that may be placed by the owning corp '\ + 'in Winnipeg or New Orleans, max one token per city, regardless of '\ + 'connectivity. Allows owning corp to skip $10 river fee when '\ + 'placing yellow tiles.', + sym: 'UBC', + abilities: [ + { + type: 'tile_discount', + discount: 10, + terrain: 'water', + owner_type: 'corporation', + }, + { + type: 'assign_hexes', + hexes: %w[D16 H18], + count: 2, + when: 'owning_corp_or_turn', + owner_type: 'corporation', + }, + ], + color: nil, + }, + { + name: 'Train Station', + value: 80, + revenue: 0, + desc: 'Provides an additional station marker for the owning corp, awarded at time of purchase', + sym: 'TS', + abilities: [ + { + type: 'additional_token', + count: 1, + owner_type: 'corporation', + }, + ], + color: nil, + }, + { + name: 'Minor Coal Mine', + value: 30, + revenue: 0, + desc: 'Comes with one coal mine marker. When placing a yellow tile '\ + 'in a mountain hex next to a revenue location, can place token '\ + 'to avoid $15 terrain fee. Marked yellow hexes cannot be upgraded. '\ + 'Hexes pay $10 extra revenue and do not count as a stop. May '\ + 'not start or end a route at a coal mine.', + sym: 'MINC', + abilities: [ + { + type: 'tile_lay', + hexes: %w[A3 + B4 + B8 + B10 + D10 + E11 + E13 + F12 + G13 + G19 + H12 + J14], + tiles: %w[7 8 9], + free: false, + when: 'track', + discount: 15, + consume_tile_lay: true, + closed_when_used_up: true, + owner_type: 'corporation', + count: 1, + }, + ], + color: nil, + }, + { + name: 'Major Coal Mine', + value: 90, + revenue: 0, + desc: 'Comes with three coal mine markers. When placing a yellow '\ + 'tile in a mountain hex next to a revenue location, can place '\ + 'token to avoid $15 terrain fee. Marked yellow hexes cannot be '\ + 'upgraded. Hexes pay $10 extra revenue and do not count as a '\ + 'stop. May not start or end a route at a coal mine.', + sym: 'MAJC', + abilities: [ + { + type: 'tile_lay', + hexes: %w[A3 + B4 + B8 + B10 + D10 + E11 + E13 + F12 + G13 + G19 + H12 + J14], + tiles: %w[7 8 9], + free: false, + when: 'track', + discount: 15, + consume_tile_lay: true, + closed_when_used_up: true, + owner_type: 'corporation', + count: 3, + }, + ], + color: nil, + }, + { + name: 'Minor Mail Contract', + value: 60, + revenue: 0, + desc: 'Pays owning corp $10 at the start of each operating round, as '\ + 'long as the company has at least one train.', + sym: 'MINM', + abilities: [ + { + type: 'revenue_change', + revenue: 10, + when: 'has_train', + owner_type: 'corporation', + }, + ], + color: nil, + }, + { + name: 'Major Mail Contract', + value: 120, + revenue: 0, + desc: 'Pays owning corp $20 at the start of each operating round, as '\ + 'long as the company has at least one train.', + sym: 'MAJM', + abilities: [ + { + type: 'revenue_change', + revenue: 20, + when: 'has_train', + owner_type: 'corporation', + }, + ], + color: nil, + }, + ].freeze + + def corporation_opts + { + float_percent: 20, + always_market_price: true, + } + end + + CORPORATIONS = [ + { + sym: 'DL&W', + name: 'Delaware, Lackawanna and Western Railroad', + logo: '1817/DLW', + simple_logo: '1817/DLW.alt', + shares: [100], + tokens: [0], + max_ownership_percent: 100, + color: '#984573', + }, + { + sym: 'J', + name: 'Elgin, Joliet and Eastern Railway', + logo: '1817/J', + simple_logo: '1817/J.alt', + shares: [100], + tokens: [0], + max_ownership_percent: 100, + text_color: 'black', + color: '#bedb86', + }, + { + sym: 'GT', + name: 'Grand Trunk Western Railroad', + logo: '1817/GT', + simple_logo: '1817/GT.alt', + shares: [100], + tokens: [0], + max_ownership_percent: 100, + color: '#e48329', + }, + { + sym: 'H', + name: 'Housatonic Railroad', + logo: '1817/H', + simple_logo: '1817/H.alt', + shares: [100], + tokens: [0], + max_ownership_percent: 100, + text_color: 'black', + color: '#bedef3', + }, + { + sym: 'ME', + name: 'Morristown and Erie Railway', + logo: '1817/ME', + simple_logo: '1817/ME.alt', + shares: [100], + tokens: [0], + max_ownership_percent: 100, + color: '#ffdea8', + text_color: 'black', + }, + { + sym: 'NYOW', + name: 'New York, Ontario and Western Railway', + logo: '1817/W', + simple_logo: '1817/W.alt', + shares: [100], + tokens: [0], + max_ownership_percent: 100, + color: '#0095da', + }, + { + sym: 'NYSW', + name: 'New York, Susquehanna and Western Railway', + logo: '1817/S', + simple_logo: '1817/S.alt', + shares: [100], + tokens: [0], + max_ownership_percent: 100, + color: '#fff36b', + text_color: 'black', + }, + { + sym: 'PSNR', + name: 'Pittsburgh, Shawmut and Northern Railroad', + logo: '1817/PSNR', + simple_logo: '1817/PSNR.alt', + shares: [100], + tokens: [0], + max_ownership_percent: 100, + color: '#0a884b', + }, + { + sym: 'PLE', + name: 'Pittsburgh and Lake Erie Railroad', + logo: '1817/PLE', + simple_logo: '1817/PLE.alt', + shares: [100], + tokens: [0], + max_ownership_percent: 100, + color: '#00afad', + }, + { + sym: 'PW', + name: 'Providence and Worcester Railroad', + logo: '1817/PW', + simple_logo: '1817/PW.alt', + shares: [100], + tokens: [0], + max_ownership_percent: 100, + text_color: 'black', + color: '#bec8cc', + }, + { + sym: 'R', + name: 'Rutland Railroad', + logo: '1817/R', + simple_logo: '1817/R.alt', + shares: [100], + tokens: [0], + max_ownership_percent: 100, + color: '#165633', + }, + { + sym: 'SR', + name: 'Strasburg Railroad', + logo: '1817/SR', + simple_logo: '1817/SR.alt', + shares: [100], + tokens: [0], + max_ownership_percent: 100, + color: '#e31f21', + }, + { + sym: 'UR', + name: 'Union Railroad', + logo: '1817/UR', + simple_logo: '1817/UR.alt', + shares: [100], + tokens: [0], + max_ownership_percent: 100, + color: '#003d84', + }, + { + sym: 'WT', + name: 'Warren & Trumbull Railroad', + logo: '1817/WT', + simple_logo: '1817/WT.alt', + shares: [100], + tokens: [0], + max_ownership_percent: 100, + color: '#e96f2c', + }, + { + sym: 'WC', + name: 'West Chester Railroad', + logo: '1817/WC', + simple_logo: '1817/WC.alt', + shares: [100], + tokens: [0], + max_ownership_percent: 100, + color: '#984d2d', + }, + ].freeze + end + end + end +end diff --git a/lib/engine/game/g_1817_na/game.rb b/lib/engine/game/g_1817_na/game.rb index f92ade8a0c..6f57209e0a 100644 --- a/lib/engine/game/g_1817_na/game.rb +++ b/lib/engine/game/g_1817_na/game.rb @@ -2,12 +2,16 @@ require_relative '../g_1817/game' require_relative 'meta' +require_relative 'entities' +require_relative 'map' module Engine module Game module G1817NA class Game < G1817::Game include_meta(G1817NA::Meta) + include Entities + include Map CURRENCY_FORMAT_STR = '$%s' @@ -21,72 +25,6 @@ class Game < G1817::Game MUST_SELL_IN_BLOCKS = false - TILES = { - '5' => 'unlimited', - '6' => 'unlimited', - '7' => 'unlimited', - '8' => 'unlimited', - '9' => 'unlimited', - '14' => 'unlimited', - '15' => 'unlimited', - '54' => 'unlimited', - '57' => 'unlimited', - '62' => 'unlimited', - '63' => 'unlimited', - '80' => 'unlimited', - '81' => 'unlimited', - '82' => 'unlimited', - '83' => 'unlimited', - '448' => 'unlimited', - '544' => 'unlimited', - '545' => 'unlimited', - '546' => 'unlimited', - '592' => 'unlimited', - '593' => 'unlimited', - '597' => 'unlimited', - '611' => 'unlimited', - '619' => 'unlimited', - 'X00' => - { - 'count' => 'unlimited', - 'color' => 'yellow', - 'code' => - 'city=revenue:30;path=a:1,b:_0;path=a:3,b:_0;path=a:5,b:_0;label=B', - }, - 'X30' => - { - 'count' => 'unlimited', - 'color' => 'gray', - 'code' => - 'city=revenue:100,slots:4;path=a:2,b:_0;path=a:3,b:_0;path=a:4,b:_0;path=a:5,b:_0;label=NY', - }, - }.freeze - - LOCATION_NAMES = { - 'A7' => 'Dawson City', - 'B2' => 'Anchorage', - 'B6' => 'The Klondike', - 'B18' => 'Arctic', - 'C3' => 'Asia', - 'C9' => 'Hazelton', - 'D12' => 'Edmonton', - 'D16' => 'Winnipeg', - 'D22' => 'Quebec', - 'D26' => 'Europe', - 'E9' => 'Seattle', - 'F14' => 'Denver', - 'F20' => 'Toronto', - 'F22' => 'New York', - 'H8' => 'Hawaii', - 'H10' => 'Los Angeles', - 'H18' => 'New Orleans', - 'I13' => 'Guadalajara', - 'I15' => 'Mexico City', - 'I21' => 'Miami', - 'J18' => 'Belize', - 'K21' => 'South America', - }.freeze - MARKET = [ %w[0l 0a @@ -204,491 +142,6 @@ class Game < G1817::Game events: [{ 'type' => 'signal_end_game' }], }].freeze - COMPANIES = [ - { - name: 'Denver Telecommunications', - value: 40, - revenue: 0, - desc: 'Owning corp may place special Denver yellow tile during tile-laying, '\ - 'regardless of connectivity. The hex is not reserved, and the '\ - 'power is lost if another company builds there first.', - sym: 'DTC', - abilities: [ - { - type: 'tile_lay', - hexes: ['F14'], - tiles: ['X00'], - when: 'track', - owner_type: 'corporation', - count: 1, - closed_when_used_up: true, - consume_tile_lay: true, - special: true, - }, - ], - color: nil, - }, - { - name: 'Mountain Engineers', - value: 40, - revenue: 0, - desc: 'Owning company receives $20 after laying a yellow tile in a '\ - 'mountain hex. Any fees must be paid first.', - sym: 'ME', - abilities: [ - { - type: 'tile_income', - income: 20, - terrain: 'mountain', - owner_type: 'corporation', - owner_only: true, - }, - ], - color: nil, - }, - { - name: 'Union Bridge Company', - value: 80, - revenue: 0, - desc: 'Comes with two $10 bridge token that may be placed by the owning corp '\ - 'in Winnipeg or New Orleans, max one token per city, regardless of '\ - 'connectivity. Allows owning corp to skip $10 river fee when '\ - 'placing yellow tiles.', - sym: 'UBC', - abilities: [ - { - type: 'tile_discount', - discount: 10, - terrain: 'water', - owner_type: 'corporation', - }, - { - type: 'assign_hexes', - hexes: %w[D16 H18], - count: 2, - when: 'owning_corp_or_turn', - owner_type: 'corporation', - }, - ], - color: nil, - }, - { - name: 'Train Station', - value: 80, - revenue: 0, - desc: 'Provides an additional station marker for the owning corp, awarded at time of purchase', - sym: 'TS', - abilities: [ - { - type: 'additional_token', - count: 1, - owner_type: 'corporation', - }, - ], - color: nil, - }, - { - name: 'Minor Coal Mine', - value: 30, - revenue: 0, - desc: 'Comes with one coal mine marker. When placing a yellow tile '\ - 'in a mountain hex next to a revenue location, can place token '\ - 'to avoid $15 terrain fee. Marked yellow hexes cannot be upgraded. '\ - 'Hexes pay $10 extra revenue and do not count as a stop. May '\ - 'not start or end a route at a coal mine.', - sym: 'MINC', - abilities: [ - { - type: 'tile_lay', - hexes: %w[A3 - B4 - B8 - B10 - D10 - E11 - E13 - F12 - G13 - G19 - H12 - J14], - tiles: %w[7 8 9], - free: false, - when: 'track', - discount: 15, - consume_tile_lay: true, - closed_when_used_up: true, - owner_type: 'corporation', - count: 1, - }, - ], - color: nil, - }, - { - name: 'Major Coal Mine', - value: 90, - revenue: 0, - desc: 'Comes with three coal mine markers. When placing a yellow '\ - 'tile in a mountain hex next to a revenue location, can place '\ - 'token to avoid $15 terrain fee. Marked yellow hexes cannot be '\ - 'upgraded. Hexes pay $10 extra revenue and do not count as a '\ - 'stop. May not start or end a route at a coal mine.', - sym: 'MAJC', - abilities: [ - { - type: 'tile_lay', - hexes: %w[A3 - B4 - B8 - B10 - D10 - E11 - E13 - F12 - G13 - G19 - H12 - J14], - tiles: %w[7 8 9], - free: false, - when: 'track', - discount: 15, - consume_tile_lay: true, - closed_when_used_up: true, - owner_type: 'corporation', - count: 3, - }, - ], - color: nil, - }, - { - name: 'Minor Mail Contract', - value: 60, - revenue: 0, - desc: 'Pays owning corp $10 at the start of each operating round, as '\ - 'long as the company has at least one train.', - sym: 'MINM', - abilities: [ - { - type: 'revenue_change', - revenue: 10, - when: 'has_train', - owner_type: 'corporation', - }, - ], - color: nil, - }, - { - name: 'Major Mail Contract', - value: 120, - revenue: 0, - desc: 'Pays owning corp $20 at the start of each operating round, as '\ - 'long as the company has at least one train.', - sym: 'MAJM', - abilities: [ - { - type: 'revenue_change', - revenue: 20, - when: 'has_train', - owner_type: 'corporation', - }, - ], - color: nil, - }, - ].freeze - - CORPORATIONS = [ - { - float_percent: 20, - sym: 'DL&W', - name: 'Delaware, Lackawanna and Western Railroad', - logo: '1817/DLW', - simple_logo: '1817/DLW.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - color: '#984573', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'J', - name: 'Elgin, Joliet and Eastern Railway', - logo: '1817/J', - simple_logo: '1817/J.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - text_color: 'black', - color: '#bedb86', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'GT', - name: 'Grand Trunk Western Railroad', - logo: '1817/GT', - simple_logo: '1817/GT.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - color: '#e48329', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'H', - name: 'Housatonic Railroad', - logo: '1817/H', - simple_logo: '1817/H.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - text_color: 'black', - color: '#bedef3', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'ME', - name: 'Morristown and Erie Railway', - logo: '1817/ME', - simple_logo: '1817/ME.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - color: '#ffdea8', - text_color: 'black', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'NYOW', - name: 'New York, Ontario and Western Railway', - logo: '1817/W', - simple_logo: '1817/W.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - color: '#0095da', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'NYSW', - name: 'New York, Susquehanna and Western Railway', - logo: '1817/S', - simple_logo: '1817/S.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - color: '#fff36b', - text_color: 'black', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'PSNR', - name: 'Pittsburgh, Shawmut and Northern Railroad', - logo: '1817/PSNR', - simple_logo: '1817/PSNR.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - color: '#0a884b', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'PLE', - name: 'Pittsburgh and Lake Erie Railroad', - logo: '1817/PLE', - simple_logo: '1817/PLE.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - color: '#00afad', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'PW', - name: 'Providence and Worcester Railroad', - logo: '1817/PW', - simple_logo: '1817/PW.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - text_color: 'black', - color: '#bec8cc', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'R', - name: 'Rutland Railroad', - logo: '1817/R', - simple_logo: '1817/R.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - color: '#165633', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'SR', - name: 'Strasburg Railroad', - logo: '1817/SR', - simple_logo: '1817/SR.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - color: '#e31f21', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'UR', - name: 'Union Railroad', - logo: '1817/UR', - simple_logo: '1817/UR.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - color: '#003d84', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'WT', - name: 'Warren & Trumbull Railroad', - logo: '1817/WT', - simple_logo: '1817/WT.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - color: '#e96f2c', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'WC', - name: 'West Chester Railroad', - logo: '1817/WC', - simple_logo: '1817/WC.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - color: '#984d2d', - reservation_color: nil, - }, - ].freeze - - HEXES = { - white: { - %w[A3 - B4 - B8 - B10 - D10 - E11 - E13 - F12 - G13 - G19 - H12 - J14] => 'upgrade=cost:15,terrain:mountain', - %w[A5 - A9 - B12 - C7 - C11 - C13 - C15 - C17 - C23 - D18 - D20 - D24 - E21 - E23 - F10 - G9 - G11 - G15 - G21 - H14 - H16 - H20 - J16 - K17 - K19] => '', - ['E19'] => 'border=edge:0,type:impassable;border=edge:1,type:impassable', - ['E17'] => 'border=edge:4,type:impassable', - ['F18'] => 'border=edge:3,type:impassable', - ['A7'] => 'city=revenue:0;upgrade=cost:15,terrain:mountain', - %w[B2 C9 D22 E9 F14 F20 H10 I13] => 'city=revenue:0', - ['J18'] => 'city=revenue:0;border=edge:3,type:impassable', - %w[D8 E25 J20] => 'upgrade=cost:20,terrain:lake', - ['I19'] => 'upgrade=cost:20,terrain:lake;border=edge:0,type:impassable', - %w[D14 E15 F16 G17] => 'upgrade=cost:10,terrain:water', - %w[H18 D16] => 'city=revenue:0;upgrade=cost:10,terrain:water', - }, - gray: { - ['B6'] => - 'town=revenue:yellow_50|green_20|brown_40;path=a:1,b:_0;path=a:2,b:_0;path=a:3,b:_0', - %w[B14 C19] => 'path=a:1,b:4', - %w[B16 C21] => 'path=a:1,b:5', - ['I21'] => - 'city=revenue:yellow_20|green_30|brown_50|gray_60;path=a:1,b:_0;path=a:_0,b:2;path=a:0,b:_0;path=a:_0,b:1', - }, - red: { - ['B18'] => - 'offboard=revenue:yellow_20|green_30|brown_50|gray_60;path=a:0,b:_0', - ['C3'] => - 'offboard=revenue:yellow_30|green_50|brown_60|gray_80;path=a:2,b:_0;path=a:3,b:_0', - ['D26'] => - 'offboard=revenue:yellow_30|green_50|brown_60|gray_80;path=a:1,b:_0;path=a:0,b:_0', - ['H8'] => - 'offboard=revenue:yellow_20|green_30|brown_50|gray_60;path=a:3,b:_0;path=a:4,b:_0', - ['K21'] => - 'offboard=revenue:yellow_20|green_30|brown_50|gray_60;path=a:1,b:_0;path=a:2,b:_0', - }, - yellow: { - ['D12'] => 'city=revenue:30;path=a:2,b:_0;path=a:_0,b:4;label=B', - ['F22'] => - 'city=revenue:40;city=revenue:40;path=a:3,b:_1;path=a:0,b:_0;label=NY;upgrade=cost:20,terrain:lake', - ['I15'] => - 'city=revenue:30;path=a:1,b:_0;path=a:_0,b:5;label=B;upgrade=cost:20,terrain:lake', - }, - blue: { - %w[I17 C1 F8] => 'offboard=revenue:yellow_0,visit_cost:99;path=a:3,b:_0', - ['I9'] => 'offboard=revenue:yellow_0,visit_cost:99;path=a:3,b:_0;border=edge:4', - ['J12'] => 'offboard=revenue:yellow_0,visit_cost:99;path=a:3,b:_0;border=edge:2', - ['I11'] => 'offboard=revenue:yellow_0,visit_cost:99;path=a:2,b:_0;offboard=revenue:yellow_0,visit_cost:99;'\ - 'path=a:4,b:_0;border=edge:1;border=edge:5', - ['A1'] => 'offboard=revenue:yellow_0,visit_cost:99;path=a:5,b:_0', - }, - }.freeze - - LAYOUT = :pointy - SEED_MONEY = 150 LOANS_PER_INCREMENT = 4 diff --git a/lib/engine/game/g_1817_na/map.rb b/lib/engine/game/g_1817_na/map.rb new file mode 100644 index 0000000000..74ab514421 --- /dev/null +++ b/lib/engine/game/g_1817_na/map.rb @@ -0,0 +1,164 @@ +# frozen_string_literal: true + +module Engine + module Game + module G1817NA + module Map + LAYOUT = :pointy + + TILES = { + '5' => 'unlimited', + '6' => 'unlimited', + '7' => 'unlimited', + '8' => 'unlimited', + '9' => 'unlimited', + '14' => 'unlimited', + '15' => 'unlimited', + '54' => 'unlimited', + '57' => 'unlimited', + '62' => 'unlimited', + '63' => 'unlimited', + '80' => 'unlimited', + '81' => 'unlimited', + '82' => 'unlimited', + '83' => 'unlimited', + '448' => 'unlimited', + '544' => 'unlimited', + '545' => 'unlimited', + '546' => 'unlimited', + '592' => 'unlimited', + '593' => 'unlimited', + '597' => 'unlimited', + '611' => 'unlimited', + '619' => 'unlimited', + 'X00' => + { + 'count' => 'unlimited', + 'color' => 'yellow', + 'code' => + 'city=revenue:30;path=a:1,b:_0;path=a:3,b:_0;path=a:5,b:_0;label=B', + }, + 'X30' => + { + 'count' => 'unlimited', + 'color' => 'gray', + 'code' => + 'city=revenue:100,slots:4;path=a:2,b:_0;path=a:3,b:_0;path=a:4,b:_0;path=a:5,b:_0;label=NY', + }, + }.freeze + + LOCATION_NAMES = { + 'A7' => 'Dawson City', + 'B2' => 'Anchorage', + 'B6' => 'The Klondike', + 'B18' => 'Arctic', + 'C3' => 'Asia', + 'C9' => 'Hazelton', + 'D12' => 'Edmonton', + 'D16' => 'Winnipeg', + 'D22' => 'Quebec', + 'D26' => 'Europe', + 'E9' => 'Seattle', + 'F14' => 'Denver', + 'F20' => 'Toronto', + 'F22' => 'New York', + 'H8' => 'Hawaii', + 'H10' => 'Los Angeles', + 'H18' => 'New Orleans', + 'I13' => 'Guadalajara', + 'I15' => 'Mexico City', + 'I21' => 'Miami', + 'J18' => 'Belize', + 'K21' => 'South America', + }.freeze + + HEXES = { + white: { + %w[A3 + B4 + B8 + B10 + D10 + E11 + E13 + F12 + G13 + G19 + H12 + J14] => 'upgrade=cost:15,terrain:mountain', + %w[A5 + A9 + B12 + C7 + C11 + C13 + C15 + C17 + C23 + D18 + D20 + D24 + E21 + E23 + F10 + G9 + G11 + G15 + G21 + H14 + H16 + H20 + J16 + K17 + K19] => '', + ['E19'] => 'border=edge:0,type:impassable;border=edge:1,type:impassable', + ['E17'] => 'border=edge:4,type:impassable', + ['F18'] => 'border=edge:3,type:impassable', + ['A7'] => 'city=revenue:0;upgrade=cost:15,terrain:mountain', + %w[B2 C9 D22 E9 F14 F20 H10 I13] => 'city=revenue:0', + ['J18'] => 'city=revenue:0;border=edge:3,type:impassable', + %w[D8 E25 J20] => 'upgrade=cost:20,terrain:lake', + ['I19'] => 'upgrade=cost:20,terrain:lake;border=edge:0,type:impassable', + %w[D14 E15 F16 G17] => 'upgrade=cost:10,terrain:water', + %w[H18 D16] => 'city=revenue:0;upgrade=cost:10,terrain:water', + }, + gray: { + ['B6'] => + 'town=revenue:yellow_50|green_20|brown_40;path=a:1,b:_0;path=a:2,b:_0;path=a:3,b:_0', + %w[B14 C19] => 'path=a:1,b:4', + %w[B16 C21] => 'path=a:1,b:5', + ['I21'] => + 'city=revenue:yellow_20|green_30|brown_50|gray_60;path=a:1,b:_0;path=a:_0,b:2;path=a:0,b:_0;path=a:_0,b:1', + }, + red: { + ['B18'] => + 'offboard=revenue:yellow_20|green_30|brown_50|gray_60;path=a:0,b:_0', + ['C3'] => + 'offboard=revenue:yellow_30|green_50|brown_60|gray_80;path=a:2,b:_0;path=a:3,b:_0', + ['D26'] => + 'offboard=revenue:yellow_30|green_50|brown_60|gray_80;path=a:1,b:_0;path=a:0,b:_0', + ['H8'] => + 'offboard=revenue:yellow_20|green_30|brown_50|gray_60;path=a:3,b:_0;path=a:4,b:_0', + ['K21'] => + 'offboard=revenue:yellow_20|green_30|brown_50|gray_60;path=a:1,b:_0;path=a:2,b:_0', + }, + yellow: { + ['D12'] => 'city=revenue:30;path=a:2,b:_0;path=a:_0,b:4;label=B', + ['F22'] => + 'city=revenue:40;city=revenue:40;path=a:3,b:_1;path=a:0,b:_0;label=NY;upgrade=cost:20,terrain:lake', + ['I15'] => + 'city=revenue:30;path=a:1,b:_0;path=a:_0,b:5;label=B;upgrade=cost:20,terrain:lake', + }, + blue: { + %w[I17 C1 F8] => 'offboard=revenue:yellow_0,visit_cost:99;path=a:3,b:_0', + ['I9'] => 'offboard=revenue:yellow_0,visit_cost:99;path=a:3,b:_0;border=edge:4', + ['J12'] => 'offboard=revenue:yellow_0,visit_cost:99;path=a:3,b:_0;border=edge:2', + ['I11'] => 'offboard=revenue:yellow_0,visit_cost:99;path=a:2,b:_0;offboard=revenue:yellow_0,visit_cost:99;'\ + 'path=a:4,b:_0;border=edge:1;border=edge:5', + ['A1'] => 'offboard=revenue:yellow_0,visit_cost:99;path=a:5,b:_0', + }, + }.freeze + end + end + end +end diff --git a/lib/engine/game/g_1817_wo/entities.rb b/lib/engine/game/g_1817_wo/entities.rb new file mode 100644 index 0000000000..cdad2afb62 --- /dev/null +++ b/lib/engine/game/g_1817_wo/entities.rb @@ -0,0 +1,313 @@ +# frozen_string_literal: true + +module Engine + module Game + module G1817WO + module Entities + COMPANIES = [ + { + name: 'Pittsburgh Steel Mill', + value: 40, + revenue: 0, + desc: "Owning corp may place special 'New Pittsburgh' yellow tile "\ + 'during tile-laying, regardless of connectivity. The hex is not reserved, and the '\ + 'power is lost if another company builds there first.', + sym: 'PSM', + abilities: [ + { + type: 'tile_lay', + hexes: ['I6'], + tiles: ['X00'], + when: 'track', + owner_type: 'corporation', + count: 1, + closed_when_used_up: true, + consume_tile_lay: true, + special: true, + }, + ], + color: nil, + }, + { + name: 'Mountain (Ocean) Engineers', + value: 40, + revenue: 0, + desc: 'Owning company receives $20 after laying a yellow tile in a '\ + 'mountain (ocean) hex. Any fees must be paid first.', + sym: 'ME', + abilities: [ + { + type: 'tile_income', + income: 20, + terrain: 'lake', + owner_type: 'corporation', + owner_only: true, + }, + ], + color: nil, + }, + { + name: 'Ohio Bridge Company', + value: 40, + revenue: 0, + desc: 'Comes with one $10 bridge token that may be placed by the owning corp '\ + 'in Mare Nostrum or Dynasties max one token per city, regardless '\ + 'of connectivity. Allows owning corp to skip $10 river fee '\ + 'when placing yellow tiles.', + sym: 'OBC', + abilities: [ + { + type: 'tile_discount', + discount: 10, + terrain: 'water', + owner_type: 'corporation', + }, + { + type: 'assign_hexes', + hexes: %w[G4 K4], + count: 1, + when: 'owning_corp_or_turn', + owner_type: 'corporation', + }, + ], + color: nil, + }, + { + name: 'Train Station', + value: 80, + revenue: 0, + desc: 'Provides an additional station marker for the owning corp, awarded at time of purchase', + sym: 'TS', + abilities: [ + { + type: 'additional_token', + count: 1, + owner_type: 'corporation', + }, + ], + color: nil, + }, + { + name: 'Minor Coal Mine', + value: 30, + revenue: 0, + desc: 'Comes with one coal mine marker. When placing a yellow tile '\ + 'in a ocean hex next to a revenue location, can place token to '\ + 'avoid $15 terrain fee. Marked yellow hexes cannot be upgraded. '\ + 'Hexes pay $10 extra revenue and do not count as a stop. May '\ + 'not start or end a route at a coal mine. C8 may not have a coal mine.', + sym: 'MINC', + abilities: [ + { + type: 'tile_lay', + hexes: %w[B7 E4 E2 F9 I8 K6 L5], + tiles: %w[7 8 9], + free: false, + when: 'track', + discount: 15, + consume_tile_lay: true, + closed_when_used_up: true, + owner_type: 'corporation', + count: 1, + }, + ], + color: nil, + }, + { + name: 'Coal Mine', + value: 60, + revenue: 0, + desc: 'Comes with two coal mine markers. When placing a yellow tile '\ + 'in a mountain hex next to a revenue location, can place token '\ + 'to avoid $15 terrain fee. Marked yellow hexes cannot be upgraded. '\ + 'Hexes pay $10 extra revenue and do not count as a stop. May '\ + 'not start or end a route at a coal mine. C8 may not have a coal mine.', + sym: 'CM', + abilities: [ + { + type: 'tile_lay', + hexes: %w[B7 E4 E2 F9 I8 K6 L5], + tiles: %w[7 8 9], + free: false, + when: 'track', + discount: 15, + consume_tile_lay: true, + closed_when_used_up: true, + owner_type: 'corporation', + count: 2, + }, + ], + color: nil, + }, + { + name: 'Major Mail Contract', + value: 120, + revenue: 0, + desc: 'Pays owning corp $20 at the start of each operating round, '\ + 'as long as the company has at least one train.', + sym: 'MAJM', + abilities: [ + { + type: 'revenue_change', + revenue: 20, + when: 'has_train', + owner_type: 'corporation', + }, + ], + color: nil, + }, + ].freeze + + CORPORATIONS = [ + { + float_percent: 20, + sym: 'A&S', + name: 'Alton & Southern Railway', + logo: '1817/AS', + simple_logo: '1817/AS.alt', + shares: [100], + max_ownership_percent: 100, + tokens: [0], + always_market_price: true, + color: '#ee3e80', + }, + { + float_percent: 20, + sym: 'Belt', + name: 'Belt Railway of Chicago', + logo: '1817/Belt', + simple_logo: '1817/Belt.alt', + shares: [100], + max_ownership_percent: 100, + tokens: [0], + always_market_price: true, + text_color: 'black', + color: '#f2a847', + }, + { + float_percent: 20, + sym: 'Bess', + name: 'Bessemer and Lake Erie Railroad', + logo: '1817/Bess', + simple_logo: '1817/Bess.alt', + shares: [100], + max_ownership_percent: 100, + tokens: [0], + always_market_price: true, + color: '#16190e', + }, + { + float_percent: 20, + sym: 'B&A', + name: 'Boston and Albany Railroad', + logo: '1817/BA', + simple_logo: '1817/BA.alt', + shares: [100], + max_ownership_percent: 100, + tokens: [0], + always_market_price: true, + color: '#ef4223', + }, + { + float_percent: 20, + sym: 'DL&W', + name: 'Delaware, Lackawanna and Western Railroad', + logo: '1817/DLW', + simple_logo: '1817/DLW.alt', + shares: [100], + max_ownership_percent: 100, + tokens: [0], + always_market_price: true, + color: '#984573', + }, + { + float_percent: 20, + sym: 'GT', + name: 'Grand Trunk Western Railroad', + logo: '1817/GT', + simple_logo: '1817/GT.alt', + shares: [100], + max_ownership_percent: 100, + tokens: [0], + always_market_price: true, + color: '#e48329', + }, + { + float_percent: 20, + sym: 'H', + name: 'Housatonic Railroad', + logo: '1817/H', + simple_logo: '1817/H.alt', + shares: [100], + max_ownership_percent: 100, + tokens: [0], + always_market_price: true, + text_color: 'black', + color: '#bedef3', + }, + { + float_percent: 20, + sym: 'ME', + name: 'Morristown and Erie Railway', + logo: '1817/ME', + simple_logo: '1817/ME.alt', + shares: [100], + max_ownership_percent: 100, + tokens: [0], + always_market_price: true, + color: '#ffdea8', + text_color: 'black', + }, + { + float_percent: 20, + sym: 'PSNR', + name: 'Pittsburgh, Shawmut and Northern Railroad', + logo: '1817/PSNR', + simple_logo: '1817/PSNR.alt', + shares: [100], + max_ownership_percent: 100, + tokens: [0], + always_market_price: true, + color: '#0a884b', + }, + { + float_percent: 20, + sym: 'R', + name: 'Rutland Railroad', + logo: '1817/R', + simple_logo: '1817/R.alt', + shares: [100], + max_ownership_percent: 100, + tokens: [0], + always_market_price: true, + color: '#165633', + }, + { + float_percent: 20, + sym: 'UR', + name: 'Union Railroad', + logo: '1817/UR', + simple_logo: '1817/UR.alt', + shares: [100], + max_ownership_percent: 100, + tokens: [0], + always_market_price: true, + color: '#003d84', + }, + { + float_percent: 20, + sym: 'WC', + name: 'West Chester Railroad', + logo: '1817/WC', + simple_logo: '1817/WC.alt', + shares: [100], + max_ownership_percent: 100, + tokens: [0], + always_market_price: true, + color: '#984d2d', + }, + ].freeze + end + end + end +end diff --git a/lib/engine/game/g_1817_wo/game.rb b/lib/engine/game/g_1817_wo/game.rb index e160b0eadc..971b2a6c7c 100644 --- a/lib/engine/game/g_1817_wo/game.rb +++ b/lib/engine/game/g_1817_wo/game.rb @@ -3,12 +3,16 @@ require_relative '../g_1817/game' require_relative 'meta' require_relative 'round/operating' +require_relative 'entities' +require_relative 'map' module Engine module Game module G1817WO class Game < G1817::Game include_meta(G1817WO::Meta) + include Entities + include Map attr_reader :new_zealand_city @@ -24,67 +28,6 @@ class Game < G1817::Game MUST_SELL_IN_BLOCKS = false - TILES = { - '5' => 'unlimited', - '6' => 'unlimited', - '7' => 'unlimited', - '8' => 'unlimited', - '9' => 'unlimited', - '14' => 'unlimited', - '15' => 'unlimited', - '54' => 'unlimited', - '57' => 'unlimited', - '62' => 'unlimited', - '63' => 'unlimited', - '80' => 'unlimited', - '81' => 'unlimited', - '82' => 'unlimited', - '83' => 'unlimited', - '448' => 'unlimited', - '544' => 'unlimited', - '545' => 'unlimited', - '546' => 'unlimited', - '592' => 'unlimited', - '593' => 'unlimited', - '597' => 'unlimited', - '611' => 'unlimited', - '619' => 'unlimited', - 'X00' => - { - 'count' => 'unlimited', - 'color' => 'yellow', - 'code' => - 'city=revenue:30;path=a:1,b:_0;path=a:3,b:_0;path=a:5,b:_0;label=B', - }, - 'X30' => - { - 'count' => 'unlimited', - 'color' => 'gray', - 'code' => - 'city=revenue:100,slots:4;path=a:2,b:_0;path=a:3,b:_0;path=a:4,b:_0;path=a:5,b:_0;label=NY', - }, - }.freeze - - LOCATION_NAMES = { - 'C2' => 'Prince of Wales Fort', - 'D7' => 'Amazonia', - 'G4' => 'Mare Nostrum', - 'G8' => 'Beginnings', - 'I2' => 'Brrrrrrrrrr!', - 'I6' => 'New Pittsburgh', - 'K4' => 'Dynasties', - 'K8' => 'Terra Australis', - 'A2' => 'Gold Rush', - 'A6' => "Kingdom of Hawai'i", - 'D9' => 'Antarctica', - 'F1' => 'Vikings', - 'H9' => 'Libertalia', - 'J9' => 'You are lost', - 'L1' => 'Gold Rush', - 'L9' => 'Nieuw Zeeland', - 'C4' => 'NYC', - }.freeze - MARKET = [ %w[0l 0a @@ -209,379 +152,6 @@ class Game < G1817::Game events: [{ 'type' => 'signal_end_game' }], }].freeze - COMPANIES = [ - { - name: 'Pittsburgh Steel Mill', - value: 40, - revenue: 0, - desc: "Owning corp may place special 'New Pittsburgh' yellow tile "\ - 'during tile-laying, regardless of connectivity. The hex is not reserved, and the '\ - 'power is lost if another company builds there first.', - sym: 'PSM', - abilities: [ - { - type: 'tile_lay', - hexes: ['I6'], - tiles: ['X00'], - when: 'track', - owner_type: 'corporation', - count: 1, - closed_when_used_up: true, - consume_tile_lay: true, - special: true, - }, - ], - color: nil, - }, - { - name: 'Mountain (Ocean) Engineers', - value: 40, - revenue: 0, - desc: 'Owning company receives $20 after laying a yellow tile in a '\ - 'mountain (ocean) hex. Any fees must be paid first.', - sym: 'ME', - abilities: [ - { - type: 'tile_income', - income: 20, - terrain: 'lake', - owner_type: 'corporation', - owner_only: true, - }, - ], - color: nil, - }, - { - name: 'Ohio Bridge Company', - value: 40, - revenue: 0, - desc: 'Comes with one $10 bridge token that may be placed by the owning corp '\ - 'in Mare Nostrum or Dynasties max one token per city, regardless '\ - 'of connectivity. Allows owning corp to skip $10 river fee '\ - 'when placing yellow tiles.', - sym: 'OBC', - abilities: [ - { - type: 'tile_discount', - discount: 10, - terrain: 'water', - owner_type: 'corporation', - }, - { - type: 'assign_hexes', - hexes: %w[G4 K4], - count: 1, - when: 'owning_corp_or_turn', - owner_type: 'corporation', - }, - ], - color: nil, - }, - { - name: 'Train Station', - value: 80, - revenue: 0, - desc: 'Provides an additional station marker for the owning corp, awarded at time of purchase', - sym: 'TS', - abilities: [ - { - type: 'additional_token', - count: 1, - owner_type: 'corporation', - }, - ], - color: nil, - }, - { - name: 'Minor Coal Mine', - value: 30, - revenue: 0, - desc: 'Comes with one coal mine marker. When placing a yellow tile '\ - 'in a ocean hex next to a revenue location, can place token to '\ - 'avoid $15 terrain fee. Marked yellow hexes cannot be upgraded. '\ - 'Hexes pay $10 extra revenue and do not count as a stop. May '\ - 'not start or end a route at a coal mine. C8 may not have a coal mine.', - sym: 'MINC', - abilities: [ - { - type: 'tile_lay', - hexes: %w[B7 E4 E2 F9 I8 K6 L5], - tiles: %w[7 8 9], - free: false, - when: 'track', - discount: 15, - consume_tile_lay: true, - closed_when_used_up: true, - owner_type: 'corporation', - count: 1, - }, - ], - color: nil, - }, - { - name: 'Coal Mine', - value: 60, - revenue: 0, - desc: 'Comes with two coal mine markers. When placing a yellow tile '\ - 'in a mountain hex next to a revenue location, can place token '\ - 'to avoid $15 terrain fee. Marked yellow hexes cannot be upgraded. '\ - 'Hexes pay $10 extra revenue and do not count as a stop. May '\ - 'not start or end a route at a coal mine. C8 may not have a coal mine.', - sym: 'CM', - abilities: [ - { - type: 'tile_lay', - hexes: %w[B7 E4 E2 F9 I8 K6 L5], - tiles: %w[7 8 9], - free: false, - when: 'track', - discount: 15, - consume_tile_lay: true, - closed_when_used_up: true, - owner_type: 'corporation', - count: 2, - }, - ], - color: nil, - }, - { - name: 'Major Mail Contract', - value: 120, - revenue: 0, - desc: 'Pays owning corp $20 at the start of each operating round, '\ - 'as long as the company has at least one train.', - sym: 'MAJM', - abilities: [ - { - type: 'revenue_change', - revenue: 20, - when: 'has_train', - owner_type: 'corporation', - }, - ], - color: nil, - }, - ].freeze - - CORPORATIONS = [ - { - float_percent: 20, - sym: 'A&S', - name: 'Alton & Southern Railway', - logo: '1817/AS', - simple_logo: '1817/AS.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - color: '#ee3e80', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'Belt', - name: 'Belt Railway of Chicago', - logo: '1817/Belt', - simple_logo: '1817/Belt.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - text_color: 'black', - color: '#f2a847', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'Bess', - name: 'Bessemer and Lake Erie Railroad', - logo: '1817/Bess', - simple_logo: '1817/Bess.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - color: '#16190e', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'B&A', - name: 'Boston and Albany Railroad', - logo: '1817/BA', - simple_logo: '1817/BA.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - color: '#ef4223', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'DL&W', - name: 'Delaware, Lackawanna and Western Railroad', - logo: '1817/DLW', - simple_logo: '1817/DLW.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - color: '#984573', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'GT', - name: 'Grand Trunk Western Railroad', - logo: '1817/GT', - simple_logo: '1817/GT.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - color: '#e48329', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'H', - name: 'Housatonic Railroad', - logo: '1817/H', - simple_logo: '1817/H.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - text_color: 'black', - color: '#bedef3', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'ME', - name: 'Morristown and Erie Railway', - logo: '1817/ME', - simple_logo: '1817/ME.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - color: '#ffdea8', - text_color: 'black', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'PSNR', - name: 'Pittsburgh, Shawmut and Northern Railroad', - logo: '1817/PSNR', - simple_logo: '1817/PSNR.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - color: '#0a884b', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'R', - name: 'Rutland Railroad', - logo: '1817/R', - simple_logo: '1817/R.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - color: '#165633', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'UR', - name: 'Union Railroad', - logo: '1817/UR', - simple_logo: '1817/UR.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - color: '#003d84', - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'WC', - name: 'West Chester Railroad', - logo: '1817/WC', - simple_logo: '1817/WC.alt', - shares: [100], - max_ownership_percent: 100, - tokens: [0], - always_market_price: true, - color: '#984d2d', - reservation_color: nil, - }, - ].freeze - - HEXES = { - white: { - %w[B3 - B5 - C6 - D3 - D5 - E6 - E8 - F3 - F5 - G2 - G6 - H1 - H5 - H7 - J5 - J7 - L3 - L7] => '', - %w[B7 C8 E2 E4 F9 I8 K6 L5] => - 'upgrade=cost:15,terrain:lake', - %w[H3 I4 J3] => 'upgrade=cost:10,terrain:water', - %w[B1 F7 K2] => 'upgrade=cost:20', - ['C2'] => 'city=revenue:0;upgrade=cost:15,terrain:lake', - %w[G8 I2 I6 K8] => 'city=revenue:0', - ['D7'] => 'city=revenue:0;upgrade=cost:20', - %w[G4 K4] => 'city=revenue:0;upgrade=cost:10,terrain:water', - }, - gray: { - ['J1'] => 'path=a:0,b:1;path=a:1,b:5;path=a:0,b:5', - ['A6'] => - 'city=revenue:yellow_10|green_20|brown_30|gray_40;path=a:4,b:_0;path=a:_0,b:5', - ['F1'] => - 'city=revenue:yellow_20|green_30|brown_40|gray_50,slots:2;path=a:1,b:_0;path=a:5,b:_0', - ['H9'] => - 'town=revenue:yellow_10|green_20|brown_30|gray_40;path=a:2,b:_0;path=a:_0,b:4', - ['L9'] => 'city=revenue:0', - }, - yellow: { - ['C4'] => - 'city=revenue:40;city=revenue:40;path=a:2,b:_0;path=a:5,b:_1;label=NY;upgrade=cost:20', - }, - red: { - ['A2'] => - 'offboard=revenue:yellow_30|green_50|brown_20|gray_60;path=a:4,b:_0', - ['D9'] => - 'offboard=revenue:yellow_20|green_30|brown_50|gray_60;path=a:2,b:_0;path=a:4,b:_0', - ['J9'] => - 'offboard=revenue:yellow_30|green_40|brown_60|gray_80;path=a:3,b:_0;path=a:4,b:_0', - ['L1'] => - 'offboard=revenue:yellow_30|green_50|brown_20|gray_60;path=a:1,b:_0', - }, - }.freeze - - LAYOUT = :flat - SEED_MONEY = 100 EVENTS_TEXT = G1817::Game::EVENTS_TEXT.merge('nieuw_zeeland_available' => ['Nieuw Zealand opens for new IPOs']) MAX_LOAN = 65 diff --git a/lib/engine/game/g_1817_wo/map.rb b/lib/engine/game/g_1817_wo/map.rb new file mode 100644 index 0000000000..a8ae9ff0b7 --- /dev/null +++ b/lib/engine/game/g_1817_wo/map.rb @@ -0,0 +1,127 @@ +# frozen_string_literal: true + +module Engine + module Game + module G1817WO + module Map + LAYOUT = :flat + + TILES = { + '5' => 'unlimited', + '6' => 'unlimited', + '7' => 'unlimited', + '8' => 'unlimited', + '9' => 'unlimited', + '14' => 'unlimited', + '15' => 'unlimited', + '54' => 'unlimited', + '57' => 'unlimited', + '62' => 'unlimited', + '63' => 'unlimited', + '80' => 'unlimited', + '81' => 'unlimited', + '82' => 'unlimited', + '83' => 'unlimited', + '448' => 'unlimited', + '544' => 'unlimited', + '545' => 'unlimited', + '546' => 'unlimited', + '592' => 'unlimited', + '593' => 'unlimited', + '597' => 'unlimited', + '611' => 'unlimited', + '619' => 'unlimited', + 'X00' => + { + 'count' => 'unlimited', + 'color' => 'yellow', + 'code' => + 'city=revenue:30;path=a:1,b:_0;path=a:3,b:_0;path=a:5,b:_0;label=B', + }, + 'X30' => + { + 'count' => 'unlimited', + 'color' => 'gray', + 'code' => + 'city=revenue:100,slots:4;path=a:2,b:_0;path=a:3,b:_0;path=a:4,b:_0;path=a:5,b:_0;label=NY', + }, + }.freeze + + LOCATION_NAMES = { + 'C2' => 'Prince of Wales Fort', + 'D7' => 'Amazonia', + 'G4' => 'Mare Nostrum', + 'G8' => 'Beginnings', + 'I2' => 'Brrrrrrrrrr!', + 'I6' => 'New Pittsburgh', + 'K4' => 'Dynasties', + 'K8' => 'Terra Australis', + 'A2' => 'Gold Rush', + 'A6' => "Kingdom of Hawai'i", + 'D9' => 'Antarctica', + 'F1' => 'Vikings', + 'H9' => 'Libertalia', + 'J9' => 'You are lost', + 'L1' => 'Gold Rush', + 'L9' => 'Nieuw Zeeland', + 'C4' => 'NYC', + }.freeze + + HEXES = { + white: { + %w[B3 + B5 + C6 + D3 + D5 + E6 + E8 + F3 + F5 + G2 + G6 + H1 + H5 + H7 + J5 + J7 + L3 + L7] => '', + %w[B7 C8 E2 E4 F9 I8 K6 L5] => + 'upgrade=cost:15,terrain:lake', + %w[H3 I4 J3] => 'upgrade=cost:10,terrain:water', + %w[B1 F7 K2] => 'upgrade=cost:20', + ['C2'] => 'city=revenue:0;upgrade=cost:15,terrain:lake', + %w[G8 I2 I6 K8] => 'city=revenue:0', + ['D7'] => 'city=revenue:0;upgrade=cost:20', + %w[G4 K4] => 'city=revenue:0;upgrade=cost:10,terrain:water', + }, + gray: { + ['J1'] => 'path=a:0,b:1;path=a:1,b:5;path=a:0,b:5', + ['A6'] => + 'city=revenue:yellow_10|green_20|brown_30|gray_40;path=a:4,b:_0;path=a:_0,b:5', + ['F1'] => + 'city=revenue:yellow_20|green_30|brown_40|gray_50,slots:2;path=a:1,b:_0;path=a:5,b:_0', + ['H9'] => + 'town=revenue:yellow_10|green_20|brown_30|gray_40;path=a:2,b:_0;path=a:_0,b:4', + ['L9'] => 'city=revenue:0', + }, + yellow: { + ['C4'] => + 'city=revenue:40;city=revenue:40;path=a:2,b:_0;path=a:5,b:_1;label=NY;upgrade=cost:20', + }, + red: { + ['A2'] => + 'offboard=revenue:yellow_30|green_50|brown_20|gray_60;path=a:4,b:_0', + ['D9'] => + 'offboard=revenue:yellow_20|green_30|brown_50|gray_60;path=a:2,b:_0;path=a:4,b:_0', + ['J9'] => + 'offboard=revenue:yellow_30|green_40|brown_60|gray_80;path=a:3,b:_0;path=a:4,b:_0', + ['L1'] => + 'offboard=revenue:yellow_30|green_50|brown_20|gray_60;path=a:1,b:_0', + }, + }.freeze + end + end + end +end diff --git a/lib/engine/game/g_1822/entities.rb b/lib/engine/game/g_1822/entities.rb index 9b1b0e66c1..e411cd4fb1 100644 --- a/lib/engine/game/g_1822/entities.rb +++ b/lib/engine/game/g_1822/entities.rb @@ -920,7 +920,6 @@ module Entities coordinates: 'H1', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '2', @@ -936,7 +935,6 @@ module Entities coordinates: 'E2', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '3', @@ -952,7 +950,6 @@ module Entities coordinates: 'H5', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '4', @@ -968,7 +965,6 @@ module Entities coordinates: 'K10', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '5', @@ -984,7 +980,6 @@ module Entities coordinates: 'J15', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '6', @@ -1000,7 +995,6 @@ module Entities coordinates: 'G16', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '7', @@ -1016,7 +1010,6 @@ module Entities coordinates: 'H23', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '8', @@ -1032,7 +1025,6 @@ module Entities coordinates: 'K24', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '9', @@ -1048,7 +1040,6 @@ module Entities coordinates: 'N23', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '10', @@ -1064,7 +1055,6 @@ module Entities coordinates: 'I30', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '11', @@ -1080,7 +1070,6 @@ module Entities coordinates: 'M30', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '12', @@ -1096,7 +1085,6 @@ module Entities coordinates: 'P35', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '13', @@ -1112,7 +1100,6 @@ module Entities coordinates: 'O40', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '14', @@ -1128,7 +1115,6 @@ module Entities coordinates: 'M38', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '15', @@ -1145,7 +1131,6 @@ module Entities city: 4, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '16', @@ -1162,7 +1147,6 @@ module Entities city: 2, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '17', @@ -1178,7 +1162,6 @@ module Entities coordinates: 'J41', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '18', @@ -1194,7 +1177,6 @@ module Entities coordinates: 'I42', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '19', @@ -1210,7 +1192,6 @@ module Entities coordinates: 'F35', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '20', @@ -1226,7 +1207,6 @@ module Entities coordinates: 'F33', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '21', @@ -1242,7 +1222,6 @@ module Entities coordinates: 'E34', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '22', @@ -1258,7 +1237,6 @@ module Entities coordinates: 'D41', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '23', @@ -1274,7 +1252,6 @@ module Entities coordinates: 'A42', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '24', @@ -1290,7 +1267,6 @@ module Entities coordinates: 'D35', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '25', @@ -1306,7 +1282,6 @@ module Entities coordinates: 'Q30', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '26', @@ -1322,7 +1297,6 @@ module Entities coordinates: 'N21', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '27', @@ -1338,7 +1312,6 @@ module Entities coordinates: 'E6', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '28', @@ -1354,7 +1327,6 @@ module Entities coordinates: 'G12', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '29', @@ -1370,7 +1342,6 @@ module Entities coordinates: 'E28', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '30', @@ -1386,7 +1357,6 @@ module Entities coordinates: 'B43', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: 'LNWR', @@ -1400,7 +1370,6 @@ module Entities coordinates: 'M38', city: 3, color: '#000', - reservation_color: nil, destination_coordinates: 'I22', destination_icon: '1822/LNWR_DEST', abilities: [{ type: 'blocks_hexes_consent', owner_type: 'player', hexes: ['M36'], hidden: true }], @@ -1416,7 +1385,6 @@ module Entities coordinates: 'M38', city: 1, color: '#165016', - reservation_color: nil, destination_coordinates: 'G36', destination_icon: '1822/GWR_DEST', abilities: [{ type: 'blocks_hexes_consent', owner_type: 'player', hexes: ['L39'], hidden: true }], @@ -1433,7 +1401,6 @@ module Entities city: 0, color: '#cccc00', text_color: 'black', - reservation_color: nil, destination_coordinates: 'M42', destination_icon: '1822/LBSCR_DEST', abilities: [{ type: 'blocks_hexes_consent', owner_type: 'player', hexes: ['M40'], hidden: true }], @@ -1459,7 +1426,6 @@ module Entities { type: 'blocks_hexes_consent', owner_type: 'player', hexes: ['N39'], hidden: true }, ], color: '#ff7f2a', - reservation_color: nil, destination_coordinates: 'P41', destination_icon: '1822/SECR_DEST', }, @@ -1473,7 +1439,6 @@ module Entities always_market_price: true, coordinates: 'E6', color: '#5555ff', - reservation_color: nil, destination_coordinates: 'G12', destination_icon: '1822/CR_DEST', }, @@ -1487,7 +1452,6 @@ module Entities always_market_price: true, coordinates: 'J29', color: '#ff2a2a', - reservation_color: nil, destination_coordinates: 'L19', destination_icon: '1822/MR_DEST', }, @@ -1501,7 +1465,6 @@ module Entities always_market_price: true, coordinates: 'G22', color: '#5a2ca0', - reservation_color: nil, destination_coordinates: 'I22', destination_icon: '1822/LYR_DEST', }, @@ -1515,7 +1478,6 @@ module Entities always_market_price: true, coordinates: 'H5', color: '#a05a2c', - reservation_color: nil, destination_coordinates: 'H1', destination_icon: '1822/NBR_DEST', }, @@ -1530,7 +1492,6 @@ module Entities coordinates: 'H33', color: '#999999', text_color: 'black', - reservation_color: nil, destination_coordinates: 'C34', destination_icon: '1822/SWR_DEST', }, @@ -1544,7 +1505,6 @@ module Entities always_market_price: true, coordinates: 'L19', color: '#aade87', - reservation_color: nil, destination_coordinates: 'H5', destination_icon: '1822/NER_DEST', }, diff --git a/lib/engine/game/g_1822/game.rb b/lib/engine/game/g_1822/game.rb index 66f8fc0af0..b111171e59 100644 --- a/lib/engine/game/g_1822/game.rb +++ b/lib/engine/game/g_1822/game.rb @@ -384,8 +384,6 @@ class Game < Game::Base LONDON_HEX = 'M38' ENGLISH_CHANNEL_HEX = 'P43' FRANCE_HEX = 'Q44' - FRANCE_HEX_BROWN_TILE = 'offboard=revenue:yellow_0|green_60|brown_90|gray_120,visit_cost:0;'\ - 'path=a:2,b:_0,lanes:2' COMPANY_MTONR = 'P2' COMPANY_LCDR = 'P5' @@ -1310,8 +1308,6 @@ def after_lay_tile(hex, old_tile, tile) # If we upgraded the english channel to brown, upgrade france as well since we got 2 lanes to france. return if hex.name != self.class::ENGLISH_CHANNEL_HEX || tile.color != :brown - - upgrade_france_to_brown end def bank_companies(prefix) @@ -1768,11 +1764,8 @@ def payoff_player_loan(player) end end - def check_destination_duplicate(entity, hex); end - - def place_destination_token(entity, hex, token) - check_destination_duplicate(entity, hex) - city = hex.tile.cities.first + def place_destination_token(entity, hex, token, city = nil) + city ||= destination_city(hex, entity) city.place_token(entity, token, free: true, check_tokenable: false, cheater: true) hex.tile.icons.reject! { |icon| icon.name == "#{entity.id}_destination" } @@ -1785,6 +1778,10 @@ def place_destination_token(entity, hex, token) @log << "#{entity.name} places its destination token on #{hex.name}" end + def destination_city(hex, _entity) + hex.tile.cities.first + end + def player_debt(player) @player_debts[player] || 0 end @@ -1842,12 +1839,6 @@ def train_type(train) train.name == 'E' ? :etrain : :normal end - def upgrade_france_to_brown - france_tile = Engine::Tile.from_code(self.class::FRANCE_HEX, :gray, self.class::FRANCE_HEX_BROWN_TILE) - france_tile.location_name = 'France' - hex_by_id(self.class::FRANCE_HEX).tile = france_tile - end - def upgrade_minor_14_home_hex(hex) return unless @minor_14_city_exit @@ -1949,6 +1940,30 @@ def nothing_sold_in_sr? @nothing_sold_in_sr end + # remove non-destination tokens if a corporation has multiple tokens in + # one city + def remove_extra_tokens!(tile) + tile.cities.each do |city| + corp_tokens_with_count = + city.tokens.each_with_object(Hash.new { |h, k| h[k] = [[], 0] }) do |token, counted_tokens| + next unless token + + counted_tokens[token.corporation][0] << token unless token.type == :destination + counted_tokens[token.corporation][1] += 1 + end + + corp_tokens_with_count.each do |corp, (tokens_to_remove, token_count)| + (token_count - 1).times do + @log << "Extra token for #{corp.name} is returned to their available tokens" + token = tokens_to_remove.pop + token.remove! + # exchange tokens have a price of 0 + token.price = self.class::TOKEN_PRICE + end + end + end + end + private def find_and_remove_train_by_id(train_id, buyable: true) @@ -2048,7 +2063,7 @@ def setup_destinations dest_hex = hex_by_id(c.destination_coordinates) ability = Ability::Base.new( type: 'base', - description: "Destination: #{dest_hex.location_name} (#{dest_hex.name})", + description: destination_description(c), ) c.add_ability(ability) @@ -2066,6 +2081,12 @@ def setup_destinations end end + def destination_description(corporation) + dest_hex = hex_by_id(corporation.destination_coordinates) + + "Destination: #{dest_hex.location_name} (#{dest_hex.name})" + end + def setup_exchange_tokens self.class::EXCHANGE_TOKENS.each do |corp, token_count| ability = Ability::Base.new( @@ -2094,6 +2115,26 @@ def price_movement_chart def port_tile?(hex) hex.tile.color == :blue && !hex.tile.cities.empty? end + + def pullman_route_distance_str(route) + towns = route.visited_stops.count(&:town?) + cities = route_distance(route) - towns + towns.positive? ? "#{cities}+#{towns}" : cities.to_s + end + + def e_route_distance_str(route) + corp = route.train.owner + total_laid_tokens = corp.tokens.count(&:used) + paying_stops = route.visited_stops.count { |stop| stop.tokened_by?(corp) } + "#{paying_stops}/#{total_laid_tokens}" + end + + def route_distance_str(route) + return pullman_route_distance_str(route) if route.train.name[-1] == '+' + return e_route_distance_str(route) if route.train.name == 'E' + + super(route) + end end end end diff --git a/lib/engine/game/g_1822/map.rb b/lib/engine/game/g_1822/map.rb index cc85319c90..1532b2bd13 100644 --- a/lib/engine/game/g_1822/map.rb +++ b/lib/engine/game/g_1822/map.rb @@ -499,7 +499,7 @@ module Map 'city=revenue:yellow_30|green_40|brown_50|gray_60,slots:2;path=a:0,b:_0,terminal:1;'\ 'path=a:1,b:_0,terminal:1', ['Q44'] => - 'offboard=revenue:yellow_0|green_60|brown_90|gray_120,visit_cost:0;path=a:2,b:_0', + 'offboard=revenue:yellow_0|green_60|brown_90|gray_120,visit_cost:0;path=a:2,b:_0,lanes:2', }, blue: { %w[L11 J43 Q36 Q42 R31] => diff --git a/lib/engine/game/g_1822/step/destination_token.rb b/lib/engine/game/g_1822/step/destination_token.rb index 0307863c64..e6c6276689 100644 --- a/lib/engine/game/g_1822/step/destination_token.rb +++ b/lib/engine/game/g_1822/step/destination_token.rb @@ -13,7 +13,7 @@ def actions(entity) return [] unless entity == current_entity return [] unless can_place_token?(entity) - ACTIONS + self.class::ACTIONS end def auto_actions(entity) @@ -38,11 +38,11 @@ def can_place_token?(entity) end def description - 'Place the destination token' + 'Place the Destination Token' end def pass_description - 'Skip (Destination token)' + 'Skip (Destination Token)' end def available_hex(entity, hex) @@ -71,13 +71,14 @@ def process_hex_token(action) end @game.place_destination_token(entity, hex, token) + @game.remove_extra_tokens!(hex.tile) pass! end def process_pass(action) entity = action.entity if !@game.loading && destination_node_check?(entity) - raise GameError, "You can't skip placing your destination token when you have a connection "\ + raise GameError, "#{entity.name} cannot skip placing its destination token when it has a connection "\ "to #{entity.destination_coordinates}" end diff --git a/lib/engine/game/g_1822/step/tracker.rb b/lib/engine/game/g_1822/step/tracker.rb index 7855dc86e8..024f071eb9 100644 --- a/lib/engine/game/g_1822/step/tracker.rb +++ b/lib/engine/game/g_1822/step/tracker.rb @@ -103,23 +103,7 @@ def upgraded_track?(from, _to, _hex) end def update_token!(action, entity, tile, old_tile) - tile.cities.each do |c| - present_corps = [] - tokens_to_return = [] - c.tokens.compact.each do |t| - if present_corps.include?(t.corporation) - tokens_to_return << t - else - present_corps << t.corporation - end - end - tokens_to_return.compact.each do |t| - corp = t.corporation - @log << "Extra token for #{corp.name} is returned to the charter" - corp.tokens << Engine::Token.new(corp, price: @game.class::TOKEN_PRICE) - t.destroy! - end - end + @game.remove_extra_tokens!(tile) super end diff --git a/lib/engine/game/g_1822_africa/entities.rb b/lib/engine/game/g_1822_africa/entities.rb index 31142a775d..8a90aec5e2 100644 --- a/lib/engine/game/g_1822_africa/entities.rb +++ b/lib/engine/game/g_1822_africa/entities.rb @@ -55,10 +55,9 @@ module Entities color: nil, }, { - name: 'P6 (Recycled train) [N/A]', + name: 'P6 (Recycled train)', sym: 'P6', - desc: '[NOT YET FUNCTIONAL] '\ - 'MAJOR/MINOR, Phase 3. Close this company to buy a rusted train for full price '\ + desc: 'MAJOR/MINOR, Phase 3. Close this company to buy a rusted train for full price '\ '(purchased train becomes permanent and is not a special train)', value: 0, revenue: 10, @@ -134,17 +133,30 @@ module Entities color: nil, }, { - name: 'P10 (Game Reserve) [N/A]', + name: 'P10 (Game Reserve)', sym: 'P10', - desc: '[NOT YET FUNCTIONAL] '\ - 'MAJOR/MINOR, Phase 3. When this company is acquired, the owning company must place '\ + desc: 'MAJOR/MINOR, Phase 3. When this company is acquired, the owning company must place '\ 'the striped Game Reserve tile on any empty (and non-desert) hex. '\ 'Placement must not run track into an unplayable hex edge. This hex becomes a game reserve. '\ 'The company immediately receives a bonus equal to A5x the number of hexes between '\ 'this game reserve and the preprinted game reserve (excluding the reserve hexes).', value: 0, revenue: 10, - abilities: [], + abilities: [ + { + type: 'tile_lay', + hexes: %w[B4 B8 E3 E17 F2 F4 F8 F10 F12 F14 F16 G5 G11 G15 H6 H14 H16 I9], + tiles: ['GR'], + owner_type: 'corporation', + when: %w[sold special_track], + count: 1, + special: true, + blocks: true, + free: true, + connect: false, + closed_when_used_up: true, + }, + ], color: nil, }, { @@ -205,10 +217,9 @@ module Entities color: nil, }, { - name: 'P13 (Station Swap) [N/A]', + name: 'P13 (Station Swap)', sym: 'P13', - desc: '[NOT YET FUNCTIONAL] '\ - 'MAJOR, Phase 5. Station Marker Swap. Allows the owning company to move a token from the exchange '\ + desc: 'MAJOR, Phase 5. Station Marker Swap. Allows the owning company to move a token from the exchange '\ 'token area of its charter to the available token area, or vice versa. '\ 'This company closes when its power is exercised.', value: 0, @@ -217,30 +228,51 @@ module Entities color: nil, }, { - name: 'P14 (Gold Mine) [N/A]', + name: 'P14 (Gold Mine)', sym: 'P14', - desc: '[NOT YET FUNCTIONAL] '\ - 'MAJOR, Phase 3. Owning company close this company to place the +20 gold mine token in any city '\ + desc: 'MAJOR, Phase 3. Owning company close this company to place the +20 gold mine token in any city '\ 'with an open city slot. This token adds 20 to the value of that city for all corporations. '\ 'The gold mine token occupies a city slot and blocks routes through that city '\ 'if the city is otherwise full.', value: 0, revenue: 10, - abilities: [], + abilities: [ + { + type: 'token', + when: 'owning_corp_or_turn', + owner_type: 'corporation', + hexes: %w[A7 B2 B10 C9 D2 E1 E9 E11 E13 F18 G3 G7 G17 H8 H10 H12 I7], + price: 0, + teleport_price: 0, + count: 1, + extra_action: true, + special_only: true, + closed_when_used_up: true, + check_tokenable: false, + }, + ], color: nil, }, { - name: 'P15 (Coffee Plantation) [N/A]', + name: 'P15 (Coffee Plantation)', sym: 'P15', - desc: '[NOT YET FUNCTIONAL] '\ - 'MAJOR/MINOR, Phase 1. Owning company may close this private company to place the coffee '\ + desc: 'MAJOR/MINOR, Phase 1. Owning company may close this private company to place the coffee '\ 'plantation token on any hex with mountainous terrain and no tile. '\ 'The company immediately receives into its treasury A30. When a tile is placed in that hex, '\ 'the coffee plantation token is placed on it and prevents upgrading this tile. '\ 'All routes that use this tile earn an extra A20.', value: 0, revenue: 10, - abilities: [], + abilities: [ + { + type: 'assign_hexes', + when: 'owning_corp_or_turn', + hexes: %w[G11 G15 H10 H14], + count: 1, + closed_when_used_up: true, + owner_type: 'corporation', + }, + ], color: nil, }, { @@ -258,10 +290,9 @@ module Entities color: nil, }, { - name: 'P17 (Bank Share Buy) [N/A]', + name: 'P17 (Bank Share Buy)', sym: 'P17', - desc: '[NOT YET FUNCTIONAL] '\ - 'MAJOR, Phase 2. Owning company may close this private company for the bank to purchase a share '\ + desc: 'MAJOR, Phase 2. Owning company may close this private company for the bank to purchase a share '\ 'it owns for the current market value. The share is moved to the bank pool. This does not count '\ 'as a share issuance and does not affect the stock price.', value: 0, @@ -500,12 +531,12 @@ module Entities float_percent: 100, hide_shares: true, shares: [100], + forced_share_percent: 100, max_ownership_percent: 100, coordinates: 'B2', city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '2', @@ -517,12 +548,12 @@ module Entities float_percent: 100, hide_shares: true, shares: [100], + forced_share_percent: 100, max_ownership_percent: 100, coordinates: 'G3', city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '3', @@ -534,12 +565,12 @@ module Entities float_percent: 100, hide_shares: true, shares: [100], + forced_share_percent: 100, max_ownership_percent: 100, coordinates: 'G7', city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '4', @@ -551,12 +582,12 @@ module Entities float_percent: 100, hide_shares: true, shares: [100], + forced_share_percent: 100, max_ownership_percent: 100, coordinates: 'H8', city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '5', @@ -568,12 +599,12 @@ module Entities float_percent: 100, hide_shares: true, shares: [100], + forced_share_percent: 100, max_ownership_percent: 100, coordinates: 'H10', city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '6', @@ -585,12 +616,12 @@ module Entities float_percent: 100, hide_shares: true, shares: [100], + forced_share_percent: 100, max_ownership_percent: 100, coordinates: 'H12', city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '7', @@ -602,12 +633,12 @@ module Entities float_percent: 100, hide_shares: true, shares: [100], + forced_share_percent: 100, max_ownership_percent: 100, coordinates: 'G17', city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '8', @@ -619,12 +650,12 @@ module Entities float_percent: 100, hide_shares: true, shares: [100], + forced_share_percent: 100, max_ownership_percent: 100, coordinates: 'E13', city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '9', @@ -636,12 +667,12 @@ module Entities float_percent: 100, hide_shares: true, shares: [100], + forced_share_percent: 100, max_ownership_percent: 100, coordinates: 'E11', city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '10', @@ -653,12 +684,12 @@ module Entities float_percent: 100, hide_shares: true, shares: [100], + forced_share_percent: 100, max_ownership_percent: 100, coordinates: 'C9', city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '11', @@ -670,12 +701,12 @@ module Entities float_percent: 100, hide_shares: true, shares: [100], + forced_share_percent: 100, max_ownership_percent: 100, coordinates: 'B10', city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '12', @@ -687,12 +718,12 @@ module Entities float_percent: 100, hide_shares: true, shares: [100], + forced_share_percent: 100, max_ownership_percent: 100, coordinates: 'A7', city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: 'NAR', @@ -705,7 +736,6 @@ module Entities coordinates: 'D2', color: 'black', text_color: 'white', - reservation_color: nil, destination_coordinates: 'C9', destination_icon: '1822_africa/NAR_DEST', }, @@ -720,7 +750,6 @@ module Entities coordinates: 'A7', color: '#CD2226', text_color: 'white', - reservation_color: nil, destination_coordinates: 'G7', destination_icon: '1822_africa/WAR_DEST', }, @@ -735,7 +764,6 @@ module Entities coordinates: 'I7', color: '#FBE93B', text_color: 'black', - reservation_color: nil, destination_coordinates: 'E9', destination_icon: '1822_africa/EAR_DEST', }, @@ -750,7 +778,6 @@ module Entities coordinates: 'E9', color: '#12853F', text_color: 'white', - reservation_color: nil, destination_coordinates: 'D2', destination_icon: '1822_africa/CAR_DEST', }, @@ -765,7 +792,6 @@ module Entities coordinates: 'F18', color: '#007ba7', text_color: 'white', - reservation_color: nil, destination_coordinates: 'H10', destination_icon: '1822_africa/SAR_DEST', }, diff --git a/lib/engine/game/g_1822_africa/game.rb b/lib/engine/game/g_1822_africa/game.rb index 3da00e6e11..3548711962 100644 --- a/lib/engine/game/g_1822_africa/game.rb +++ b/lib/engine/game/g_1822_africa/game.rb @@ -13,6 +13,8 @@ class Game < G1822::Game include G1822Africa::Entities include G1822Africa::Map + attr_accessor :gold_mine_token + CERT_LIMIT = { 2 => 99, 3 => 99, 4 => 99 }.freeze BIDDING_TOKENS = { @@ -42,17 +44,24 @@ class Game < G1822::Game BANK_CASH = 99_999 MARKET = [ - %w[40 50p 60xp 70xp 80xp 90m 100 110 120 135 150 165e], + %w[40 50p 60xp 70xp 80xp 95m 115 140 170 205 250 300 350e 400e], ].freeze MUST_SELL_IN_BLOCKS = true SELL_MOVEMENT = :left_per_10_if_pres_else_left_one + SOLD_OUT_INCREASE = false GAME_END_CHECK = { stock_market: :current_or, custom: :full_or }.freeze GAME_END_REASONS_TEXT = Base::GAME_END_REASONS_TEXT.merge( custom: 'Cannot refill bid boxes' ) + ASSIGNMENT_TOKENS = { + P15: '/icons/1822_africa/coffee.svg', + }.freeze + + PRIVATES_IN_GAME = 12 + EXTRA_TRAINS = %w[2P P+ LP].freeze EXTRA_TRAIN_PERMANENTS = %w[2P LP].freeze EXPRESS_TRAIN_MULTIPLIER = 2 @@ -64,7 +73,20 @@ class Game < G1822::Game COMPANY_10X_REVENUE = 'P16' COMPANY_REMOVE_TOWN = 'P9' - COMPANY_EXTRA_TILE_LAYS = 'P12' + COMPANY_EXTRA_TILE_LAYS = %w[P7 P12].freeze + COMPANY_TOKEN_SWAP = 'P13' + COMPANY_RECYCLED_TRAIN = 'P6' + COMPANY_SELL_SHARE = 'P17' + + COMPANY_COFFEE_PLANTATION = 'P15' + COFFEE_PLANTATION_PLACEMENT_BONUS = 30 + COFFEE_PLANTATION_ROUTE_BONUS = 20 + + COMPANY_GOLD_MINE = 'P14' + GOLD_MINE_BONUS = 20 + + GAME_RESERVE_TILE = 'GR' + GAME_RESERVE_MULTIPLIER = 5 MINOR_BIDBOX_PRICE = 100 BIDDING_BOX_MINOR_COUNT = 3 @@ -73,6 +95,7 @@ class Game < G1822::Game STOCK_ROUND_COUNT = 2 # Disable 1822-specific rules + MINOR_14_ID = nil COMPANY_LCDR = nil COMPANY_EGR = nil COMPANY_DOUBLE_CASH = nil @@ -82,11 +105,13 @@ class Game < G1822::Game COMPANY_LSR = nil COMPANY_OSTH = nil COMPANY_LUR = nil - COMPANY_CHPR = nil COMPANY_5X_REVENUE = nil COMPANY_HSBC = nil FRANCE_HEX = nil + CARDIFF_HEX = nil ENGLISH_CHANNEL_HEX = nil + MERTHYR_TYDFIL_PONTYPOOL_HEX = nil + UPGRADABLE_S_HEX_NAME = nil BIDDING_BOX_START_PRIVATE = nil BIDDING_BOX_START_MINOR = nil DOUBLE_HEX = [].freeze @@ -315,15 +340,24 @@ class Game < G1822::Game @bidbox_cache = [] @bidbox_companies_size = false + def init_companies(_players) + game_companies.map do |company| + Company.new(**company) + end.compact + end + def setup_companies minors = @companies.select { |c| minor?(c) } concessions = @companies.select { |c| concession?(c) } - privates = @companies.select { |c| private?(c) } + privates = @companies.select { |c| private?(c) }.sort_by! { rand } @companies.clear @companies.concat(minors) @companies.concat(concessions) - @companies.concat(privates.sort_by! { rand }.take(10)) + @companies.concat(privates.take(self.class::PRIVATES_IN_GAME)) + + unused_privates = privates.drop(self.class::PRIVATES_IN_GAME) + @log << "Private companies not in this game: #{unused_privates.map(&:name).join(', ')}" # Randomize from preset seed to get same order @companies.sort_by! { rand } @@ -367,8 +401,8 @@ def reorder_on_concession(companies) def setup_bidboxes # Set the owner to bank for the companies up for auction this stockround bidbox_refill! - bidbox.each do |minor| - minor.owner = @bank + bidbox.each do |company| + company.owner = @bank end end @@ -423,14 +457,16 @@ def operating_round(round_num) Engine::Step::AcquireCompany, G1822::Step::DiscardTrain, G1822::Step::SpecialChoose, + G1822Africa::Step::LayGameReserve, G1822::Step::SpecialTrack, - G1822::Step::SpecialToken, + G1822Africa::Step::SpecialToken, + G1822Africa::Step::Assign, G1822::Step::Track, G1822::Step::DestinationToken, G1822::Step::Token, G1822::Step::Route, G1822::Step::Dividend, - G1822::Step::BuyTrain, + G1822Africa::Step::BuyTrain, G1822Africa::Step::MinorAcquisition, G1822::Step::PendingToken, G1822::Step::DiscardTrain, @@ -500,9 +536,9 @@ def private?(company) company.id[0] == self.class::COMPANY_PRIVATE_PREFIX end - def compute_game_end - return %i[custom full_or] if bidbox.length < self.class::BIDDING_BOX_MINOR_COUNT + def game_end_check return %i[stock_market current_or] if @stock_market.max_reached? + return %i[custom full_or] if bidbox.length < self.class::BIDDING_BOX_MINOR_COUNT end def reset_sold_in_sr! @@ -577,6 +613,8 @@ def compute_other_paths(routes, route) # This repeats the logic from the base game, but with changes to how */E trains are calculated def revenue_for(route, stops) revenue = super + revenue += plantation_bonus(route) + revenue += gold_mine_bonus(route, stops) revenue += destination_bonus_for(route) return revenue unless can_be_express?(route.train) @@ -585,9 +623,30 @@ def revenue_for(route, stops) express_revenue = revenue_for_express(route, stops) express_revenue += destination_bonus_for(route) * self.class::EXPRESS_TRAIN_MULTIPLIER + return express_revenue if train_over_distance?(route) + [revenue, express_revenue].max end + def plantation_bonus(route) + route.all_hexes.any? { |hex| plantation_assigned?(hex) } ? self.class::COFFEE_PLANTATION_ROUTE_BONUS : 0 + end + + def gold_mine_corp + @gold_mine_corp ||= Corporation.new( + sym: 'MINE', + name: 'Gold Mine', + logo: '1822_africa/gold_mine', + tokens: [0], + ) + end + + def gold_mine_bonus(_route, stops) + return 0 if !@gold_mine_token || stops&.none? { |s| s.hex == @gold_mine_token.hex } + + self.class::GOLD_MINE_BONUS + end + def destination_bonus_for(route) destination_bonus = destination_bonus(route.routes) @@ -625,9 +684,9 @@ def runs_as_express?(route) def revenue_str(route) str = super - str += ' [Express]' if runs_as_express?(route) - + str += ' +20 (Coffee Plantation) ' if plantation_bonus(route).positive? + str += ' +20 (Gold Mine)' if gold_mine_bonus(route, route.stops).positive? str end @@ -670,7 +729,41 @@ def can_be_express?(train) end def company_ability_extra_track?(company) - company.id == self.class::COMPANY_EXTRA_TILE_LAYS + self.class::COMPANY_EXTRA_TILE_LAYS.include?(company.id) + end + + def tile_game_reserve?(tile) + tile.name == self.class::GAME_RESERVE_TILE + end + + def plantation_assigned?(hex) + hex.assigned?(self.class::COMPANY_COFFEE_PLANTATION) + end + + def upgrades_to?(from, to, special = false, selected_company: nil) + return true if special && tile_game_reserve?(to) + return false if from.color == :yellow && plantation_assigned?(from.hex) + + super + end + + def pay_game_reserve_bonus!(entity) + reserves = hexes.select { |h| h.tile.color == :purple } + bonus = hex_crow_distance_not_inclusive(*reserves) * self.class::GAME_RESERVE_MULTIPLIER + + return if bonus.zero? + + corporation = entity.owner + + @log << "#{corporation.id} receives a Game Reserve bonus of #{format_currency(bonus)} from the bank" + + @bank.spend(bonus, corporation) + end + + def hex_crow_distance_not_inclusive(start, finish) + dx = (start.x - finish.x).abs - 1 + dy = (start.y - finish.y).abs - 1 + dx + [0, (dy - dx) / 2].max end # This game has two back-to-back SRs so we need to manually disable auto-pass on round end @@ -685,6 +778,79 @@ def check_programmed_actions end end + def company_choices(company, time) + case company.id + when self.class::COMPANY_TOKEN_SWAP + company_choices_chpr(company, time) + when self.class::COMPANY_RECYCLED_TRAIN + company_choices_recycled_train(company, time) + when self.class::COMPANY_SELL_SHARE + company_choices_sell_share(company, time) + else + {} + end + end + + def company_choices_recycled_train(company, time) + return {} if time != :buy_train || !company.owner&.corporation? + return {} unless room?(company.owner) + + choices = {} + + @depot.trains.group_by(&:name).each do |name, trains| + train = trains.first + next unless train.rusted + + choices[name] = "Buy #{name} for #{format_currency(train.price)}" + end + + choices + end + + def company_choices_sell_share(company, time) + return {} if !company.owner&.corporation? || !%i[token track buy_train issue acquire_minor].include?(time) + return {} if company.owner.num_treasury_shares.zero? + + corp = company.owner + + { sell: "Sell #{corp.name} treasury share for #{format_currency(corp.share_price.price)}" } + end + + def company_made_choice(company, choice, _time) + case company.id + when self.class::COMPANY_TOKEN_SWAP + company_made_choice_chpr(company, choice) + when self.class::COMPANY_RECYCLED_TRAIN + company_made_choice_recycled_train(company, choice) + when self.class::COMPANY_SELL_SHARE + company_made_choice_sell_share(company, choice) + end + end + + def company_made_choice_recycled_train(company, choice) + train = @depot.trains.find { |t| t.name == choice } + new_train = Engine::Train.new(name: "#{train.name}R", distance: train.distance, price: train.price) + new_train.owner = @depot + @depot.trains << train + + @log << "#{company.owner.name} buys a recycled #{train.name} train for #{format_currency(train.price)}" + buy_train(company.owner, new_train) + + @log << "#{company.name} closes" + company.close! + end + + def company_made_choice_sell_share(company, _choice) + share_pool.sell_shares(ShareBundle.new(company.owner.treasury_shares.first)) + + @log << "#{company.name} closes" + company.close! + end + + def room?(entity) + entity.trains.count { |t| !extra_train?(t) } < train_limit(entity) + end + # Stubbed out because this game doesn't use it, but base 22 does def bidbox_minors = [] def bidbox_concessions = [] diff --git a/lib/engine/game/g_1822_africa/map.rb b/lib/engine/game/g_1822_africa/map.rb index bd0c08c8e5..3d50b43104 100644 --- a/lib/engine/game/g_1822_africa/map.rb +++ b/lib/engine/game/g_1822_africa/map.rb @@ -5,59 +5,30 @@ module Game module G1822Africa module Map TILES = { - '1' => 1, - '2' => 1, - '3' => 6, - '4' => 6, - '5' => 6, - '6' => 8, - '7' => 'unlimited', - '8' => 'unlimited', - '9' => 'unlimited', - '55' => 1, - '56' => 1, - '57' => 6, - '58' => 6, - '69' => 1, - '14' => 6, - '15' => 6, - '80' => 6, - '81' => 6, - '82' => 8, - '83' => 8, - '141' => 4, - '142' => 4, - '143' => 4, - '144' => 4, + '3' => 1, + '4' => 2, + '5' => 2, + '6' => 4, + '7' => 4, + '8' => 12, + '9' => 7, + '57' => 4, + '58' => 4, + '14' => 2, + '15' => 5, + '80' => 1, + '81' => 2, + '82' => 2, + '83' => 1, + '141' => 1, + '142' => 1, + '143' => 1, + '144' => 1, '207' => 2, '208' => 1, - '619' => 6, - '63' => 8, - '448' => 'unlimited', - '544' => 6, - '545' => 6, - '546' => 8, - '768' => - { - 'count' => 4, - 'color' => 'brown', - 'code' => - 'town=revenue:10;path=a:0,b:_0;path=a:2,b:_0;path=a:3,b:_0;path=a:5,b:_0', - }, - '767' => - { - 'count' => 4, - 'color' => 'brown', - 'code' => - 'town=revenue:10;path=a:0,b:_0;path=a:1,b:_0;path=a:2,b:_0;path=a:3,b:_0', - }, - '769' => - { - 'count' => 6, - 'color' => 'brown', - 'code' => - 'town=revenue:10;path=a:0,b:_0;path=a:2,b:_0;path=a:3,b:_0;path=a:4,b:_0', - }, + '619' => 1, + '611' => 2, + '448' => 5, 'X1' => { 'count' => 2, @@ -70,13 +41,12 @@ module Map 'color' => 'brown', 'code' => 'city=revenue:50,slots:3;path=a:0,b:_0;path=a:1,b:_0;path=a:3,b:_0;path=a:4,b:_0;label=Y', }, - 'GR1' => + 'GR' => { 'count' => 1, 'color' => 'purple', 'code' => 'offboard=revenue:20,visit_cost:0;path=a:0,b:_0,terminal:1;path=a:1,b:_0,terminal:1;'\ - 'path=a:2,b:_0,terminal:1;path=a:3,b:_0,terminal:1;path=a:5,b:_0,terminal:1;'\ - 'icon=image:1822_africa/elephant', + 'path=a:2,b:_0,terminal:1;icon=image:1822_africa/zebra;stripes=color:white', }, }.freeze @@ -141,11 +111,8 @@ module Map blue: { ['A3'] => 'junction;path=a:4,b:_0,terminal:1', ['A11'] => 'junction;path=a:4,b:_0,terminal:1', - ['E19'] => 'junction;path=a:4,b:_0,terminal:1', ['G1'] => 'junction;path=a:0,b:_0,terminal:1', - ['J8'] => 'junction;path=a:2,b:_0,terminal:1', - ['D0'] => 'junction;path=a:0,b:_0,terminal:1', - ['D12'] => 'junction;path=a:4,b:_0,terminal:1', + %w[G19 J8] => 'junction;path=a:2,b:_0,terminal:1', }, }.freeze end diff --git a/lib/engine/game/g_1822_africa/round/stock.rb b/lib/engine/game/g_1822_africa/round/stock.rb index e0de1428aa..78fbc5f8c4 100644 --- a/lib/engine/game/g_1822_africa/round/stock.rb +++ b/lib/engine/game/g_1822_africa/round/stock.rb @@ -33,26 +33,21 @@ def finish_round remove_minor = nil concession_to_remove = nil - minors, companies = @game.bidbox.partition { |c| @game.minor?(c) } - - companies.each_with_index do |company, index| - if (bid = highest_bid(company)) + @game.bidbox.each_with_index do |company, index| + if @game.minor?(company) + if (bid = highest_bid(company)) + float_minors << [bid, index] + else + remove_l_count += 1 + remove_minor = company if index.zero? + end + minor_count += 1 + elsif (bid = highest_bid(company)) buy_company(bid) else company.owner = nil - concession_to_remove = company if index.zero? && @game.concession?(company) - end - end - - minors.each_with_index do |minor, index| - if (bid = highest_bid(minor)) - float_minors << [bid, index] - else - minor.owner = nil - remove_l_count += 1 - remove_minor = minor if index.zero? + concession_to_remove = company if @game.concession?(company) && index.zero? end - minor_count += 1 end # Sort the minors first according to bid price, highest first. If a tie, lowest index first @@ -72,15 +67,15 @@ def finish_round if @game.nothing_sold_in_sr? clear_bidboxes(current_bidbox_items) elsif concession_to_remove - @game.log << "No bids on concession #{concession_to_remove.id}, it will be removed from the game" + @game.log << "No bids on #{concession_to_remove.name}, it is removed from the game" close_company(concession_to_remove) end # Refill the bidbox @game.bidbox_refill! - # Increase player loans with 50% interest - @game.add_interest_player_loans! + # Increase player loans with 50% interest in SR x.2 + @game.add_interest_player_loans! if round_num == 2 # Move sold out corps stock value right corporations_to_move_price.sort.each do |corp| diff --git a/lib/engine/game/g_1822_africa/step/assign.rb b/lib/engine/game/g_1822_africa/step/assign.rb new file mode 100644 index 0000000000..ab2466cc8c --- /dev/null +++ b/lib/engine/game/g_1822_africa/step/assign.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +require_relative '../../../step/assign' + +module Engine + module Game + module G1822Africa + module Step + class Assign < Engine::Step::Assign + def process_assign(action) + corporation = action.entity.owner + + super + + bonus = @game.class::COFFEE_PLANTATION_PLACEMENT_BONUS + @game.bank.spend(bonus, corporation) + @game.log << "#{corporation.id} receives Coffee Plantation bonus of #{@game.format_currency(bonus)}" + end + end + end + end + end +end diff --git a/lib/engine/game/g_1822_africa/step/buy_train.rb b/lib/engine/game/g_1822_africa/step/buy_train.rb new file mode 100644 index 0000000000..51e41ba0d6 --- /dev/null +++ b/lib/engine/game/g_1822_africa/step/buy_train.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +require_relative '../../g_1822/step/buy_train' + +module Engine + module Game + module G1822Africa + module Step + class BuyTrain < G1822::Step::BuyTrain + def actions(entity) + actions = super + + actions << 'choose_ability' if !choices_ability(entity).empty? && !actions.include?('choose_ability') + + actions + end + + def choices_ability(entity) + return {} unless entity.company? + + @game.company_choices(entity, :buy_train) + end + + def process_choose_ability(action) + @game.company_made_choice(action.entity, action.choice, :buy_train) + end + end + end + end + end +end diff --git a/lib/engine/game/g_1822_africa/step/lay_game_reserve.rb b/lib/engine/game/g_1822_africa/step/lay_game_reserve.rb new file mode 100644 index 0000000000..da8f981a28 --- /dev/null +++ b/lib/engine/game/g_1822_africa/step/lay_game_reserve.rb @@ -0,0 +1,85 @@ +# frozen_string_literal: true + +require_relative '../../../step/special_track' +require_relative '../../../step/track_lay_when_company_sold' + +module Engine + module Game + module G1822Africa + module Step + class LayGameReserve < Engine::Step::SpecialTrack + include Engine::Step::TrackLayWhenCompanySold + + def abilities(entity, **kwargs, &block) + return unless entity&.company? + + if acquired_companies.include?(entity) + ability = @game.abilities(entity, :tile_lay, time: 'sold', **kwargs, &block) + return ability if ability + end + + nil + end + + def blocking_for_sold_company? + @company = acquired_companies.find do |company| + @game.abilities(company, :tile_lay, time: 'sold') + end + end + + def acquired_companies + return [] unless @round.respond_to?(:acquired_companies) + + @round.acquired_companies + end + + def get_sold_company_ability(entity = nil) + acquired_companies = @round.respond_to?(:acquired_companies) && @round.acquired_companies + entities = [entity, *acquired_companies].compact + + entities.each do |company| + ability = @game.abilities(company, :tile_lay, time: 'sold') + return ability if ability + end + + nil + end + + def available_hex(entity, hex) + return unless (ability = abilities(entity)) + + ability.hexes&.include?(hex.id) && hex.tile.color == :white + end + + def legal_tile_rotation?(entity_or_entities, hex, tile) + entities = Array(entity_or_entities) + entity, *_combo_entities = entities + + return @game.legal_tile_rotation?(entity, hex, tile) unless @game.tile_game_reserve?(tile) + + # Only check than tile exits don't connect to map edges + tile.exits.all? { |edge| hex.neighbors[edge] } + end + + def process_lay_tile(action) + super + + @game.pay_game_reserve_bonus!(action.entity) + + @log << "#{action.entity.name} closes" + action.entity.close! + end + + def potential_tiles(entity_or_entities, _hex) + entities = Array(entity_or_entities) + entity, *_combo_entities = entities + + return [] unless (tile_ability = abilities(entity)) + + tile_ability.tiles.map { |name| @game.tiles.find { |t| t.name == name } } + end + end + end + end + end +end diff --git a/lib/engine/game/g_1822_africa/step/minor_acquisition.rb b/lib/engine/game/g_1822_africa/step/minor_acquisition.rb index 8f126d6d76..5dfdd03fd4 100644 --- a/lib/engine/game/g_1822_africa/step/minor_acquisition.rb +++ b/lib/engine/game/g_1822_africa/step/minor_acquisition.rb @@ -9,11 +9,46 @@ module Game module G1822Africa module Step class MinorAcquisition < Engine::Game::G1822::Step::MinorAcquisition + def actions(entity) + actions = super + + actions << 'choose_ability' if !choices_ability(entity).empty? && !actions.include?('choose_ability') + + actions + end + + def choices_ability(entity) + return {} unless entity.company? + + @game.company_choices(entity, :acquire_minor) + end + + def process_choose_ability(action) + @game.company_made_choice(action.entity, action.choice, :acquire_minor) + end + def can_acquire?(entity) return false if !entity.corporation? || (entity.corporation? && entity.type != :major) !potentially_mergeable(entity).empty? end + + def potentially_mergeable(entity) + # Mergable ignoring connections + minors = @game.corporations.select do |minor| + minor.type == :minor && minor.floated? && !pay_choices(entity, minor).empty? + end + + if @game.phase.status.include?('can_acquire_minor_bidbox') + bidbox_minors = @game.bidbox.select { |c| @game.minor?(c) } + available_minors = bidbox_minors.map { |c| @game.find_corporation(c) }.reject do |minor| + pay_choices(entity, minor).empty? + end + minors.concat(available_minors) if available_minors + end + + minors + end end end end diff --git a/lib/engine/game/g_1822_africa/step/special_token.rb b/lib/engine/game/g_1822_africa/step/special_token.rb new file mode 100644 index 0000000000..28f22765bf --- /dev/null +++ b/lib/engine/game/g_1822_africa/step/special_token.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +require_relative '../../g_1822/step/special_token' + +module Engine + module Game + module G1822Africa + module Step + class SpecialToken < G1822::Step::SpecialToken + def process_place_token(action) + super + + return unless action.entity.id == @game.class::COMPANY_GOLD_MINE + + token = action.city.tokens.reverse.find(&:itself) + token.corporation = @game.gold_mine_corp + token.logo = @game.gold_mine_corp.logo + token.simple_logo = token.logo + @game.gold_mine_token = token + + @log << "#{action.entity.name} closes" + action.entity.close! + end + end + end + end + end +end diff --git a/lib/engine/game/g_1822_ca/entities.rb b/lib/engine/game/g_1822_ca/entities.rb index 04fc8dbbce..e8a2222555 100644 --- a/lib/engine/game/g_1822_ca/entities.rb +++ b/lib/engine/game/g_1822_ca/entities.rb @@ -1100,7 +1100,6 @@ module Entities coordinates: 'AP4', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '2', @@ -1116,7 +1115,6 @@ module Entities coordinates: 'AN6', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '3', @@ -1132,7 +1130,6 @@ module Entities coordinates: 'AK3', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '4', @@ -1148,7 +1145,6 @@ module Entities coordinates: 'AH12', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '5', @@ -1165,7 +1161,6 @@ module Entities coordinates: 'AH8', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '6', @@ -1181,7 +1176,6 @@ module Entities coordinates: 'AG13', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '7', @@ -1198,7 +1192,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '8', @@ -1215,7 +1208,6 @@ module Entities city: 1, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '9', @@ -1232,7 +1224,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '10', @@ -1248,7 +1239,6 @@ module Entities coordinates: 'AD20', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '11', @@ -1264,7 +1254,6 @@ module Entities coordinates: 'AC23', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '12', @@ -1281,7 +1270,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '13', @@ -1296,7 +1284,6 @@ module Entities max_ownership_percent: 100, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '14', @@ -1312,7 +1299,6 @@ module Entities coordinates: 'AA25', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '15', @@ -1328,7 +1314,6 @@ module Entities coordinates: 'AA15', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '16', @@ -1344,7 +1329,6 @@ module Entities coordinates: 'Z28', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '17', @@ -1360,7 +1344,6 @@ module Entities coordinates: 'Y15', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '18', @@ -1376,7 +1359,6 @@ module Entities coordinates: 'X12', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '19', @@ -1392,7 +1374,6 @@ module Entities coordinates: 'V18', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '20', @@ -1408,7 +1389,6 @@ module Entities coordinates: 'P18', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '21', @@ -1425,7 +1405,6 @@ module Entities city: 2, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '22', @@ -1441,7 +1420,6 @@ module Entities coordinates: 'N6', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '23', @@ -1457,7 +1435,6 @@ module Entities coordinates: 'K15', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '24', @@ -1473,7 +1450,6 @@ module Entities coordinates: 'J12', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '25', @@ -1489,7 +1465,6 @@ module Entities coordinates: 'G17', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '26', @@ -1505,7 +1480,6 @@ module Entities coordinates: 'G15', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '27', @@ -1521,7 +1495,6 @@ module Entities coordinates: 'G11', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '28', @@ -1537,7 +1510,6 @@ module Entities coordinates: 'D14', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '29', @@ -1553,7 +1525,6 @@ module Entities coordinates: 'D10', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '30', @@ -1569,7 +1540,6 @@ module Entities coordinates: 'A7', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: 'CNoR', @@ -1583,7 +1553,6 @@ module Entities city: 0, color: '#9fce63', text_color: 'black', - reservation_color: nil, destination_coordinates: 'C15', destination_icon: '1822_ca/CNoR_DEST', }, @@ -1599,7 +1568,6 @@ module Entities coordinates: 'AF12', city: 1, color: '#ed242a', - reservation_color: nil, destination_coordinates: 'C15', destination_icon: '1822_ca/CPR_DEST', }, @@ -1614,8 +1582,8 @@ module Entities coordinates: 'R16', color: '#8dd8f8', text_color: 'black', - reservation_color: nil, destination_coordinates: 'N16', + destination_exits: [3], destination_icon: '1822_ca/GNWR_DEST', }, { @@ -1629,8 +1597,8 @@ module Entities coordinates: 'AC21', city: 1, color: '#000000', - reservation_color: nil, destination_coordinates: 'AF12', + destination_exits: [0], destination_icon: '1822_ca/GT_DEST', }, { @@ -1644,7 +1612,6 @@ module Entities coordinates: 'N16', city: 0, color: '#f47d20', - reservation_color: nil, destination_coordinates: 'A7', destination_icon: '1822_ca/GTP_DEST', }, @@ -1658,7 +1625,6 @@ module Entities always_market_price: true, coordinates: 'AB24', color: '#395aa8', - reservation_color: nil, destination_coordinates: 'Z28', destination_icon: '1822_ca/GWR_DEST', }, @@ -1673,8 +1639,8 @@ module Entities coordinates: 'AP4', color: '#eee91e', text_color: 'black', - reservation_color: nil, destination_coordinates: 'AH8', + destination_exits: [0, 1, 2, 3, 4, 5], destination_icon: '1822_ca/ICR_DEST', }, { @@ -1687,8 +1653,8 @@ module Entities always_market_price: true, coordinates: 'AO3', color: '#9a6733', - reservation_color: nil, destination_coordinates: 'N16', + destination_exits: [5], destination_icon: '1822_ca/NTR_DEST', }, { @@ -1701,7 +1667,6 @@ module Entities always_market_price: true, coordinates: 'C15', color: '#199d4a', - reservation_color: nil, destination_coordinates: 'D10', destination_icon: '1822_ca/PGE_DEST', }, @@ -1715,7 +1680,6 @@ module Entities always_market_price: true, coordinates: 'AH8', color: '#7f3881', - reservation_color: nil, destination_coordinates: 'AA15', destination_icon: '1822_ca/QMOO_DEST', }, diff --git a/lib/engine/game/g_1822_ca/game.rb b/lib/engine/game/g_1822_ca/game.rb index 6cae421f50..add51f1483 100644 --- a/lib/engine/game/g_1822_ca/game.rb +++ b/lib/engine/game/g_1822_ca/game.rb @@ -330,7 +330,7 @@ def operating_round(round_num) G1822CA::Step::SpecialTrack, G1822CA::Step::SpecialToken, G1822CA::Step::Track, - G1822::Step::DestinationToken, + G1822CA::Step::DestinationToken, G1822CA::Step::Token, G1822CA::Step::Route, G1822::Step::Dividend, @@ -583,6 +583,37 @@ def event_open_detroit_duluth! end @graph.clear end + + # - usually returns a single city + # - returns an Array of cities if entity is ICR and Quebec has multiple + # cities with paths + def destination_city(hex, entity) + return hex.tile.cities[0] unless (exits = entity.destination_exits) + + cities = exits.each_with_object([]) do |exit, cities_| + hex.paths[exit].each do |path| + next unless (city = path.city) + + cities_ << city unless cities.include?(city) + end + end + cities.one? ? cities[0] : cities + end + + def destination_description(corporation) + return super unless (exits = corporation.destination_exits) + + dest_hex = hex_by_id(corporation.destination_coordinates) + which = + if exits.size == 6 + 'Any ' + elsif exits.one? + %w[S SW NW N NE SE][exits[0]] + ' ' + else + '' + end + "Destination: #{which}#{dest_hex.location_name} (#{dest_hex.name})" + end end end end diff --git a/lib/engine/game/g_1822_ca/step/destination_token.rb b/lib/engine/game/g_1822_ca/step/destination_token.rb new file mode 100644 index 0000000000..ec4a2d16c9 --- /dev/null +++ b/lib/engine/game/g_1822_ca/step/destination_token.rb @@ -0,0 +1,95 @@ +# frozen_string_literal: true + +require_relative '../../g_1822/step/destination_token' + +module Engine + module Game + module G1822CA + module Step + class DestinationToken < G1822::Step::DestinationToken + ACTIONS = %w[hex_token place_token pass].freeze + + def setup + @connected_destination_nodes = [] + end + + def auto_actions(entity) + return [Engine::Action::Pass.new(entity)] unless destination_node_check?(entity) + + # ICR cannot auto-destinate if it is connected to multiple Quebec cities + return if @connected_destination_nodes.size > 1 + + destination_hex = @game.hex_by_id(entity.destination_coordinates) + if destination_hex.tile.cities.one? || !@game.destination_city(destination_hex, entity).is_a?(Array) + [Engine::Action::HexToken.new(entity, + hex: @game.hex_by_id(entity.destination_coordinates), + token_type: available_tokens(entity).first.type)] + else + # if there are multiple Quebec cities and ICR is connected to only + # one, it can auto-destinate, but the destination city needs to be + # tracked + city = @connected_destination_nodes[0] + [Engine::Action::PlaceToken.new(entity, + city: city, + slot: city.get_slot(entity), + token_type: available_tokens(entity).first.type)] + end + end + + def process_hex_token(action) + entity = action.entity + hex = action.hex + + if !@game.loading && !destination_node_check?(entity) + raise GameError, "Can't place the destination token on #{hex.name} "\ + 'because it is not connected' + end + if @connected_destination_nodes.size > 1 + raise GameError, "#{entity.name} is connected to multiple cities on the hex. Click "\ + 'on the city where it should place its destination token.' + end + + super + end + + def process_place_token(action) + entity = action.entity + city = action.city + hex = city.hex + token = action.token + raise GameError, 'Corporation does not have a destination token unused' unless token + + if !@game.loading && !destination_node_check?(entity) + raise GameError, "Can't place the destination token on #{hex.name} "\ + 'because it is not connected' + end + + @game.place_destination_token(entity, hex, token, city) + @game.remove_extra_tokens!(hex.tile) + pass! + end + + def destination_node_check?(entity) + destination_hex = @game.hex_by_id(entity.destination_coordinates) + home_node = entity.tokens.first.city + + destination_nodes = Array(@game.destination_city(destination_hex, entity)) + + @connected_destination_nodes = destination_nodes.select do |destination_node| + nodes_connected?(destination_node, home_node, entity) + end + + !@connected_destination_nodes.empty? + end + + def nodes_connected?(node_a, node_b, entity) + node_a&.walk(corporation: entity) do |path, _, _| + return true if path.nodes.include?(node_b) + end + false + end + end + end + end + end +end diff --git a/lib/engine/game/g_1822_mx/entities.rb b/lib/engine/game/g_1822_mx/entities.rb index 2512a7bd60..c60cc2a06b 100644 --- a/lib/engine/game/g_1822_mx/entities.rb +++ b/lib/engine/game/g_1822_mx/entities.rb @@ -769,7 +769,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '2', @@ -786,7 +785,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '3', @@ -803,7 +801,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '4', @@ -820,7 +817,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '5', @@ -837,7 +833,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '6', @@ -854,7 +849,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '7', @@ -871,7 +865,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '8', @@ -888,7 +881,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '9', @@ -905,7 +897,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '10', @@ -922,7 +913,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '11', @@ -939,7 +929,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '12', @@ -956,7 +945,6 @@ module Entities city: 1, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '13', @@ -973,7 +961,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '14', @@ -990,7 +977,6 @@ module Entities city: 1, color: '#ffffff', text_color: 'black', - reservation_color: nil, abilities: [{ type: 'blocks_hexes_consent', owner_type: 'player', hexes: ['N21'], hidden: true }], }, { @@ -1008,7 +994,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, abilities: [{ type: 'blocks_hexes_consent', owner_type: 'player', hexes: ['O22'], hidden: true }], }, { @@ -1026,7 +1011,6 @@ module Entities city: 2, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '17', @@ -1043,7 +1027,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '18', @@ -1060,7 +1043,6 @@ module Entities city: 1, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '19', @@ -1077,7 +1059,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '20', @@ -1094,7 +1075,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '21', @@ -1111,7 +1091,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '22', @@ -1128,7 +1107,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '23', @@ -1145,7 +1123,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '24', @@ -1162,7 +1139,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: 'FCM', @@ -1175,7 +1151,6 @@ module Entities coordinates: 'N23', city: 4, color: '#e51c00', - reservation_color: nil, destination_coordinates: 'N27', destination_icon: '1822_mx/FCM_DEST', }, @@ -1190,7 +1165,6 @@ module Entities coordinates: 'N23', city: 2, color: '#000000', - reservation_color: nil, destination_coordinates: 'F21', destination_icon: '1822_mx/MC_DEST', abilities: [{ type: 'blocks_hexes_consent', owner_type: 'player', hexes: ['M22'], hidden: true }], @@ -1206,7 +1180,6 @@ module Entities coordinates: 'F15', color: '#ff7b93', text_color: 'black', - reservation_color: nil, destination_coordinates: 'H11', destination_icon: '1822_mx/CHP_DEST', }, @@ -1221,7 +1194,6 @@ module Entities coordinates: 'N23', city: 3, color: '#850040', - reservation_color: nil, destination_coordinates: 'G22', destination_icon: '1822_mx/FNM_DEST', abilities: [{ type: 'blocks_hexes_consent', owner_type: 'player', hexes: ['M24'], hidden: true }], @@ -1236,7 +1208,6 @@ module Entities always_market_price: true, coordinates: 'F21', color: '#ff3600', - reservation_color: nil, destination_coordinates: 'J15', destination_icon: '1822_mx/MIR_DEST', }, @@ -1250,7 +1221,6 @@ module Entities always_market_price: true, coordinates: 'D9', color: '#fab506', - reservation_color: nil, destination_coordinates: 'L17', destination_icon: '1822_mx/FCP_DEST', }, @@ -1265,7 +1235,6 @@ module Entities coordinates: 'N23', city: 5, color: '#004c6c', - reservation_color: nil, destination_coordinates: 'N27', destination_icon: '1822_mx/IRM_DEST', abilities: [{ type: 'blocks_hexes_consent', owner_type: 'player', hexes: ['O24'], hidden: true }], @@ -1280,7 +1249,6 @@ module Entities always_market_price: true, city: 5, color: '#525600', - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_1822_pnw/entities.rb b/lib/engine/game/g_1822_pnw/entities.rb index c65b0f1edb..6422aa4c10 100644 --- a/lib/engine/game/g_1822_pnw/entities.rb +++ b/lib/engine/game/g_1822_pnw/entities.rb @@ -719,7 +719,6 @@ module Entities city: 0, color: '#EF1D24', text_color: 'white', - reservation_color: nil, abilities: [ { type: 'description', @@ -742,7 +741,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '3', @@ -759,7 +757,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '4', @@ -776,7 +773,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '5', @@ -793,7 +789,6 @@ module Entities city: 0, color: '#6BCFF7', text_color: '#white', - reservation_color: nil, abilities: [ { type: 'description', @@ -816,7 +811,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '7', @@ -833,7 +827,6 @@ module Entities city: 0, color: '#F69B1D', text_color: '#white', - reservation_color: nil, abilities: [ { type: 'description', @@ -856,7 +849,6 @@ module Entities city: 0, color: '#238541', text_color: '#black', - reservation_color: nil, abilities: [ { type: 'description', @@ -879,7 +871,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '10', @@ -896,7 +887,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '11', @@ -913,7 +903,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '12', @@ -930,7 +919,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '13', @@ -947,7 +935,6 @@ module Entities city: 1, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '14', @@ -964,7 +951,6 @@ module Entities city: 1, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '15', @@ -981,7 +967,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '16', @@ -998,7 +983,6 @@ module Entities city: 2, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '17', @@ -1015,7 +999,6 @@ module Entities city: 0, ## Todo - Check color: '#8D061B', text_color: '#white', - reservation_color: nil, abilities: [ { type: 'description', @@ -1038,7 +1021,6 @@ module Entities city: 1, ## Todo - Check color: '#3078C1', text_color: '#white', - reservation_color: nil, abilities: [ { type: 'description', @@ -1061,7 +1043,6 @@ module Entities city: 1, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '20', @@ -1078,7 +1059,6 @@ module Entities city: 0, color: '#221E20', text_color: 'white', - reservation_color: nil, abilities: [ { type: 'description', @@ -1101,7 +1081,6 @@ module Entities city: 0, color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: 'A', @@ -1118,7 +1097,6 @@ module Entities city: 0, color: '#808080', text_color: 'white', - reservation_color: nil, }, { sym: 'B', @@ -1135,7 +1113,6 @@ module Entities city: 0, color: '#808080', text_color: 'white', - reservation_color: nil, }, { sym: 'C', @@ -1152,7 +1129,6 @@ module Entities city: 0, color: '#808080', text_color: 'white', - reservation_color: nil, }, { sym: 'NP', @@ -1165,7 +1141,6 @@ module Entities coordinates: 'O20', city: 4, color: '#221E20', - reservation_color: nil, destination_coordinates: 'I12', destination_icon: '1822_pnw/NP_DEST', }, @@ -1180,7 +1155,6 @@ module Entities coordinates: 'A8', city: 2, color: '#EF1D24', - reservation_color: nil, destination_coordinates: 'A22', destination_icon: '1822_pnw/CPR_DEST', }, @@ -1195,7 +1169,6 @@ module Entities coordinates: 'D23', color: '#6BCFF7', text_color: 'black', - reservation_color: nil, destination_coordinates: 'D11', destination_icon: '1822_pnw/GNR_DEST', }, @@ -1210,7 +1183,6 @@ module Entities coordinates: 'O8', city: 3, color: '#3078C1', - reservation_color: nil, destination_coordinates: 'O20', destination_icon: '1822_pnw/ORNC_DEST', }, @@ -1224,7 +1196,6 @@ module Entities always_market_price: true, coordinates: 'O8', color: '#8D061B', - reservation_color: nil, destination_coordinates: 'F23', destination_icon: '1822_pnw/SPS_DEST', }, @@ -1238,7 +1209,6 @@ module Entities always_market_price: true, coordinates: 'F23', color: '#F69B1D', - reservation_color: nil, destination_coordinates: 'H11', destination_icon: '1822_pnw/CMPS_DEST', }, @@ -1253,7 +1223,6 @@ module Entities coordinates: 'H11', city: 5, color: '#238541', - reservation_color: nil, destination_coordinates: 'O22', destination_icon: '1822_pnw/SWW_DEST', }, diff --git a/lib/engine/game/g_1822_pnw/game.rb b/lib/engine/game/g_1822_pnw/game.rb index 91dad6ed28..ab7f5bbdd8 100644 --- a/lib/engine/game/g_1822_pnw/game.rb +++ b/lib/engine/game/g_1822_pnw/game.rb @@ -1087,14 +1087,6 @@ def close_minor(minor) corporations.delete(minor) end - def check_destination_duplicate(entity, hex) - city = hex.tile.cities.first - return unless city.tokened_by?(entity) - - @log << "#{entity.name} has an existing token on its destination #{hex.name} and will pick it up as an available token" - entity.tokens.find { |t| t.city == city }.remove! - end - def after_lay_tile(hex, old_tile, tile) hex.neighbors[1].tile.borders.shift if hex.id == 'H13' && tile.exits.include?(1) super diff --git a/lib/engine/game/g_1824/entities.rb b/lib/engine/game/g_1824/entities.rb index c5786b0a6a..a68c82d5e8 100644 --- a/lib/engine/game/g_1824/entities.rb +++ b/lib/engine/game/g_1824/entities.rb @@ -137,7 +137,6 @@ module Entities simple_logo: '1824/BK.alt', color: :blue, coordinates: 'B9', - reservation_color: nil, }, { name: 'Mährisch-Schlesische Eisenbahn', @@ -150,7 +149,6 @@ module Entities color: :yellow, text_color: 'black', coordinates: 'C12', - reservation_color: nil, }, { name: 'Carl Ludwigs-Bahn', @@ -162,7 +160,6 @@ module Entities logo: '1824/CL', simple_logo: '1824/CL.alt', coordinates: 'B23', - reservation_color: nil, }, { name: 'Siebenbürgische Bahn', @@ -175,7 +172,6 @@ module Entities color: :green, text_color: 'black', coordinates: 'G26', - reservation_color: nil, }, { name: 'Bosnisch-Herzegowinische Landesbahn', @@ -187,7 +183,6 @@ module Entities simple_logo: '1824/BH.alt', color: :red, coordinates: 'J13', - reservation_color: nil, }, { name: 'Südbahn', @@ -205,7 +200,6 @@ module Entities simple_logo: '1824/SD.alt', color: :orange, text_color: 'black', - reservation_color: nil, }, { name: 'Ungarische Staatsbahn', @@ -222,7 +216,6 @@ module Entities logo: '1824/UG', simple_logo: '1824/UG.alt', color: :purple, - reservation_color: nil, }, { name: 'k&k Staatsbahn', @@ -239,7 +232,6 @@ module Entities logo: '1824/KK', simple_logo: '1824/KK.alt', color: :brown, - reservation_color: nil, }, ].freeze diff --git a/lib/engine/game/g_1825/entities.rb b/lib/engine/game/g_1825/entities.rb index e5d341e466..fd1ee88b5d 100644 --- a/lib/engine/game/g_1825/entities.rb +++ b/lib/engine/game/g_1825/entities.rb @@ -103,7 +103,6 @@ module Entities city: 0, color: '#000000', text_color: '#ffffff', - reservation_color: nil, abilities: [{ type: 'blocks_hexes', owner_type: nil, hexes: ['U17'] }], }, { @@ -118,7 +117,6 @@ module Entities city: 0, color: '#004225', text_color: '#ffffff', - reservation_color: nil, abilities: [{ type: 'blocks_hexes', owner_type: nil, hexes: ['V18'] }], }, { @@ -133,7 +131,6 @@ module Entities city: 4, color: '#191970', text_color: '#ffffff', - reservation_color: nil, abilities: [{ type: 'blocks_hexes', owner_type: nil, hexes: ['U23'] }], }, { @@ -148,7 +145,6 @@ module Entities city: 0, color: '#d0f0c0', text_color: '#000000', - reservation_color: nil, abilities: [{ type: 'blocks_hexes', owner_type: nil, hexes: ['W19'] }], }, { @@ -163,7 +159,6 @@ module Entities city: 0, color: '#ffef00', text_color: '#000000', - reservation_color: nil, abilities: [], }, { @@ -178,7 +173,6 @@ module Entities city: 0, color: '#ffa500', text_color: 'black', - reservation_color: nil, abilities: [{ type: 'blocks_hexes', owner_type: nil, hexes: ['X20'] }], }, ].freeze @@ -196,7 +190,6 @@ module Entities city: 0, color: '#000000', text_color: '#ffffff', - reservation_color: nil, }, { sym: 'MR', @@ -210,7 +203,6 @@ module Entities city: 0, color: '#ff0000', text_color: '#ffffff', - reservation_color: nil, abilities: [{ type: 'blocks_hexes', owner_type: nil, hexes: ['Q15'] }], }, { @@ -225,7 +217,6 @@ module Entities city: 0, color: '#00ff00', text_color: '#000000', - reservation_color: nil, abilities: [{ type: 'blocks_hexes', owner_type: nil, hexes: ['L14'] }], }, { @@ -240,7 +231,6 @@ module Entities city: 0, color: '#89cff0', text_color: '#000000', - reservation_color: nil, }, { sym: 'GNR', @@ -254,7 +244,6 @@ module Entities city: 1, color: '#228c22', text_color: '#ffffff', - reservation_color: nil, }, { sym: 'L&Y', @@ -268,7 +257,6 @@ module Entities city: 1, color: '#6c0ba9', text_color: '#ffffff', - reservation_color: nil, abilities: [{ type: 'blocks_hexes', owner_type: nil, hexes: ['N10'] }], }, ].freeze @@ -286,7 +274,6 @@ module Entities city: 2, color: '#0047ab', text_color: '#ffffff', - reservation_color: nil, }, { sym: 'NBR', @@ -300,7 +287,6 @@ module Entities city: 1, color: '#7c4700', text_color: '#ffffff', - reservation_color: nil, }, { sym: 'GSWR', @@ -314,7 +300,6 @@ module Entities city: 0, color: '#001800', text_color: '#ffff00', - reservation_color: nil, abilities: [{ type: 'blocks_hexes', owner_type: nil, hexes: ['H4'] }], }, { diff --git a/lib/engine/game/g_1828/entities.rb b/lib/engine/game/g_1828/entities.rb index 4e0196caa8..5acdbd810a 100644 --- a/lib/engine/game/g_1828/entities.rb +++ b/lib/engine/game/g_1828/entities.rb @@ -247,7 +247,6 @@ module Entities description: 'Place one additional yellow tile for $40', }, ], - reservation_color: nil, }, { sym: 'B&O', @@ -257,7 +256,6 @@ module Entities tokens: [0, 100, 100], coordinates: 'I19', color: '#4682B4', - reservation_color: nil, }, { sym: 'C&O', @@ -268,7 +266,6 @@ module Entities coordinates: 'K15', color: '#B0E0E6', text_color: 'black', - reservation_color: nil, }, { sym: 'CPR', @@ -278,7 +275,6 @@ module Entities tokens: [0, 100, 100, 100], coordinates: 'A23', color: '#9C661F', - reservation_color: nil, }, { sym: 'GT', @@ -289,7 +285,6 @@ module Entities coordinates: 'D4', color: '#F0E68C', text_color: 'black', - reservation_color: nil, }, { sym: 'ERIE', @@ -299,7 +294,6 @@ module Entities tokens: [0, 100, 100], coordinates: 'E15', color: '#B8860B', - reservation_color: nil, }, { sym: 'IC', @@ -310,7 +304,6 @@ module Entities coordinates: 'J6', color: '#9ACD32', text_color: 'black', - reservation_color: nil, }, { sym: 'MC', @@ -321,7 +314,6 @@ module Entities coordinates: 'A7', color: '#B3B3B3', text_color: 'black', - reservation_color: nil, }, { sym: 'MP', @@ -332,7 +324,6 @@ module Entities coordinates: 'I3', color: '#BDB76B', text_color: 'black', - reservation_color: nil, }, { sym: 'NYC', @@ -342,7 +333,6 @@ module Entities tokens: [0, 100, 100], coordinates: 'E23', color: '#7F7F7F', - reservation_color: nil, }, { sym: 'NKP', @@ -353,7 +343,6 @@ module Entities coordinates: 'F10', color: '#D8BFD8', text_color: 'black', - reservation_color: nil, }, { sym: 'NYH', @@ -371,7 +360,6 @@ module Entities description: 'Place one additional yellow tile for $40', }, ], - reservation_color: nil, }, { sym: 'NW', @@ -382,7 +370,6 @@ module Entities coordinates: 'K19', color: '#F08080', text_color: 'black', - reservation_color: nil, }, { sym: 'OSH', @@ -392,7 +379,6 @@ module Entities tokens: [0, 100, 100, 100], coordinates: 'A15', color: '#61B329', - reservation_color: nil, }, { sym: 'PRR', @@ -402,7 +388,6 @@ module Entities tokens: [0, 100, 100, 100], coordinates: 'H16', color: '#FF6347', - reservation_color: nil, }, { sym: 'WAB', @@ -413,7 +398,6 @@ module Entities coordinates: 'H6', color: '#DDA0DD', text_color: 'black', - reservation_color: nil, }, ].freeze diff --git a/lib/engine/game/g_1830/entities.rb b/lib/engine/game/g_1830/entities.rb index d5fca55ad8..522a827d1d 100644 --- a/lib/engine/game/g_1830/entities.rb +++ b/lib/engine/game/g_1830/entities.rb @@ -111,7 +111,6 @@ module Entities tokens: [0, 40, 100, 100], coordinates: 'H12', color: '#32763f', - reservation_color: nil, }, { float_percent: 60, @@ -122,7 +121,6 @@ module Entities tokens: [0, 40, 100, 100], coordinates: 'E19', color: :'#474548', - reservation_color: nil, }, { float_percent: 60, @@ -133,7 +131,6 @@ module Entities tokens: [0, 40, 100, 100], coordinates: 'A19', color: '#d1232a', - reservation_color: nil, }, { float_percent: 60, @@ -144,7 +141,6 @@ module Entities tokens: [0, 40, 100], coordinates: 'I15', color: '#025aaa', - reservation_color: nil, }, { float_percent: 60, @@ -156,7 +152,6 @@ module Entities coordinates: 'F6', color: :'#ADD8E6', text_color: 'black', - reservation_color: nil, }, { float_percent: 60, @@ -168,7 +163,6 @@ module Entities coordinates: 'E11', color: :'#FFF500', text_color: 'black', - reservation_color: nil, }, { float_percent: 60, @@ -180,7 +174,6 @@ module Entities coordinates: 'G19', city: 0, color: :'#d88e39', - reservation_color: nil, }, { float_percent: 60, @@ -191,7 +184,6 @@ module Entities tokens: [0, 40], coordinates: 'E23', color: :'#95c054', - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_1836_jr56/entities.rb b/lib/engine/game/g_1836_jr56/entities.rb index 85ef49ce0d..955df9a6dd 100644 --- a/lib/engine/game/g_1836_jr56/entities.rb +++ b/lib/engine/game/g_1836_jr56/entities.rb @@ -161,7 +161,6 @@ module Entities description: 'May borrow a train when trainless*', }, ], - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_1840/entities.rb b/lib/engine/game/g_1840/entities.rb index 0b7cef92e6..cef4796864 100644 --- a/lib/engine/game/g_1840/entities.rb +++ b/lib/engine/game/g_1840/entities.rb @@ -238,7 +238,6 @@ module Entities coordinates: 'D18', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '2', @@ -254,7 +253,6 @@ module Entities coordinates: 'D18', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '3', @@ -270,7 +268,6 @@ module Entities coordinates: 'E17', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '4', @@ -286,7 +283,6 @@ module Entities coordinates: 'H28', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '5', @@ -302,7 +298,6 @@ module Entities coordinates: 'G15', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '6', @@ -318,7 +313,6 @@ module Entities coordinates: 'K27', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '7', @@ -334,7 +328,6 @@ module Entities coordinates: 'F18', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '8', @@ -350,7 +343,6 @@ module Entities coordinates: 'J10', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '9', @@ -366,7 +358,6 @@ module Entities coordinates: 'C7', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '10', @@ -382,7 +373,6 @@ module Entities coordinates: 'D4', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '11', @@ -398,7 +388,6 @@ module Entities coordinates: 'B12', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '12', @@ -414,7 +403,6 @@ module Entities coordinates: 'E11', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '13', @@ -430,7 +418,6 @@ module Entities coordinates: 'G3', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '14', @@ -446,7 +433,6 @@ module Entities coordinates: 'E3', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '15', @@ -462,7 +448,6 @@ module Entities coordinates: 'J16', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '16', @@ -478,7 +463,6 @@ module Entities coordinates: 'D26', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '17', @@ -494,7 +478,6 @@ module Entities coordinates: 'A29', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { sym: '18', @@ -510,7 +493,6 @@ module Entities coordinates: 'I21', color: '#ffffff', text_color: 'black', - reservation_color: nil, }, { float_percent: 50, @@ -520,7 +502,6 @@ module Entities tokens: [], color: '#1A1A18', type: 'major', - reservation_color: nil, shares: [50, 10, 10, 10, 10, 10], always_market_price: true, }, @@ -532,7 +513,6 @@ module Entities tokens: [], color: '#AD4382', type: 'major', - reservation_color: nil, shares: [50, 10, 10, 10, 10, 10], always_market_price: true, }, @@ -544,7 +524,6 @@ module Entities tokens: [], color: '#2F2483', type: 'major', - reservation_color: nil, shares: [50, 10, 10, 10, 10, 10], always_market_price: true, }, @@ -558,7 +537,6 @@ module Entities color: '#FECC00', text_color: 'black', type: 'major', - reservation_color: nil, shares: [50, 10, 10, 10, 10, 10], always_market_price: true, }, @@ -570,7 +548,6 @@ module Entities tokens: [], color: '#00963F', type: 'major', - reservation_color: nil, shares: [50, 10, 10, 10, 10, 10], always_market_price: true, }, @@ -582,7 +559,6 @@ module Entities tokens: [], color: '#E3000F', type: 'major', - reservation_color: nil, shares: [50, 10, 10, 10, 10, 10], always_market_price: true, }, @@ -594,7 +570,6 @@ module Entities tokens: [0, 0, 0, 0], color: '#A15E48', type: 'city', - reservation_color: nil, shares: [10, 10, 10, 10, 10, 10, 10, 10, 10, 10], always_market_price: true, }, @@ -607,7 +582,6 @@ module Entities color: '#DAB06E', text_color: 'black', type: 'city', - reservation_color: nil, shares: [10, 10, 10, 10, 10, 10, 10, 10, 10, 10], always_market_price: true, }, @@ -620,7 +594,6 @@ module Entities color: '#F58220', text_color: 'black', type: 'city', - reservation_color: nil, shares: [10, 10, 10, 10, 10, 10, 10, 10, 10, 10], always_market_price: true, }, @@ -633,7 +606,6 @@ module Entities color: '#FFCB1C', text_color: 'black', type: 'city', - reservation_color: nil, shares: [10, 10, 10, 10, 10, 10, 10, 10, 10, 10], always_market_price: true, }, diff --git a/lib/engine/game/g_1840/game.rb b/lib/engine/game/g_1840/game.rb index b6c31e3c4e..2257433851 100644 --- a/lib/engine/game/g_1840/game.rb +++ b/lib/engine/game/g_1840/game.rb @@ -412,6 +412,7 @@ def init_company_round @round_counter += 1 @intern_cr_phase_counter = 1 @cr_counter += 1 + @sorted_corporations_for_company_round = operating_order remove_obsolete_trains @log << "-- #{round_description('Company', nil)} --" new_company_operating_route_round @@ -925,6 +926,10 @@ def timeline def train_actions_always_use_operating_round_view? true end + + def sorted_corporations + @sorted_corporations_for_company_round || operating_order + end end end end diff --git a/lib/engine/game/g_1840/meta.rb b/lib/engine/game/g_1840/meta.rb index 2c73c13e79..da14f9afff 100644 --- a/lib/engine/game/g_1840/meta.rb +++ b/lib/engine/game/g_1840/meta.rb @@ -17,7 +17,7 @@ module Meta PLAYER_RANGE = [2, 6].freeze - DEV_STAGE = :beta + DEV_STAGE = :production OPTIONAL_RULES = [ { diff --git a/lib/engine/game/g_1840/round/acquisition.rb b/lib/engine/game/g_1840/round/acquisition.rb index ea0537dc37..0b756a55ac 100644 --- a/lib/engine/game/g_1840/round/acquisition.rb +++ b/lib/engine/game/g_1840/round/acquisition.rb @@ -22,7 +22,7 @@ def offer end def select_entities - @game.operating_order.select { |item| item.type == :major && @game.corporate_card_minors(item).size < 3 } + @game.sorted_corporations.select { |item| item.type == :major && @game.corporate_card_minors(item).size < 3 } end end end diff --git a/lib/engine/game/g_1840/round/company.rb b/lib/engine/game/g_1840/round/company.rb index 1143c37b12..6dda744f68 100644 --- a/lib/engine/game/g_1840/round/company.rb +++ b/lib/engine/game/g_1840/round/company.rb @@ -23,7 +23,7 @@ def name end def select_entities - entites = @game.operating_order + entites = @game.sorted_corporations majors = entites.select { |item| item.type == :major } return majors if @no_city diff --git a/lib/engine/game/g_1840/step/acquisition_auction.rb b/lib/engine/game/g_1840/step/acquisition_auction.rb index 348c5d60fe..7a60c30f30 100644 --- a/lib/engine/game/g_1840/step/acquisition_auction.rb +++ b/lib/engine/game/g_1840/step/acquisition_auction.rb @@ -71,7 +71,7 @@ def process_merge(action) @log << "#{action.entity.id} selects #{action.corporation.full_name} for auctioning" end - def can_bid?(entity) + def can_bid_any?(entity) return unless entity.corporation? return if @bids[@auctioning].any? { |b| b.entity == entity } diff --git a/lib/engine/game/g_1840/step/selection_auction.rb b/lib/engine/game/g_1840/step/selection_auction.rb index eaee53cd28..a2568806bc 100644 --- a/lib/engine/game/g_1840/step/selection_auction.rb +++ b/lib/engine/game/g_1840/step/selection_auction.rb @@ -159,7 +159,7 @@ def all_passed! def resolve_bids super entities.each(&:unpass!) - @round.goto_entity!(@auction_triggerer) + @round.goto_entity!(@auction_triggerer) if @auction_triggerer end end end diff --git a/lib/engine/game/g_1841/game.rb b/lib/engine/game/g_1841/game.rb index af5ae843f0..9de2cece6b 100644 --- a/lib/engine/game/g_1841/game.rb +++ b/lib/engine/game/g_1841/game.rb @@ -5,12 +5,14 @@ require_relative 'entities' require_relative 'map' require_relative 'stock_market' +require_relative '../cities_plus_towns_route_distance_str' module Engine module Game module G1841 class Game < Game::Base include_meta(G1841::Meta) + include CitiesPlusTownsRouteDistanceStr include Entities include Map @@ -1222,7 +1224,7 @@ def merger_values(corpa, corpb) end # minor - [find_rightmost_share_price(((corpa.share_price.price + corpb.share_price.price) / 2.0).to_i)] + [find_rightmost_share_price((corpa.share_price.price + corpb.share_price.price) / 2.0)] end def merger_start(corpa, corpb, target, tuscan_merge: false) diff --git a/lib/engine/game/g_1846/entities.rb b/lib/engine/game/g_1846/entities.rb index cb7d6e9656..4263011a92 100644 --- a/lib/engine/game/g_1846/entities.rb +++ b/lib/engine/game/g_1846/entities.rb @@ -284,7 +284,6 @@ module Entities coordinates: 'F20', color: :'#FF0000', always_market_price: true, - reservation_color: nil, }, { float_percent: 20, @@ -296,7 +295,6 @@ module Entities coordinates: 'D20', color: '#110a0c', always_market_price: true, - reservation_color: nil, }, { float_percent: 20, @@ -325,7 +323,6 @@ module Entities coordinates: 'G19', color: '#025aaa', always_market_price: true, - reservation_color: nil, }, { float_percent: 20, @@ -338,7 +335,6 @@ module Entities color: :'#ADD8E6', text_color: 'black', always_market_price: true, - reservation_color: nil, }, { float_percent: 20, @@ -368,7 +364,6 @@ module Entities color: :'#FFF500', text_color: 'black', always_market_price: true, - reservation_color: nil, }, { float_percent: 20, @@ -380,7 +375,6 @@ module Entities coordinates: 'B16', color: '#f58121', always_market_price: true, - reservation_color: nil, }, { float_percent: 20, @@ -426,7 +420,6 @@ module Entities coordinates: 'K3', color: '#32763f', always_market_price: true, - reservation_color: nil, }, ].freeze diff --git a/lib/engine/game/g_1846/game.rb b/lib/engine/game/g_1846/game.rb index c371f389fc..7140a4b69c 100644 --- a/lib/engine/game/g_1846/game.rb +++ b/lib/engine/game/g_1846/game.rb @@ -268,7 +268,9 @@ def setup @second_tokens_in_green = {} # When creating a game the game will not have enough to start - return unless @players.size.between?(*self.class::PLAYER_RANGE) + unless (player_count = @players.size).between?(*self.class::PLAYER_RANGE) + raise GameError, "#{self.class::GAME_TITLE} does not support #{player_count} players" + end if first_edition? remove_icons(self.class::BOOMTOWN_HEXES, self.class::ABILITY_ICONS['BT']) diff --git a/lib/engine/game/g_1846/step/buy_train.rb b/lib/engine/game/g_1846/step/buy_train.rb index 8b2a5517c1..7bc6d9753b 100644 --- a/lib/engine/game/g_1846/step/buy_train.rb +++ b/lib/engine/game/g_1846/step/buy_train.rb @@ -120,6 +120,10 @@ def buyable_train_variants(train, entity) def buying_power(entity) @game.train_buying_power(entity) end + + def president_may_contribute?(corporation, _shell = nil) + must_buy_train?(corporation) && ebuy_president_can_contribute?(corporation) + end end end end diff --git a/lib/engine/game/g_1847_ae/corporation.rb b/lib/engine/game/g_1847_ae/corporation.rb index b9c77869fb..cec5e4a54c 100644 --- a/lib/engine/game/g_1847_ae/corporation.rb +++ b/lib/engine/game/g_1847_ae/corporation.rb @@ -4,6 +4,8 @@ module Engine module Game module G1847AE class Corporation < Engine::Corporation + attr_accessor :has_ipo_description_ability + attr_reader :hex_color, :second_share_double, :last_share_double def initialize(sym:, name:, **opts) @@ -11,10 +13,11 @@ def initialize(sym:, name:, **opts) @second_share_double = opts[:second_share_double] @last_share_double = opts[:last_share_double] - shares[2].double_cert = @second_share_double + shares[2].double_cert = @second_share_double if @second_share_double shares.last.double_cert = @last_share_double @par_price = opts[:par_price] @hex_color = opts[:hex_color] + @has_ipo_description_ability = opts[:has_ipo_description_ability] end end end diff --git a/lib/engine/game/g_1847_ae/entities.rb b/lib/engine/game/g_1847_ae/entities.rb index 338e178eb4..22cf8ae4f9 100644 --- a/lib/engine/game/g_1847_ae/entities.rb +++ b/lib/engine/game/g_1847_ae/entities.rb @@ -31,15 +31,10 @@ module Entities name: 'Locomotive Firm Krauss & Co.', value: 130, revenue: 0, - desc: 'Every OR, first time a train is purchased from supply, this pays revenue '\ - 'equal to 10% of the train\'s cost and the stock price marker is moved right. '\ - 'If no train is purchased from supply in OR, no revenue is paid and the stock '\ - 'price marker is moved left. '\ - 'May not be sold to a corporation. '\ - 'May be sold to or purchased from the market. '\ - 'Never closes.', + desc: 'Comes with the President\'s certificate of Locomotive Firm Krauss & Co. (LFK). '\ + 'LFK is in fact the private company but it is represented by a corporation for the implementation sake.', sym: 'LFKC', - abilities: [{ type: 'no_buy' }], + abilities: [{ type: 'shares', shares: 'LFK_0' }], }, { name: 'Rammelsbach', @@ -184,15 +179,18 @@ module Entities desc: 'May be exchanged for an Investor share of the Hessische Ludwigsbahn (HLB), '\ 'instead of buying a share, during a stock round in Phase 3+3 or later. '\ 'Automatically exchanged at the beginning of the first stock round in Phase 5+5. '\ - 'May not be sold to a corporation. ', + 'May not be sold to a corporation.', sym: 'MNR', - abilities: [{ - type: 'exchange', - corporations: ['HLB'], - owner_type: 'player', - when: 'owning_player_sr_turn', - from: %w[reserved], - }], + abilities: [ + { type: 'no_buy' }, + { + type: 'exchange', + corporations: ['HLB'], + owner_type: 'player', + when: 'owning_player_sr_turn', + from: %w[reserved], + }, + ], }, { name: 'Saarland Coal Mines', @@ -203,13 +201,16 @@ module Entities 'Automatically exchanged at the beginning of the first stock round in Phase 5+5. '\ 'May not be sold to a corporation. ', sym: 'SCR', - abilities: [{ - type: 'exchange', - corporations: ['Saar'], - owner_type: 'player', - when: 'owning_player_sr_turn', - from: %w[reserved], - }], + abilities: [ + { type: 'no_buy' }, + { + type: 'exchange', + corporations: ['Saar'], + owner_type: 'player', + when: 'owning_player_sr_turn', + from: %w[reserved], + }, + ], }, { name: 'Völklinger Iron Works', @@ -220,17 +221,52 @@ module Entities 'Automatically exchanged at the beginning of the first stock round in Phase 5+5. '\ 'May not be sold to a corporation. ', sym: 'VIW', - abilities: [{ - type: 'exchange', - corporations: ['Saar'], - owner_type: 'player', - when: 'owning_player_sr_turn', - from: %w[reserved], - }], + abilities: [ + { type: 'no_buy' }, + { + type: 'exchange', + corporations: ['Saar'], + owner_type: 'player', + when: 'owning_player_sr_turn', + from: %w[reserved], + }, + ], }, ].freeze CORPORATIONS = [ + # This corporation is in fact the Locomotive Firm Krauss & Co. private company + { + sym: 'LFK', + name: 'Locomotive Firm Krauss & Co.', + logo: '1847_ae/LFK', + simple_logo: '1847_ae/LFK', + tokens: [], + float_percent: 100, + max_ownership_percent: 100, + required_par_price: 100, + shares: [100], + forced_share_percent: 100, + second_share_double: false, + last_share_double: false, + text_color: 'black', + color: 'white', + has_ipo_description_ability: false, + abilities: [ + { + type: 'base', + description: 'Click to see details', + desc_detail: 'This is the Locomotive Firm Krauss & Co. private company. '\ + 'Every OR, first time a train is purchased from supply, this corporation pays revenue '\ + 'equal to 10% of the train\'s cost to its president and the stock price marker is moved right. '\ + 'If no train is purchased from supply in OR, no revenue is paid and the stock '\ + 'price marker is moved left. '\ + 'May not be sold to a corporation. '\ + 'May be sold to or purchased from the market. '\ + 'Never closes.', + }, + ], + }, { sym: 'L', name: 'Pfälzische Ludwigsbahn', @@ -246,6 +282,7 @@ module Entities second_share_double: false, last_share_double: false, color: '#4682b4', + has_ipo_description_ability: false, abilities: [ { type: 'base', @@ -270,12 +307,17 @@ module Entities last_share_double: true, float_includes_reserved: true, color: '#ff4040', + has_ipo_description_ability: true, abilities: [ { type: 'base', description: 'Builds in pink hexes in yellow phase', remove: '4', }, + { + type: 'base', + description: 'IPO: last cert is double', + }, ], }, { @@ -294,6 +336,7 @@ module Entities last_share_double: true, float_includes_reserved: true, color: '#dda0dd', + has_ipo_description_ability: true, abilities: [ { type: 'base', @@ -308,6 +351,10 @@ module Entities type: 'base', description: 'Two home stations (D18 and C21)', }, + { + type: 'base', + description: 'IPO: last cert is double', + }, ], text_color: 'black', }, @@ -327,6 +374,7 @@ module Entities required_par_price: 74, hex_color: 'blue', color: '#61b229', + has_ipo_description_ability: true, abilities: [ { type: 'base', @@ -337,6 +385,10 @@ module Entities type: 'base', description: 'May not be started until HLB floats', }, + { + type: 'base', + description: 'IPO: 2nd and last certs are double', + }, ], }, { @@ -355,6 +407,7 @@ module Entities last_share_double: true, color: '#fafa37', text_color: 'black', + has_ipo_description_ability: true, abilities: [ { type: 'base', @@ -365,6 +418,10 @@ module Entities type: 'base', description: 'May not be started until HLB floats', }, + { + type: 'base', + description: 'IPO: last cert is double', + }, ], }, { @@ -382,7 +439,9 @@ module Entities last_share_double: true, required_par_price: 66, hex_color: 'blue', - color: '#ff9966', + color: '#ffc04d', + text_color: 'black', + has_ipo_description_ability: true, abilities: [ { type: 'base', @@ -393,6 +452,10 @@ module Entities type: 'base', description: 'May not be started until HLB floats', }, + { + type: 'base', + description: 'IPO: 2nd and last cert are double', + }, ], }, { @@ -411,6 +474,8 @@ module Entities required_par_price: 66, hex_color: 'pink', color: '#ffc0cb', + text_color: 'black', + has_ipo_description_ability: true, abilities: [ { type: 'base', @@ -421,6 +486,10 @@ module Entities type: 'base', description: 'May not be started until HLB floats', }, + { + type: 'base', + description: 'IPO: 2nd and last cert are double', + }, ], }, ].freeze diff --git a/lib/engine/game/g_1847_ae/game.rb b/lib/engine/game/g_1847_ae/game.rb index 56e8567aee..665727006f 100644 --- a/lib/engine/game/g_1847_ae/game.rb +++ b/lib/engine/game/g_1847_ae/game.rb @@ -15,7 +15,7 @@ class Game < Game::Base include Map include Entities - attr_accessor :draft_finished, :must_exchange_investor_companies + attr_accessor :draft_finished, :yellow_tracks_restricted, :must_exchange_investor_companies, :train_bought_this_round HOME_TOKEN_TIMING = :float TRACK_RESTRICTION = :semi_restrictive @@ -30,8 +30,8 @@ class Game < Game::Base CERT_LIMIT = { 3 => 16, 4 => 12, 5 => 9 }.freeze STARTING_CASH = { 3 => 500, 4 => 390, 5 => 320 }.freeze - COMPANIES_PURCHASABLE_BY_CORPORATIONS = %w[R K W H].freeze INVESTOR_COMPANIES = %w[MNR SCR VIW].freeze + COMPANIES_PURCHASABLE_BY_PLAYERS = %w[R K W H MNR SCR VIW].freeze LAST_TRANCH_CORPORATIONS = %w[NDB M N RNB].freeze @@ -46,13 +46,23 @@ class Game < Game::Base MARKET = [ ['', '', '', '', '130', '150', '170', '190', '210', '230', '255', '285', '315', '350', '385', '420'], ['', '', '98', '108', '120', '135', '150', '170', '190', '210', '235', '260', '285', '315', '350', '385'], - %w[82 86p 92 100 110 125 140 155 170 190 210 235 260 290 320], + %w[82 86p 92 100p 110 125 140 155 170 190 210 235 260 290 320], %w[78 84p 88 94 104 112 125 140 155 170 190 215], %w[72 80p 86 90 96 104 115 125 140], %w[62 74p 82 88 92 98 105], %w[50 66p 76 84 90], ].freeze + def price_movement_chart + [ + ['Action', 'Share Price Change'], + ['Dividend 0 or withheld', '1 ←'], + ['Dividend paid', '1 →'], + ['Any number of shares sold', '1 ↓'], + ['Corporation sold out at end of SR', '1 ↑'], + ] + end + PHASES = [ { name: '3', @@ -128,7 +138,17 @@ class Game < Game::Base rusts_on: '5+5', num: 2, }, - { name: '4', distance: 4, price: 300, rusts_on: '6+6', num: 2 }, + { + name: '4', + distance: 4, + price: 300, + rusts_on: '6+6', + num: 2, + events: [ + { 'type' => 'only_one_yellow' }, + { 'type' => 'yellow_tracks_not_restricted' }, + ], + }, { name: '4+4', distance: [{ 'nodes' => ['town'], 'pay' => 4, 'visit' => 4 }, @@ -141,9 +161,6 @@ class Game < Game::Base distance: 5, price: 450, num: 2, - events: [ - { 'type' => 'must_exchange_investor_companies' }, - ], }, { name: '5+5', @@ -151,6 +168,9 @@ class Game < Game::Base { 'nodes' => %w[city offboard town], 'pay' => 5, 'visit' => 5 }], price: 550, num: 1, + events: [ + { 'type' => 'must_exchange_investor_companies' }, + ], }, { name: '6E', @@ -175,13 +195,31 @@ class Game < Game::Base ).freeze EVENTS_TEXT = Base::EVENTS_TEXT.merge( + 'only_one_yellow' => ['Only one yellow track', + 'From now on, corporations may only lay one yellow track except for their very first operation'], + 'yellow_tracks_not_restricted' => ['Yellow tracks not restricted', + 'From now on, corporations may lay yellow tracks in any hexes they can reach,'\ + ' not only in hexes of a given color'], 'must_exchange_investor_companies' => ['Must exchange Investor companies', 'Must exchange Investor companies for the associated Investor shares'\ ' in the next Stock Round'], ).freeze + YELLOW_OR_UPGRADE = [{ lay: true, upgrade: true }].freeze + TWO_YELLOW = [{ lay: true, upgrade: false }, { lay: true, upgrade: false }].freeze + TWO_YELLOW_OR_YELLOW_AND_UPGRADE = [ + { lay: true, upgrade: true }, + { lay: true, upgrade: :not_if_upgraded, cannot_reuse_same_hex: true }, + ].freeze + LAYOUT = :pointy + def init_stock_market + market = G1847AE::StockMarket.new(self.class::MARKET, []) + market.game = self + market + end + def init_round G1847AE::Round::Draft.new(self, [G1847AE::Step::Draft], @@ -202,7 +240,7 @@ def stock_round end def operating_round(round_num) - Engine::Round::Operating.new(self, [ + G1847AE::Round::Operating.new(self, [ Engine::Step::Bankrupt, Engine::Step::Exchange, Engine::Step::SpecialTrack, @@ -220,15 +258,28 @@ def operating_round(round_num) end def next_round! - return super if @draft_finished + if @round.is_a?(Round::Operating) && lfk.floated? && !@train_bought_this_round + @log << 'No train purchased from supply this round' + old_lfk_price = lfk.share_price + @stock_market.move_left(lfk) + log_share_price(lfk, old_lfk_price) + end + + # Draft is Turn 0 + if @draft_finished + @turn = 1 if @turn.zero? + + return super + end clear_programmed_actions @round = case @round when G1847AE::Round::Draft reorder_players - new_operating_round - when Engine::Round::Operating + new_operating_round(@draft_round_num) + when G1847AE::Round::Operating + @draft_round_num += 1 new_draft_round end end @@ -245,6 +296,10 @@ def hlb corporation_by_id('HLB') end + def lfk + corporation_by_id('LFK') + end + def r company_by_id('R') end @@ -270,10 +325,27 @@ def init_corporations(stock_market) end end + def round_description(name, round_number = nil) + # Keep displayed Draft Round name consistent with short ORs (0.1, 0.2, ...) + return "#{name} Round #{@turn}.#{@draft_round_num}" if name == 'Draft' + + round_number ||= @round.round_num + description = "#{name} Round " + + total = total_rounds(name) + + description += @turn.to_s + description += '.' if total + description += "#{round_number} (of #{total})" if total + + description.strip + end + def setup - # Place stock market markers for two corporations that have their president shares drafted in initial auction + # Place stock market markers for corporations that have their president shares drafted in initial auction stock_market.set_par(l, stock_market.share_price([2, 1])) stock_market.set_par(saar, stock_market.share_price([3, 1])) + stock_market.set_par(lfk, stock_market.share_price([2, 3])) # Place L's home station in case there is a "short OR" during draft hex = hex_by_id(l.coordinates) @@ -285,20 +357,50 @@ def setup @bank.spend(saar.par_price.price * 2, saar) @bank.spend(hlb.par_price.price * 1, hlb) + # Draft Rounds and short ORs ("inside" Draft Round) are named 0.1, 0.2, ... + @turn = 0 + @draft_round_num = 1 @draft_finished = false + @recently_floated = [] + @extra_tile_lay = true + @yellow_tracks_restricted = true @must_exchange_investor_companies = false end + def float_corporation(corporation) + @recently_floated << corporation + + super + end + + def operating_order + # LFK is not really a corporation and does not operate + super.reject { |c| c == lfk } + end + + def tile_lays(entity) + return TWO_YELLOW_OR_YELLOW_AND_UPGRADE if @recently_floated.include?(entity) + + @extra_tile_lay ? TWO_YELLOW : YELLOW_OR_UPGRADE + end + + def or_round_finished + @recently_floated = [] + end + def after_buy_company(player, company, _price) abilities(company, :shares) do |ability| ability.shares.each do |share| + corporation = share.corporation + corporation.forced_share_percent = 100 if corporation == lfk share_pool.buy_shares(player, share, exchange: :free) - @bank.spend(share.corporation.par_price.price * share.percent / 10, share.corporation) + @bank.spend(corporation.par_price.price * share.percent / 10, corporation) unless corporation == lfk end end # PLP company is only a temporary holder for the L presidency - company.close! if company.id == 'PLP' + # LFKC company is only a temporary holder for the LFK corporation + company.close! if %w[PLP LFKC].include?(company.id) end def can_corporation_have_investor_shares_exchanged?(corporation) @@ -314,6 +416,22 @@ def event_must_exchange_investor_companies! @must_exchange_investor_companies = true end + def event_only_one_yellow! + @log << '-- From now on, corporations may only lay one yellow track except for their very first operation' + @extra_tile_lay = false + end + + def event_yellow_tracks_not_restricted! + colors = %w[pink blue green] + @hexes.each do |hex| + hex.tile.icons.reject! { |i| colors.include?(i.name) } + end + + @log << '-- From now on, corporations may lay yellow tracks in any hexes they can reach, not'\ + ' only in hexes of a given color Investor companies for the associated Investor shares --' + @yellow_tracks_restricted = false + end + def exchange_all_investor_companies! INVESTOR_COMPANIES.map { |id| company_by_id(id) }.reject(&:closed?).each do |company| corporation = corporation_by_id(company.abilities.first.corporations.first) @@ -339,7 +457,7 @@ def place_home_token(corporation) tile.cities.first.place_token(hlb, hlb.next_token) end hlb.coordinates = [hlb.coordinates.first] - ability = hlb.all_abilities.find { |a| a.description.include?('Two home stations') } + ability = hlb.all_abilities.find { |a| a.description&.include?('Two home stations') } hlb.remove_ability(ability) end @@ -350,39 +468,70 @@ def can_par?(corporation, _parrer) !corporation.ipoed end + def bundles_for_corporation(share_holder, corporation, shares: nil) + return [] unless corporation.ipoed + + shares = (shares || share_holder.shares_of(corporation)).sort_by { |h| [h.president ? 1 : 0, h.percent] } + + bundles = (1..shares.size).flat_map do |n| + shares.combination(n).to_a.map { |ss| Engine::ShareBundle.new(ss) } + end + + bundles = bundles.uniq do |b| + [b.shares.count { |s| s.percent == 10 }, + b.presidents_share ? 1 : 0, + b.shares.find(&:double_cert) ? 1 : 0] + end + + bundles.sort_by(&:percent) + end + # Cannot build in E9 before Phase 5 def can_build_in_e9? ['5', '5+5', '6E', '6+6'].include?(@phase.current[:name]) end def upgrades_to?(from, to, _special = false, selected_company: nil) - # yellow double towns upgrade to single green towns + # Yellow double towns upgrade to single green towns return to.name == '88' if %w[1 55].include?(from.hex.tile.name) return to.name == '87' if from.hex.tile.name == '56' return to.name == '204' if from.hex.tile.name == '69' - # double slot green cities don't upgrade + # Double slot green cities don't upgrade return false if DOUBLE_SLOT_GREEN_CITIES.include?(from.hex.tile.name) super end def purchasable_companies(entity = nil) - return super unless entity&.corporation? + return super unless entity&.player? @companies.select do |company| - company.owner&.player? && entity != company.owner && !abilities(company, :no_buy) && - COMPANIES_PURCHASABLE_BY_CORPORATIONS.include?(company.id) + company.owner&.player? && entity != company.owner && COMPANIES_PURCHASABLE_BY_PLAYERS.include?(company.id) end end def action_processed(action) super - return if r.revenue == 50 || !action.is_a?(Action::LayTile) || action.hex.id != 'E9' + case action + when Action::BuyShares + corporation = action.bundle.corporation + return unless corporation.has_ipo_description_ability - r.revenue = 50 - @log << "Tile laid in E9 - #{r.name}'s revenue increased to 50M" + ipo_shares = corporation.num_ipo_shares - corporation.num_ipo_reserved_shares + return unless ipo_shares.zero? + + # Remove IPO description ability that is no longer relevant + ability = corporation.all_abilities.find { |a| a.description&.include?('IPO:') } + corporation.remove_ability(ability) + corporation.has_ipo_description_ability = false + when Action::LayTile + return if action.hex.id != 'E9' || r.revenue == 50 + + r.revenue = 50 + @log << "Tile laid in E9 - #{r.name}'s revenue increased to 50M" + end end def revenue_for(route, stops) @@ -394,7 +543,7 @@ def revenue_for(route, stops) end def coal_bonus(train, stops) - # coal hex to Z hex, not if 6E train + # Coal hex to Z hex, not if 6E train return 0 if train.name == '6E' return 0 unless stops.any? { |s| COAL_HEXES.include?(s.hex.id) } return 0 unless stops.any? { |s| Z_HEXES.include?(s.hex.id) } diff --git a/lib/engine/game/g_1847_ae/meta.rb b/lib/engine/game/g_1847_ae/meta.rb index c5e5802e9f..4a8333f974 100644 --- a/lib/engine/game/g_1847_ae/meta.rb +++ b/lib/engine/game/g_1847_ae/meta.rb @@ -16,8 +16,8 @@ module Meta GAME_IMPLEMENTER = 'Jan Kłos' GAME_LOCATION = 'Pfalz, Germany' GAME_PUBLISHER = :marflow_games - GAME_RULES_URL = '' - GAME_INFO_URL = '' + GAME_RULES_URL = 'https://18xx-marflow-games.de/onewebmedia/1847%20AE%20-%20Rules%20EN%20-%20Final.pdf' + GAME_INFO_URL = 'https://github.com/tobymao/18xx/wiki/1847-AE' PLAYER_RANGE = [3, 5].freeze end diff --git a/lib/engine/game/g_1847_ae/round/operating.rb b/lib/engine/game/g_1847_ae/round/operating.rb new file mode 100644 index 0000000000..27019221ad --- /dev/null +++ b/lib/engine/game/g_1847_ae/round/operating.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +require_relative '../../../round/operating' + +module Engine + module Game + module G1847AE + module Round + class Operating < Engine::Round::Operating + def setup + @game.train_bought_this_round = false + + super + end + end + end + end + end +end diff --git a/lib/engine/game/g_1847_ae/share_pool.rb b/lib/engine/game/g_1847_ae/share_pool.rb index cfff7fc8c3..7b2fe39bbc 100644 --- a/lib/engine/game/g_1847_ae/share_pool.rb +++ b/lib/engine/game/g_1847_ae/share_pool.rb @@ -6,13 +6,13 @@ module G1847AE class SharePool < Engine::SharePool def change_president(presidents_share, swap_to, president, _previous_president) corporation = presidents_share.corporation - incoming_pres_shares = president.shares_of(corporation) + incoming_president_shares = president.shares_of(corporation) - single_shares = incoming_pres_shares.reject(&:double_cert) + single_shares = incoming_president_shares.reject(&:double_cert) shares_to_transfer = if single_shares.size >= 2 single_shares.take(2) else - [incoming_pres_shares.find(&:double_cert)] + [incoming_president_shares.find(&:double_cert)].compact end shares_to_transfer.each { |s| move_share(s, swap_to) } diff --git a/lib/engine/game/g_1847_ae/step/buy_sell_par_shares.rb b/lib/engine/game/g_1847_ae/step/buy_sell_par_shares.rb index c18b9e92f4..993af6ebe6 100644 --- a/lib/engine/game/g_1847_ae/step/buy_sell_par_shares.rb +++ b/lib/engine/game/g_1847_ae/step/buy_sell_par_shares.rb @@ -58,6 +58,8 @@ def can_buy_any_from_player?(entity) end def can_nationalize?(player, corporation) + return false if corporation == @game.lfk + player.num_shares_of(corporation) >= 7 end @@ -89,6 +91,19 @@ def process_buy_shares(action) track_action(action, corporation) end + + def can_sell?(entity, bundle) + # LFK corporation represents a sellable private company + return true if bundle.corporation == @game.lfk && !bought? + + super + end + + def process_sell_shares(action) + super + + @game.lfk.owner = @game.share_pool if action.bundle.corporation == @game.lfk + end end end end diff --git a/lib/engine/game/g_1847_ae/step/buy_single_train_of_type.rb b/lib/engine/game/g_1847_ae/step/buy_single_train_of_type.rb index 2679bc3739..c2837228b1 100644 --- a/lib/engine/game/g_1847_ae/step/buy_single_train_of_type.rb +++ b/lib/engine/game/g_1847_ae/step/buy_single_train_of_type.rb @@ -14,6 +14,25 @@ def buyable_trains(entity) super.select(&:from_depot?) end + + def process_buy_train(action) + from_depot = action.train.from_depot? + super + + lfk = @game.lfk + return if @game.train_bought_this_round || !lfk.floated? || !from_depot + + lfk_owner = lfk.owner + if lfk_owner.player? + lfk_revenue = action.train.price / 10 + @game.bank.spend(lfk_revenue, lfk_owner) + @log << "#{lfk.name} pays #{@game.format_currency(lfk_revenue)} to #{lfk_owner.name}" + end + old_lfk_price = lfk.share_price + @game.stock_market.move_right(lfk) + @game.log_share_price(lfk, old_lfk_price) + @game.train_bought_this_round = true + end end end end diff --git a/lib/engine/game/g_1847_ae/step/draft.rb b/lib/engine/game/g_1847_ae/step/draft.rb index 22988bc12b..52d6451069 100644 --- a/lib/engine/game/g_1847_ae/step/draft.rb +++ b/lib/engine/game/g_1847_ae/step/draft.rb @@ -54,7 +54,7 @@ def process_bid(action, _suppress_log = false) @log << "#{player.name} buys #{company.name} for #{@game.format_currency(price)}" - @game.after_buy_company(player, company) + @game.after_buy_company(player, company, price) end def process_pass(action) diff --git a/lib/engine/game/g_1847_ae/step/track.rb b/lib/engine/game/g_1847_ae/step/track.rb index a44d8a104b..a12aacfc45 100644 --- a/lib/engine/game/g_1847_ae/step/track.rb +++ b/lib/engine/game/g_1847_ae/step/track.rb @@ -10,6 +10,8 @@ class Track < Engine::Step::Track def available_hex(entity, hex) return nil if (hex.id == 'E9') && !@game.can_build_in_e9? + return nil if @game.yellow_tracks_restricted && hex.tile.icons.none? { |i| i.name == entity.hex_color } + super end diff --git a/lib/engine/game/g_1847_ae/stock_market.rb b/lib/engine/game/g_1847_ae/stock_market.rb new file mode 100644 index 0000000000..9603102d06 --- /dev/null +++ b/lib/engine/game/g_1847_ae/stock_market.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +require_relative '../../stock_market' + +module Engine + module Game + module G1847AE + class StockMarket < Engine::StockMarket + attr_writer :game + + def move_up(corporation) + return if corporation == @game.lfk + + super + end + end + end + end +end diff --git a/lib/engine/game/g_1849/entities.rb b/lib/engine/game/g_1849/entities.rb index ac472fc433..e96da49b22 100644 --- a/lib/engine/game/g_1849/entities.rb +++ b/lib/engine/game/g_1849/entities.rb @@ -108,7 +108,6 @@ module Entities shares: [20, 10, 10, 10, 10, 10, 10, 20], always_market_price: true, color: '#ff0000', - reservation_color: nil, }, { float_percent: 20, @@ -122,7 +121,6 @@ module Entities coordinates: 'M13', always_market_price: true, color: :green, - reservation_color: nil, }, { float_percent: 20, @@ -137,7 +135,6 @@ module Entities always_market_price: true, color: '#f9b231', text_color: 'black', - reservation_color: nil, }, { float_percent: 20, @@ -151,7 +148,6 @@ module Entities coordinates: 'H12', always_market_price: true, color: '#0189d1', - reservation_color: nil, }, { float_percent: 20, @@ -165,7 +161,6 @@ module Entities coordinates: 'C5', always_market_price: true, color: '#f48221', - reservation_color: nil, }, { float_percent: 20, @@ -180,7 +175,6 @@ module Entities always_market_price: true, color: :pink, text_color: 'black', - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_1849_boot/entities.rb b/lib/engine/game/g_1849_boot/entities.rb index d8684c742c..d2958dcf48 100644 --- a/lib/engine/game/g_1849_boot/entities.rb +++ b/lib/engine/game/g_1849_boot/entities.rb @@ -107,7 +107,6 @@ module Entities shares: [20, 10, 10, 10, 10, 10, 10, 20], always_market_price: true, color: '#ff0000', - reservation_color: nil, }, { float_percent: 20, @@ -120,7 +119,6 @@ module Entities coordinates: 'O9', always_market_price: true, color: :green, - reservation_color: nil, }, { float_percent: 20, @@ -134,7 +132,6 @@ module Entities always_market_price: true, color: '#f9b231', text_color: 'black', - reservation_color: nil, }, { float_percent: 20, @@ -147,7 +144,6 @@ module Entities coordinates: 'B14', always_market_price: true, color: '#0189d1', - reservation_color: nil, }, { float_percent: 20, @@ -160,7 +156,6 @@ module Entities coordinates: 'G7', always_market_price: true, color: '#f48221', - reservation_color: nil, }, { float_percent: 20, @@ -174,7 +169,6 @@ module Entities always_market_price: true, color: :pink, text_color: 'black', - reservation_color: nil, }, { float_percent: 20, @@ -187,7 +181,6 @@ module Entities coordinates: 'A9', always_market_price: true, color: '#7b352a', - reservation_color: nil, }, { float_percent: 20, @@ -200,7 +193,6 @@ module Entities coordinates: 'L18', always_market_price: true, color: '#000', - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_1849_boot/map.rb b/lib/engine/game/g_1849_boot/map.rb index 0a1ac4d291..53e048464f 100644 --- a/lib/engine/game/g_1849_boot/map.rb +++ b/lib/engine/game/g_1849_boot/map.rb @@ -183,7 +183,7 @@ module Map }.freeze HEXES = { white: { - %w[A11 A13 B12 D6 D8 E7 E15 F16 H14 I17 J8 K19 K15 M19 M21 N18 L10 O7] => '', + %w[A11 A13 B12 D6 D8 E7 E15 F16 H14 I17 J8 K19 K15 M19 M21 L10 O7] => '', ['H16'] => 'border=edge:3,type:impassable', %w[E9 E13 G13 H10 I9 N8] => 'upgrade=cost:40,terrain:mountain', %w[C13 F12 G11 I15 J14 K17 M11 O3] => 'upgrade=cost:80,terrain:mountain', diff --git a/lib/engine/game/g_1849_boot/meta.rb b/lib/engine/game/g_1849_boot/meta.rb index 2bfddb9c93..97d706a7b3 100644 --- a/lib/engine/game/g_1849_boot/meta.rb +++ b/lib/engine/game/g_1849_boot/meta.rb @@ -13,7 +13,7 @@ module Meta DEPENDS_ON = '1849' GAME_DESIGNER = 'Scott Petersen (Based on 1849 by Federico Vellani)' - GAME_INFO_URL = 'https://github.com/tobymao/18xx/wiki/1849#variants-and-optional-rules' + GAME_INFO_URL = 'https://github.com/tobymao/18xx/wiki/1849:-Kingdom-of-the-Two-Sicilies' GAME_LOCATION = 'Southern Italy' GAME_RULES_URL = { '1849 Rules' => 'https://boardgamegeek.com/filepage/206628/1849-rules', diff --git a/lib/engine/game/g_1850/entities.rb b/lib/engine/game/g_1850/entities.rb index ab2ad64a0e..dad1284b96 100644 --- a/lib/engine/game/g_1850/entities.rb +++ b/lib/engine/game/g_1850/entities.rb @@ -156,7 +156,6 @@ module Entities coordinates: 'I18', city: 1, color: '#8C8C7E', - reservation_color: nil, }, { float_percent: 60, @@ -167,7 +166,6 @@ module Entities coordinates: 'G18', abilities: [{ type: 'assign_hexes', hexes: ['A2'], count: 1, cost: 50 }], color: '#C45114', - reservation_color: nil, }, { float_percent: 60, @@ -177,7 +175,6 @@ module Entities tokens: [0, 40, 100, 100], coordinates: 'H11', color: '#881319', - reservation_color: nil, }, { float_percent: 60, @@ -188,7 +185,6 @@ module Entities coordinates: 'D9', abilities: [{ type: 'assign_hexes', hexes: ['A2'], count: 1, cost: 50 }], color: '#6FB3C4', - reservation_color: nil, }, { float_percent: 60, @@ -199,7 +195,6 @@ module Entities coordinates: 'K6', abilities: [{ type: 'assign_hexes', hexes: ['M2'], count: 1, cost: 50 }], color: '#006521', - reservation_color: nil, }, { float_percent: 60, @@ -209,7 +204,6 @@ module Entities tokens: [0, 40, 100], coordinates: 'L13', color: '#181D62', - reservation_color: nil, }, { float_percent: 60, @@ -224,7 +218,6 @@ module Entities count: 1, }], color: '#1C1A17', - reservation_color: nil, }, { float_percent: 60, @@ -235,7 +228,6 @@ module Entities coordinates: 'F13', abilities: [{ type: 'assign_hexes', hexes: ['C20'], count: 1, cost: 50 }], color: '#C40017', - reservation_color: nil, }, { float_percent: 60, @@ -246,7 +238,6 @@ module Entities coordinates: 'I4', abilities: [{ type: 'assign_hexes', hexes: ['F1'], count: 1, cost: 50 }], color: '#B6AD14', - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_1856/entities.rb b/lib/engine/game/g_1856/entities.rb index a73de041ce..0f0cb94a94 100644 --- a/lib/engine/game/g_1856/entities.rb +++ b/lib/engine/game/g_1856/entities.rb @@ -130,7 +130,6 @@ module Entities coordinates: 'J15', color: '#ffd9eb', text_color: 'black', - reservation_color: nil, }, { sym: 'CA', @@ -140,7 +139,6 @@ module Entities tokens: [0, 40, 100], coordinates: 'D17', color: '#f72d2d', - reservation_color: nil, }, { sym: 'CPR', @@ -150,7 +148,6 @@ module Entities tokens: [0, 40, 100, 100], coordinates: 'M4', color: '#c474bc', - reservation_color: nil, }, { sym: 'CV', @@ -161,7 +158,6 @@ module Entities coordinates: 'N11', city: 0, color: '#2d0047', - reservation_color: nil, }, { sym: 'GT', @@ -171,7 +167,6 @@ module Entities tokens: [0, 40, 100, 100], coordinates: 'P9', color: '#78c292', - reservation_color: nil, }, { sym: 'GW', @@ -181,7 +176,6 @@ module Entities tokens: [0, 40, 100, 100], coordinates: 'F15', color: '#6e6966', - reservation_color: nil, }, { sym: 'LPS', @@ -192,7 +186,6 @@ module Entities coordinates: 'C14', color: '#c3deeb', text_color: 'black', - reservation_color: nil, }, { sym: 'TGB', @@ -202,7 +195,6 @@ module Entities tokens: [0, 40], coordinates: 'K8', color: '#c94d00', - reservation_color: nil, }, { sym: 'THB', @@ -213,7 +205,6 @@ module Entities coordinates: 'L15', color: '#ebff45', text_color: 'black', - reservation_color: nil, }, { sym: 'WR', @@ -223,7 +214,6 @@ module Entities tokens: [0, 40, 100], coordinates: 'O16', color: '#54230e', - reservation_color: nil, }, { sym: 'WGB', @@ -233,7 +223,6 @@ module Entities tokens: [0, 40], coordinates: 'J11', color: '#494d99', - reservation_color: nil, }, { sym: 'CGR', @@ -259,7 +248,6 @@ module Entities description: 'May borrow a train when trainless*', }, ], - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_1860/entities.rb b/lib/engine/game/g_1860/entities.rb index 2793356131..d4f7f1d50c 100644 --- a/lib/engine/game/g_1860/entities.rb +++ b/lib/engine/game/g_1860/entities.rb @@ -91,7 +91,6 @@ module Entities coordinates: 'F2', color: :deepskyblue, text_color: 'black', - reservation_color: nil, }, { sym: 'IOW', @@ -103,7 +102,6 @@ module Entities tokens: [0, 40, 100, 100], coordinates: 'I3', color: '#ff0000', - reservation_color: nil, }, { sym: 'IWNJ', @@ -115,7 +113,6 @@ module Entities tokens: [0, 40, 100], coordinates: 'G7', color: '#000000', - reservation_color: nil, }, { sym: 'FYN', @@ -127,7 +124,6 @@ module Entities tokens: [0, 40, 100], coordinates: 'B4', color: :green, - reservation_color: nil, }, { sym: 'NGStL', @@ -140,7 +136,6 @@ module Entities coordinates: 'G9', color: :yellow, text_color: 'black', - reservation_color: nil, }, { sym: 'BHI&R', @@ -152,7 +147,6 @@ module Entities tokens: [0, 40], coordinates: 'L6', color: :darkmagenta, - reservation_color: nil, }, { sym: 'S&C', @@ -164,7 +158,6 @@ module Entities tokens: [0, 40], coordinates: 'F12', color: :darkblue, - reservation_color: nil, }, { sym: 'VYSC', @@ -177,7 +170,6 @@ module Entities coordinates: 'E9', color: :yellowgreen, text_color: 'black', - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_1861/entities.rb b/lib/engine/game/g_1861/entities.rb index 45816dcbc4..e389e21da1 100644 --- a/lib/engine/game/g_1861/entities.rb +++ b/lib/engine/game/g_1861/entities.rb @@ -108,7 +108,6 @@ module Entities tokens: [0, 20, 40], type: 'major', color: '#000080', - reservation_color: nil, }, { sym: 'SW', @@ -120,7 +119,6 @@ module Entities tokens: [0, 20, 40], type: 'major', color: '#d75500', - reservation_color: nil, }, { sym: 'SE', @@ -132,7 +130,6 @@ module Entities tokens: [0, 20, 40], type: 'major', color: '#772282', - reservation_color: nil, }, { sym: 'MVR', @@ -144,7 +141,6 @@ module Entities tokens: [0, 20, 40], type: 'major', color: '#808000', - reservation_color: nil, }, { sym: 'MK', @@ -156,7 +152,6 @@ module Entities tokens: [0, 20, 40], type: 'major', color: '#7b352a', - reservation_color: nil, }, { sym: 'GRR', @@ -168,7 +163,6 @@ module Entities tokens: [0, 20, 40], type: 'major', color: '#ef4223', - reservation_color: nil, }, { sym: 'MKN', @@ -180,7 +174,6 @@ module Entities tokens: [0, 20, 40], type: 'major', color: '#0189d1', - reservation_color: nil, }, { sym: 'MKV', @@ -192,7 +185,6 @@ module Entities tokens: [0, 20, 40], type: 'major', color: '#3c7b5c', - reservation_color: nil, }, { sym: 'RO', @@ -207,7 +199,6 @@ module Entities shares: [100], max_ownership_percent: 100, color: '#009595', - reservation_color: nil, }, { sym: 'KB', @@ -223,7 +214,6 @@ module Entities coordinates: 'D14', city: 1, color: '#4cb5d2', - reservation_color: nil, }, { sym: 'OK', @@ -238,7 +228,6 @@ module Entities type: 'minor', coordinates: 'D20', color: '#0097df', - reservation_color: nil, }, { sym: 'KK', @@ -254,7 +243,6 @@ module Entities coordinates: 'D14', city: 2, color: '#0097df', - reservation_color: nil, }, { sym: 'SPW', @@ -270,7 +258,6 @@ module Entities coordinates: 'E1', city: 0, color: '#0189d1', - reservation_color: nil, }, { sym: 'MB', @@ -300,7 +287,6 @@ module Entities type: 'minor', coordinates: 'G15', color: '#772282', - reservation_color: nil, }, { sym: 'N', @@ -316,7 +302,6 @@ module Entities coordinates: 'H8', city: 1, color: '#d30869', - reservation_color: nil, }, { sym: 'Y', @@ -347,7 +332,6 @@ module Entities coordinates: 'H8', city: 0, color: '#d75500', - reservation_color: nil, }, { sym: 'MNN', @@ -363,7 +347,6 @@ module Entities coordinates: 'H8', city: 2, color: '#ef4223', - reservation_color: nil, }, { sym: 'MV', @@ -378,7 +361,6 @@ module Entities type: 'minor', coordinates: 'I13', color: '#b7274c', - reservation_color: nil, }, { sym: 'V', @@ -453,7 +435,6 @@ module Entities city: 1, color: '#fffdd0', text_color: 'black', - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_1862/entities.rb b/lib/engine/game/g_1862/entities.rb index 9cdf3ad912..256ddbee87 100644 --- a/lib/engine/game/g_1862/entities.rb +++ b/lib/engine/game/g_1862/entities.rb @@ -23,7 +23,6 @@ module Entities coordinates: 'C8', color: '#FFFF00', text_color: '#DD571C', - reservation_color: nil, }, { sym: 'ECR', @@ -37,7 +36,6 @@ module Entities coordinates: 'D13', color: '#0A1172', text_color: '#FFFFFF', - reservation_color: nil, }, { sym: 'ENR', @@ -51,7 +49,6 @@ module Entities coordinates: 'F3', color: '#FFFF00', text_color: '#0492C2', - reservation_color: nil, }, { sym: 'ESR', @@ -65,7 +62,6 @@ module Entities coordinates: 'F11', color: '#5DBB63', text_color: '#30430E', - reservation_color: nil, }, { sym: 'EUR', @@ -79,7 +75,6 @@ module Entities coordinates: 'E12', color: '#FF3030', text_color: '#710193', - reservation_color: nil, }, { sym: 'FDR', @@ -93,7 +88,6 @@ module Entities coordinates: 'G12', color: '#FF6A06', text_color: '#C00000', - reservation_color: nil, }, { sym: 'I&B', @@ -107,7 +101,6 @@ module Entities coordinates: 'D9', color: '#A0A0A0', text_color: '#000000', - reservation_color: nil, }, { sym: 'L&D', @@ -121,7 +114,6 @@ module Entities coordinates: 'D5', color: '#FF6A06', text_color: '#0A1172', - reservation_color: nil, }, { sym: 'L&E', @@ -135,7 +127,6 @@ module Entities coordinates: 'C6', color: '#FFFF00', text_color: '#D00000', - reservation_color: nil, }, { sym: 'L&H', @@ -149,7 +140,6 @@ module Entities coordinates: 'C4', color: '#A1CAF1', text_color: '#B00000', - reservation_color: nil, }, { sym: 'N&B', @@ -163,7 +153,6 @@ module Entities coordinates: 'E8', color: '#C0C0C0', text_color: '#B64900', - reservation_color: nil, }, { sym: 'N&E', @@ -177,7 +166,6 @@ module Entities coordinates: 'B13', color: '#C0C0C0', text_color: '#355E3B', - reservation_color: nil, }, { sym: 'N&S', @@ -191,7 +179,6 @@ module Entities coordinates: 'H7', color: '#A1CAF1', text_color: '#082567', - reservation_color: nil, }, { sym: 'Y&N', @@ -205,7 +192,6 @@ module Entities coordinates: 'H5', color: '#ff0000', text_color: '#000000', - reservation_color: nil, }, { sym: 'NGC', @@ -219,7 +205,6 @@ module Entities coordinates: 'C10', color: '#FFFF00', text_color: '#000000', - reservation_color: nil, }, { sym: 'SVR', @@ -233,7 +218,6 @@ module Entities coordinates: 'D11', color: '#D2B55B', text_color: '#355E3B', - reservation_color: nil, }, { sym: 'WNR', @@ -247,7 +231,6 @@ module Entities coordinates: 'E2', color: '#D2B55B', text_color: '#FF0000', - reservation_color: nil, }, { sym: 'W&F', @@ -261,7 +244,6 @@ module Entities coordinates: 'E4', color: '#C7EA46', text_color: '#0B6623', - reservation_color: nil, }, { sym: 'WVR', @@ -275,7 +257,6 @@ module Entities coordinates: 'G8', color: '#FFC0C0', text_color: '#8B008B', - reservation_color: nil, }, { sym: 'WStI', @@ -289,7 +270,6 @@ module Entities coordinates: 'B5', color: '#FFFF00', text_color: '#8B008B', - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_1862/step/charter_auction.rb b/lib/engine/game/g_1862/step/charter_auction.rb index f1d9b03b8d..81b03d0511 100644 --- a/lib/engine/game/g_1862/step/charter_auction.rb +++ b/lib/engine/game/g_1862/step/charter_auction.rb @@ -70,14 +70,14 @@ def can_start_auction?(entity) end end - def can_bid?(entity) + def can_bid_any?(entity) @game.ipoable_corporations.any? do |c| @game.can_par?(c, entity) && can_buy?(entity, c.ipo_shares.first&.to_bundle) end end def can_increase_bid?(entity) - entity.cash >= min_required(entity) && can_bid?(entity) + entity.cash >= min_required(entity) && can_bid_any?(entity) end def min_par diff --git a/lib/engine/game/g_1866/entities.rb b/lib/engine/game/g_1866/entities.rb index 5089e1fda1..1993050245 100644 --- a/lib/engine/game/g_1866/entities.rb +++ b/lib/engine/game/g_1866/entities.rb @@ -291,7 +291,6 @@ module Entities city: [0, 1, 2, 3], color: '#fde2c5', text_color: 'black', - reservation_color: nil, }, { sym: 'FR', @@ -306,7 +305,6 @@ module Entities city: [0, 1, 2, 3, 4, 5], color: '#fffbcc', text_color: 'black', - reservation_color: nil, }, { sym: 'AHE', @@ -320,7 +318,6 @@ module Entities coordinates: %w[K25 L18 L26 N22 N26 O23 O21 P26 J22 L24 M23 Q25], color: '#e2ceb6', text_color: 'black', - reservation_color: nil, }, { sym: 'DE', @@ -334,7 +331,6 @@ module Entities coordinates: %w[H14 H26 F22 E25 E19 F18 E17 K19 I15 K15 I23 H20], color: '#d0c1de', text_color: 'black', - reservation_color: nil, }, { sym: 'IT', @@ -348,7 +344,6 @@ module Entities coordinates: %w[S23 T20 V18 V20 N12 O13 T12 N14 P18 N18 R18 Q19 Q17], color: '#ff7ffe', text_color: 'black', - reservation_color: nil, }, { sym: 'BNL', @@ -362,7 +357,6 @@ module Entities coordinates: %w[F10 F12 G9 G11 H10 I11], color: '#7eff80', text_color: 'black', - reservation_color: nil, }, { sym: 'ESP', @@ -376,7 +370,6 @@ module Entities coordinates: %w[O1 T2 R0 R4 U1], color: '#bea481', text_color: 'black', - reservation_color: nil, }, { sym: 'CH', @@ -390,7 +383,6 @@ module Entities coordinates: %w[L14 L16 L12], color: '#d6cf81', text_color: 'black', - reservation_color: nil, }, { sym: 'PRU', @@ -405,7 +397,6 @@ module Entities coordinates: %w[H14 H26 F22 E25], color: '#d9cde4', text_color: 'black', - reservation_color: nil, }, { sym: 'HAN', @@ -420,7 +411,6 @@ module Entities coordinates: %w[E19 F18 E17], color: '#a386be', text_color: 'black', - reservation_color: nil, }, { sym: 'BAV', @@ -435,7 +425,6 @@ module Entities coordinates: 'K19', color: '#b8a2cd', text_color: 'black', - reservation_color: nil, }, { sym: 'WTB', @@ -450,7 +439,6 @@ module Entities coordinates: %w[I15 K15], color: '#8e6aae', text_color: 'black', - reservation_color: nil, }, { sym: 'SAX', @@ -465,7 +453,6 @@ module Entities coordinates: %w[I23 H20], color: '#78539a', text_color: 'black', - reservation_color: nil, }, { sym: 'K2S', @@ -480,7 +467,6 @@ module Entities coordinates: %w[S23 T20 V18 V20], color: '#ffd8fe', text_color: 'black', - reservation_color: nil, }, { sym: 'SAR', @@ -495,7 +481,6 @@ module Entities coordinates: %w[N12 O13 T12], color: '#ff62fa', text_color: 'black', - reservation_color: nil, }, { sym: 'LV', @@ -510,7 +495,6 @@ module Entities coordinates: %w[N14 P18 N18], color: '#ff7ffe', text_color: 'black', - reservation_color: nil, }, { sym: 'PAP', @@ -525,7 +509,6 @@ module Entities coordinates: %w[R18 Q19], color: '#ff33f9', text_color: 'black', - reservation_color: nil, }, { sym: 'TUS', @@ -540,7 +523,6 @@ module Entities coordinates: 'Q17', color: '#ffa8fc', text_color: 'black', - reservation_color: nil, }, { sym: 'LNWR', @@ -554,7 +536,6 @@ module Entities coordinates: 'D4', color: '#0072bc', text_color: 'white', - reservation_color: nil, }, { sym: 'GWR', @@ -568,7 +549,6 @@ module Entities coordinates: 'F2', color: '#007236', text_color: 'white', - reservation_color: nil, }, { sym: 'NBR', @@ -582,7 +562,6 @@ module Entities coordinates: 'A3', color: '#7d4900', text_color: 'white', - reservation_color: nil, }, { sym: 'PLM', @@ -596,7 +575,6 @@ module Entities coordinates: %w[M9 P10], color: '#630460', text_color: 'white', - reservation_color: nil, }, { sym: 'MIDI', @@ -610,7 +588,6 @@ module Entities coordinates: 'N2', color: '#acd473', text_color: 'black', - reservation_color: nil, }, { sym: 'OU', @@ -624,7 +601,6 @@ module Entities coordinates: 'I5', color: '#fbaf5d', text_color: 'black', - reservation_color: nil, }, { sym: 'CPS', @@ -638,7 +614,6 @@ module Entities coordinates: 'K13', color: '#323996', text_color: 'white', - reservation_color: nil, }, { sym: 'KPS', @@ -652,7 +627,6 @@ module Entities coordinates: 'E25', color: '#000000', text_color: 'white', - reservation_color: nil, }, { sym: 'BY', @@ -666,7 +640,6 @@ module Entities coordinates: 'K19', color: '#6dd0f7', text_color: 'black', - reservation_color: nil, }, { sym: 'KHS', @@ -680,7 +653,6 @@ module Entities coordinates: 'F18', color: '#fff200', text_color: 'black', - reservation_color: nil, }, { sym: 'SB', @@ -694,7 +666,6 @@ module Entities coordinates: 'N22', color: '#f26522', text_color: 'black', - reservation_color: nil, }, { sym: 'BH', @@ -708,7 +679,6 @@ module Entities coordinates: 'Q25', color: '#ff0000', text_color: 'white', - reservation_color: nil, }, { sym: 'KFN', @@ -722,7 +692,6 @@ module Entities coordinates: 'K25', color: '#a3d49c', text_color: 'black', - reservation_color: nil, }, { sym: 'SSFL', @@ -736,7 +705,6 @@ module Entities coordinates: 'Q17', color: '#48e293', text_color: 'black', - reservation_color: nil, }, { sym: 'IFT', @@ -750,7 +718,6 @@ module Entities coordinates: 'V20', color: '#ff7ffe', text_color: 'black', - reservation_color: nil, }, { sym: 'SFAI', @@ -764,7 +731,6 @@ module Entities coordinates: 'N14', color: '#a4610a', text_color: 'white', - reservation_color: nil, }, { sym: 'SBB', @@ -778,7 +744,6 @@ module Entities coordinates: 'L16', color: '#9e0b0f', text_color: 'white', - reservation_color: nil, }, { sym: 'GL', @@ -792,7 +757,6 @@ module Entities coordinates: 'I11', color: '#ffcd03', text_color: 'black', - reservation_color: nil, }, { sym: 'NRS', @@ -806,7 +770,6 @@ module Entities coordinates: 'F12', color: '#d54427', text_color: 'black', - reservation_color: nil, }, { sym: 'ZPB', @@ -820,7 +783,6 @@ module Entities coordinates: 'R4', color: '#ffc592', text_color: 'black', - reservation_color: nil, }, { sym: 'MZA', @@ -834,7 +796,6 @@ module Entities coordinates: 'U1', color: '#fef2c9', text_color: 'black', - reservation_color: nil, }, { sym: 'L', diff --git a/lib/engine/game/g_1866/game.rb b/lib/engine/game/g_1866/game.rb index 9faac4dde0..f70544e6d0 100644 --- a/lib/engine/game/g_1866/game.rb +++ b/lib/engine/game/g_1866/game.rb @@ -2037,7 +2037,6 @@ def purchase_stock_turn_token(player, share_price) always_market_price: true, color: 'white', text_color: 'white', - reservation_color: nil, capitalization: self.class::CAPITALIZATION, ) corporation.ipoed = true diff --git a/lib/engine/game/g_1867/entities.rb b/lib/engine/game/g_1867/entities.rb index 491fc48fb8..029eb1ddb9 100644 --- a/lib/engine/game/g_1867/entities.rb +++ b/lib/engine/game/g_1867/entities.rb @@ -108,7 +108,6 @@ module Entities tokens: [0, 20, 40], type: 'major', color: '#3c7b5c', - reservation_color: nil, }, { sym: 'CPR', @@ -120,7 +119,6 @@ module Entities tokens: [0, 20, 40], type: 'major', color: '#ef4223', - reservation_color: nil, }, { sym: 'C&O', @@ -132,7 +130,6 @@ module Entities tokens: [0, 20, 40], type: 'major', color: '#0189d1', - reservation_color: nil, }, { sym: 'GTR', @@ -144,7 +141,6 @@ module Entities tokens: [0, 20, 40], type: 'major', color: '#d75500', - reservation_color: nil, }, { sym: 'GWR', @@ -156,7 +152,6 @@ module Entities tokens: [0, 20, 40], type: 'major', color: :darkBlue, - reservation_color: nil, }, { sym: 'ICR', @@ -168,7 +163,6 @@ module Entities tokens: [0, 20, 40], type: 'major', color: '#7b352a', - reservation_color: nil, }, { sym: 'NTR', @@ -180,7 +174,6 @@ module Entities tokens: [0, 20, 40], type: 'major', color: '#3c7b5c', - reservation_color: nil, }, { sym: 'NYC', @@ -192,7 +185,6 @@ module Entities tokens: [0, 20, 40], type: 'major', color: '#772282', - reservation_color: nil, }, { sym: 'BBG', @@ -205,7 +197,6 @@ module Entities shares: [100], max_ownership_percent: 100, color: '#7c7b8c', - reservation_color: nil, }, { sym: 'BO', @@ -218,7 +209,6 @@ module Entities max_ownership_percent: 100, type: 'minor', color: '#009595', - reservation_color: nil, }, { sym: 'CS', @@ -231,7 +221,6 @@ module Entities max_ownership_percent: 100, type: 'minor', color: '#4cb5d2', - reservation_color: nil, }, { sym: 'CV', @@ -244,7 +233,6 @@ module Entities max_ownership_percent: 100, type: 'minor', color: '#0097df', - reservation_color: nil, }, { sym: 'KP', @@ -257,7 +245,6 @@ module Entities max_ownership_percent: 100, type: 'minor', color: '#0097df', - reservation_color: nil, }, { sym: 'LPS', @@ -270,7 +257,6 @@ module Entities max_ownership_percent: 100, type: 'minor', color: '#7c7b8c', - reservation_color: nil, }, { sym: 'OP', @@ -283,7 +269,6 @@ module Entities max_ownership_percent: 100, type: 'minor', color: '#d30869', - reservation_color: nil, }, { sym: 'SLA', @@ -296,7 +281,6 @@ module Entities max_ownership_percent: 100, type: 'minor', color: '#7c7b8c', - reservation_color: nil, }, { sym: 'TGB', @@ -309,7 +293,6 @@ module Entities max_ownership_percent: 100, type: 'minor', color: :darkBlue, - reservation_color: nil, }, { sym: 'TN', @@ -322,7 +305,6 @@ module Entities max_ownership_percent: 100, type: 'minor', color: '#7b352a', - reservation_color: nil, }, { sym: 'AE', @@ -335,7 +317,6 @@ module Entities max_ownership_percent: 100, type: 'minor', color: '#d75500', - reservation_color: nil, }, { sym: 'CA', @@ -348,7 +329,6 @@ module Entities max_ownership_percent: 100, type: 'minor', color: '#772282', - reservation_color: nil, }, { sym: 'NO', @@ -361,7 +341,6 @@ module Entities max_ownership_percent: 100, type: 'minor', color: '#d75500', - reservation_color: nil, }, { sym: 'PM', @@ -374,7 +353,6 @@ module Entities max_ownership_percent: 100, type: 'minor', color: '#4cb5d2', - reservation_color: nil, }, { sym: 'QLS', @@ -387,7 +365,6 @@ module Entities max_ownership_percent: 100, type: 'minor', color: '#0189d1', - reservation_color: nil, }, { sym: 'THB', @@ -400,7 +377,6 @@ module Entities max_ownership_percent: 100, type: 'minor', color: '#d75500', - reservation_color: nil, }, { sym: 'CN', @@ -411,7 +387,6 @@ module Entities hide_shares: true, type: 'national', color: '#ef4223', - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_1867/step/buy_sell_par_shares.rb b/lib/engine/game/g_1867/step/buy_sell_par_shares.rb index da6dc76e04..7f91b54d1f 100644 --- a/lib/engine/game/g_1867/step/buy_sell_par_shares.rb +++ b/lib/engine/game/g_1867/step/buy_sell_par_shares.rb @@ -40,7 +40,7 @@ def win_bid(winner, _company) pass! end - def can_bid?(entity) + def can_bid_any?(entity) max_bid(entity) >= MIN_BID && !bought? && @game.corporations.any? do |c| @game.can_par?(c, entity) && c.type == :minor && can_buy?(entity, c.shares.first&.to_bundle) diff --git a/lib/engine/game/g_1868_wy/game.rb b/lib/engine/game/g_1868_wy/game.rb index 7bc40b0eed..f2a077c6b6 100644 --- a/lib/engine/game/g_1868_wy/game.rb +++ b/lib/engine/game/g_1868_wy/game.rb @@ -1159,7 +1159,7 @@ def developing_order minors = @coal_companies.select { |c| c.floated? && !c.closed? }.sort_by { |m| @players.index(m.owner) } oil = @oil_companies.select { |c| c.floated? && !c.closed? }.sort_by { |m| @players.index(m.owner) } minors.concat(oil) - minors.sort_by! { |m| @players.index(m.owner) } if @optional_rules.include?(:async) + minors.sort_by! { |m| @players.index(m.owner) } if @optional_rules.include?(:async_friendly) minors end @@ -2216,6 +2216,14 @@ def event_close_privates! def event_setup_company_price_up_to_face! setup_company_price_up_to_face end + + def check_connected(route, corporation) + route.hexes.each do |hex| + raise GameError, 'Route is not connected' if hex.tile.color == :purple && hex.id != corporation.coordinates + end + + super + end end end end diff --git a/lib/engine/game/g_1868_wy/meta.rb b/lib/engine/game/g_1868_wy/meta.rb index 0b4ae1369b..6b613b1527 100644 --- a/lib/engine/game/g_1868_wy/meta.rb +++ b/lib/engine/game/g_1868_wy/meta.rb @@ -8,12 +8,15 @@ module G1868WY module Meta include Game::Meta - DEV_STAGE = :prealpha + DEV_STAGE = :alpha GAME_DESIGNER = 'John Harres' GAME_INFO_URL = 'https://github.com/tobymao/18xx/wiki/1868-Wyoming' GAME_PUBLISHER = :mercury - GAME_RULES_URL = 'https://boardgamegeek.com/filepage/262791/rules-traxx-mainline-hell-wheels-ks-release' + GAME_RULES_URL = { + 'Rules' => 'https://boardgamegeek.com/filepage/262791/rules-traxx-mainline-hell-wheels-ks-release', + 'Rules Highlights (2 pages)' => 'https://boardgamegeek.com/filepage/262792/rules-highlights', + }.freeze GAME_LOCATION = 'Wyoming, USA' GAME_TITLE = '1868 Wyoming' GAME_FULL_TITLE = '1868: Boom and Bust in the Coal Mines and Oil Fields of Wyoming' @@ -23,7 +26,7 @@ module Meta OPTIONAL_RULES = [ { - sym: :async, + sym: :async_friendly, short_name: 'Async-friendly Dev Rounds', desc: 'In Development Rounds from phase 5, players go through the Stock '\ 'Round order once to place Coal and Oil tokens together, instead '\ diff --git a/lib/engine/game/g_1868_wy/step/development_token.rb b/lib/engine/game/g_1868_wy/step/development_token.rb index 0924094bc1..dea7584f0b 100644 --- a/lib/engine/game/g_1868_wy/step/development_token.rb +++ b/lib/engine/game/g_1868_wy/step/development_token.rb @@ -42,7 +42,7 @@ def help_oil if current_entity.find_token_by_type(:development) 'You may place the BZ Oil Development Token for free.' else - 'You may move the BZ Oil Development Token for free.' + 'You may remove and then place the BZ Oil Development Token for free.' end end @@ -74,7 +74,10 @@ def log_skip(entity) end def available_hex(entity, hex) - @game.available_development_hex?(entity, hex) + return true if actions(entity).include?('hex_token') && @game.available_development_hex?(entity, hex) + return true if actions(entity).include?('remove_hex_token') && entity.tokens.any? { |t| t.hex == hex } + + false end def available_tokens(entity) @@ -103,7 +106,7 @@ def can_place_token?(entity) def can_remove_token?(entity) entity.type == :oil && @net_tokens_placed.zero? && - @game.placed_oil_dt_count[entity].positive? + (@game.placed_oil_dt_count[entity].positive? || entity == @game.bonanza) end def process_hex_token(action) diff --git a/lib/engine/game/g_1870/entities.rb b/lib/engine/game/g_1870/entities.rb index cd1f7f110a..48385863a2 100644 --- a/lib/engine/game/g_1870/entities.rb +++ b/lib/engine/game/g_1870/entities.rb @@ -136,7 +136,6 @@ module Entities coordinates: 'B9', color: '#7090c9', text_color: 'black', - reservation_color: nil, }, { float_percent: 60, @@ -148,7 +147,6 @@ module Entities abilities: [{ type: 'assign_hexes', hexes: ['J3'], count: 1 }], coordinates: 'H17', color: '#111199', - reservation_color: nil, }, { float_percent: 60, @@ -160,7 +158,6 @@ module Entities abilities: [{ type: 'assign_hexes', hexes: ['N17'], count: 1 }], coordinates: 'N1', color: '#f48221', - reservation_color: nil, }, { float_percent: 20, @@ -172,7 +169,6 @@ module Entities abilities: [{ type: 'assign_hexes', hexes: ['M22'], count: 1 }], coordinates: 'E12', color: '#d02020', - reservation_color: nil, }, { float_percent: 60, @@ -184,7 +180,6 @@ module Entities abilities: [{ type: 'assign_hexes', hexes: ['J5'], count: 1 }], coordinates: 'C18', color: '#5b4545', - reservation_color: nil, }, { float_percent: 60, @@ -196,7 +191,6 @@ module Entities abilities: [{ type: 'assign_hexes', hexes: ['N1'], count: 1 }], coordinates: 'B11', color: '#018471', - reservation_color: nil, }, { float_percent: 60, @@ -208,7 +202,6 @@ module Entities abilities: [{ type: 'assign_hexes', hexes: ['A22'], count: 1 }], coordinates: 'K16', color: '#b0b030', - reservation_color: nil, }, { float_percent: 60, @@ -221,7 +214,6 @@ module Entities coordinates: 'M20', color: '#ff4080', text_color: 'black', - reservation_color: nil, }, { float_percent: 60, @@ -234,7 +226,6 @@ module Entities coordinates: 'J3', color: '#56ad9a', text_color: 'black', - reservation_color: nil, }, { float_percent: 60, @@ -246,7 +237,6 @@ module Entities abilities: [{ type: 'assign_hexes', hexes: ['N17'], count: 1 }], coordinates: 'J5', color: '#37383a', - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_1871/corporations.rb b/lib/engine/game/g_1871/corporations.rb index 48088a1431..99ec685fe4 100644 --- a/lib/engine/game/g_1871/corporations.rb +++ b/lib/engine/game/g_1871/corporations.rb @@ -13,7 +13,6 @@ module Corporations tokens: [0, 80, 80, 80], coordinates: 'T12', color: '#0a0a0a', - reservation_color: nil, float_excludes_market: true, float_includes_reserved: true, always_market_price: true, @@ -27,7 +26,6 @@ module Corporations coordinates: 'D6', color: '#b58168', text_color: '#000000', - reservation_color: nil, float_excludes_market: true, float_includes_reserved: true, always_market_price: true, @@ -41,7 +39,6 @@ module Corporations coordinates: 'M13', color: '#fcea18', text_color: '#000000', - reservation_color: nil, float_excludes_market: true, float_includes_reserved: true, always_market_price: true, @@ -55,7 +52,6 @@ module Corporations coordinates: 'Q21', color: '#37b2e2', text_color: '#000000', - reservation_color: nil, float_excludes_market: true, float_includes_reserved: true, always_market_price: true, @@ -69,7 +65,6 @@ module Corporations coordinates: 'F14', color: '#7bb137', text_color: '#000000', - reservation_color: nil, float_excludes_market: true, float_includes_reserved: true, always_market_price: true, @@ -83,7 +78,6 @@ module Corporations coordinates: 'R16', color: '#9a9a9d', text_color: '#000000', - reservation_color: nil, float_excludes_market: true, float_includes_reserved: true, always_market_price: true, @@ -96,7 +90,6 @@ module Corporations tokens: [0, 80, 80, 80], coordinates: 'L16', color: '#a60a3d', - reservation_color: nil, float_excludes_market: true, float_includes_reserved: true, always_market_price: true, @@ -110,7 +103,6 @@ module Corporations tokens: [0, 0, 0, 0, 0], color: '#ec767c', text_color: '#000000', - reservation_color: nil, max_ownership_percent: 100, }, { @@ -121,7 +113,6 @@ module Corporations tokens: [0, 80, 80, 80], color: '#baa4cb', text_color: '#000000', - reservation_color: nil, float_excludes_market: true, float_includes_reserved: true, always_market_price: true, @@ -134,7 +125,6 @@ module Corporations logo: '1871/SB', tokens: [0, 80, 80, 80], color: '#bf4da5', - reservation_color: nil, float_excludes_market: true, float_includes_reserved: true, always_market_price: true, @@ -147,7 +137,6 @@ module Corporations logo: '1871/MB', tokens: [0, 80, 80, 80], color: '#0a70b3', - reservation_color: nil, float_excludes_market: true, float_includes_reserved: true, always_market_price: true, @@ -161,7 +150,6 @@ module Corporations tokens: [0, 80, 80, 80], color: '#eb6f0e', text_color: '#000000', - reservation_color: nil, float_excludes_market: true, float_includes_reserved: true, always_market_price: true, @@ -175,7 +163,6 @@ module Corporations tokens: [0, 80, 80, 80], color: '#bdbd00', text_color: '#000000', - reservation_color: nil, float_excludes_market: true, float_includes_reserved: true, always_market_price: true, @@ -188,7 +175,6 @@ module Corporations logo: '1871/HRB', tokens: [0, 80, 80, 80], color: '#008f4f', - reservation_color: nil, float_excludes_market: true, float_includes_reserved: true, always_market_price: true, diff --git a/lib/engine/game/g_1877/entities.rb b/lib/engine/game/g_1877/entities.rb index 329cc95e97..68733e7fac 100644 --- a/lib/engine/game/g_1877/entities.rb +++ b/lib/engine/game/g_1877/entities.rb @@ -15,7 +15,6 @@ module Entities tokens: [0], always_market_price: true, color: :dodgerblue, - reservation_color: nil, }, { float_percent: 20, @@ -28,7 +27,6 @@ module Entities always_market_price: true, text_color: 'black', color: :lightgreen, - reservation_color: nil, }, { float_percent: 20, @@ -41,7 +39,6 @@ module Entities always_market_price: true, text_color: 'black', color: :'#FFD700', - reservation_color: nil, }, { float_percent: 20, @@ -53,7 +50,6 @@ module Entities tokens: [0], always_market_price: true, color: :deeppink, - reservation_color: nil, }, { float_percent: 20, @@ -65,7 +61,6 @@ module Entities tokens: [0], always_market_price: true, color: :darkmagenta, - reservation_color: nil, }, { float_percent: 20, @@ -77,7 +72,6 @@ module Entities tokens: [0], always_market_price: true, color: '#ef4223', - reservation_color: nil, }, { float_percent: 20, @@ -90,7 +84,6 @@ module Entities always_market_price: true, text_color: 'black', color: '#f2a847', - reservation_color: nil, }, { float_percent: 20, @@ -102,7 +95,6 @@ module Entities tokens: [0], always_market_price: true, color: :saddlebrown, - reservation_color: nil, }, { float_percent: 20, @@ -114,7 +106,6 @@ module Entities tokens: [0], always_market_price: true, color: :darkgreen, - reservation_color: nil, }, { float_percent: 20, @@ -127,7 +118,6 @@ module Entities always_market_price: true, text_color: 'black', color: :aqua, - reservation_color: nil, }, { float_percent: 20, @@ -140,7 +130,6 @@ module Entities always_market_price: true, color: :silver, text_color: 'black', - reservation_color: nil, }, { float_percent: 20, @@ -152,7 +141,6 @@ module Entities tokens: [0], always_market_price: true, color: '#16190e', - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_1877_stockholm_tramways/entities.rb b/lib/engine/game/g_1877_stockholm_tramways/entities.rb index fc1d5edcf8..5235409b5c 100644 --- a/lib/engine/game/g_1877_stockholm_tramways/entities.rb +++ b/lib/engine/game/g_1877_stockholm_tramways/entities.rb @@ -18,7 +18,6 @@ module Entities city: 0, color: '#9A9A9D', text_color: :black, - reservation_color: nil, float_excludes_market: true, always_market_price: true, }, @@ -32,7 +31,6 @@ module Entities coordinates: 'H4', color: '#7BB137', text_color: :black, - reservation_color: nil, float_excludes_market: true, always_market_price: true, }, @@ -45,7 +43,6 @@ module Entities tokens: [0, 60, 60, 60, 60, 60], coordinates: 'C7', color: '#06038D', - reservation_color: nil, float_excludes_market: true, always_market_price: true, }, @@ -58,7 +55,6 @@ module Entities tokens: [0, 60, 60, 60, 60, 60], coordinates: 'I13', color: '#881A1E', - reservation_color: nil, float_excludes_market: true, always_market_price: true, }, @@ -72,7 +68,6 @@ module Entities coordinates: 'D10', city: 0, color: '#235758', - reservation_color: nil, float_excludes_market: true, always_market_price: true, }, @@ -86,7 +81,6 @@ module Entities coordinates: 'D4', color: '#008F4F', text_color: :black, - reservation_color: nil, float_excludes_market: true, always_market_price: true, }, @@ -100,7 +94,6 @@ module Entities coordinates: 'A9', color: '#FCEA18', text_color: :black, - reservation_color: nil, float_excludes_market: true, always_market_price: true, }, @@ -115,7 +108,6 @@ module Entities city: 1, color: '#EC767C', text_color: :black, - reservation_color: nil, float_excludes_market: true, always_market_price: true, }, @@ -128,7 +120,6 @@ module Entities tokens: [0, 60, 60, 60, 60, 60], coordinates: 'G1', color: '#4D2674', - reservation_color: nil, float_excludes_market: true, always_market_price: true, }, @@ -141,7 +132,6 @@ module Entities tokens: [0, 60, 60, 60, 60, 60], coordinates: 'G7', color: '#DD0030', - reservation_color: nil, float_excludes_market: true, always_market_price: true, }, @@ -154,7 +144,6 @@ module Entities tokens: [0, 60, 60, 60, 60, 60], coordinates: 'H8', color: '#0A70B3', - reservation_color: nil, float_excludes_market: true, always_market_price: true, }, @@ -169,7 +158,6 @@ module Entities city: 1, color: '#EB6f0E', text_color: :black, - reservation_color: nil, float_excludes_market: true, always_market_price: true, }, diff --git a/lib/engine/game/g_1877_stockholm_tramways/step/buy_sell_par_shares.rb b/lib/engine/game/g_1877_stockholm_tramways/step/buy_sell_par_shares.rb index 8aa56cc987..8eaba8d2d9 100644 --- a/lib/engine/game/g_1877_stockholm_tramways/step/buy_sell_par_shares.rb +++ b/lib/engine/game/g_1877_stockholm_tramways/step/buy_sell_par_shares.rb @@ -47,7 +47,7 @@ def win_bid(winner, _company) @round.goto_entity!(winner.entity) end - def can_bid?(entity) + def can_bid_any?(entity) max_bid(entity) >= MIN_BID && !bought? && @game.ipoable_corporations.any? do |c| @game.can_par?(c, entity) diff --git a/lib/engine/game/g_1882/entities.rb b/lib/engine/game/g_1882/entities.rb index a37c5732c0..2b1cd85f4d 100644 --- a/lib/engine/game/g_1882/entities.rb +++ b/lib/engine/game/g_1882/entities.rb @@ -108,7 +108,6 @@ module Entities tokens: [], color: :orange, text_color: 'black', - reservation_color: nil, }, { sym: 'CNR', @@ -118,7 +117,6 @@ module Entities tokens: [0, 40, 100], coordinates: 'D8', color: '#237333', - reservation_color: nil, }, { sym: 'HBR', @@ -129,7 +127,6 @@ module Entities coordinates: 'G11', color: :gold, text_color: 'black', - reservation_color: nil, }, { sym: 'CPR', @@ -139,7 +136,6 @@ module Entities tokens: [0, 40, 100, 100], coordinates: 'I5', color: '#d81e3e', - reservation_color: nil, }, { sym: 'GT', @@ -149,7 +145,6 @@ module Entities tokens: [0, 40, 100], coordinates: 'L8', color: :black, - reservation_color: nil, }, { sym: 'SC', @@ -158,7 +153,6 @@ module Entities simple_logo: '1882/SC.alt', tokens: [0], color: '#0189d1', - reservation_color: nil, }, { sym: 'QLL', @@ -168,7 +162,6 @@ module Entities tokens: [0, 40], coordinates: 'J10', color: :purple, - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_1888/entities.rb b/lib/engine/game/g_1888/entities.rb index 37ac799846..38cbf0988b 100644 --- a/lib/engine/game/g_1888/entities.rb +++ b/lib/engine/game/g_1888/entities.rb @@ -117,7 +117,6 @@ module Entities city: 1, color: '#C93A1E', text_color: 'white', - reservation_color: nil, }, { float_percent: 60, @@ -130,7 +129,6 @@ module Entities city: 0, color: '#A7A6A6', text_color: 'black', - reservation_color: nil, }, { float_percent: 60, @@ -142,7 +140,6 @@ module Entities coordinates: 'A19', color: '#44BC4F', text_color: 'black', - reservation_color: nil, }, { float_percent: 60, @@ -154,7 +151,6 @@ module Entities coordinates: 'F6', color: '#CBA375', text_color: 'black', - reservation_color: nil, }, { float_percent: 60, @@ -166,7 +162,6 @@ module Entities coordinates: 'E3', color: '#231F20', text_color: 'white', - reservation_color: nil, }, { float_percent: 60, @@ -178,7 +173,6 @@ module Entities coordinates: 'F16', color: '#FCC707', text_color: 'black', - reservation_color: nil, }, { float_percent: 60, @@ -191,7 +185,6 @@ module Entities city: 0, color: '#9D65B9', text_color: 'white', - reservation_color: nil, }, { float_percent: 60, @@ -203,7 +196,6 @@ module Entities coordinates: 'G11', color: '#00ACD0', text_color: 'white', - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_1889/entities.rb b/lib/engine/game/g_1889/entities.rb index f301415fa7..7ef7106536 100644 --- a/lib/engine/game/g_1889/entities.rb +++ b/lib/engine/game/g_1889/entities.rb @@ -132,7 +132,6 @@ module Entities tokens: [0, 40], coordinates: 'K8', color: '#37383a', - reservation_color: nil, }, { float_percent: 50, @@ -143,7 +142,6 @@ module Entities tokens: [0, 40], coordinates: 'E2', color: '#f48221', - reservation_color: nil, }, { float_percent: 50, @@ -154,7 +152,6 @@ module Entities tokens: [0, 40], coordinates: 'I2', color: '#76a042', - reservation_color: nil, }, { float_percent: 50, @@ -165,7 +162,6 @@ module Entities tokens: [0, 40], coordinates: 'K4', color: '#d81e3e', - reservation_color: nil, }, { float_percent: 50, @@ -176,7 +172,6 @@ module Entities tokens: [0, 40, 40], coordinates: 'F9', color: '#00a993', - reservation_color: nil, }, { float_percent: 50, @@ -187,7 +182,6 @@ module Entities tokens: [0], coordinates: 'C10', color: '#0189d1', - reservation_color: nil, }, { float_percent: 50, @@ -198,7 +192,6 @@ module Entities tokens: [0, 40, 40], coordinates: 'B7', color: '#6f533e', - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_1893/game.rb b/lib/engine/game/g_1893/game.rb index 6680e8dc42..cc2ac795a1 100644 --- a/lib/engine/game/g_1893/game.rb +++ b/lib/engine/game/g_1893/game.rb @@ -404,7 +404,6 @@ class Game < Game::Base simple_logo: '1893/DE.alt', color: :blue, coordinates: 'O2', - reservation_color: nil, }, { name: 'Rhein-Sieg Eisenbahn', @@ -419,7 +418,6 @@ class Game < Game::Base color: :pink, text_color: 'black', coordinates: 'R7', - reservation_color: nil, }, { name: 'Rheinbahn AG', @@ -434,7 +432,6 @@ class Game < Game::Base simple_logo: '1893/RAG.alt', text_color: 'black', coordinates: 'D5', - reservation_color: nil, }, { name: 'AG für Verkehrswesen', @@ -460,7 +457,6 @@ class Game < Game::Base 'MR until Phase 5 when AGV float automatically during the first MR.', }, ], - reservation_color: nil, }, { name: 'Häfen und Güterverkehr Köln AG', @@ -485,7 +481,6 @@ class Game < Game::Base 'voting is repeated each MR until Phase 6 when HGK float automatically during the first MR.', }, ], - reservation_color: nil, }, ].freeze diff --git a/lib/engine/game/g_18_bf/entities.rb b/lib/engine/game/g_18_bf/entities.rb index 67ce8cf9a3..7330a692cc 100644 --- a/lib/engine/game/g_18_bf/entities.rb +++ b/lib/engine/game/g_18_bf/entities.rb @@ -749,7 +749,6 @@ module Entities type: 'major', shares: [20, 10, 10, 10, 10, 10, 10, 10, 10], color: '#3c7b5c', - reservation_color: nil, }, { sym: 'GER', @@ -761,7 +760,6 @@ module Entities type: 'major', shares: [20, 10, 10, 10, 10, 10, 10, 10, 10], color: '#3c7b5c', - reservation_color: nil, }, { sym: 'GNR', @@ -773,7 +771,6 @@ module Entities type: 'major', shares: [20, 10, 10, 10, 10, 10, 10, 10, 10], color: '#3c7b5c', - reservation_color: nil, }, { sym: 'LBSC', @@ -785,7 +782,6 @@ module Entities type: 'major', shares: [20, 10, 10, 10, 10, 10, 10, 10, 10], color: '#3c7b5c', - reservation_color: nil, }, { sym: 'LNW', @@ -797,7 +793,6 @@ module Entities type: 'major', shares: [20, 10, 10, 10, 10, 10, 10, 10, 10], color: '#3c7b5c', - reservation_color: nil, }, { sym: 'LSW', @@ -809,7 +804,6 @@ module Entities type: 'major', shares: [20, 10, 10, 10, 10, 10, 10, 10, 10], color: '#3c7b5c', - reservation_color: nil, }, { sym: 'LYR', @@ -821,7 +815,6 @@ module Entities type: 'major', shares: [20, 10, 10, 10, 10, 10, 10, 10, 10], color: '#3c7b5c', - reservation_color: nil, }, { sym: 'MR', @@ -833,7 +826,6 @@ module Entities type: 'major', shares: [20, 10, 10, 10, 10, 10, 10, 10, 10], color: '#3c7b5c', - reservation_color: nil, }, { sym: 'NBR', @@ -845,7 +837,6 @@ module Entities type: 'major', shares: [20, 10, 10, 10, 10, 10, 10, 10, 10], color: '#3c7b5c', - reservation_color: nil, }, { sym: 'NER', @@ -857,7 +848,6 @@ module Entities type: 'major', shares: [20, 10, 10, 10, 10, 10, 10, 10, 10], color: '#3c7b5c', - reservation_color: nil, }, { sym: 'SEC', @@ -869,7 +859,6 @@ module Entities type: 'major', shares: [20, 10, 10, 10, 10, 10, 10, 10, 10], color: '#3c7b5c', - reservation_color: nil, }, { sym: 'GCR', @@ -881,7 +870,6 @@ module Entities type: 'system', shares: [20, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5], color: '#3c7b5c', - reservation_color: nil, }, { sym: 'GWR', @@ -893,7 +881,6 @@ module Entities type: 'system', shares: [20, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5], color: '#3c7b5c', - reservation_color: nil, }, { sym: 'LMS', @@ -905,7 +892,6 @@ module Entities type: 'system', shares: [20, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5], color: '#3c7b5c', - reservation_color: nil, }, { sym: 'LNE', @@ -917,7 +903,6 @@ module Entities type: 'system', shares: [20, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5], color: '#3c7b5c', - reservation_color: nil, }, { sym: 'SR', @@ -929,7 +914,6 @@ module Entities type: 'system', shares: [20, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5], color: '#3c7b5c', - reservation_color: nil, }, ].freeze diff --git a/lib/engine/game/g_18_chesapeake/entities.rb b/lib/engine/game/g_18_chesapeake/entities.rb index 63dce72e21..c019ba6bdd 100644 --- a/lib/engine/game/g_18_chesapeake/entities.rb +++ b/lib/engine/game/g_18_chesapeake/entities.rb @@ -111,7 +111,6 @@ module Entities tokens: [0, 40, 60, 80], coordinates: 'F2', color: '#237333', - reservation_color: nil, }, { float_percent: 60, @@ -122,7 +121,6 @@ module Entities tokens: [0, 40, 60], coordinates: 'A3', color: :black, - reservation_color: nil, }, { float_percent: 60, @@ -133,7 +131,6 @@ module Entities tokens: [0, 40], coordinates: 'H4', color: '#d81e3e', - reservation_color: nil, }, { float_percent: 60, @@ -145,7 +142,6 @@ module Entities coordinates: 'H6', city: 0, color: '#0189d1', - reservation_color: nil, }, { float_percent: 60, @@ -157,7 +153,6 @@ module Entities coordinates: 'G13', color: '#a2dced', text_color: 'black', - reservation_color: nil, }, { float_percent: 60, @@ -169,7 +164,6 @@ module Entities coordinates: 'J2', color: '#FFF500', text_color: 'black', - reservation_color: nil, }, { float_percent: 60, @@ -180,7 +174,6 @@ module Entities tokens: [0, 40], coordinates: 'J6', color: '#f48221', - reservation_color: nil, }, { float_percent: 60, @@ -191,7 +184,6 @@ module Entities tokens: [0, 40, 60], coordinates: 'C13', color: '#7b352a', - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_18_chesapeake_off_the_rails/game.rb b/lib/engine/game/g_18_chesapeake_off_the_rails/game.rb index dc4fb0d46d..41cf364929 100644 --- a/lib/engine/game/g_18_chesapeake_off_the_rails/game.rb +++ b/lib/engine/game/g_18_chesapeake_off_the_rails/game.rb @@ -70,91 +70,9 @@ class Game < G18Chesapeake::Game }, ].freeze - CORPORATIONS = [ - { - float_percent: 50, - sym: 'PRR', - name: 'Pennsylvania Railroad', - logo: '18_chesapeake/PRR', - tokens: [0, 40, 60, 80], - coordinates: 'F2', - color: '#237333', - reservation_color: nil, - }, - { - float_percent: 50, - sym: 'PLE', - name: 'Pittsburgh and Lake Erie Railroad', - logo: '18_chesapeake/PLE', - tokens: [0, 40, 60], - coordinates: 'A3', - color: :black, - reservation_color: nil, - }, - { - float_percent: 50, - sym: 'SRR', - name: 'Strasburg Rail Road', - logo: '18_chesapeake/SRR', - tokens: [0, 40], - coordinates: 'H4', - color: '#d81e3e', - reservation_color: nil, - }, - { - float_percent: 50, - sym: 'B&O', - name: 'Baltimore & Ohio Railroad', - logo: '18_chesapeake/BO', - tokens: [0, 40, 60], - coordinates: 'H6', - city: 0, - color: '#0189d1', - reservation_color: nil, - }, - { - float_percent: 50, - sym: 'C&O', - name: 'Chesapeake & Ohio Railroad', - logo: '18_chesapeake/CO', - tokens: [0, 40, 60, 80], - coordinates: 'G13', - color: '#a2dced', - text_color: 'black', - reservation_color: nil, - }, - { - float_percent: 50, - sym: 'LV', - name: 'Lehigh Valley Railroad', - logo: '18_chesapeake/LV', - tokens: [0, 40], - coordinates: 'J2', - color: '#FFF500', - text_color: 'black', - reservation_color: nil, - }, - { - float_percent: 50, - sym: 'C&A', - name: 'Camden & Amboy Railroad', - logo: '18_chesapeake/CA', - tokens: [0, 40], - coordinates: 'J6', - color: '#f48221', - reservation_color: nil, - }, - { - float_percent: 50, - sym: 'N&W', - name: 'Norfolk & Western Railway', - logo: '18_chesapeake/NW', - tokens: [0, 40, 60], - coordinates: 'C13', - color: '#7b352a', - reservation_color: nil, - }, - ].freeze + def corporation_opts + { float_percent: 50 } + end SELL_BUY_ORDER = :sell_buy_sell diff --git a/lib/engine/game/g_18_christmas_eve/entities.rb b/lib/engine/game/g_18_christmas_eve/entities.rb new file mode 100644 index 0000000000..520391e562 --- /dev/null +++ b/lib/engine/game/g_18_christmas_eve/entities.rb @@ -0,0 +1,146 @@ +# frozen_string_literal: true + +module Engine + module Game + module G18ChristmasEve + module Entities + COMPANIES = [ + { + name: 'Stair Case Cleanup Co', + value: 20, + revenue: 5, + desc: 'Blocks hex H9 while owned by a player.', + sym: 'SCCC', + abilities: [{ type: 'blocks_hexes', owner_type: 'player', hexes: ['H9'] }], + color: nil, + }, + { + name: 'Dumbwaiter Excavation', + value: 50, + revenue: 10, + desc: 'Blocks building a station at F3 while owned by a player.', + sym: 'DW', + abilities: [{ type: 'reservation', remove: 'sold', hex: 'F3' }], + color: nil, + }, + { + name: "Dad's Intervention", + value: 100, + revenue: 0, + desc: 'The player purchasing this cert also gains a 10% share of Baltimore and Ohio.', + sym: 'DI', + abilities: [{ type: 'shares', shares: 'B&O_1' }], + color: nil, + }, + { + name: '"Santa"?', + value: 200, + revenue: 30, + desc: 'This private closes when the associated corporation buys its first train. It cannot be bought by a '\ + 'corporation.', + sym: 'SC', + abilities: [{ type: 'shares', shares: 'random_president' }, + { type: 'no_buy' }], + color: nil, + }, + { + name: 'Egg Nog Express', + value: 80, + revenue: 15, + desc: 'The owning company adds $40 to any train run that includes both the Bar (F7) and the DC hex (C10).', + sym: 'ENX', + color: nil, + }, + { + name: "Conductor's Hat", + value: 40, + revenue: 10, + desc: 'Adds $10 per room stopped at at least once by any one train of the owning corporation. Red off-board '\ + 'locations do not count.', + sym: 'CH', + color: nil, + }, + ].freeze + + CORPORATIONS = [ + { + sym: 'PRR', + name: 'Pennsylvania Railroad', + logo: '18_chesapeake/PRR', + simple_logo: '18_chesapeake/PRR.alt', + tokens: [0, 40, 60, 80], + coordinates: 'L11', + color: '#237333', + }, + { + sym: 'PLE', + name: 'Pittsburgh and Lake Erie Railroad', + logo: '18_chesapeake/PLE', + simple_logo: '18_chesapeake/PLE.alt', + tokens: [0, 40, 60], + coordinates: 'B3', + color: :black, + }, + { + sym: 'SRR', + name: 'Strasburg Rail Road', + logo: '18_chesapeake/SRR', + simple_logo: '18_chesapeake/SRR.alt', + tokens: [0, 40], + city: 1, + coordinates: 'E12', + color: '#d81e3e', + }, + { + sym: 'B&O', + name: 'Baltimore & Ohio Railroad', + logo: '18_chesapeake/BO', + simple_logo: '18_chesapeake/BO.alt', + tokens: [0, 40, 60], + coordinates: 'J5', + city: 0, + color: '#0189d1', + }, + { + sym: 'C&O', + name: 'Chesapeake & Ohio Railroad', + logo: '18_chesapeake/CO', + simple_logo: '18_chesapeake/CO.alt', + tokens: [0, 40, 60, 80], + coordinates: 'K2', + color: '#a2dced', + text_color: 'black', + }, + { + sym: 'LV', + name: 'Lehigh Valley Railroad', + logo: '18_chesapeake/LV', + simple_logo: '18_chesapeake/LV.alt', + tokens: [0, 40], + coordinates: 'F9', + color: '#FFF500', + text_color: 'black', + }, + { + sym: 'C&A', + name: 'Camden & Amboy Railroad', + logo: '18_chesapeake/CA', + simple_logo: '18_chesapeake/CA.alt', + tokens: [0, 40], + coordinates: 'J11', + color: '#f48221', + }, + { + sym: 'N&W', + name: 'Norfolk & Western Railway', + logo: '18_chesapeake/NW', + simple_logo: '18_chesapeake/NW.alt', + tokens: [0, 40, 60], + coordinates: 'E6', + color: '#7b352a', + }, + ].freeze + end + end + end +end diff --git a/lib/engine/game/g_18_christmas_eve/game.rb b/lib/engine/game/g_18_christmas_eve/game.rb index 7c1bae0cfd..816ba1a3e7 100644 --- a/lib/engine/game/g_18_christmas_eve/game.rb +++ b/lib/engine/game/g_18_christmas_eve/game.rb @@ -3,12 +3,16 @@ require_relative 'meta' require_relative '../g_18_chesapeake/game' require_relative '../base' +require_relative 'entities' +require_relative 'map' module Engine module Game module G18ChristmasEve class Game < G18Chesapeake::Game include_meta(G18ChristmasEve::Meta) + include Entities + include Map BANK_CASH = 12_000 @@ -25,78 +29,6 @@ class Game < G18Chesapeake::Game custom: 'First D Purchased' ) - # rubocop:disable Layout/LineLength - HEXES = { - white: { - # Kitchen - %w[D3 E4] => 'frame=color:#CE95C3', - %w[B3 F3] => 'frame=color:#CE95C3;city=revenue:0', - %w[C4] => 'frame=color:#CE95C3;town=revenue:0', - # Dining - %w[D5 E6] => 'frame=color:#F7FFB6;city=revenue:0', - %w[D7 F5] => 'frame=color:#F7FFB6', - # Lounge - %w[C8 D9 D11] => 'frame=color:#FFFFFF', - %w[B7] => 'frame=color:#FFFFFF;town=revenue:0;town=revenue:0', - %w[B9 C12] => 'frame=color:#FFFFFF;town=revenue:0', - %w[C10] => 'frame=color:#FFFFFF;city=revenue:0;label=DC', - # Foyer - %w[F11] => 'frame=color:#7D96CD', - %w[E10] => 'frame=color:#7D96CD;city=revenue:0;', - # Utilities - %w[F9] => 'frame=color:#CCCCC1;city=revenue:0;', - # Staircase - %w[G8 G10 H7 H9] => 'upgrade=cost:80,terrain:mountain;frame=color:#C4E4CD', - # Study - %w[G12] => 'frame=color:#BBBBB6;city=revenue:0;', - %w[H11] => 'frame=color:#BBBBB6;', - %w[I12] => 'frame=color:#BBBBB6;town=revenue:0', - # Master - %w[K10 L11] => 'frame=color:#E6C4AF;city=revenue:0;', - %w[L9 K12] => 'frame=color:#E6C4AF;', - # Hall - %w[I4 I8 J7] => 'frame=color:#F5846B', - %w[I6] => 'frame=color:#F5846B;town=revenue:0;town=revenue:0', - %w[K8] => 'frame=color:#F5846B;city=revenue:0;', - # Rec Room - %w[I2 J1] => 'frame=color:#9FCAA1', - %w[J3] => 'frame=color:#9FCAA1;town=revenue:0;town=revenue:0', - # Bedroom - %w[L1 L3] => 'frame=color:#AB9E7F', - %w[K2] => 'frame=color:#AB9E7F;city=revenue:0;', - # Bedroom - %w[K4 L5] => 'frame=color:#AFDFE0', - %w[J5] => 'frame=color:#AFDFE0;city=revenue:0;', - }, - red: { - %w[E14] => 'offboard=revenue:yellow_20|green_40|brown_60|gray_80;path=a:2,b:_0;path=a:3,b:_0;path=a:4,b:_0', - %w[L13] => 'offboard=revenue:yellow_20|green_80|gray_120;path=a:2,b:_0;path=a:3,b:_0;path=a:4,b:_0', - %w[A8] => 'offboard=revenue:yellow_20|green_30|brown_40|gray_60;path=a:4,b:_0', - %w[J11] => 'city=revenue:yellow_20|brown_40;path=a:1,b:_0', - %w[A6] => 'offboard=revenue:20;path=a:5,b:_0', - %w[K6] => 'offboard=revenue:20,groups:Bathroom;path=a:1,b:_0;path=a:2,b:_0;path=a:3,b:_0;path=a:4,b:_0;path=a:0,b:_0;border=edge:5', - %w[L7] => 'offboard=revenue:20,hide:1,groups:Bathroom;path=a:0,b:_0;path=a:1,b:_0;path=a:3,b:_0;border=edge:2', - %w[A2] => 'offboard=revenue:yellow_60|brown_20|gray_10,groups:Back Door;path=a:5,b:_0;border=edge:4', - %w[B1] => 'offboard=revenue:yellow_60|brown_20|gray_10,hide:1,groups:Back Door;path=a:0,b:_0;border=edge:1', - }, - yellow: { - %w[E12] => 'frame=color:#7D96CD;city=revenue:30;city=revenue:30;path=a:3,b:_0;path=a:0,b:_1;label=OO', - %w[H3] => 'frame=color:#F5846B;city=revenue:30;city=revenue:30;path=a:2,b:_0;path=a:5,b:_1;label=OO', - }, - gray: { - %w[D13 G4] => 'path=a:4,b:5', - %w[F13] => 'path=a:1,b:2;path=a:3,b:4', - %w[M12] => 'path=a:1,b:2', - %w[B5] => 'path=a:0,b:3', - %w[H13] => 'path=a:2,b:3;path=a:2,b:4', - %w[G2] => 'path=a:1,b:5;path=a:2,b:5', - %w[H5] => 'path=a:2,b:5;path=a:3,b:5', - %w[B11] => 'town=revenue:yellow_20|brown_40;path=a:3,b:_0;path=a:4,b:_0', - %w[F7] => 'town=revenue:20;path=a:2,b:_0;path=a:3,b:_0', - %w[F1] => 'path=a:0,b:5', - }, - }.freeze - def cornelius # cornelius, as inheriting behaviour from the chessie cornelius private @cornelius ||= @companies.find { |company| company.name == '"Santa"?' } @@ -110,183 +42,6 @@ def nog @nog ||= @companies.find { |company| company.name == 'Egg Nog Express' } end - COMPANIES = [ - { - name: 'Stair Case Cleanup Co', - value: 20, - revenue: 5, - desc: 'Blocks hex H9 while owned by a player.', - sym: 'SCCC', - abilities: [{ type: 'blocks_hexes', owner_type: 'player', hexes: ['H9'] }], - color: nil, - }, - { - name: 'Dumbwaiter Excavation', - value: 50, - revenue: 10, - desc: 'Blocks building a station at F3 while owned by a player.', - sym: 'DW', - abilities: [{ type: 'reservation', remove: 'sold', hex: 'F3' }], - color: nil, - }, - { - name: 'Dad\'s Intervention', - value: 100, - revenue: 0, - desc: 'The player purchasing this cert also gains a 10% share of Baltimore and Ohio.', - sym: 'DI', - abilities: [{ type: 'shares', shares: 'B&O_1' }], - color: nil, - }, - { - name: '"Santa"?', - value: 200, - revenue: 30, - desc: 'This private closes when the associated corporation buys its first train. It cannot be bought by a corporation.', - sym: 'SC', - abilities: [{ type: 'shares', shares: 'random_president' }, - { type: 'no_buy' }], - color: nil, - }, - { - name: 'Egg Nog Express', - value: 80, - revenue: 15, - desc: 'The owning company adds $40 to any train run that includes both the Bar (F7) and the DC hex (C10).', - sym: 'ENX', - color: nil, - }, - { - name: 'Conductor\'s Hat', - value: 40, - revenue: 10, - desc: 'Adds $10 per room stopped at at least once by any one train of the owning corporation. Red off-board locations do not count.', - sym: 'CH', - color: nil, - }, - ].freeze - # rubocop:enable Layout/LineLength - - CORPORATIONS = [ - { - float_percent: 60, - sym: 'PRR', - name: 'Pennsylvania Railroad', - logo: '18_chesapeake/PRR', - simple_logo: '18_chesapeake/PRR.alt', - tokens: [0, 40, 60, 80], - coordinates: 'L11', - color: '#237333', - reservation_color: nil, - }, - { - float_percent: 60, - sym: 'PLE', - name: 'Pittsburgh and Lake Erie Railroad', - logo: '18_chesapeake/PLE', - simple_logo: '18_chesapeake/PLE.alt', - tokens: [0, 40, 60], - coordinates: 'B3', - color: :black, - reservation_color: nil, - }, - { - float_percent: 60, - sym: 'SRR', - name: 'Strasburg Rail Road', - logo: '18_chesapeake/SRR', - simple_logo: '18_chesapeake/SRR.alt', - tokens: [0, 40], - city: 1, - coordinates: 'E12', - color: '#d81e3e', - reservation_color: nil, - }, - { - float_percent: 60, - sym: 'B&O', - name: 'Baltimore & Ohio Railroad', - logo: '18_chesapeake/BO', - simple_logo: '18_chesapeake/BO.alt', - tokens: [0, 40, 60], - coordinates: 'J5', - city: 0, - color: '#0189d1', - reservation_color: nil, - }, - { - float_percent: 60, - sym: 'C&O', - name: 'Chesapeake & Ohio Railroad', - logo: '18_chesapeake/CO', - simple_logo: '18_chesapeake/CO.alt', - tokens: [0, 40, 60, 80], - coordinates: 'K2', - color: '#a2dced', - text_color: 'black', - reservation_color: nil, - }, - { - float_percent: 60, - sym: 'LV', - name: 'Lehigh Valley Railroad', - logo: '18_chesapeake/LV', - simple_logo: '18_chesapeake/LV.alt', - tokens: [0, 40], - coordinates: 'F9', - color: '#FFF500', - text_color: 'black', - reservation_color: nil, - }, - { - float_percent: 60, - sym: 'C&A', - name: 'Camden & Amboy Railroad', - logo: '18_chesapeake/CA', - simple_logo: '18_chesapeake/CA.alt', - tokens: [0, 40], - coordinates: 'J11', - color: '#f48221', - reservation_color: nil, - }, - { - float_percent: 60, - sym: 'N&W', - name: 'Norfolk & Western Railway', - logo: '18_chesapeake/NW', - simple_logo: '18_chesapeake/NW.alt', - tokens: [0, 40, 60], - coordinates: 'E6', - color: '#7b352a', - reservation_color: nil, - }, - ].freeze - - LOCATION_NAMES = { - 'J11' => 'Basement', - 'E14' => 'Front Door', - 'B11' => 'Christmas Tree', - 'L13' => 'Balcony', - 'F7' => 'Bar', - 'L7' => 'Bathroom', - 'B1' => 'Back Door', - 'A6' => 'Forgotten Cupboard', - 'A8' => 'Garage', - 'G8' => 'Staircase', - 'D3' => 'Kitchen', - 'D7' => 'Dining', - 'H11' => 'Study', - 'C8' => 'Lounge', - 'L9' => 'Master', - 'J7' => 'Hall', - 'K4' => 'Bedroom', - 'L3' => 'Bedroom', - 'I2' => 'Rec Room', - 'F11' => 'Foyer', - 'F9' => 'Utilities', - - }.freeze - # Reimplement 18Ches trains for D end game trigger TRAINS = [ { diff --git a/lib/engine/game/g_18_christmas_eve/map.rb b/lib/engine/game/g_18_christmas_eve/map.rb new file mode 100644 index 0000000000..79e247405e --- /dev/null +++ b/lib/engine/game/g_18_christmas_eve/map.rb @@ -0,0 +1,105 @@ +# frozen_string_literal: true + +module Engine + module Game + module G18ChristmasEve + module Map + LOCATION_NAMES = { + 'J11' => 'Basement', + 'E14' => 'Front Door', + 'B11' => 'Christmas Tree', + 'L13' => 'Balcony', + 'F7' => 'Bar', + 'L7' => 'Bathroom', + 'B1' => 'Back Door', + 'A6' => 'Forgotten Cupboard', + 'A8' => 'Garage', + 'G8' => 'Staircase', + 'D3' => 'Kitchen', + 'D7' => 'Dining', + 'H11' => 'Study', + 'C8' => 'Lounge', + 'L9' => 'Master', + 'J7' => 'Hall', + 'K4' => 'Bedroom', + 'L3' => 'Bedroom', + 'I2' => 'Rec Room', + 'F11' => 'Foyer', + 'F9' => 'Utilities', + }.freeze + + HEXES = { + white: { + # Kitchen + %w[D3 E4] => 'frame=color:#CE95C3', + %w[B3 F3] => 'frame=color:#CE95C3;city=revenue:0', + %w[C4] => 'frame=color:#CE95C3;town=revenue:0', + # Dining + %w[D5 E6] => 'frame=color:#F7FFB6;city=revenue:0', + %w[D7 F5] => 'frame=color:#F7FFB6', + # Lounge + %w[C8 D9 D11] => 'frame=color:#FFFFFF', + %w[B7] => 'frame=color:#FFFFFF;town=revenue:0;town=revenue:0', + %w[B9 C12] => 'frame=color:#FFFFFF;town=revenue:0', + %w[C10] => 'frame=color:#FFFFFF;city=revenue:0;label=DC', + # Foyer + %w[F11] => 'frame=color:#7D96CD', + %w[E10] => 'frame=color:#7D96CD;city=revenue:0;', + # Utilities + %w[F9] => 'frame=color:#CCCCC1;city=revenue:0;', + # Staircase + %w[G8 G10 H7 H9] => 'upgrade=cost:80,terrain:mountain;frame=color:#C4E4CD', + # Study + %w[G12] => 'frame=color:#BBBBB6;city=revenue:0;', + %w[H11] => 'frame=color:#BBBBB6;', + %w[I12] => 'frame=color:#BBBBB6;town=revenue:0', + # Master + %w[K10 L11] => 'frame=color:#E6C4AF;city=revenue:0;', + %w[L9 K12] => 'frame=color:#E6C4AF;', + # Hall + %w[I4 I8 J7] => 'frame=color:#F5846B', + %w[I6] => 'frame=color:#F5846B;town=revenue:0;town=revenue:0', + %w[K8] => 'frame=color:#F5846B;city=revenue:0;', + # Rec Room + %w[I2 J1] => 'frame=color:#9FCAA1', + %w[J3] => 'frame=color:#9FCAA1;town=revenue:0;town=revenue:0', + # Bedroom + %w[L1 L3] => 'frame=color:#AB9E7F', + %w[K2] => 'frame=color:#AB9E7F;city=revenue:0;', + # Bedroom + %w[K4 L5] => 'frame=color:#AFDFE0', + %w[J5] => 'frame=color:#AFDFE0;city=revenue:0;', + }, + red: { + %w[E14] => 'offboard=revenue:yellow_20|green_40|brown_60|gray_80;path=a:2,b:_0;path=a:3,b:_0;path=a:4,b:_0', + %w[L13] => 'offboard=revenue:yellow_20|green_80|gray_120;path=a:2,b:_0;path=a:3,b:_0;path=a:4,b:_0', + %w[A8] => 'offboard=revenue:yellow_20|green_30|brown_40|gray_60;path=a:4,b:_0', + %w[J11] => 'city=revenue:yellow_20|brown_40;path=a:1,b:_0', + %w[A6] => 'offboard=revenue:20;path=a:5,b:_0', + %w[K6] => 'offboard=revenue:20,groups:Bathroom;path=a:1,b:_0;path=a:2,b:_0;path=a:3,b:_0;path=a:4,b:_0;'\ + 'path=a:0,b:_0;border=edge:5', + %w[L7] => 'offboard=revenue:20,hide:1,groups:Bathroom;path=a:0,b:_0;path=a:1,b:_0;path=a:3,b:_0;border=edge:2', + %w[A2] => 'offboard=revenue:yellow_60|brown_20|gray_10,groups:Back Door;path=a:5,b:_0;border=edge:4', + %w[B1] => 'offboard=revenue:yellow_60|brown_20|gray_10,hide:1,groups:Back Door;path=a:0,b:_0;border=edge:1', + }, + yellow: { + %w[E12] => 'frame=color:#7D96CD;city=revenue:30;city=revenue:30;path=a:3,b:_0;path=a:0,b:_1;label=OO', + %w[H3] => 'frame=color:#F5846B;city=revenue:30;city=revenue:30;path=a:2,b:_0;path=a:5,b:_1;label=OO', + }, + gray: { + %w[D13 G4] => 'path=a:4,b:5', + %w[F13] => 'path=a:1,b:2;path=a:3,b:4', + %w[M12] => 'path=a:1,b:2', + %w[B5] => 'path=a:0,b:3', + %w[H13] => 'path=a:2,b:3;path=a:2,b:4', + %w[G2] => 'path=a:1,b:5;path=a:2,b:5', + %w[H5] => 'path=a:2,b:5;path=a:3,b:5', + %w[B11] => 'town=revenue:yellow_20|brown_40;path=a:3,b:_0;path=a:4,b:_0', + %w[F7] => 'town=revenue:20;path=a:2,b:_0;path=a:3,b:_0', + %w[F1] => 'path=a:0,b:5', + }, + }.freeze + end + end + end +end diff --git a/lib/engine/game/g_18_co/game.rb b/lib/engine/game/g_18_co/game.rb index 3a850a9048..dbf43b47a7 100644 --- a/lib/engine/game/g_18_co/game.rb +++ b/lib/engine/game/g_18_co/game.rb @@ -575,7 +575,6 @@ class Game < Game::Base coordinates: 'E27', color: '#7b352a', abilities: [{ type: 'description', description: 'Par Group - C' }], - reservation_color: nil, }, { sym: 'CM', @@ -590,7 +589,6 @@ class Game < Game::Base color: '#a2dced', text_color: 'black', abilities: [{ type: 'description', description: 'Par Group - C' }], - reservation_color: nil, }, { sym: 'CS', @@ -604,7 +602,6 @@ class Game < Game::Base coordinates: 'K17', color: :'#232b2b', abilities: [{ type: 'description', description: 'Par Group - C' }], - reservation_color: nil, }, { sym: 'DPAC', @@ -619,7 +616,6 @@ class Game < Game::Base coordinates: 'E15', color: :'#82009c', abilities: [{ type: 'description', description: 'Par Group - C' }], - reservation_color: nil, }, { sym: 'DSL', @@ -634,7 +630,6 @@ class Game < Game::Base coordinates: 'E15', color: '#237333', abilities: [{ type: 'description', description: 'Par Group - C' }], - reservation_color: nil, }, { sym: 'DRG', @@ -650,7 +645,6 @@ class Game < Game::Base color: :gold, text_color: 'black', abilities: [{ type: 'description', description: 'Par Group - B' }], - reservation_color: nil, }, { sym: 'ATSF', @@ -664,7 +658,6 @@ class Game < Game::Base coordinates: 'J26', color: :'#000e4b', abilities: [{ type: 'description', description: 'Par Group - B' }], - reservation_color: nil, }, { sym: 'CBQ', @@ -679,7 +672,6 @@ class Game < Game::Base color: '#f48221', text_color: 'black', abilities: [{ type: 'description', description: 'Par Group - A' }], - reservation_color: nil, }, { sym: 'ROCK', @@ -693,7 +685,6 @@ class Game < Game::Base coordinates: 'G27', color: '#d81e3e', abilities: [{ type: 'description', description: 'Par Group - A' }], - reservation_color: nil, }, { sym: 'UP', @@ -708,7 +699,6 @@ class Game < Game::Base color: :'#ffffeb', text_color: 'black', abilities: [{ type: 'description', description: 'Par Group - A' }], - reservation_color: nil, }, { sym: 'DSNG', @@ -732,7 +722,6 @@ class Game < Game::Base description: 'Shares: 2P/2/2/1/1/1/1', }, ], - reservation_color: nil, }, ].freeze diff --git a/lib/engine/game/g_18_co/step/acquisition_auction.rb b/lib/engine/game/g_18_co/step/acquisition_auction.rb index 3f313242d6..617761b0fe 100644 --- a/lib/engine/game/g_18_co/step/acquisition_auction.rb +++ b/lib/engine/game/g_18_co/step/acquisition_auction.rb @@ -14,7 +14,7 @@ class AcquisitionAuction < Engine::Step::Base def actions(entity) return [] unless @auctioning - return [] unless can_bid?(entity) + return [] unless can_bid_any?(entity) ACTIONS end @@ -64,7 +64,7 @@ def same_president(entity) entity.owner == @auctioning.owner end - def can_bid?(entity) + def can_bid_any?(entity) return unless entity.corporation? return if same_president(entity) return if @bids[@auctioning].any? { |b| b.entity == entity } @@ -139,7 +139,7 @@ def resolve_bids entities.each do |participant| next if participant.passed? - unless can_bid?(participant) + unless can_bid_any?(participant) log_skip(participant) participant.pass! end diff --git a/lib/engine/game/g_18_cz/entities.rb b/lib/engine/game/g_18_cz/entities.rb index b31ed78def..b8530665f7 100644 --- a/lib/engine/game/g_18_cz/entities.rb +++ b/lib/engine/game/g_18_cz/entities.rb @@ -1770,7 +1770,6 @@ module Entities coordinates: %w[A8 B5], color: :'#e31e24', type: 'large', - reservation_color: nil, }, { float_percent: 50, @@ -1785,7 +1784,6 @@ module Entities coordinates: %w[A22 B19], color: :'#2b2a29', type: 'large', - reservation_color: nil, }, { float_percent: 50, @@ -1800,7 +1798,6 @@ module Entities coordinates: %w[F3 H5], color: :'#0971b7', type: 'large', - reservation_color: nil, }, { float_percent: 50, @@ -1815,7 +1812,6 @@ module Entities coordinates: %w[J15 I18], color: :'#cc6f3c', type: 'large', - reservation_color: nil, }, { float_percent: 50, @@ -1830,7 +1826,6 @@ module Entities coordinates: %w[G28 I24], color: :'#ae4a84', type: 'large', - reservation_color: nil, }, { float_percent: 60, @@ -1848,7 +1843,6 @@ module Entities color: :darkGrey, text_color: 'black', type: 'medium', - reservation_color: nil, }, { float_percent: 60, @@ -1866,7 +1860,6 @@ module Entities color: :'#e1af33', text_color: 'black', type: 'medium', - reservation_color: nil, }, { float_percent: 60, @@ -1883,7 +1876,6 @@ module Entities text_color: 'black', coordinates: 'B9', type: 'medium', - reservation_color: nil, }, { float_percent: 60, @@ -1900,7 +1892,6 @@ module Entities color: :'#dbe285', text_color: 'black', type: 'medium', - reservation_color: nil, }, { float_percent: 60, @@ -1917,7 +1908,6 @@ module Entities color: :'#a2d9f7', text_color: 'black', type: 'medium', - reservation_color: nil, }, { float_percent: 50, @@ -1933,7 +1923,6 @@ module Entities color: :antiqueWhite, text_color: 'black', type: 'small', - reservation_color: nil, fraction_shares: false, }, { @@ -1950,7 +1939,6 @@ module Entities color: '#F3B1B3', text_color: 'black', type: 'small', - reservation_color: nil, fraction_shares: false, }, { @@ -1967,7 +1955,6 @@ module Entities color: :'#fabc48', text_color: 'black', type: 'small', - reservation_color: nil, fraction_shares: false, }, { @@ -1984,7 +1971,6 @@ module Entities color: '#B1CEC7', text_color: 'black', type: 'small', - reservation_color: nil, fraction_shares: false, }, { @@ -2000,7 +1986,6 @@ module Entities coordinates: 'I10', color: :'#009846', type: 'small', - reservation_color: nil, fraction_shares: false, }, ].freeze diff --git a/lib/engine/game/g_18_dixie/corporations.rb b/lib/engine/game/g_18_dixie/corporations.rb index cf65b28b71..81009f3fb6 100644 --- a/lib/engine/game/g_18_dixie/corporations.rb +++ b/lib/engine/game/g_18_dixie/corporations.rb @@ -83,7 +83,6 @@ module Corporations coordinates: 'C17', city: 1, color: '#76a042', - reservation_color: nil, }, { type: 'major', diff --git a/lib/engine/game/g_18_eu/entities.rb b/lib/engine/game/g_18_eu/entities.rb index 79adcb8b88..d2bbf7dc69 100644 --- a/lib/engine/game/g_18_eu/entities.rb +++ b/lib/engine/game/g_18_eu/entities.rb @@ -102,7 +102,6 @@ module Entities tokens: [0], color: 'black', text_color: 'white', - reservation_color: nil, abilities: [ { type: 'exchange', @@ -121,7 +120,6 @@ module Entities tokens: [0], color: 'black', text_color: 'white', - reservation_color: nil, abilities: [ { type: 'exchange', @@ -130,8 +128,8 @@ module Entities from: %w[ipo market], }, { - type: 'blocks_hexes', - owner_type: nil, + type: 'blocks_hexes_consent', + owner_type: 'player', hexes: ['C8'], }, ], @@ -146,7 +144,6 @@ module Entities tokens: [0], color: 'black', text_color: 'white', - reservation_color: nil, abilities: [ { type: 'exchange', @@ -155,8 +152,8 @@ module Entities from: %w[ipo market], }, { - type: 'blocks_hexes', - owner_type: nil, + type: 'blocks_hexes_consent', + owner_type: 'player', hexes: ['B11'], }, ], @@ -171,7 +168,6 @@ module Entities tokens: [0], color: 'black', text_color: 'white', - reservation_color: nil, abilities: [ { type: 'exchange', @@ -191,7 +187,6 @@ module Entities tokens: [0], color: 'black', text_color: 'white', - reservation_color: nil, abilities: [ { type: 'exchange', @@ -211,7 +206,6 @@ module Entities tokens: [0], color: 'black', text_color: 'white', - reservation_color: nil, abilities: [ { type: 'exchange', @@ -231,7 +225,6 @@ module Entities tokens: [0], color: 'black', text_color: 'white', - reservation_color: nil, abilities: [ { type: 'exchange', @@ -240,8 +233,8 @@ module Entities from: %w[ipo market], }, { - type: 'blocks_hexes', - owner_type: nil, + type: 'blocks_hexes_consent', + owner_type: 'player', hexes: ['I6'], }, ], @@ -256,7 +249,6 @@ module Entities tokens: [0], color: 'black', text_color: 'white', - reservation_color: nil, abilities: [ { type: 'exchange', @@ -276,7 +268,6 @@ module Entities tokens: [0], color: 'black', text_color: 'white', - reservation_color: nil, abilities: [ { type: 'exchange', @@ -296,7 +287,6 @@ module Entities tokens: [0], color: 'black', text_color: 'white', - reservation_color: nil, abilities: [ { type: 'exchange', @@ -305,8 +295,8 @@ module Entities from: %w[ipo market], }, { - type: 'blocks_hexes', - owner_type: nil, + type: 'blocks_hexes_consent', + owner_type: 'player', hexes: %w[F19 F21], }, ], @@ -321,7 +311,6 @@ module Entities tokens: [0], color: 'black', text_color: 'white', - reservation_color: nil, abilities: [ { type: 'exchange', @@ -341,7 +330,6 @@ module Entities tokens: [0], color: 'black', text_color: 'white', - reservation_color: nil, abilities: [ { type: 'exchange', @@ -361,7 +349,6 @@ module Entities tokens: [0], color: 'black', text_color: 'white', - reservation_color: nil, abilities: [ { type: 'exchange', @@ -381,7 +368,6 @@ module Entities tokens: [0], color: 'black', text_color: 'white', - reservation_color: nil, abilities: [ { type: 'exchange', @@ -401,7 +387,6 @@ module Entities tokens: [0], color: 'black', text_color: 'white', - reservation_color: nil, abilities: [ { type: 'exchange', diff --git a/lib/engine/game/g_18_eu/step/minor_exchange.rb b/lib/engine/game/g_18_eu/step/minor_exchange.rb index 5efa744756..7ca0a22f0c 100644 --- a/lib/engine/game/g_18_eu/step/minor_exchange.rb +++ b/lib/engine/game/g_18_eu/step/minor_exchange.rb @@ -81,6 +81,13 @@ def transfer_trains(source, destination) @game.maybe_discard_pullman(destination) end + + def can_gain?(entity, bundle, exchange: false) + return if !bundle || !entity + return true if exchange + + super + end end end end diff --git a/lib/engine/game/g_18_fl/entities.rb b/lib/engine/game/g_18_fl/entities.rb index 7ce4d0c4d9..3d0d1280f6 100644 --- a/lib/engine/game/g_18_fl/entities.rb +++ b/lib/engine/game/g_18_fl/entities.rb @@ -110,7 +110,6 @@ module Entities color: :darkblue, type: 'five_share', always_market_price: true, - reservation_color: nil, }, { float_percent: 50, @@ -125,7 +124,6 @@ module Entities text_color: 'black', type: 'five_share', always_market_price: true, - reservation_color: nil, }, { float_percent: 50, @@ -140,7 +138,6 @@ module Entities color: '#76a042', type: 'five_share', always_market_price: true, - reservation_color: nil, }, { float_percent: 50, @@ -155,7 +152,6 @@ module Entities color: '#f48221', type: 'five_share', always_market_price: true, - reservation_color: nil, }, { float_percent: 50, @@ -169,7 +165,6 @@ module Entities color: :purple, type: 'five_share', always_market_price: true, - reservation_color: nil, }, { float_percent: 50, @@ -183,7 +178,6 @@ module Entities color: '#d81e3e', type: 'five_share', always_market_price: true, - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_18_gb/entities.rb b/lib/engine/game/g_18_gb/entities.rb index 9756c8a28e..b14a5bc03a 100644 --- a/lib/engine/game/g_18_gb/entities.rb +++ b/lib/engine/game/g_18_gb/entities.rb @@ -312,7 +312,6 @@ module Entities tokens: [0, 0], coordinates: 'G4', color: '#0a70b3', - reservation_color: nil, always_market_price: true, max_ownership_percent: 100, abilities: [ @@ -334,7 +333,6 @@ module Entities tokens: [0, 50], coordinates: 'J25', color: '#37b2e2', - reservation_color: nil, always_market_price: true, max_ownership_percent: 100, abilities: [ @@ -368,7 +366,6 @@ module Entities tokens: [0, 50], coordinates: 'F5', color: '#ec767c', - reservation_color: nil, always_market_price: true, max_ownership_percent: 100, abilities: [ @@ -401,7 +398,6 @@ module Entities tokens: [0, 50], coordinates: 'D23', color: '#008f4f', - reservation_color: nil, always_market_price: true, max_ownership_percent: 100, abilities: [ @@ -424,7 +420,6 @@ module Entities coordinates: 'F21', color: '#0a0a0a', text_color: '#ffffff', - reservation_color: nil, always_market_price: true, max_ownership_percent: 100, abilities: [ @@ -447,7 +442,6 @@ module Entities coordinates: 'D25', color: '#fcea18', text_color: '#000000', - reservation_color: nil, always_market_price: true, max_ownership_percent: 100, abilities: [ @@ -470,7 +464,6 @@ module Entities coordinates: 'H15', color: '#baa4cb', text_color: '#000000', - reservation_color: nil, always_market_price: true, max_ownership_percent: 100, abilities: [ @@ -492,7 +485,6 @@ module Entities tokens: [0, 50], coordinates: 'H19', color: '#dd0030', - reservation_color: nil, always_market_price: true, max_ownership_percent: 100, abilities: [ @@ -525,7 +517,6 @@ module Entities tokens: [0], coordinates: 'H17', color: '#881a1e', - reservation_color: nil, always_market_price: true, max_ownership_percent: 100, abilities: [ @@ -547,7 +538,6 @@ module Entities tokens: [0, 50], coordinates: 'I6', color: '#eb6f0e', - reservation_color: nil, always_market_price: true, max_ownership_percent: 100, abilities: [ @@ -569,7 +559,6 @@ module Entities tokens: [0, 50], coordinates: 'J13', color: '#7bb137', - reservation_color: nil, always_market_price: true, max_ownership_percent: 100, abilities: [ @@ -603,7 +592,6 @@ module Entities coordinates: 'A20', color: '#9a9a9d', text_color: '#000000', - reservation_color: nil, always_market_price: true, max_ownership_percent: 100, abilities: [ diff --git a/lib/engine/game/g_18_ireland/entities.rb b/lib/engine/game/g_18_ireland/entities.rb index 15cd82c97e..c4c10b340d 100644 --- a/lib/engine/game/g_18_ireland/entities.rb +++ b/lib/engine/game/g_18_ireland/entities.rb @@ -211,7 +211,6 @@ module Entities shares: [20, 10, 10, 10, 10, 10, 10, 10, 10], always_market_price: true, color: 'red', - reservation_color: nil, type: 'major', max_ownership_percent: 70, }, @@ -224,7 +223,6 @@ module Entities shares: [20, 10, 10, 10, 10, 10, 10, 10, 10], always_market_price: true, color: '#3DAAD6', - reservation_color: nil, type: 'major', max_ownership_percent: 70, }, @@ -237,7 +235,6 @@ module Entities shares: [20, 10, 10, 10, 10, 10, 10, 10, 10], always_market_price: true, color: 'black', - reservation_color: nil, type: 'major', max_ownership_percent: 70, }, @@ -250,7 +247,6 @@ module Entities shares: [20, 10, 10, 10, 10, 10, 10, 10, 10], always_market_price: true, color: 'green', - reservation_color: nil, type: 'major', max_ownership_percent: 70, }, @@ -263,7 +259,6 @@ module Entities shares: [20, 10, 10, 10, 10, 10, 10, 10, 10], always_market_price: true, color: '#DB7093', - reservation_color: nil, type: 'major', max_ownership_percent: 70, }, @@ -277,7 +272,6 @@ module Entities always_market_price: true, color: 'yellow', text_color: 'black', - reservation_color: nil, type: 'major', max_ownership_percent: 70, }, @@ -290,7 +284,6 @@ module Entities shares: [20, 10, 10, 10, 10, 10, 10, 10, 10], always_market_price: true, color: 'brown', - reservation_color: nil, type: 'major', max_ownership_percent: 70, }, @@ -304,7 +297,6 @@ module Entities shares: [40, 20, 20, 20], always_market_price: true, color: '#8B4513', - reservation_color: nil, type: 'minor', coordinates: 'G1', }, @@ -317,7 +309,6 @@ module Entities shares: [40, 20, 20, 20], always_market_price: true, color: 'black', - reservation_color: nil, type: 'minor', coordinates: 'E21', }, @@ -331,7 +322,6 @@ module Entities always_market_price: true, color: '#F5DEB3', text_color: 'black', - reservation_color: nil, type: 'minor', coordinates: 'F6', }, @@ -344,7 +334,6 @@ module Entities shares: [40, 20, 20, 20], always_market_price: true, color: 'gray', - reservation_color: nil, type: 'minor', coordinates: 'F6', }, @@ -358,7 +347,6 @@ module Entities always_market_price: true, color: '#98FB98', text_color: 'black', - reservation_color: nil, type: 'minor', coordinates: 'I11', city: 1, @@ -372,7 +360,6 @@ module Entities shares: [40, 20, 20, 20], always_market_price: true, color: 'purple', - reservation_color: nil, type: 'minor', coordinates: 'I11', city: 0, @@ -387,7 +374,6 @@ module Entities always_market_price: true, color: 'white', text_color: 'black', - reservation_color: nil, type: 'minor', coordinates: 'D6', }, @@ -401,7 +387,6 @@ module Entities always_market_price: true, color: 'coral', text_color: 'black', - reservation_color: nil, type: 'minor', coordinates: 'J4', }, @@ -415,7 +400,6 @@ module Entities always_market_price: true, color: 'pink', text_color: 'black', - reservation_color: nil, type: 'minor', coordinates: 'I9', }, @@ -428,7 +412,6 @@ module Entities shares: [40, 20, 20, 20], always_market_price: true, color: '#9370DB', - reservation_color: nil, type: 'minor', coordinates: 'F10', }, @@ -442,7 +425,6 @@ module Entities always_market_price: true, color: 'lightblue', text_color: 'black', - reservation_color: nil, type: 'minor', coordinates: 'G19', }, @@ -455,7 +437,6 @@ module Entities shares: [40, 20, 20, 20], always_market_price: true, color: '#556B2F', - reservation_color: nil, type: 'minor', coordinates: 'G13', }, @@ -469,7 +450,6 @@ module Entities always_market_price: true, color: '#DDA0DD', text_color: 'black', - reservation_color: nil, type: 'minor', coordinates: 'G13', }, @@ -482,7 +462,6 @@ module Entities shares: [40, 20, 20, 20], always_market_price: true, color: 'red', - reservation_color: nil, type: 'minor', coordinates: 'D16', }, diff --git a/lib/engine/game/g_18_ireland/step/buy_sell_par_shares.rb b/lib/engine/game/g_18_ireland/step/buy_sell_par_shares.rb index fc518731f7..9b26af0127 100644 --- a/lib/engine/game/g_18_ireland/step/buy_sell_par_shares.rb +++ b/lib/engine/game/g_18_ireland/step/buy_sell_par_shares.rb @@ -41,7 +41,7 @@ def win_bid(winner, _company) pass! end - def can_bid?(entity) + def can_bid_any?(entity) max_bid(entity) >= MIN_BID && !bought? && !sold? && @game.corporations.any? do |c| @game.can_par?(c, entity) && c.type == :minor && can_buy?(entity, c.shares.first&.to_bundle) diff --git a/lib/engine/game/g_18_jpt/entities.rb b/lib/engine/game/g_18_jpt/entities.rb index e81f14cac3..02ee9cc084 100644 --- a/lib/engine/game/g_18_jpt/entities.rb +++ b/lib/engine/game/g_18_jpt/entities.rb @@ -88,7 +88,6 @@ module Entities tokens: [0, 0, 40, 100, 100], coordinates: 'A77', color: :grey, - reservation_color: nil, abilities: [ { type: 'assign_hexes', @@ -111,7 +110,6 @@ module Entities city: 0, color: :yellow, text_color: 'black', - reservation_color: nil, abilities: [ { type: 'hex_bonus', @@ -136,7 +134,6 @@ module Entities coordinates: 'F86', city: 0, color: :darkgreen, - reservation_color: nil, abilities: [ { type: 'hex_bonus', @@ -156,7 +153,6 @@ module Entities coordinates: 'F86', city: 0, color: :purple, - reservation_color: nil, abilities: [ { type: 'hex_bonus', @@ -177,7 +173,6 @@ module Entities city: 0, color: :lightBlue, text_color: 'black', - reservation_color: nil, abilities: [ { type: 'description', @@ -205,7 +200,6 @@ module Entities coordinates: 'G89', city: 1, color: :red, - reservation_color: nil, abilities: [ { type: 'hex_bonus', @@ -227,7 +221,6 @@ module Entities city: 1, color: :pink, text_color: 'black', - reservation_color: nil, abilities: [ { type: 'hex_bonus', @@ -247,7 +240,6 @@ module Entities coordinates: 'G87', city: 0, color: :brown, - reservation_color: nil, abilities: [ { type: 'tile_discount', @@ -269,7 +261,6 @@ module Entities city: 0, color: :lightGreen, text_color: 'black', - reservation_color: nil, abilities: [ { type: 'hex_bonus', @@ -289,7 +280,6 @@ module Entities coordinates: 'J78', color: :orange, text_color: 'black', - reservation_color: nil, abilities: [ { type: 'hex_bonus', @@ -308,7 +298,6 @@ module Entities tokens: [0, 40, 100, 100, 100], coordinates: 'I83', color: :darkBlue, - reservation_color: nil, abilities: [ { type: 'hex_bonus', diff --git a/lib/engine/game/g_18_ka/game.rb b/lib/engine/game/g_18_ka/game.rb index 01c1859636..33afcd82e6 100644 --- a/lib/engine/game/g_18_ka/game.rb +++ b/lib/engine/game/g_18_ka/game.rb @@ -801,7 +801,6 @@ def cert_limit(_player = nil) description: 'May borrow a train when trainless*', }, ], - reservation_color: nil, }, ].freeze # TODO: Make location name optional and refactor into 1856 diff --git a/lib/engine/game/g_18_los_angeles/entities.rb b/lib/engine/game/g_18_los_angeles/entities.rb index 2e6155d8ae..1203718383 100644 --- a/lib/engine/game/g_18_los_angeles/entities.rb +++ b/lib/engine/game/g_18_los_angeles/entities.rb @@ -335,7 +335,6 @@ module Entities coordinates: 'C12', color: '#ff0000', always_market_price: true, - reservation_color: nil, }, { float_percent: 20, @@ -357,7 +356,6 @@ module Entities coordinates: 'A8', color: '#00830e', always_market_price: true, - reservation_color: nil, }, { float_percent: 20, @@ -370,7 +368,6 @@ module Entities color: '#b8ffff', text_color: 'black', always_market_price: true, - reservation_color: nil, }, { float_percent: 20, @@ -382,7 +379,6 @@ module Entities color: '#ff6a00', text_color: 'black', always_market_price: true, - reservation_color: nil, }, { float_percent: 20, @@ -396,7 +392,6 @@ module Entities color: '#ff7fed', text_color: 'black', always_market_price: true, - reservation_color: nil, }, { float_percent: 20, @@ -419,7 +414,6 @@ module Entities coordinates: 'C2', color: '#0026ff', always_market_price: true, - reservation_color: nil, }, { float_percent: 20, @@ -431,7 +425,6 @@ module Entities coordinates: 'B11', color: '#727272', always_market_price: true, - reservation_color: nil, }, ].freeze diff --git a/lib/engine/game/g_18_los_angeles1/entities.rb b/lib/engine/game/g_18_los_angeles1/entities.rb index 4ae0f75892..186e60a346 100644 --- a/lib/engine/game/g_18_los_angeles1/entities.rb +++ b/lib/engine/game/g_18_los_angeles1/entities.rb @@ -141,7 +141,6 @@ module Entities coordinates: 'C12', color: '#ff0000', always_market_price: true, - reservation_color: nil, }, 'PER' => { float_percent: 20, @@ -154,7 +153,6 @@ module Entities color: '#ff6a00', text_color: 'black', always_market_price: true, - reservation_color: nil, }, 'SF' => { float_percent: 20, @@ -177,7 +175,6 @@ module Entities color: '#ff7fed', text_color: 'black', always_market_price: true, - reservation_color: nil, }, 'SP' => { float_percent: 20, @@ -200,7 +197,6 @@ module Entities coordinates: 'C2', color: '#0026ff', always_market_price: true, - reservation_color: nil, }, }.freeze end diff --git a/lib/engine/game/g_18_mo/entities.rb b/lib/engine/game/g_18_mo/entities.rb index 07122c973c..85bed24003 100644 --- a/lib/engine/game/g_18_mo/entities.rb +++ b/lib/engine/game/g_18_mo/entities.rb @@ -205,7 +205,6 @@ module Entities coordinates: 'A7', color: 'blue', always_market_price: true, - reservation_color: nil, }, { float_percent: 20, @@ -228,7 +227,6 @@ module Entities coordinates: 'J4', color: 'gray', always_market_price: true, - reservation_color: nil, }, { float_percent: 20, @@ -251,7 +249,6 @@ module Entities coordinates: 'C13', color: 'green', always_market_price: true, - reservation_color: nil, }, { float_percent: 20, @@ -275,7 +272,6 @@ module Entities city: 2, color: 'purple', always_market_price: true, - reservation_color: nil, }, { float_percent: 20, @@ -298,7 +294,6 @@ module Entities coordinates: 'K5', color: 'brown', always_market_price: true, - reservation_color: nil, }, { float_percent: 20, @@ -322,7 +317,6 @@ module Entities city: 1, color: 'red', always_market_price: true, - reservation_color: nil, }, { float_percent: 20, @@ -346,7 +340,6 @@ module Entities city: 0, color: 'darkblue', always_market_price: true, - reservation_color: nil, }, ].freeze diff --git a/lib/engine/game/g_18_mt/corporations.rb b/lib/engine/game/g_18_mt/corporations.rb index 57751fda18..5370384e0d 100644 --- a/lib/engine/game/g_18_mt/corporations.rb +++ b/lib/engine/game/g_18_mt/corporations.rb @@ -16,7 +16,6 @@ module Corporations coordinates: 'F22', 'text-color': 'white', color: :'#20451d', - reservation_color: nil, abilities: [{ type: 'description', description: 'Tile Lay Blocked by GV' }], }, { @@ -30,7 +29,6 @@ module Corporations coordinates: 'C9', 'text-color': 'white', color: :'#754d24', - reservation_color: nil, }, { sym: 'GN', @@ -43,7 +41,6 @@ module Corporations city: 0, coordinates: 'A21', color: '#d81e3e', - reservation_color: nil, abilities: [{ type: 'description', description: 'Tile Lay Blocked by SOO' }], }, { @@ -57,7 +54,6 @@ module Corporations coordinates: 'C19', 'text-color': 'white', color: :'#919191', - reservation_color: nil, }, { sym: 'MR', @@ -70,7 +66,6 @@ module Corporations coordinates: 'E9', 'text-color': 'white', color: '#000000', - reservation_color: nil, }, { sym: 'CBQ', @@ -83,7 +78,6 @@ module Corporations coordinates: 'G15', text_color: 'black', color: '#f48221', - reservation_color: nil, }, { sym: 'UP', @@ -96,7 +90,6 @@ module Corporations coordinates: 'H6', text_color: 'black', color: :'#ffffeb', - reservation_color: nil, abilities: [{ type: 'description', description: 'Tile Lay Blocked by GP' }], }, { @@ -110,7 +103,6 @@ module Corporations coordinates: 'F12', text_color: 'white', color: :'#00bfff', - reservation_color: nil, }, { sym: 'BAP', @@ -123,7 +115,6 @@ module Corporations coordinates: 'D6', text_color: 'black', color: '#FFF500', - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_18_neb/entities.rb b/lib/engine/game/g_18_neb/entities.rb new file mode 100644 index 0000000000..1d02b8c4ca --- /dev/null +++ b/lib/engine/game/g_18_neb/entities.rb @@ -0,0 +1,204 @@ +# frozen_string_literal: true + +module Engine + module Game + module G18Neb + module Entities + COMPANIES = [ + { + name: 'Denver Pacific Railroad', + value: 20, + revenue: 5, + desc: 'Once per game, allows Corporation owner to lay or upgrade a tile in B8', + sym: 'DPR', + abilities: [ + { + type: 'blocks_hexes', + owner_type: 'player', + remove: 3, # No tile may be placed on C7 until phase 3. + hexes: ['B8'], + }, + { + type: 'tile_lay', + owner_type: 'corporation', + hexes: ['B8'], + tiles: %w[3 4 5 80 81 82 83], + count: 1, + on_phase: 3, + }, + ], + }, + { + name: 'Morison Bridging Company', + value: 40, + revenue: 10, + desc: 'Corporation owner gets two bridge discount tokens', + sym: 'P2', + abilities: [ + { + type: 'tile_discount', + discount: 60, + terrain: 'water', + owner_type: 'corporation', + hexes: %w[K3 K5 K7 J8 L8 L10], + count: 2, + remove: 5, + }, + ], + }, + { + name: 'Armour and Company', + value: 70, + revenue: 15, + desc: 'An owning Corporation may place a cattle token in any Town or City', + sym: 'P3', + abilities: [ + { + type: 'assign_hexes', + hexes: %w[B6 C3 C7 C9 E7 F6 G7 G11 H8 H10 I3 I5 J8 J12 K3 K7 L10], + count: 1, + when: 'track_and_token', + owner_type: 'corporation', + }, + { type: 'hex_bonus', owner_type: 'corporation', amount: 20, hexes: [] }, + ], + }, + { + name: 'Central Pacific Railroad', + value: 100, + revenue: 15, + desc: 'May exchange for share in Colorado & Southern Railroad', + sym: 'P4', + abilities: [ + { + type: 'exchange', + corporations: ['C&S'], + owner_type: 'player', + when: 'owning_player_stock_round', + from: %w[ipo market], + }, + { + type: 'blocks_hexes', + owner_type: 'player', + hexes: ['C7'], + # on_phase: 3, + remove: 3, # No tile may be placed on C7 until phase 3. + }, + ], + }, + { + name: 'Crédit Mobilier', + value: 130, + revenue: 5, + desc: '$5 revenue each time ANY tile is laid or upgraded.', + sym: 'P5', + abilities: [ + { + type: 'tile_income', + income: 5, + }, + ], + }, + { + name: 'Union Pacific Railroad', + value: 175, + revenue: 25, + desc: 'Comes with President\'s Certificate of the Union Pacific Railroad', + sym: 'P6', + abilities: [ + { type: 'shares', shares: 'UP_0' }, + { type: 'close', when: 'bought_train', corporation: 'UP' }, + { type: 'no_buy' }, + ], + }, + ].freeze + + def corporation_opts + { always_market_price: true } + end + + CORPORATIONS = [ + { + float_percent: 20, + sym: 'UP', + name: 'Union Pacific', + logo: '18_neb/UP', + tokens: [0, 40, 100], + coordinates: 'K7', + color: '#376FFF', + }, + { + float_percent: 20, + sym: 'CBQ', + name: 'Chicago Burlington & Quincy', + logo: '18_neb/CBQ', + tokens: [0, 40, 100, 100], + coordinates: 'L6', + color: '#666666', + }, + { + float_percent: 20, + sym: 'CNW', + name: 'Chicago & Northwestern', + logo: '18_neb/CNW', + tokens: [0, 40, 100], + coordinates: 'L4', + color: '#2C9846', + }, + { + float_percent: 20, + sym: 'DRG', + name: 'Denver & Rio Grande', + logo: '18_neb/DRG', + tokens: [0, 40], + coordinates: 'C9', + color: '#D4AF37', + text_color: 'black', + }, + { + float_percent: 20, + sym: 'MP', + name: 'Missouri Pacific', + logo: '18_neb/MP', + tokens: [0, 40, 100], + coordinates: 'L12', + color: '#874301', + }, + { + float_percent: 20, + sym: 'C&S', + name: 'Colorado & Southern', + logo: '18_neb/CS', + tokens: [0, 40, 100, 100], + coordinates: 'A7', + color: '#AE4A84', + }, + { + float_percent: 40, + sym: 'OLB', + name: 'Omaha, Lincoln & Beatrice', + logo: '18_neb/OLB', + shares: [40, 20, 20, 20], + tokens: [0, 40], + coordinates: 'K7', + max_ownership_percent: 100, + color: '#F40003', + type: 'local', + }, + { + float_percent: 40, + sym: 'NR', + name: 'NebKota', + logo: '18_neb/NR', + shares: [40, 20, 20, 20], + tokens: [0, 40], + coordinates: 'C3', + max_ownership_percent: 100, + color: '#000000', + type: 'local', + }, + ].freeze + end + end + end +end diff --git a/lib/engine/game/g_18_neb/game.rb b/lib/engine/game/g_18_neb/game.rb index 132bd46cc6..36888eefd7 100644 --- a/lib/engine/game/g_18_neb/game.rb +++ b/lib/engine/game/g_18_neb/game.rb @@ -2,12 +2,16 @@ require_relative 'meta' require_relative '../base' +require_relative 'entities' +require_relative 'map' module Engine module Game module G18Neb class Game < Game::Base include_meta(G18Neb::Meta) + include Entities + include Map register_colors(black: '#37383a', orange: '#f48221', @@ -47,150 +51,6 @@ class Game < Game::Base BROWN_CITIES = %w[611].freeze GRAY_CITIES = %w[51].freeze - TILE_TYPE = :lawson - - # rubocop:disable Layout/LineLength - TILES = { - # Yellow - '3a' => - { - 'count' => 4, - 'color' => 'yellow', - 'code' => 'town=revenue:10,to_city:1;path=a:0,b:_0;path=a:_0,b:1', - }, - '4a' => - { - 'count' => 6, - 'color' => 'yellow', - 'code' => 'town=revenue:10,to_city:1;path=a:0,b:_0;path=a:_0,b:3', - }, - '58a' => - { - 'count' => 6, - 'color' => 'yellow', - 'code' => 'town=revenue:10,to_city:1;path=a:0,b:_0;path=a:_0,b:2', - }, - '7' => 4, - '8' => 14, - '9' => 14, - - # Green - '80' => 2, - '81' => 2, - '82' => 6, - '83' => 6, - # Single City green tiles - '226' => - { - 'count' => 2, - 'color' => 'green', - 'code' => 'city=revenue:30,slots:1;path=a:2,b:_0;path=a:3,b:_0;path=a:4,b:_0;path=a:6,b:_0', - }, - '227' => - { - 'count' => 2, - 'color' => 'green', - 'code' => 'city=revenue:30,slots:1;path=a:3,b:_0;path=a:4,b:_0;path=a:5,b:_0;path=a:6,b:_0', - }, - '228' => - { - 'count' => 2, - 'color' => 'green', - 'code' => 'city=revenue:30,slots:1;path=a:0,b:_0;path=a:1,b:_0;path=a:3,b:_0;path=a:4,b:_0', - }, - '229' => - { - 'count' => 1, - 'color' => 'green', - 'code' => 'city=revenue:40,slots:2;path=a:1,b:_0;path=a:2,b:_0;path=a:4,b:_0;path=a:5,b:_0;label=O', - }, - '407' => - { - 'count' => 1, - 'color' => 'green', - 'code' => 'city=revenue:40,slots:2;path=a:2,b:_0;path=a:3,b:_0;path=a:5,b:_0;path=a:5,b:_0;label=D', - }, - - # Brown - '544' => 2, - '545' => 2, - '546' => 2, - '611' => 6, - '230' => - { - 'count' => 1, - 'color' => 'brown', - 'code' => 'city=revenue:50,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;label=O', - }, - '233' => - { - 'count' => 2, - 'color' => 'brown', - '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;label=LC', - }, - '234' => - { - 'count' => 1, - 'color' => 'brown', - 'code' => 'city=revenue:50,slots:2;path=a:2,b:_0;path=a:3,b:_0;path=a:5,b:_0;label=D', - }, - - # Gray - '231' => - { - 'count' => 1, - 'color' => 'gray', - 'code' => 'city=revenue:60,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;label=O', - }, - '192' => - { - 'count' => 1, - 'color' => 'gray', - 'code' => 'city=revenue:50,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;label=C', - }, - '116' => - { - 'count' => 1, - 'color' => 'gray', - 'code' => 'city=revenue:60,slots:3;path=a:2,b:_0;path=a:3,b:_0;path=a:5,b:_0;label=D', - }, - '409' => - { - 'count' => 1, - 'color' => 'gray', - 'code' => 'city=revenue:50,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;label=L', - }, - '51' => 2, - }.freeze - # rubocop:enable Layout/LineLength - - LOCATION_NAMES = { - 'A5' => 'Powder River Basin', - 'A7' => 'West', - 'B2' => 'Pacific Northwest', - 'B6' => 'Scottsbluff', - 'C3' => 'Chadron', - 'C7' => 'Sidney', - 'C9' => 'Denver', - 'E7' => 'Sutherland', - 'F6' => 'North Platte', - 'G1' => 'Valentine', - 'G7' => 'Kearney', - 'G11' => 'McCook', - 'H8' => 'Grand Island', - 'H10' => 'Holdrege', - 'I3' => 'ONeill', - 'I5' => 'Norfolk', - 'J8' => 'Lincoln', - 'J12' => 'Beatrice', - 'K3' => 'South Sioux City', - 'K7' => 'Omaha', - 'L4' => 'Chicago Norh', - 'L6' => 'South Chicago', - 'L10' => 'Nebraska City', - 'L12' => 'Kansas City', - }.freeze - MARKET = [ %w[82 90 100 110 122 135 150 165 180 200 220 270 300 330 360 400], %w[75 82 90 100p 110 122 135 150 165 180 200 220 270 300 330 360], @@ -300,267 +160,6 @@ class Game < Game::Base }, ].freeze - COMPANIES = [ - { - name: 'Denver Pacific Railroad', - value: 20, - revenue: 5, - desc: 'Once per game, allows Corporation owner to lay or upgrade a tile in B8', - sym: 'DPR', - abilities: [ - { - type: 'blocks_hexes', - owner_type: 'player', - remove: 3, # No tile may be placed on C7 until phase 3. - hexes: ['B8'], - }, - { - type: 'tile_lay', - owner_type: 'corporation', - hexes: ['B8'], - tiles: %w[3 4 5 80 81 82 83], - count: 1, - on_phase: 3, - }, - ], - color: nil, - }, - { - name: 'Morison Bridging Company', - value: 40, - revenue: 10, - desc: 'Corporation owner gets two bridge discount tokens', - sym: 'P2', - abilities: [ - { - type: 'tile_discount', - discount: 60, - terrain: 'water', - owner_type: 'corporation', - hexes: %w[K3 K5 K7 J8 L8 L10], - count: 2, - remove: 5, - }, - ], - color: nil, - }, - { - name: 'Armour and Company', - value: 70, - revenue: 15, - desc: 'An owning Corporation may place a cattle token in any Town or City', - sym: 'P3', - abilities: [ - { - type: 'assign_hexes', - hexes: %w[B6 C3 C7 C9 E7 F6 G7 G11 H8 H10 I3 I5 J8 J12 K3 K7 L10], - count: 1, - when: 'track_and_token', - owner_type: 'corporation', - }, - { type: 'hex_bonus', owner_type: 'corporation', amount: 20, hexes: [] }, - ], - color: nil, - }, - { - name: 'Central Pacific Railroad', - value: 100, - revenue: 15, - desc: 'May exchange for share in Colorado & Southern Railroad', - sym: 'P4', - abilities: [ - { - type: 'exchange', - corporations: ['C&S'], - owner_type: 'player', - when: 'owning_player_stock_round', - from: %w[ipo market], - }, - { - type: 'blocks_hexes', - owner_type: 'player', - hexes: ['C7'], - # on_phase: 3, - remove: 3, # No tile may be placed on C7 until phase 3. - }, - ], - color: nil, - }, - { - name: 'Crédit Mobilier', - value: 130, - revenue: 5, - desc: '$5 revenue each time ANY tile is laid or upgraded.', - sym: 'P5', - abilities: [ - { - type: 'tile_income', - income: 5, - }, - ], - color: nil, - }, - { - name: 'Union Pacific Railroad', - value: 175, - revenue: 25, - desc: 'Comes with President\'s Certificate of the Union Pacific Railroad', - sym: 'P6', - abilities: [ - { type: 'shares', shares: 'UP_0' }, - { type: 'close', when: 'bought_train', corporation: 'UP' }, - { type: 'no_buy' }, - ], - color: nil, - }, - ].freeze - - CORPORATIONS = [ - { - float_percent: 20, - sym: 'UP', - name: 'Union Pacific', - logo: '18_neb/UP', - tokens: [0, 40, 100], - coordinates: 'K7', - color: '#376FFF', - always_market_price: true, - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'CBQ', - name: 'Chicago Burlington & Quincy', - logo: '18_neb/CBQ', - tokens: [0, 40, 100, 100], - coordinates: 'L6', - color: '#666666', - always_market_price: true, - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'CNW', - name: 'Chicago & Northwestern', - logo: '18_neb/CNW', - tokens: [0, 40, 100], - coordinates: 'L4', - color: '#2C9846', - always_market_price: true, - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'DRG', - name: 'Denver & Rio Grande', - logo: '18_neb/DRG', - tokens: [0, 40], - coordinates: 'C9', - color: '#D4AF37', - text_color: 'black', - always_market_price: true, - reservation_color: nil, - }, - { - float_percent: 20, - sym: 'MP', - name: 'Missouri Pacific', - logo: '18_neb/MP', - tokens: [0, 40, 100], - coordinates: 'L12', - color: '#874301', - reservation_color: nil, - always_market_price: true, - }, - { - float_percent: 20, - sym: 'C&S', - name: 'Colorado & Southern', - logo: '18_neb/CS', - tokens: [0, 40, 100, 100], - coordinates: 'A7', - color: '#AE4A84', - always_market_price: true, - reservation_color: nil, - }, - { - float_percent: 40, - sym: 'OLB', - name: 'Omaha, Lincoln & Beatrice', - logo: '18_neb/OLB', - shares: [40, 20, 20, 20], - tokens: [0, 40], - coordinates: 'K7', - max_ownership_percent: 100, - color: '#F40003', - type: 'local', - always_market_price: true, - reservation_color: nil, - }, - { - float_percent: 40, - sym: 'NR', - name: 'NebKota', - logo: '18_neb/NR', - shares: [40, 20, 20, 20], - tokens: [0, 40], - coordinates: 'C3', - max_ownership_percent: 100, - color: '#000000', - type: 'local', - always_market_price: true, - reservation_color: nil, - }, - ].freeze - - # rubocop:disable Layout/LineLength - HEXES = { - white: { - # empty tiles - %w[B4 B8 C5 D2 D4 D6 E3 E5 F2 F4 F8 F10 F12 G3 G5 G9 H2 H4 H6 H12 I7 I9 I11 J2 J4 J6 J10 K9 K11] => '', - %w[K5 L8] => 'upgrade=cost:60,terrain:water', - # town tiles - %w[B6 C3 C7 E7 F6 G7 G11 H8 H10 I3 I5 J12] => 'town=revenue:0', - %w[K3] => 'town=revenue:0;upgrade=cost:20,terrain:water', - %w[J8] => 'town=revenue:0;upgrade=cost:40,terrain:water', - %w[L10] => 'town=revenue:0;upgrade=cost:60,terrain:water', - }, - yellow: { - # city tiles - ['C9'] => 'city=revenue:30;path=a:5,b:_0', - # Omaha - ['K7'] => 'city=revenue:30,loc:5;town=revenue:10,loc:4,to_city:1;path=a:1,b:_1;path=a:_1,b:4;path=a:1,b:_0;upgrade=cost:60,terrain:water', - }, - gray: { - ['D8'] => 'path=a:5,b:2', - ['D10'] => 'path=a:4,b:2', - ['E9'] => 'junction;path=a:5,b:_0;path=a:_0,b:2;path=a:_0,b:1;path=a:_0,b:3', - ['I1'] => 'path=a:1,b:5', - ['K1'] => 'path=a:1,b:6', - ['K13'] => 'path=a:2,b:3', - ['M9'] => 'path=a:2,b:1', - }, - red: { - # Powder River Basin - ['A5'] => 'offboard=revenue:yellow_0|green_30|brown_60;path=a:4,b:_0;path=a:5,b:_0;path=a:0,b:_0;label=W', - # West - ['A7'] => 'city=revenue:yellow_30|green_40|brown_50;path=a:4,b:_0;path=a:5,b:_0;path=a:_0,b:3;label=W', - # Pacific NW - ['B2'] => 'offboard=revenue:yellow_30|green_40|brown_50;path=a:0,b:_0;path=a:5,b:_0;label=W', - # Valentine - ['G1'] => 'town=revenue:yellow_30|green_40|brown_50;path=a:0,b:_0;path=a:5,b:_0;path=a:1,b:_0', - # Chi North - ['L4'] => 'city=revenue:yellow_30|green_50|brown_60;path=a:1,b:_0,terminal:1;path=a:2,b:_0,terminal:1;label=E', - # South Chi - ['L6'] => 'city=revenue:yellow_20|green_40|brown_60;path=a:2,b:_0,terminal:1;path=a:0,b:_0,terminal:1;path=a:1,b:_0,terminal:1;label=E', - # KC - ['L12'] => 'city=revenue:yellow_30|green_50|brown_60;path=a:2,b:_0,terminal:1;path=a:3,b:_0,terminal:1;label=E', - }, - }.freeze - # rubocop:enable Layout/LineLength - - LAYOUT = :flat - EBUY_PRES_SWAP = false # allow presidential swaps of other corps when ebuying EBUY_OTHER_VALUE = false # allow ebuying other corp trains for up to face HOME_TOKEN_TIMING = :float # not :operating_round diff --git a/lib/engine/game/g_18_neb/map.rb b/lib/engine/game/g_18_neb/map.rb new file mode 100644 index 0000000000..f4f33864d7 --- /dev/null +++ b/lib/engine/game/g_18_neb/map.rb @@ -0,0 +1,201 @@ +# frozen_string_literal: true + +module Engine + module Game + module G18Neb + module Map + TILE_TYPE = :lawson + + # rubocop:disable Layout/LineLength + TILES = { + # Yellow + '3a' => + { + 'count' => 4, + 'color' => 'yellow', + 'code' => 'town=revenue:10,to_city:1;path=a:0,b:_0;path=a:_0,b:1', + }, + '4a' => + { + 'count' => 6, + 'color' => 'yellow', + 'code' => 'town=revenue:10,to_city:1;path=a:0,b:_0;path=a:_0,b:3', + }, + '58a' => + { + 'count' => 6, + 'color' => 'yellow', + 'code' => 'town=revenue:10,to_city:1;path=a:0,b:_0;path=a:_0,b:2', + }, + '7' => 4, + '8' => 14, + '9' => 14, + + # Green + '80' => 2, + '81' => 2, + '82' => 6, + '83' => 6, + # Single City green tiles + '226' => + { + 'count' => 2, + 'color' => 'green', + 'code' => 'city=revenue:30,slots:1;path=a:2,b:_0;path=a:3,b:_0;path=a:4,b:_0;path=a:6,b:_0', + }, + '227' => + { + 'count' => 2, + 'color' => 'green', + 'code' => 'city=revenue:30,slots:1;path=a:3,b:_0;path=a:4,b:_0;path=a:5,b:_0;path=a:6,b:_0', + }, + '228' => + { + 'count' => 2, + 'color' => 'green', + 'code' => 'city=revenue:30,slots:1;path=a:0,b:_0;path=a:1,b:_0;path=a:3,b:_0;path=a:4,b:_0', + }, + '229' => + { + 'count' => 1, + 'color' => 'green', + 'code' => 'city=revenue:40,slots:2;path=a:1,b:_0;path=a:2,b:_0;path=a:4,b:_0;path=a:5,b:_0;label=O', + }, + '407' => + { + 'count' => 1, + 'color' => 'green', + 'code' => 'city=revenue:40,slots:2;path=a:2,b:_0;path=a:3,b:_0;path=a:5,b:_0;path=a:5,b:_0;label=D', + }, + + # Brown + '544' => 2, + '545' => 2, + '546' => 2, + '611' => 6, + '230' => + { + 'count' => 1, + 'color' => 'brown', + 'code' => 'city=revenue:50,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;label=O', + }, + '233' => + { + 'count' => 2, + 'color' => 'brown', + '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;label=LC', + }, + '234' => + { + 'count' => 1, + 'color' => 'brown', + 'code' => 'city=revenue:50,slots:2;path=a:2,b:_0;path=a:3,b:_0;path=a:5,b:_0;label=D', + }, + + # Gray + '231' => + { + 'count' => 1, + 'color' => 'gray', + 'code' => 'city=revenue:60,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;label=O', + }, + '192' => + { + 'count' => 1, + 'color' => 'gray', + 'code' => 'city=revenue:50,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;label=C', + }, + '116' => + { + 'count' => 1, + 'color' => 'gray', + 'code' => 'city=revenue:60,slots:3;path=a:2,b:_0;path=a:3,b:_0;path=a:5,b:_0;label=D', + }, + '409' => + { + 'count' => 1, + 'color' => 'gray', + 'code' => 'city=revenue:50,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;label=L', + }, + '51' => 2, + }.freeze + # rubocop:enable Layout/LineLength + + LOCATION_NAMES = { + 'A5' => 'Powder River Basin', + 'A7' => 'West', + 'B2' => 'Pacific Northwest', + 'B6' => 'Scottsbluff', + 'C3' => 'Chadron', + 'C7' => 'Sidney', + 'C9' => 'Denver', + 'E7' => 'Sutherland', + 'F6' => 'North Platte', + 'G1' => 'Valentine', + 'G7' => 'Kearney', + 'G11' => 'McCook', + 'H8' => 'Grand Island', + 'H10' => 'Holdrege', + 'I3' => 'ONeill', + 'I5' => 'Norfolk', + 'J8' => 'Lincoln', + 'J12' => 'Beatrice', + 'K3' => 'South Sioux City', + 'K7' => 'Omaha', + 'L4' => 'Chicago Norh', + 'L6' => 'South Chicago', + 'L10' => 'Nebraska City', + 'L12' => 'Kansas City', + }.freeze + + # rubocop:disable Layout/LineLength + HEXES = { + white: { + # empty tiles + %w[B4 B8 C5 D2 D4 D6 E3 E5 F2 F4 F8 F10 F12 G3 G5 G9 H2 H4 H6 H12 I7 I9 I11 J2 J4 J6 J10 K9 K11] => '', + %w[K5 L8] => 'upgrade=cost:60,terrain:water', + # town tiles + %w[B6 C3 C7 E7 F6 G7 G11 H8 H10 I3 I5 J12] => 'town=revenue:0', + %w[K3] => 'town=revenue:0;upgrade=cost:20,terrain:water', + %w[J8] => 'town=revenue:0;upgrade=cost:40,terrain:water', + %w[L10] => 'town=revenue:0;upgrade=cost:60,terrain:water', + }, + yellow: { + # city tiles + ['C9'] => 'city=revenue:30;path=a:5,b:_0', + # Omaha + ['K7'] => 'city=revenue:30,loc:5;town=revenue:10,loc:4,to_city:1;path=a:1,b:_1;path=a:_1,b:4;path=a:1,b:_0;upgrade=cost:60,terrain:water', + }, + gray: { + ['D8'] => 'path=a:5,b:2', + ['D10'] => 'path=a:4,b:2', + ['E9'] => 'junction;path=a:5,b:_0;path=a:_0,b:2;path=a:_0,b:1;path=a:_0,b:3', + ['I1'] => 'path=a:1,b:5', + ['K1'] => 'path=a:1,b:6', + ['K13'] => 'path=a:2,b:3', + ['M9'] => 'path=a:2,b:1', + }, + red: { + # Powder River Basin + ['A5'] => 'offboard=revenue:yellow_0|green_30|brown_60;path=a:4,b:_0;path=a:5,b:_0;path=a:0,b:_0;label=W', + # West + ['A7'] => 'city=revenue:yellow_30|green_40|brown_50;path=a:4,b:_0;path=a:5,b:_0;path=a:_0,b:3;label=W', + # Pacific NW + ['B2'] => 'offboard=revenue:yellow_30|green_40|brown_50;path=a:0,b:_0;path=a:5,b:_0;label=W', + # Valentine + ['G1'] => 'town=revenue:yellow_30|green_40|brown_50;path=a:0,b:_0;path=a:5,b:_0;path=a:1,b:_0', + # Chi North + ['L4'] => 'city=revenue:yellow_30|green_50|brown_60;path=a:1,b:_0,terminal:1;path=a:2,b:_0,terminal:1;label=E', + # South Chi + ['L6'] => 'city=revenue:yellow_20|green_40|brown_60;path=a:2,b:_0,terminal:1;path=a:0,b:_0,terminal:1;path=a:1,b:_0,terminal:1;label=E', + # KC + ['L12'] => 'city=revenue:yellow_30|green_50|brown_60;path=a:2,b:_0,terminal:1;path=a:3,b:_0,terminal:1;label=E', + }, + }.freeze + # rubocop:enable Layout/LineLength + + LAYOUT = :flat + end + end + end +end diff --git a/lib/engine/game/g_18_new_england_north/entities.rb b/lib/engine/game/g_18_new_england_north/entities.rb index 2119de98d4..4361c66c51 100644 --- a/lib/engine/game/g_18_new_england_north/entities.rb +++ b/lib/engine/game/g_18_new_england_north/entities.rb @@ -130,7 +130,6 @@ module Entities shares: [100], type: 'minor', capitalization: :incremental, - reservation_color: nil, }, { sym: 'CP', @@ -144,7 +143,6 @@ module Entities shares: [100], type: 'minor', capitalization: :incremental, - reservation_color: nil, }, { sym: 'K&P', @@ -173,7 +171,6 @@ module Entities shares: [100], type: 'minor', capitalization: :incremental, - reservation_color: nil, }, { sym: 'AK', @@ -187,7 +184,6 @@ module Entities shares: [100], type: 'minor', capitalization: :incremental, - reservation_color: nil, }, { sym: 'P&R', @@ -201,7 +197,6 @@ module Entities shares: [100], type: 'minor', capitalization: :incremental, - reservation_color: nil, }, { sym: 'RW', @@ -215,7 +210,6 @@ module Entities shares: [100], type: 'minor', capitalization: :incremental, - reservation_color: nil, }, { sym: 'BCM', @@ -229,7 +223,6 @@ module Entities shares: [100], type: 'minor', capitalization: :incremental, - reservation_color: nil, }, { sym: 'CC', @@ -243,7 +236,6 @@ module Entities shares: [100], type: 'minor', capitalization: :incremental, - reservation_color: nil, }, { sym: 'PSP', @@ -258,7 +250,6 @@ module Entities shares: [100], type: 'minor', capitalization: :incremental, - reservation_color: nil, }, { sym: 'BR', @@ -272,7 +263,6 @@ module Entities shares: [100], type: 'minor', capitalization: :incremental, - reservation_color: nil, }, { sym: 'RB', @@ -286,7 +276,6 @@ module Entities shares: [100], type: 'minor', capitalization: :incremental, - reservation_color: nil, }, { sym: 'PC', @@ -301,7 +290,6 @@ module Entities shares: [100], type: 'minor', capitalization: :incremental, - reservation_color: nil, }, { sym: 'VV', @@ -315,7 +303,6 @@ module Entities shares: [100], type: 'minor', capitalization: :incremental, - reservation_color: nil, }, ].freeze diff --git a/lib/engine/game/g_18_ny/entities.rb b/lib/engine/game/g_18_ny/entities.rb index e3e54675e6..0186932e77 100644 --- a/lib/engine/game/g_18_ny/entities.rb +++ b/lib/engine/game/g_18_ny/entities.rb @@ -135,7 +135,6 @@ module Entities max_ownership_percent: 100, coordinates: 'F20', color: '#000000', - reservation_color: nil, }, { name: 'Utica and Schenectady Railroad', @@ -149,7 +148,6 @@ module Entities max_ownership_percent: 100, coordinates: 'E19', color: '#000000', - reservation_color: nil, }, { name: 'Tonawanda Railroad', @@ -163,7 +161,6 @@ module Entities max_ownership_percent: 100, coordinates: 'D8', color: '#000000', - reservation_color: nil, }, { name: 'Syracuse and Utica Railroad', @@ -177,7 +174,6 @@ module Entities max_ownership_percent: 100, coordinates: 'E15', color: '#000000', - reservation_color: nil, }, { name: 'Auburn and Rochester Railroad', @@ -191,7 +187,6 @@ module Entities max_ownership_percent: 100, coordinates: 'E11', color: '#000000', - reservation_color: nil, }, { name: 'Attica and Buffalo Railroad', @@ -205,7 +200,6 @@ module Entities max_ownership_percent: 100, coordinates: 'E3', color: '#000000', - reservation_color: nil, }, { name: 'Schenectady and Troy Railroad', @@ -219,7 +213,6 @@ module Entities max_ownership_percent: 100, coordinates: 'E21', color: '#000000', - reservation_color: nil, }, { name: 'Rochester, Lockport, and Niagara Falls Railroad', @@ -233,7 +226,6 @@ module Entities max_ownership_percent: 100, coordinates: 'D2', color: '#000000', - reservation_color: nil, }, { name: 'Buffalo and Lockport Railroad', @@ -247,7 +239,6 @@ module Entities max_ownership_percent: 100, coordinates: 'D4', color: '#000000', - reservation_color: nil, }, { name: 'Rochester and Syracuse Railroad', @@ -261,7 +252,6 @@ module Entities max_ownership_percent: 100, coordinates: 'D12', color: '#000000', - reservation_color: nil, }, { name: 'Buffalo and Rochester Railroad', @@ -275,7 +265,6 @@ module Entities max_ownership_percent: 100, coordinates: 'E5', color: '#000000', - reservation_color: nil, }, { name: 'Delaware & Hudson Railroad', @@ -288,7 +277,6 @@ module Entities float_percent: 20, coordinates: 'H14', color: '#2E3192', - reservation_color: nil, }, { name: 'Rome, Watertown, and Ogdensburg Railroad', @@ -301,7 +289,6 @@ module Entities float_percent: 20, coordinates: 'D14', color: '#07733D', - reservation_color: nil, }, { name: 'New York and Harlem Railroad', @@ -314,7 +301,6 @@ module Entities float_percent: 20, coordinates: 'J20', color: '#8C4776', - reservation_color: nil, }, { name: 'New York, New Haven, & Hartford Railroad', @@ -327,7 +313,6 @@ module Entities float_percent: 20, coordinates: 'I25', color: '#E96B21', - reservation_color: nil, }, { name: 'Erie Railroad', @@ -341,7 +326,6 @@ module Entities coordinates: 'E3', color: '#FFF200', text_color: 'black', - reservation_color: nil, }, { name: 'Boston and Albany Railroad', @@ -354,7 +338,6 @@ module Entities float_percent: 20, coordinates: 'F26', color: '#E21F27', - reservation_color: nil, }, { name: 'Hudson River Railroad', @@ -368,7 +351,6 @@ module Entities coordinates: 'H20', color: '#8DD8F8', text_color: 'black', - reservation_color: nil, }, { name: 'New York Central Railroad', @@ -380,7 +362,6 @@ module Entities always_market_price: true, floatable: false, color: '#231F20', - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_18_ny/step/buy_sell_par_shares.rb b/lib/engine/game/g_18_ny/step/buy_sell_par_shares.rb index 8e7dff9c44..e92276ffb9 100644 --- a/lib/engine/game/g_18_ny/step/buy_sell_par_shares.rb +++ b/lib/engine/game/g_18_ny/step/buy_sell_par_shares.rb @@ -84,7 +84,7 @@ def can_sell?(entity, bundle) super end - def can_bid?(entity) + def can_bid_any?(entity) return false if max_bid(entity) < MIN_BID || bought? @game.corporations.any? { |c| c.type == :minor && @game.can_par?(c, entity) } diff --git a/lib/engine/game/g_18_ny_1e/entities.rb b/lib/engine/game/g_18_ny_1e/entities.rb index 1388b73efe..0e5f9b8c78 100644 --- a/lib/engine/game/g_18_ny_1e/entities.rb +++ b/lib/engine/game/g_18_ny_1e/entities.rb @@ -135,7 +135,6 @@ module Entities max_ownership_percent: 100, coordinates: 'F20', color: '#000000', - reservation_color: nil, }, { name: 'Utica and Schenectady Railroad', @@ -149,7 +148,6 @@ module Entities max_ownership_percent: 100, coordinates: 'E19', color: '#000000', - reservation_color: nil, }, { name: 'Tonawanda Railroad', @@ -163,7 +161,6 @@ module Entities max_ownership_percent: 100, coordinates: 'D8', color: '#000000', - reservation_color: nil, }, { name: 'Syracuse and Utica Railroad', @@ -177,7 +174,6 @@ module Entities max_ownership_percent: 100, coordinates: 'E15', color: '#000000', - reservation_color: nil, }, { name: 'Auburn and Rochester Railroad', @@ -191,7 +187,6 @@ module Entities max_ownership_percent: 100, coordinates: 'E11', color: '#000000', - reservation_color: nil, }, { name: 'Attica and Buffalo Railroad', @@ -205,7 +200,6 @@ module Entities max_ownership_percent: 100, coordinates: 'E3', color: '#000000', - reservation_color: nil, }, { name: 'Schenectady and Troy Railroad', @@ -219,7 +213,6 @@ module Entities max_ownership_percent: 100, coordinates: 'E21', color: '#000000', - reservation_color: nil, }, { name: 'Rochester, Lockport, and Niagara Falls Railroad', @@ -233,7 +226,6 @@ module Entities max_ownership_percent: 100, coordinates: 'D2', color: '#000000', - reservation_color: nil, }, { name: 'Buffalo and Lockport Railroad', @@ -247,7 +239,6 @@ module Entities max_ownership_percent: 100, coordinates: 'D4', color: '#000000', - reservation_color: nil, }, { name: 'Rochester and Syracuse Railroad', @@ -261,7 +252,6 @@ module Entities max_ownership_percent: 100, coordinates: 'D12', color: '#000000', - reservation_color: nil, }, { name: 'Buffalo and Rochester Railroad', @@ -275,7 +265,6 @@ module Entities max_ownership_percent: 100, coordinates: 'E5', color: '#000000', - reservation_color: nil, }, { name: 'Delaware & Hudson Railroad', @@ -288,7 +277,6 @@ module Entities float_percent: 20, coordinates: 'H14', color: '#2E3192', - reservation_color: nil, }, { name: 'Rome, Watertown, and Ogdensburg Railroad', @@ -301,7 +289,6 @@ module Entities float_percent: 20, coordinates: 'D14', color: '#07733D', - reservation_color: nil, }, { name: 'New York and Harlem Railroad', @@ -314,7 +301,6 @@ module Entities float_percent: 20, coordinates: 'J20', color: '#8C4776', - reservation_color: nil, }, { name: 'New York, New Haven, & Hartford Railroad', @@ -327,7 +313,6 @@ module Entities float_percent: 20, coordinates: 'I25', color: '#E96B21', - reservation_color: nil, }, { name: 'Erie Railroad', @@ -341,7 +326,6 @@ module Entities coordinates: 'E3', color: '#FFF200', text_color: 'black', - reservation_color: nil, }, { name: 'Boston and Albany Railroad', @@ -354,7 +338,6 @@ module Entities float_percent: 20, coordinates: 'F26', color: '#E21F27', - reservation_color: nil, }, { name: 'Hudson River Railroad', @@ -368,7 +351,6 @@ module Entities coordinates: 'H20', color: '#8DD8F8', text_color: 'black', - reservation_color: nil, }, { name: 'New York Central Railroad', @@ -380,7 +362,6 @@ module Entities always_market_price: true, floatable: false, color: '#231F20', - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_18_texas/entities.rb b/lib/engine/game/g_18_texas/entities.rb index 26e93d1c4c..79a8dea2e7 100644 --- a/lib/engine/game/g_18_texas/entities.rb +++ b/lib/engine/game/g_18_texas/entities.rb @@ -91,7 +91,6 @@ module Entities coordinates: 'D9', color: 'darkmagenta', text_color: 'white', - reservation_color: nil, always_market_price: true, }, { @@ -103,7 +102,6 @@ module Entities coordinates: 'B11', color: 'green', text_color: 'white', - reservation_color: nil, always_market_price: true, }, { @@ -115,7 +113,6 @@ module Entities coordinates: 'I14', color: 'orange', text_color: 'white', - reservation_color: nil, always_market_price: true, }, { @@ -127,7 +124,6 @@ module Entities coordinates: 'G10', color: 'red', text_color: 'white', - reservation_color: nil, always_market_price: true, }, { @@ -139,7 +135,6 @@ module Entities coordinates: 'D15', color: 'blue', text_color: 'white', - reservation_color: nil, always_market_price: true, }, { @@ -151,7 +146,6 @@ module Entities coordinates: 'J5', color: 'black', text_color: 'white', - reservation_color: nil, always_market_price: true, }, ].freeze diff --git a/lib/engine/game/g_18_tokaido/entities.rb b/lib/engine/game/g_18_tokaido/entities.rb index 00e6b23af5..12015d2425 100644 --- a/lib/engine/game/g_18_tokaido/entities.rb +++ b/lib/engine/game/g_18_tokaido/entities.rb @@ -105,7 +105,6 @@ module Entities coordinates: 'I9', color: '#ef2f2f', text_color: 'white', - reservation_color: nil, }, { float_percent: 60, @@ -117,7 +116,6 @@ module Entities coordinates: 'B12', color: '#ef8f2f', text_color: 'black', - reservation_color: nil, }, { float_percent: 60, @@ -130,7 +128,6 @@ module Entities city: 1, color: '#2f7f2f', text_color: 'white', - reservation_color: nil, }, { float_percent: 60, @@ -142,7 +139,6 @@ module Entities coordinates: 'F8', color: '#2f2f9f', text_color: 'white', - reservation_color: nil, }, { float_percent: 60, @@ -155,7 +151,6 @@ module Entities city: 1, color: 'black', text_color: 'white', - reservation_color: nil, }, { float_percent: 60, @@ -167,7 +162,6 @@ module Entities coordinates: 'J2', color: '#efef4f', text_color: 'black', - reservation_color: nil, }, { float_percent: 60, @@ -179,7 +173,6 @@ module Entities coordinates: 'F4', color: '#7f9f9f', text_color: 'white', - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_18_usa/entities.rb b/lib/engine/game/g_18_usa/entities.rb index 6ddbc8a425..f1e66f82af 100644 --- a/lib/engine/game/g_18_usa/entities.rb +++ b/lib/engine/game/g_18_usa/entities.rb @@ -815,7 +815,6 @@ module Entities always_market_price: true, color: '#7090c9', text_color: 'White', - reservation_color: nil, }, { float_percent: 20, @@ -828,7 +827,6 @@ module Entities tokens: [0], always_market_price: true, color: '#025aaa', - reservation_color: nil, }, { float_percent: 20, @@ -842,7 +840,6 @@ module Entities always_market_price: true, color: '#ADD8E6', text_color: 'black', - reservation_color: nil, }, { float_percent: 20, @@ -856,7 +853,6 @@ module Entities always_market_price: true, color: 'Sienna', text_color: 'White', - reservation_color: nil, }, { float_percent: 20, @@ -870,7 +866,6 @@ module Entities always_market_price: true, color: 'LightSkyBlue', text_color: 'Black', - reservation_color: nil, }, { float_percent: 20, @@ -883,7 +878,6 @@ module Entities tokens: [0], always_market_price: true, color: '#32763f', - reservation_color: nil, }, { float_percent: 20, @@ -896,7 +890,6 @@ module Entities tokens: [0], always_market_price: true, color: 'Red', - reservation_color: nil, }, { float_percent: 20, @@ -910,7 +903,6 @@ module Entities always_market_price: true, color: 'Gray', text_color: 'White', - reservation_color: nil, }, { float_percent: 20, @@ -923,7 +915,6 @@ module Entities tokens: [0], always_market_price: true, color: '#018471', - reservation_color: nil, }, { float_percent: 20, @@ -936,7 +927,6 @@ module Entities tokens: [0], always_market_price: true, color: 'Indigo', - reservation_color: nil, }, { float_percent: 20, @@ -949,7 +939,6 @@ module Entities tokens: [0], always_market_price: true, color: '#110a0c', - reservation_color: nil, }, { float_percent: 20, @@ -962,7 +951,6 @@ module Entities tokens: [0], always_market_price: true, color: 'DarkRed', - reservation_color: nil, }, { float_percent: 20, @@ -975,7 +963,6 @@ module Entities tokens: [0], always_market_price: true, color: 'Black', - reservation_color: nil, }, { float_percent: 20, @@ -989,7 +976,6 @@ module Entities always_market_price: true, color: 'YellowGreen', text_color: 'Black', - reservation_color: nil, }, { float_percent: 20, @@ -1002,7 +988,6 @@ module Entities tokens: [0], always_market_price: true, color: '#f48221', - reservation_color: nil, }, { float_percent: 20, @@ -1015,7 +1000,6 @@ module Entities tokens: [0], always_market_price: true, color: 'ForestGreen', - reservation_color: nil, }, { float_percent: 20, @@ -1028,7 +1012,6 @@ module Entities tokens: [0], always_market_price: true, color: '#d02020', - reservation_color: nil, }, { float_percent: 20, @@ -1041,7 +1024,6 @@ module Entities tokens: [0], always_market_price: true, color: 'Purple', - reservation_color: nil, }, { float_percent: 20, @@ -1055,7 +1037,6 @@ module Entities always_market_price: true, color: 'Gold', text_color: 'black', - reservation_color: nil, }, { float_percent: 20, @@ -1068,7 +1049,6 @@ module Entities tokens: [0], always_market_price: true, color: 'Brown', - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_18_va/entities.rb b/lib/engine/game/g_18_va/entities.rb index a532197782..0dd18a9933 100644 --- a/lib/engine/game/g_18_va/entities.rb +++ b/lib/engine/game/g_18_va/entities.rb @@ -100,7 +100,6 @@ module Entities color: '#025aaa', type: 'ten_share', always_market_price: true, - reservation_color: nil, }, { float_percent: 40, @@ -115,7 +114,6 @@ module Entities text_color: 'black', type: 'five_share', always_market_price: true, - reservation_color: nil, }, { float_percent: 40, @@ -130,7 +128,6 @@ module Entities color: '#76a042', type: 'five_share', always_market_price: true, - reservation_color: nil, }, { float_percent: 40, @@ -145,7 +142,6 @@ module Entities color: '#7b352a', type: 'five_share', always_market_price: true, - reservation_color: nil, }, { float_percent: 40, @@ -159,7 +155,6 @@ module Entities color: '#f48221', type: 'five_share', always_market_price: true, - reservation_color: nil, }, { float_percent: 40, @@ -173,7 +168,6 @@ module Entities color: '#d81e3e', type: 'five_share', always_market_price: true, - reservation_color: nil, }, { float_percent: 40, @@ -187,7 +181,6 @@ module Entities color: :purple, type: 'five_share', always_market_price: true, - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_18_west/entities.rb b/lib/engine/game/g_18_west/entities.rb index f5f2c06fdf..6aabf36a93 100644 --- a/lib/engine/game/g_18_west/entities.rb +++ b/lib/engine/game/g_18_west/entities.rb @@ -18,7 +18,6 @@ module Entities coordinates: 'F21', color: '#efe73f', text_color: 'black', - reservation_color: nil, }, { float_percent: 60, @@ -32,7 +31,6 @@ module Entities city: 0, color: '#bfd7ff', text_color: 'black', - reservation_color: nil, }, { float_percent: 60, @@ -45,7 +43,6 @@ module Entities coordinates: 'G14', color: '#af6f2f', text_color: 'white', - reservation_color: nil, }, { float_percent: 60, @@ -58,7 +55,6 @@ module Entities coordinates: 'K20', color: '#8f3f8f', text_color: 'white', - reservation_color: nil, }, { float_percent: 60, @@ -72,7 +68,6 @@ module Entities city: 1, color: '#ffaf2f', text_color: 'black', - reservation_color: nil, }, { float_percent: 60, @@ -85,7 +80,6 @@ module Entities coordinates: 'A4', color: '#000', text_color: 'white', - reservation_color: nil, }, { float_percent: 60, @@ -99,7 +93,6 @@ module Entities city: 1, color: '#9f9fcf', text_color: 'white', - reservation_color: nil, }, { float_percent: 60, @@ -113,7 +106,6 @@ module Entities city: 0, color: '#007fbf', text_color: 'white', - reservation_color: nil, }, { float_percent: 60, @@ -126,7 +118,6 @@ module Entities coordinates: 'L21', color: '#009f00', text_color: 'white', - reservation_color: nil, }, { float_percent: 60, @@ -140,7 +131,6 @@ module Entities city: 0, color: '#9f9f9f', text_color: 'white', - reservation_color: nil, }, { float_percent: 60, @@ -154,7 +144,6 @@ module Entities city: 0, color: '#3f009f', text_color: 'white', - reservation_color: nil, }, { float_percent: 60, @@ -167,7 +156,6 @@ module Entities coordinates: 'E26', color: '#ef7f00', text_color: 'black', - reservation_color: nil, }, { float_percent: 60, @@ -180,7 +168,6 @@ module Entities coordinates: 'I26', color: '#af7faf', text_color: 'white', - reservation_color: nil, }, { float_percent: 60, @@ -193,7 +180,6 @@ module Entities coordinates: 'F25', color: '#9f4f0f', text_color: 'white', - reservation_color: nil, }, { float_percent: 60, @@ -207,7 +193,6 @@ module Entities city: 1, color: '#ef3f3f', text_color: 'white', - reservation_color: nil, }, { float_percent: 60, @@ -221,7 +206,6 @@ module Entities city: 1, color: '#bfbf00', text_color: 'black', - reservation_color: nil, }, ].freeze end diff --git a/lib/engine/game/g_2038/entities.rb b/lib/engine/game/g_2038/entities.rb new file mode 100644 index 0000000000..c806704647 --- /dev/null +++ b/lib/engine/game/g_2038/entities.rb @@ -0,0 +1,417 @@ +# frozen_string_literal: true + +module Engine + module Game + module G2038 + module Entities + COMPANIES = [ + { + name: 'Planetary Imports', + sym: 'PI', + value: 50, + revenue: 10, + desc: 'No special abilities', + color: nil, + }, + { + name: 'Fast Buck', + sym: 'FB', + value: 100, + revenue: 0, + desc: 'May form a Growth Corporation OR join the Asteroid League for 1 share.', + abilities: [ + { type: 'no_buy' }, + { + type: 'exchange', + corporations: ['AL'], + owner_type: 'player', + from: 'market', + when: ['Phase 3', 'Phase 4'], + }, + ], + color: 'white', + }, + { + name: 'Ice Finder', + sym: 'IF', + value: 100, + revenue: 0, + desc: 'May form a Growth Corporation OR join the Asteroid League for 1 share.', + abilities: [ + { type: 'no_buy' }, + { + type: 'exchange', + corporations: ['AL'], + owner_type: 'player', + from: 'market', + when: ['Phase 3', 'Phase 4'], + }, + ], + color: 'white', + }, + { + name: 'Drill Hound', + sym: 'DH', + value: 100, + revenue: 0, + desc: 'May form a Growth Corporation OR join the Asteroid League for 1 share.', + abilities: [ + { type: 'no_buy' }, + { + type: 'exchange', + corporations: ['AL'], + owner_type: 'player', + from: 'market', + when: ['Phase 3', 'Phase 4'], + }, + ], + color: 'white', + }, + { + name: 'Ore Crusher', + sym: 'OC', + value: 100, + revenue: 0, + desc: 'May form a Growth Corporation OR join the Asteroid League for 1 share.', + abilities: [ + { type: 'no_buy' }, + { + type: 'exchange', + corporations: ['AL'], + owner_type: 'player', + from: 'market', + when: ['Phase 3', 'Phase 4'], + }, + ], + color: 'white', + }, + { + name: 'Torch', + sym: 'TT', + value: 100, + revenue: 0, + desc: 'May form a Growth Corporation OR join the Asteroid League for 1 share.', + abilities: [ + { type: 'no_buy' }, + { + type: 'exchange', + corporations: ['AL'], + owner_type: 'player', + from: 'market', + when: ['Phase 3', 'Phase 4'], + }, + ], + color: 'white', + }, + { + name: 'Lucky', + sym: 'LY', + value: 100, + revenue: 0, + desc: 'May form a Growth Corporation OR join the Asteroid League for 1 share.', + abilities: [ + { type: 'no_buy' }, + { + type: 'exchange', + corporations: ['AL'], + owner_type: 'player', + from: 'market', + when: ['Phase 3', 'Phase 4'], + }, + ], + color: 'white', + }, + { + name: 'Tunnel Systems', + sym: 'TS', + value: 120, + revenue: 5, + desc: 'Buyer recieves a TSI Share. If owned by a corporation, may place 1 free Base on ANY'\ + ' explored and unclaimed tile.', + abilities: [ + { type: 'shares', shares: 'TSI_3' }, + { + type: 'tile_lay', + owner_type: 'corporation', + tiles: ['1'], + when: 'owning_corp_or_turn', + count: 1, + }, + ], + color: nil, + }, + { + name: 'Vacuum Associates', + sym: 'VA', + value: 140, + revenue: 10, + desc: 'Buyer recieves a TSI Share. If owned by a corporation, may place 1 free'\ + ' Refueling Station within range.', + abilities: [ + { type: 'shares', shares: 'TSI_2' }, + { + type: 'tile_lay', + owner_type: 'corporation', + tiles: ['2'], + when: 'owning_corp_or_turn', + count: 1, + }, + ], + color: nil, + }, + { + name: 'Robot Smelters, Inc.', + sym: 'RS', + value: 160, + revenue: 15, + desc: 'Buyer recieves a TSI Share. If owned by a corporation, may place 1 free Claim within range.', + abilities: [ + { type: 'shares', shares: 'TSI_1' }, + { + type: 'tile_lay', + owner_type: 'corporation', + tiles: ['3'], + when: 'owning_corp_or_turn', + count: 1, + }, + ], + color: nil, + }, + { + name: 'Space Transportation Co.', + sym: 'ST', + value: 180, + revenue: 20, + desc: "Buyer recieves TSI president's Share and flies probe if TSI isn't active. May not be owned"\ + ' by a corporation. Remove from the game after TSI buys a spaceship.', + abilities: [ + { type: 'shares', shares: 'TSI_0' }, + { type: 'no_buy' }, + { type: 'close', when: 'bought_train', corporation: 'TSI' }, + ], + color: nil, + }, + { + name: 'Asteroid Export Co.', + sym: 'AE', + value: 180, + revenue: 30, + desc: "Forms Asteroid League, receiving its President's certificate. May not be bought by a"\ + ' corporation. Remove from the game after AL aquires a spaceship.', + abilities: [ + { type: 'close', when: 'bought_train', corporation: 'AL' }, + { type: 'no_buy' }, + { + type: 'shares', + shares: 'AL_0', + when: ['Phase 3', 'Phase 4'], + }, + ], + color: nil, + }, + ].freeze + + MINORS = [ + { + sym: 'FB', + name: 'Fast Buck', + value: 100, + coordinates: 'G7', + logo: '18_eu/1', + tokens: [60, 100], + color: 'black', + text_color: 'white', + abilities: [ + { + type: 'exchange', + corporations: %w[RU VP MM LE OPC RCC AL], + owner_type: 'player', + from: 'ipo', + }, + ], + }, + { + sym: 'IF', + name: 'Ice Finder', + value: 100, + coordinates: 'G7', + logo: '18_eu/2', + tokens: [60, 100], + color: 'black', + text_color: 'white', + abilities: [ + { + type: 'exchange', + corporations: %w[RU VP MM LE OPC RCC AL], + owner_type: 'player', + from: 'ipo', + }, + ], + }, + { + sym: 'DH', + name: 'Drill Hound', + value: 100, + coordinates: 'D14', + logo: '18_eu/3', + tokens: [60, 100], + color: 'black', + text_color: 'white', + abilities: [ + { + type: 'exchange', + corporations: %w[RU VP MM LE OPC RCC AL], + owner_type: 'player', + from: 'ipo', + }, + ], + }, + { + sym: 'OC', + name: 'Ore Crusher', + value: 100, + coordinates: 'M5', + logo: '18_eu/4', + tokens: [60, 100], + color: 'black', + text_color: 'white', + abilities: [ + { + type: 'exchange', + corporations: %w[RU VP MM LE OPC RCC AL], + owner_type: 'player', + from: 'ipo', + }, + ], + }, + { + sym: 'TT', + name: 'Torch', + value: 100, + coordinates: 'B6', + logo: '18_eu/5', + tokens: [60, 100], + color: 'black', + text_color: 'white', + abilities: [ + { + type: 'exchange', + corporations: %w[RU VP MM LE OPC RCC AL], + owner_type: 'player', + from: 'ipo', + }, + ], + }, + { + sym: 'LY', + name: 'Lucky', + value: 100, + coordinates: 'H14', + logo: '18_eu/6', + tokens: [60, 100], + color: 'black', + text_color: 'white', + abilities: [ + { + type: 'exchange', + corporations: %w[RU VP MM LE OPC RCC AL], + owner_type: 'player', + from: 'ipo', + }, + ], + }, + ].freeze + + def corporation_opts + { float_percent: 50 } + end + + # TODO: corp logos + CORPORATIONS = [ + { + sym: 'TSI', + name: 'Trans-Space Incorporated', + logo: '18_chesapeake/PRR', + simple_logo: '1830/PRR.alt', + tokens: [60, 100, 60, 100, 60, 100, 60, 100, 60, 100], + coordinates: 'K9', + color: '#40b1b9', + type: 'group_a', + }, + { + sym: 'RU', + name: 'Resources Unlimited', + logo: '18_chesapeake/PRR', + simple_logo: '1830/PRR.alt', + tokens: [0, 100, 0, 100, 0, 100, 0, 100, 0, 100, 0, 100], + coordinates: 'D8', + color: '#d57e59', + type: 'group_a', + }, + { + sym: 'VP', + name: 'Venus Prospectors Limited', + logo: '1830/NYC', + simple_logo: '1830/NYC.alt', + tokens: [60, 100, 60, 100, 60], + coordinates: 'J1', + color: :'#3eb75b', + type: 'group_b', + }, + { + sym: 'LE', + name: 'Lunar Enterprises', + logo: '1830/CPR', + simple_logo: '1830/CPR.alt', + tokens: [60, 100, 60, 100, 60, 100, 60, 100, 60], + coordinates: 'O1', + color: '#fefc5d', + type: 'group_b', + }, + { + sym: 'MM', + name: 'Mars Mining', + logo: '18_chesapeake/BO', + simple_logo: '1830/BO.alt', + tokens: [60, 100, 60, 100, 60, 100], + coordinates: 'A1', + color: '#f66936', + type: 'group_b', + }, + { + sym: 'OPC', + name: 'Outer Planet Consortium', + logo: '18_chesapeake/CO', + simple_logo: '1830/CO.alt', + tokens: [60, 100, 60, 100, 60, 100, 60], + coordinates: 'J18', + color: :'#cc4f8c', + text_color: 'black', + type: 'group_c', + }, + { + sym: 'RCC', + name: 'Ring Construction Corporation', + logo: '1846/ERIE', + simple_logo: '1830/ERIE.alt', + tokens: [60, 100, 60, 100, 60, 100, 60, 100], + coordinates: 'F18', + color: :'#f8b34b', + text_color: 'black', + type: 'group_c', + }, + { + sym: 'AL', + name: 'Asteroid League', + logo: '1830/NYNH', + simple_logo: '1830/NYNH.alt', + tokens: [60, 75, 100, 60, 75, 100, 60, 75, 100, 60, 75, 100, 60, 75, 100], + coordinates: 'H10', + color: :'#fa3d58', + type: 'groupD', + }, + ].freeze + end + end + end +end diff --git a/lib/engine/game/g_2038/game.rb b/lib/engine/game/g_2038/game.rb index 1dbef8c577..3dc020d0ad 100644 --- a/lib/engine/game/g_2038/game.rb +++ b/lib/engine/game/g_2038/game.rb @@ -2,6 +2,7 @@ require_relative 'meta' require_relative 'map' +require_relative 'entities' require_relative '../base' module Engine @@ -10,6 +11,7 @@ module G2038 class Game < Game::Base include_meta(G2038::Meta) include Map + include Entities register_colors(red: '#d1232a', orange: '#f58121', @@ -196,425 +198,6 @@ class Game < Game::Base }, ].freeze - COMPANIES = [ - { - name: 'Planetary Imports', - sym: 'PI', - value: 50, - revenue: 10, - desc: 'No special abilities', - color: nil, - }, - { - name: 'Fast Buck', - sym: 'FB', - value: 100, - revenue: 0, - desc: 'May form a Growth Corporation OR join the Asteroid League for 1 share.', - abilities: [ - { type: 'no_buy' }, - { - type: 'exchange', - corporations: ['AL'], - owner_type: 'player', - from: 'market', - when: ['Phase 3', 'Phase 4'], - }, - ], - color: 'white', - }, - { - name: 'Ice Finder', - sym: 'IF', - value: 100, - revenue: 0, - desc: 'May form a Growth Corporation OR join the Asteroid League for 1 share.', - abilities: [ - { type: 'no_buy' }, - { - type: 'exchange', - corporations: ['AL'], - owner_type: 'player', - from: 'market', - when: ['Phase 3', 'Phase 4'], - }, - ], - color: 'white', - }, - { - name: 'Drill Hound', - sym: 'DH', - value: 100, - revenue: 0, - desc: 'May form a Growth Corporation OR join the Asteroid League for 1 share.', - abilities: [ - { type: 'no_buy' }, - { - type: 'exchange', - corporations: ['AL'], - owner_type: 'player', - from: 'market', - when: ['Phase 3', 'Phase 4'], - }, - ], - color: 'white', - }, - { - name: 'Ore Crusher', - sym: 'OC', - value: 100, - revenue: 0, - desc: 'May form a Growth Corporation OR join the Asteroid League for 1 share.', - abilities: [ - { type: 'no_buy' }, - { - type: 'exchange', - corporations: ['AL'], - owner_type: 'player', - from: 'market', - when: ['Phase 3', 'Phase 4'], - }, - ], - color: 'white', - }, - { - name: 'Torch', - sym: 'TT', - value: 100, - revenue: 0, - desc: 'May form a Growth Corporation OR join the Asteroid League for 1 share.', - abilities: [ - { type: 'no_buy' }, - { - type: 'exchange', - corporations: ['AL'], - owner_type: 'player', - from: 'market', - when: ['Phase 3', 'Phase 4'], - }, - ], - color: 'white', - }, - { - name: 'Lucky', - sym: 'LY', - value: 100, - revenue: 0, - desc: 'May form a Growth Corporation OR join the Asteroid League for 1 share.', - abilities: [ - { type: 'no_buy' }, - { - type: 'exchange', - corporations: ['AL'], - owner_type: 'player', - from: 'market', - when: ['Phase 3', 'Phase 4'], - }, - ], - color: 'white', - }, - { - name: 'Tunnel Systems', - sym: 'TS', - value: 120, - revenue: 5, - desc: 'Buyer recieves a TSI Share. If owned by a corporation, may place 1 free Base on ANY'\ - ' explored and unclaimed tile.', - abilities: [ - { type: 'shares', shares: 'TSI_3' }, - { - type: 'tile_lay', - owner_type: 'corporation', - tiles: ['1'], - when: 'owning_corp_or_turn', - count: 1, - }, - ], - color: nil, - }, - { - name: 'Vacuum Associates', - sym: 'VA', - value: 140, - revenue: 10, - desc: 'Buyer recieves a TSI Share. If owned by a corporation, may place 1 free'\ - ' Refueling Station within range.', - abilities: [ - { type: 'shares', shares: 'TSI_2' }, - { - type: 'tile_lay', - owner_type: 'corporation', - tiles: ['2'], - when: 'owning_corp_or_turn', - count: 1, - }, - ], - color: nil, - }, - { - name: 'Robot Smelters, Inc.', - sym: 'RS', - value: 160, - revenue: 15, - desc: 'Buyer recieves a TSI Share. If owned by a corporation, may place 1 free Claim within range.', - abilities: [ - { type: 'shares', shares: 'TSI_1' }, - { - type: 'tile_lay', - owner_type: 'corporation', - tiles: ['3'], - when: 'owning_corp_or_turn', - count: 1, - }, - ], - color: nil, - }, - { - name: 'Space Transportation Co.', - sym: 'ST', - value: 180, - revenue: 20, - desc: "Buyer recieves TSI president's Share and flies probe if TSI isn't active. May not be owned"\ - ' by a corporation. Remove from the game after TSI buys a spaceship.', - abilities: [ - { type: 'shares', shares: 'TSI_0' }, - { type: 'no_buy' }, - { type: 'close', when: 'bought_train', corporation: 'TSI' }, - ], - color: nil, - }, - { - name: 'Asteroid Export Co.', - sym: 'AE', - value: 180, - revenue: 30, - desc: "Forms Asteroid League, receiving its President's certificate. May not be bought by a"\ - ' corporation. Remove from the game after AL aquires a spaceship.', - abilities: [ - { type: 'close', when: 'bought_train', corporation: 'AL' }, - { type: 'no_buy' }, - { - type: 'shares', - shares: 'AL_0', - when: ['Phase 3', 'Phase 4'], - }, - ], - color: nil, - }, - ].freeze - - MINORS = [ - { - sym: 'FB', - name: 'Fast Buck', - value: 100, - coordinates: 'G7', - logo: '18_eu/1', - tokens: [60, 100], - color: 'black', - text_color: 'white', - abilities: [ - { - type: 'exchange', - corporations: %w[RU VP MM LE OPC RCC AL], - owner_type: 'player', - from: 'ipo', - }, - ], - }, - { - sym: 'IF', - name: 'Ice Finder', - value: 100, - coordinates: 'G7', - logo: '18_eu/2', - tokens: [60, 100], - color: 'black', - text_color: 'white', - abilities: [ - { - type: 'exchange', - corporations: %w[RU VP MM LE OPC RCC AL], - owner_type: 'player', - from: 'ipo', - }, - ], - }, - { - sym: 'DH', - name: 'Drill Hound', - value: 100, - coordinates: 'D14', - logo: '18_eu/3', - tokens: [60, 100], - color: 'black', - text_color: 'white', - abilities: [ - { - type: 'exchange', - corporations: %w[RU VP MM LE OPC RCC AL], - owner_type: 'player', - from: 'ipo', - }, - ], - }, - { - sym: 'OC', - name: 'Ore Crusher', - value: 100, - coordinates: 'M5', - logo: '18_eu/4', - tokens: [60, 100], - color: 'black', - text_color: 'white', - abilities: [ - { - type: 'exchange', - corporations: %w[RU VP MM LE OPC RCC AL], - owner_type: 'player', - from: 'ipo', - }, - ], - }, - { - sym: 'TT', - name: 'Torch', - value: 100, - coordinates: 'B6', - logo: '18_eu/5', - tokens: [60, 100], - color: 'black', - text_color: 'white', - abilities: [ - { - type: 'exchange', - corporations: %w[RU VP MM LE OPC RCC AL], - owner_type: 'player', - from: 'ipo', - }, - ], - }, - { - sym: 'LY', - name: 'Lucky', - value: 100, - coordinates: 'H14', - logo: '18_eu/6', - tokens: [60, 100], - color: 'black', - text_color: 'white', - abilities: [ - { - type: 'exchange', - corporations: %w[RU VP MM LE OPC RCC AL], - owner_type: 'player', - from: 'ipo', - }, - ], - }, - ].freeze - - CORPORATIONS = [ - { - float_percent: 50, - sym: 'TSI', - name: 'Trans-Space Incorporated', - logo: '18_chesapeake/PRR', - simple_logo: '1830/PRR.alt', - tokens: [60, 100, 60, 100, 60, 100, 60, 100, 60, 100], - coordinates: 'K9', - color: '#40b1b9', - type: 'group_a', - reservation_color: nil, - }, - { - float_percent: 50, - sym: 'RU', - name: 'Resources Unlimited', - logo: '18_chesapeake/PRR', - simple_logo: '1830/PRR.alt', - tokens: [0, 100, 0, 100, 0, 100, 0, 100, 0, 100, 0, 100], - coordinates: 'D8', - color: '#d57e59', - type: 'group_a', - reservation_color: nil, - }, - { - float_percent: 50, - sym: 'VP', - name: 'Venus Prospectors Limited', - logo: '1830/NYC', - simple_logo: '1830/NYC.alt', - tokens: [60, 100, 60, 100, 60], - coordinates: 'J1', - color: :'#3eb75b', - type: 'group_b', - reservation_color: nil, - }, - { - float_percent: 50, - sym: 'LE', - name: 'Lunar Enterprises', - logo: '1830/CPR', - simple_logo: '1830/CPR.alt', - tokens: [60, 100, 60, 100, 60, 100, 60, 100, 60], - coordinates: 'O1', - color: '#fefc5d', - type: 'group_b', - reservation_color: nil, - }, - { - float_percent: 50, - sym: 'MM', - name: 'Mars Mining', - logo: '18_chesapeake/BO', - simple_logo: '1830/BO.alt', - tokens: [60, 100, 60, 100, 60, 100], - coordinates: 'A1', - color: '#f66936', - type: 'group_b', - reservation_color: nil, - }, - { - float_percent: 50, - sym: 'OPC', - name: 'Outer Planet Consortium', - logo: '18_chesapeake/CO', - simple_logo: '1830/CO.alt', - tokens: [60, 100, 60, 100, 60, 100, 60], - coordinates: 'J18', - color: :'#cc4f8c', - text_color: 'black', - type: 'group_c', - reservation_color: nil, - }, - { - float_percent: 50, - sym: 'RCC', - name: 'Ring Construction Corporation', - logo: '1846/ERIE', - simple_logo: '1830/ERIE.alt', - tokens: [60, 100, 60, 100, 60, 100, 60, 100], - coordinates: 'F18', - color: :'#f8b34b', - text_color: 'black', - type: 'group_c', - reservation_color: nil, - }, - { - float_percent: 50, - sym: 'AL', - name: 'Asteroid League', - logo: '1830/NYNH', - simple_logo: '1830/NYNH.alt', - tokens: [60, 75, 100, 60, 75, 100, 60, 75, 100, 60, 75, 100, 60, 75, 100], - coordinates: 'H10', - color: :'#fa3d58', - type: 'groupD', - reservation_color: nil, - }, - ].freeze - EVENTS_TEXT = Base::EVENTS_TEXT.merge( 'asteroid_league_can_form' => ['Asteroid League may be formed'], 'group_b_corps_available' => ['Group B Corporations become available'], diff --git a/lib/engine/game/g_rolling_stock/step/buy_sell_shares_bid_companies.rb b/lib/engine/game/g_rolling_stock/step/buy_sell_shares_bid_companies.rb index 5d614c0c56..c38bae0b66 100644 --- a/lib/engine/game/g_rolling_stock/step/buy_sell_shares_bid_companies.rb +++ b/lib/engine/game/g_rolling_stock/step/buy_sell_shares_bid_companies.rb @@ -17,13 +17,13 @@ def actions(entity) actions = [] actions << 'buy_shares' if can_buy_any?(entity) actions << 'sell_shares' if can_sell_any?(entity) - actions << 'bid' if can_bid?(entity) + actions << 'bid' if can_bid_any?(entity) actions << 'pass' unless actions.empty? actions end - def can_bid?(entity) + def can_bid_any?(entity) return unless @round.current_actions.empty? biddable = @game.biddable_companies diff --git a/lib/engine/graph.rb b/lib/engine/graph.rb index 598d55d78b..8724647f1c 100644 --- a/lib/engine/graph.rb +++ b/lib/engine/graph.rb @@ -56,18 +56,18 @@ def route_info(corporation) @routes[corporation] end - def can_token?(corporation, cheater: false, same_hex_allowed: false) - tokens = cheater ? @cheater_tokens : @tokens - return tokens[corporation] if tokens.key?(corporation) + def can_token?(corporation, cheater: false, same_hex_allowed: false, tokens: corporation.tokens_by_type) + tokeners = cheater ? @cheater_tokens : @tokens + return tokeners[corporation] if tokeners.key?(corporation) compute(corporation) do |node| - if node.tokenable?(corporation, free: true, cheater: cheater, same_hex_allowed: same_hex_allowed) - tokens[corporation] = true + if node.tokenable?(corporation, free: true, cheater: cheater, tokens: tokens, same_hex_allowed: same_hex_allowed) + tokeners[corporation] = true break end end - tokens[corporation] ||= false - tokens[corporation] + tokeners[corporation] ||= false + tokeners[corporation] end def no_blocking? diff --git a/lib/engine/operator.rb b/lib/engine/operator.rb index c51de8ece4..275a57da9f 100644 --- a/lib/engine/operator.rb +++ b/lib/engine/operator.rb @@ -9,7 +9,7 @@ module Operator attr_accessor :coordinates, :color, :text_color attr_reader :city, :loans, :logo, :logo_filename, :simple_logo, :operating_history, :tokens, :trains, :destination_icon, - :destination_coordinates, :share_price + :destination_coordinates, :destination_exits, :share_price def init_operator(opts) @cash = 0 @@ -25,6 +25,7 @@ def init_operator(opts) @color = opts[:color] @text_color = opts[:text_color] || '#ffffff' @destination_coordinates = opts[:destination_coordinates] + @destination_exits = opts[:destination_exits] @destination_icon = opts[:destination_icon] ? "/icons/#{opts[:destination_icon]}" : '' end diff --git a/lib/engine/part/path.rb b/lib/engine/part/path.rb index aaf7498787..8c4d82a566 100644 --- a/lib/engine/part/path.rb +++ b/lib/engine/part/path.rb @@ -180,18 +180,35 @@ def walk( end # return true if facing exits on adjacent tiles match up taking lanes into account - # TBD: support titles where lanes of different sizes can connect def lane_match?(lanes0, lanes1) - lanes0 && - lanes1 && - lanes1[LANE_WIDTH] == lanes0[LANE_WIDTH] && + return false unless lanes0 + return false unless lanes1 + + if lanes1[LANE_WIDTH] == lanes0[LANE_WIDTH] lanes1[LANE_INDEX] == lane_invert(lanes0)[LANE_INDEX] + else + lane_match_different_sizes?(lanes0, lanes1) + end end def lane_invert(lane) [lane[LANE_WIDTH], lane[LANE_WIDTH] - lane[LANE_INDEX] - 1] end + # the important part of matching lanes of different sizes is to just use + # the larger width when doing the inverted comparison; the delta just + # allows the smaller-lane side to be more centered, i.e., it makes 1 lane + # match up with the middle of 3 lanes + def lane_match_different_sizes?(lanes0, lanes1) + lanes_a, lanes_b = [lanes0, lanes1].sort + + larger_width = lanes_b[LANE_WIDTH] + delta = ((lanes_b[LANE_WIDTH] - lanes_a[LANE_WIDTH]) / 2).to_i + new_index = lanes_a[LANE_INDEX] + delta + + [larger_width, new_index][LANE_INDEX] == lane_invert(lanes_b)[LANE_INDEX] + end + def path? true end diff --git a/lib/engine/step/buy_sell_par_shares.rb b/lib/engine/step/buy_sell_par_shares.rb index 4bdfe6b3f9..9ce423e0a4 100644 --- a/lib/engine/step/buy_sell_par_shares.rb +++ b/lib/engine/step/buy_sell_par_shares.rb @@ -97,7 +97,7 @@ def can_buy?(entity, bundle) return false if entity == bundle.owner corporation = bundle.corporation - entity.cash >= modify_purchase_price(bundle) && + available_cash(entity) >= modify_purchase_price(bundle) && !@round.players_sold[entity][corporation] && (can_buy_multiple?(entity, corporation, bundle.owner) || !bought?) && can_gain?(entity, bundle) @@ -206,6 +206,10 @@ def pass! end end + def available_cash(entity) + entity.cash + end + def can_buy_multiple?(_entity, corporation, owner) if @game.multiple_buy_only_from_market? return false unless owner.share_pool? @@ -242,7 +246,7 @@ def can_buy_shares?(entity, shares) bundle = min_share&.to_bundle return unless bundle - entity.cash >= modify_purchase_price(bundle) && can_gain?(entity, bundle) + available_cash(entity) >= modify_purchase_price(bundle) && can_gain?(entity, bundle) end def can_buy_any_from_market?(entity) @@ -286,7 +290,7 @@ def ipo_type(_entity) def purchasable_companies(entity) return [] if bought? || - !entity.cash.positive? || + !available_cash(entity).positive? || !@game.phase || !@game.phase.status.include?('can_buy_companies_from_other_players') @@ -300,14 +304,14 @@ def buyable_bank_owned_companies(entity) end def can_buy_company?(player, company) - @game.buyable_bank_owned_companies.include?(company) && player.cash >= company.value + @game.buyable_bank_owned_companies.include?(company) && available_cash(player) >= company.value end def get_par_prices(entity, _corp) @game .stock_market .par_prices - .select { |p| p.price * 2 <= entity.cash } + .select { |p| p.price * 2 <= available_cash(entity) } end def sell_shares(entity, shares, swap: nil) diff --git a/lib/engine/step/buy_sell_par_shares_via_bid.rb b/lib/engine/step/buy_sell_par_shares_via_bid.rb index 58ef2f97ad..67d0e30a72 100644 --- a/lib/engine/step/buy_sell_par_shares_via_bid.rb +++ b/lib/engine/step/buy_sell_par_shares_via_bid.rb @@ -15,7 +15,7 @@ def actions(entity) return %w[bid pass] if @auctioning actions = super - actions << 'bid' if !bought? && can_bid?(entity) + actions << 'bid' if !bought? && can_bid_any?(entity) actions << 'pass' if actions.any? && !actions.include?('pass') && !must_sell?(entity) actions end diff --git a/lib/engine/step/dividend.rb b/lib/engine/step/dividend.rb index fef471ea03..a6be58cf26 100644 --- a/lib/engine/step/dividend.rb +++ b/lib/engine/step/dividend.rb @@ -218,8 +218,10 @@ def pass! private def log_payout_shares(entity, revenue, per_share, receivers) - @log << "#{entity.name} pays out #{@game.format_currency(revenue)} = "\ - "#{@game.format_currency(per_share)} per share (#{receivers})" + msg = "#{entity.name} pays out #{@game.format_currency(revenue)} = "\ + "#{@game.format_currency(per_share)} per share" + msg += " (#{receivers})" unless receivers.empty? + @log << msg end end end diff --git a/lib/engine/step/train.rb b/lib/engine/step/train.rb index 1a39d049ac..6249116e66 100644 --- a/lib/engine/step/train.rb +++ b/lib/engine/step/train.rb @@ -27,11 +27,7 @@ def ability_timing end def room?(entity, _shell = nil) - if @game.class::OBSOLETE_TRAINS_COUNT_FOR_LIMIT - entity.trains - else - entity.trains.reject(&:obsolete) - end.size < @game.train_limit(entity) + @game.num_corp_trains(entity) < @game.train_limit(entity) end def can_entity_buy_train?(entity) diff --git a/public/fixtures/1840/2player.json b/public/fixtures/1840/2player.json new file mode 100644 index 0000000000..b38d8d8795 --- /dev/null +++ b/public/fixtures/1840/2player.json @@ -0,0 +1,7619 @@ +{ + "id": 133875, + "description": "", + "user": { + "id": 2006, + "name": "tvahlsing" + }, + "players": [ + { + "id": 2006, + "name": "tvahlsing" + }, + { + "id": 621, + "name": "WyoBadger" + } + ], + "min_players": 2, + "max_players": 6, + "title": "1840", + "settings": { + "seed": 687012523, + "is_async": false, + "unlisted": false, + "auto_routing": true, + "player_order": null, + "optional_rules": [] + }, + "user_settings": null, + "status": "finished", + "turn": 6, + "round": "Company Round", + "acting": [ + 2006, + 621 + ], + "result": { + "621": 7618, + "2006": 8351 + }, + "actions": [ + { + "type": "bid", + "entity": 2006, + "entity_type": "player", + "id": 1, + "created_at": 1693828566, + "company": "KK", + "price": 20 + }, + { + "type": "pass", + "entity": 621, + "entity_type": "player", + "id": 2, + "created_at": 1693828592 + }, + { + "type": "bid", + "entity": 621, + "entity_type": "player", + "id": 3, + "created_at": 1693828596, + "company": "SB", + "price": 30 + }, + { + "type": "bid", + "entity": 2006, + "entity_type": "player", + "id": 4, + "created_at": 1693828613, + "company": "SB", + "price": 35 + }, + { + "type": "pass", + "entity": 621, + "entity_type": "player", + "id": 5, + "created_at": 1693828619 + }, + { + "type": "pass", + "entity": 2006, + "entity_type": "player", + "id": 6, + "created_at": 1693828637 + }, + { + "type": "bid", + "entity": 621, + "entity_type": "player", + "id": 7, + "created_at": 1693828641, + "company": "HB", + "price": 40 + }, + { + "type": "pass", + "entity": 2006, + "entity_type": "player", + "id": 8, + "created_at": 1693828645 + }, + { + "type": "bid", + "entity": 2006, + "entity_type": "player", + "id": 9, + "created_at": 1693828647, + "company": "SD", + "price": 50 + }, + { + "type": "bid", + "entity": 621, + "entity_type": "player", + "id": 10, + "created_at": 1693828649, + "company": "SD", + "price": 55 + }, + { + "type": "pass", + "entity": 2006, + "entity_type": "player", + "id": 11, + "created_at": 1693828650 + }, + { + "type": "choose", + "entity": 621, + "entity_type": "player", + "id": 12, + "created_at": 1693828654, + "choice": 0 + }, + { + "type": "par", + "entity": 621, + "entity_type": "player", + "id": 13, + "created_at": 1693828676, + "corporation": "GWStStB", + "share_price": "70,4,2" + }, + { + "type": "par", + "entity": 2006, + "entity_type": "player", + "id": 14, + "created_at": 1693828685, + "corporation": "WT", + "share_price": "100,1,2" + }, + { + "type": "buy_shares", + "entity": 621, + "entity_type": "player", + "id": 15, + "created_at": 1693828693, + "shares": [ + "WT_1" + ], + "percent": 10 + }, + { + "type": "buy_shares", + "entity": 2006, + "entity_type": "player", + "id": 16, + "created_at": 1693828706, + "shares": [ + "WT_2" + ], + "percent": 10 + }, + { + "type": "buy_shares", + "entity": 621, + "entity_type": "player", + "id": 17, + "created_at": 1693828707, + "auto_actions": [ + { + "type": "run_routes", + "entity": "D", + "entity_type": "corporation", + "created_at": 1693828707, + "routes": [ + { + "train": "City-2", + "connections": [ + [ + "A17", + "A19" + ] + ], + "hexes": [ + "A19", + "A17" + ], + "revenue": 70, + "revenue_str": "A19-A17", + "nodes": [ + "A17-2", + "A19-0" + ] + } + ] + } + ], + "shares": [ + "WT_3" + ], + "percent": 10 + }, + { + "type": "buy_train", + "entity": "WT", + "entity_type": "corporation", + "id": 18, + "created_at": 1693828725, + "train": "O1-0", + "price": 300, + "variant": "O1" + }, + { + "type": "pass", + "entity": "WT", + "entity_type": "corporation", + "id": 19, + "created_at": 1693828731 + }, + { + "type": "buy_train", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 20, + "created_at": 1693828768, + "train": "O1-1", + "price": 300, + "variant": "O1" + }, + { + "type": "pass", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 21, + "created_at": 1693828772 + }, + { + "type": "merge", + "entity": "WT", + "entity_type": "corporation", + "id": 22, + "created_at": 1693828792, + "corporation": "4" + }, + { + "type": "bid", + "entity": "WT", + "entity_type": "corporation", + "id": 23, + "created_at": 1693828795, + "corporation": "4", + "price": 20 + }, + { + "type": "pass", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 24, + "created_at": 1693828799 + }, + { + "type": "pass", + "entity": "WT", + "entity_type": "corporation", + "id": 25, + "created_at": 1693828807, + "auto_actions": [ + { + "type": "reassign_trains", + "entity": "WT", + "entity_type": "corporation", + "created_at": 1693828806, + "assignments": [ + { + "train": "O1-0", + "corporation": "4" + } + ] + } + ] + }, + { + "type": "merge", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 26, + "created_at": 1693828915, + "corporation": "5" + }, + { + "type": "bid", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 27, + "created_at": 1693828917, + "corporation": "5", + "price": 20 + }, + { + "type": "pass", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 28, + "created_at": 1693828927, + "auto_actions": [ + { + "type": "reassign_trains", + "entity": "GWStStB", + "entity_type": "corporation", + "created_at": 1693828927, + "assignments": [ + { + "train": "O1-1", + "corporation": "5" + } + ] + } + ] + }, + { + "type": "lay_tile", + "entity": "4", + "entity_type": "corporation", + "id": 29, + "created_at": 1693828957, + "hex": "H28", + "tile": "6-0", + "rotation": 4 + }, + { + "type": "lay_tile", + "entity": "4", + "entity_type": "corporation", + "id": 30, + "created_at": 1693828975, + "hex": "B20", + "tile": "L2-0", + "rotation": 2 + }, + { + "type": "lay_tile", + "entity": "4", + "entity_type": "corporation", + "id": 31, + "created_at": 1693828991, + "hex": "I27", + "tile": "L25-0", + "rotation": 3 + }, + { + "type": "pass", + "entity": "4", + "entity_type": "corporation", + "id": 32, + "created_at": 1693828998 + }, + { + "type": "run_routes", + "entity": "4", + "entity_type": "corporation", + "id": 33, + "created_at": 1693829004, + "routes": [ + { + "train": "O1-0", + "connections": [ + [ + "I27", + "H28" + ], + [ + "H28", + "H30" + ] + ], + "hexes": [ + "I27", + "H28", + "H30" + ], + "revenue": 50, + "revenue_str": "I27-H28-H30", + "nodes": [ + "I27-0", + "H28-0", + "H30-0" + ] + } + ] + }, + { + "type": "lay_tile", + "entity": "5", + "entity_type": "corporation", + "id": 34, + "created_at": 1693829024, + "hex": "G15", + "tile": "5-0", + "rotation": 2 + }, + { + "type": "lay_tile", + "entity": "5", + "entity_type": "corporation", + "id": 35, + "created_at": 1693829042, + "hex": "I13", + "tile": "L2-1", + "rotation": 1 + }, + { + "type": "lay_tile", + "entity": "5", + "entity_type": "corporation", + "id": 36, + "created_at": 1693829045, + "hex": "F14", + "tile": "6-1", + "rotation": 3 + }, + { + "type": "place_token", + "entity": "5", + "entity_type": "corporation", + "id": 37, + "created_at": 1693829049, + "city": "6-1-0", + "slot": 0, + "tokener": "5" + }, + { + "type": "pass", + "entity": "5", + "entity_type": "corporation", + "id": 38, + "created_at": 1693829053 + }, + { + "type": "run_routes", + "entity": "5", + "entity_type": "corporation", + "id": 39, + "created_at": 1693829056, + "routes": [ + { + "train": "O1-1", + "connections": [ + [ + "F14", + "G15" + ] + ], + "hexes": [ + "F14", + "G15" + ], + "revenue": 40, + "revenue_str": "F14-G15", + "nodes": [ + "F14-0", + "G15-0" + ] + } + ] + }, + { + "type": "lay_tile", + "entity": "4", + "entity_type": "corporation", + "id": 40, + "created_at": 1693829081, + "hex": "G29", + "tile": "58-0", + "rotation": 3 + }, + { + "type": "lay_tile", + "entity": "4", + "entity_type": "corporation", + "id": 41, + "created_at": 1693829110, + "hex": "G23", + "tile": "L1-0", + "rotation": 1 + }, + { + "type": "lay_tile", + "entity": "4", + "entity_type": "corporation", + "id": 42, + "created_at": 1693829116, + "hex": "F28", + "tile": "57-0", + "rotation": 1 + }, + { + "type": "place_token", + "entity": "4", + "entity_type": "corporation", + "id": 43, + "created_at": 1693829117, + "city": "57-0-0", + "slot": 0, + "tokener": "4" + }, + { + "type": "pass", + "entity": "4", + "entity_type": "corporation", + "id": 44, + "created_at": 1693829123 + }, + { + "type": "run_routes", + "entity": "4", + "entity_type": "corporation", + "id": 45, + "created_at": 1693829127, + "routes": [ + { + "train": "O1-0", + "connections": [ + [ + "F28", + "F30" + ], + [ + "F30", + "G29" + ], + [ + "G29", + "H30" + ], + [ + "H30", + "H28" + ], + [ + "H28", + "I27" + ] + ], + "hexes": [ + "F28", + "F30", + "G29", + "H30", + "H28", + "I27" + ], + "revenue": 90, + "revenue_str": "F28-F30-G29-H30-H28-I27", + "nodes": [ + "F28-0", + "F30-0", + "G29-0", + "H30-0", + "H28-0", + "I27-0" + ] + } + ] + }, + { + "type": "lay_tile", + "entity": "5", + "entity_type": "corporation", + "id": 46, + "created_at": 1693829132, + "hex": "E15", + "tile": "6-2", + "rotation": 0 + }, + { + "type": "lay_tile", + "entity": "5", + "entity_type": "corporation", + "id": 47, + "created_at": 1693829138, + "hex": "I15", + "tile": "L3-0", + "rotation": 1 + }, + { + "type": "place_token", + "entity": "5", + "entity_type": "corporation", + "id": 48, + "created_at": 1693829139, + "city": "6-2-0", + "slot": 0, + "tokener": "5" + }, + { + "type": "pass", + "entity": "5", + "entity_type": "corporation", + "id": 49, + "created_at": 1693829141 + }, + { + "type": "run_routes", + "entity": "5", + "entity_type": "corporation", + "id": 50, + "created_at": 1693829145, + "routes": [ + { + "train": "O1-1", + "connections": [ + [ + "E15", + "F14" + ], + [ + "F14", + "G15" + ] + ], + "hexes": [ + "E15", + "F14", + "G15" + ], + "revenue": 60, + "revenue_str": "E15-F14-G15", + "nodes": [ + "E15-0", + "F14-0", + "G15-0" + ] + } + ] + }, + { + "type": "dividend", + "entity": "WT", + "entity_type": "corporation", + "id": 51, + "created_at": 1693829160, + "kind": "variable", + "amount": 140 + }, + { + "type": "dividend", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 52, + "created_at": 1693829170, + "auto_actions": [ + { + "type": "run_routes", + "entity": "W", + "entity_type": "corporation", + "created_at": 1693829169, + "routes": [ + { + "train": "City-0", + "connections": [ + [ + "I13", + "I15" + ], + [ + "I11", + "I13" + ] + ], + "hexes": [ + "I15", + "I13", + "I11" + ], + "revenue": 60, + "revenue_str": "I15-I13-I11", + "nodes": [ + "I13-0", + "I15-0", + "I11-1" + ] + } + ] + }, + { + "type": "run_routes", + "entity": "D", + "entity_type": "corporation", + "created_at": 1693829169, + "routes": [ + { + "train": "City-2", + "connections": [ + [ + "A19", + "B20" + ], + [ + "A17", + "A19" + ] + ], + "hexes": [ + "B20", + "A19", + "A17" + ], + "revenue": 80, + "revenue_str": "B20-A19-A17", + "nodes": [ + "A19-0", + "B20-0", + "A17-2" + ] + } + ] + } + ], + "kind": "variable", + "amount": 100 + }, + { + "type": "buy_train", + "entity": "WT", + "entity_type": "corporation", + "id": 53, + "created_at": 1693829210, + "train": "O1-2", + "price": 200, + "variant": "O2" + }, + { + "type": "pass", + "entity": "WT", + "entity_type": "corporation", + "id": 54, + "created_at": 1693829215 + }, + { + "type": "reassign_trains", + "entity": "WT", + "entity_type": "corporation", + "id": 55, + "created_at": 1693829220, + "assignments": [ + { + "train": "O1-0", + "corporation": "4" + }, + { + "train": "O1-2", + "corporation": "WT" + } + ] + }, + { + "type": "pass", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 56, + "created_at": 1693829223 + }, + { + "type": "merge", + "entity": "WT", + "entity_type": "corporation", + "id": 57, + "created_at": 1693829238, + "corporation": "18" + }, + { + "type": "bid", + "entity": "WT", + "entity_type": "corporation", + "id": 58, + "created_at": 1693829239, + "corporation": "18", + "price": 20 + }, + { + "type": "pass", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 59, + "created_at": 1693829285 + }, + { + "type": "pass", + "entity": "WT", + "entity_type": "corporation", + "id": 60, + "created_at": 1693829293 + }, + { + "type": "reassign_trains", + "entity": "WT", + "entity_type": "corporation", + "id": 61, + "created_at": 1693829298, + "assignments": [ + { + "train": "O1-0", + "corporation": "4" + }, + { + "train": "O1-2", + "corporation": "18" + } + ] + }, + { + "type": "merge", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 62, + "created_at": 1693829317, + "corporation": "2" + }, + { + "type": "bid", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 63, + "created_at": 1693829319, + "corporation": "2", + "price": 20 + }, + { + "type": "buy_train", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 64, + "created_at": 1693829341, + "train": "Y1-0", + "price": 50, + "variant": "Y2" + }, + { + "type": "pass", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 65, + "created_at": 1693829343 + }, + { + "type": "reassign_trains", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 66, + "created_at": 1693829347, + "assignments": [ + { + "train": "O1-1", + "corporation": "5" + }, + { + "train": "Y1-0", + "corporation": "2" + } + ] + }, + { + "type": "buy_shares", + "entity": 621, + "entity_type": "player", + "id": 67, + "created_at": 1693829363, + "shares": [ + "WT_4" + ], + "percent": 10 + }, + { + "type": "buy_shares", + "entity": 2006, + "entity_type": "player", + "id": 68, + "created_at": 1693829370, + "shares": [ + "GWStStB_1" + ], + "percent": 10 + }, + { + "type": "buy_shares", + "entity": 621, + "entity_type": "player", + "id": 69, + "created_at": 1693829383, + "shares": [ + "WT_5" + ], + "percent": 10 + }, + { + "type": "buy_shares", + "entity": 2006, + "entity_type": "player", + "id": 70, + "created_at": 1693829399, + "shares": [ + "W_0" + ], + "percent": 10 + }, + { + "type": "pass", + "entity": 621, + "entity_type": "player", + "id": 71, + "created_at": 1693829403 + }, + { + "type": "pass", + "entity": 2006, + "entity_type": "player", + "id": 72, + "created_at": 1693829405 + }, + { + "hex": "D18", + "tile": "235-0", + "type": "lay_tile", + "entity": "2", + "rotation": 0, + "entity_type": "corporation", + "id": 73, + "user": 621, + "created_at": 1693829430 + }, + { + "city": "235-0-0", + "slot": 0, + "type": "place_token", + "entity": "2", + "tokener": "2", + "entity_type": "corporation", + "id": 74, + "user": 621, + "created_at": 1693829453 + }, + { + "type": "undo", + "entity": "2", + "action_id": 72, + "entity_type": "corporation", + "id": 75, + "user": 621, + "created_at": 1693829465 + }, + { + "type": "lay_tile", + "entity": "2", + "entity_type": "corporation", + "id": 76, + "created_at": 1693829476, + "hex": "D18", + "tile": "235-0", + "rotation": 4 + }, + { + "type": "place_token", + "entity": "2", + "entity_type": "corporation", + "id": 77, + "created_at": 1693829477, + "city": "235-0-0", + "slot": 0, + "tokener": "2" + }, + { + "type": "lay_tile", + "entity": "2", + "entity_type": "corporation", + "id": 78, + "created_at": 1693829482, + "hex": "C21", + "tile": "L2-2", + "rotation": 2 + }, + { + "type": "lay_tile", + "entity": "2", + "entity_type": "corporation", + "id": 79, + "created_at": 1693829498, + "hex": "D20", + "tile": "L22-0", + "rotation": 4 + }, + { + "type": "place_token", + "entity": "2", + "entity_type": "corporation", + "id": 80, + "created_at": 1693829502, + "city": "L22-0-0", + "slot": 0, + "tokener": "2" + }, + { + "type": "pass", + "entity": "2", + "entity_type": "corporation", + "id": 81, + "created_at": 1693829508 + }, + { + "type": "run_routes", + "entity": "2", + "entity_type": "corporation", + "id": 82, + "created_at": 1693829512, + "routes": [ + { + "train": "Y1-0", + "connections": [ + [ + "D20", + "D18" + ] + ], + "hexes": [ + "D20", + "D18" + ], + "revenue": 70, + "revenue_str": "D20-D18", + "nodes": [ + "D20-0", + "D18-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "2", + "entity_type": "corporation", + "id": 83, + "created_at": 1693829531 + }, + { + "type": "lay_tile", + "entity": "4", + "entity_type": "corporation", + "id": 84, + "created_at": 1693829551, + "hex": "I25", + "tile": "58-1", + "rotation": 4 + }, + { + "type": "lay_tile", + "entity": "4", + "entity_type": "corporation", + "id": 85, + "created_at": 1693829557, + "hex": "H16", + "tile": "L2-3", + "rotation": 0 + }, + { + "type": "lay_tile", + "entity": "4", + "entity_type": "corporation", + "id": 86, + "created_at": 1693829587, + "hex": "H28", + "tile": "619-0", + "rotation": 2 + }, + { + "type": "pass", + "entity": "4", + "entity_type": "corporation", + "id": 87, + "created_at": 1693829598 + }, + { + "type": "run_routes", + "entity": "4", + "entity_type": "corporation", + "id": 88, + "created_at": 1693829609, + "routes": [ + { + "train": "O1-0", + "connections": [ + [ + "F28", + "F30" + ], + [ + "F30", + "G29" + ], + [ + "G29", + "H30" + ], + [ + "H30", + "H28" + ], + [ + "H28", + "I27" + ], + [ + "I27", + "I25" + ] + ], + "hexes": [ + "F28", + "F30", + "G29", + "H30", + "H28", + "I27", + "I25" + ], + "revenue": 110, + "revenue_str": "F28-F30-G29-H30-H28-I27-I25", + "nodes": [ + "F28-0", + "F30-0", + "G29-0", + "H30-0", + "H28-0", + "I27-0", + "I25-0" + ] + } + ] + }, + { + "type": "buy_company", + "entity": "4", + "entity_type": "corporation", + "id": 89, + "created_at": 1693829627, + "company": "KK", + "price": 20 + }, + { + "type": "pass", + "entity": "4", + "entity_type": "corporation", + "id": 90, + "created_at": 1693829630 + }, + { + "type": "lay_tile", + "entity": "5", + "entity_type": "corporation", + "id": 91, + "created_at": 1693829653, + "hex": "E15", + "tile": "619-1", + "rotation": 0 + }, + { + "type": "pass", + "entity": "5", + "entity_type": "corporation", + "id": 92, + "user": 621, + "created_at": 1693829663 + }, + { + "type": "undo", + "entity": "5", + "entity_type": "corporation", + "id": 93, + "user": 621, + "created_at": 1693829668 + }, + { + "type": "remove_token", + "entity": "5", + "entity_type": "corporation", + "id": 94, + "created_at": 1693829673, + "city": "D22-0-0", + "slot": 0 + }, + { + "type": "lay_tile", + "entity": "5", + "entity_type": "corporation", + "id": 95, + "created_at": 1693829693, + "hex": "D22", + "tile": "L4-0", + "rotation": 2 + }, + { + "type": "lay_tile", + "entity": "5", + "entity_type": "corporation", + "id": 96, + "created_at": 1693829697, + "hex": "E17", + "tile": "235-1", + "rotation": 1 + }, + { + "type": "place_token", + "entity": "5", + "entity_type": "corporation", + "id": 97, + "created_at": 1693829698, + "city": "235-1-0", + "slot": 0, + "tokener": "5" + }, + { + "type": "pass", + "entity": "5", + "entity_type": "corporation", + "id": 98, + "created_at": 1693829700 + }, + { + "type": "run_routes", + "entity": "5", + "entity_type": "corporation", + "id": 99, + "created_at": 1693829707, + "routes": [ + { + "train": "O1-1", + "connections": [ + [ + "E17", + "E15" + ], + [ + "E15", + "F14" + ], + [ + "F14", + "G15" + ] + ], + "hexes": [ + "E17", + "E15", + "F14", + "G15" + ], + "revenue": 100, + "revenue_str": "E17-E15-F14-G15", + "nodes": [ + "E17-0", + "E15-0", + "F14-0", + "G15-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "5", + "entity_type": "corporation", + "id": 100, + "created_at": 1693829709 + }, + { + "type": "lay_tile", + "entity": "18", + "entity_type": "corporation", + "id": 101, + "created_at": 1693829719, + "hex": "I21", + "tile": "5-1", + "rotation": 4 + }, + { + "type": "lay_tile", + "entity": "18", + "entity_type": "corporation", + "id": 102, + "created_at": 1693829725, + "hex": "G21", + "tile": "L2-4", + "rotation": 1 + }, + { + "type": "lay_tile", + "entity": "18", + "entity_type": "corporation", + "id": 103, + "created_at": 1693829737, + "hex": "J22", + "tile": "L24-0", + "rotation": 4 + }, + { + "type": "pass", + "entity": "18", + "entity_type": "corporation", + "id": 104, + "created_at": 1693829745 + }, + { + "type": "run_routes", + "entity": "18", + "entity_type": "corporation", + "id": 105, + "created_at": 1693829747, + "routes": [ + { + "train": "O1-2", + "connections": [ + [ + "I21", + "J22" + ] + ], + "hexes": [ + "I21", + "J22" + ], + "revenue": 30, + "revenue_str": "I21-J22", + "nodes": [ + "I21-0", + "J22-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "18", + "entity_type": "corporation", + "id": 106, + "created_at": 1693829748 + }, + { + "type": "lay_tile", + "entity": "2", + "entity_type": "corporation", + "id": 107, + "created_at": 1693829789, + "hex": "D18", + "tile": "8859-0", + "rotation": 1 + }, + { + "type": "lay_tile", + "entity": "2", + "entity_type": "corporation", + "id": 108, + "created_at": 1693829801, + "hex": "B16", + "tile": "L1-1", + "rotation": 1 + }, + { + "type": "lay_tile", + "entity": "2", + "entity_type": "corporation", + "id": 109, + "created_at": 1693829805, + "hex": "D16", + "tile": "58-2", + "rotation": 4 + }, + { + "type": "place_token", + "entity": "2", + "entity_type": "corporation", + "id": 110, + "created_at": 1693829808, + "city": "619-1-0", + "slot": 1, + "tokener": "2" + }, + { + "type": "pass", + "entity": "2", + "entity_type": "corporation", + "id": 111, + "created_at": 1693829813 + }, + { + "type": "run_routes", + "entity": "2", + "entity_type": "corporation", + "id": 112, + "created_at": 1693829818, + "routes": [ + { + "train": "Y1-0", + "connections": [ + [ + "D20", + "D18" + ], + [ + "D18", + "D16" + ], + [ + "D16", + "E15" + ], + [ + "E15", + "E17" + ] + ], + "hexes": [ + "D20", + "D18", + "D16", + "E15", + "E17" + ], + "revenue": 120, + "revenue_str": "D20-D18-D16-E15-E17", + "nodes": [ + "D20-0", + "D18-0", + "D16-0", + "E15-0", + "E17-0" + ] + } + ] + }, + { + "type": "choose_ability", + "entity": "HB", + "entity_type": "company", + "id": 113, + "created_at": 1693829825, + "choice": { + "type": "sell" + } + }, + { + "type": "pass", + "entity": "2", + "entity_type": "corporation", + "id": 114, + "created_at": 1693829828 + }, + { + "hex": "J24", + "tile": "58-3", + "type": "lay_tile", + "entity": "4", + "rotation": 1, + "entity_type": "corporation", + "id": 115, + "user": 2006, + "created_at": 1693829835 + }, + { + "city": "E23-0-0", + "slot": 0, + "type": "remove_token", + "entity": "4", + "entity_type": "corporation", + "id": 116, + "user": 2006, + "created_at": 1693829842 + }, + { + "type": "undo", + "entity": "4", + "entity_type": "corporation", + "id": 117, + "user": 2006, + "created_at": 1693829848 + }, + { + "hex": "E23", + "tile": "L4-1", + "type": "lay_tile", + "entity": "4", + "rotation": 2, + "entity_type": "corporation", + "id": 118, + "user": 2006, + "created_at": 1693829853 + }, + { + "type": "undo", + "entity": "4", + "entity_type": "corporation", + "id": 119, + "user": 2006, + "created_at": 1693829864 + }, + { + "type": "undo", + "entity": "4", + "entity_type": "corporation", + "id": 120, + "user": 2006, + "created_at": 1693829870 + }, + { + "hex": "F28", + "tile": "619-2", + "type": "lay_tile", + "entity": "4", + "rotation": 4, + "entity_type": "corporation", + "id": 121, + "user": 2006, + "created_at": 1693829877 + }, + { + "hex": "E23", + "tile": "L4-1", + "type": "lay_tile", + "entity": "4", + "rotation": 2, + "entity_type": "corporation", + "id": 122, + "user": 2006, + "created_at": 1693829883 + }, + { + "type": "undo", + "entity": "4", + "entity_type": "corporation", + "id": 123, + "user": 2006, + "created_at": 1693829889 + }, + { + "type": "undo", + "entity": "4", + "entity_type": "corporation", + "id": 124, + "user": 2006, + "created_at": 1693829890 + }, + { + "type": "lay_tile", + "entity": "4", + "entity_type": "corporation", + "id": 125, + "created_at": 1693829899, + "hex": "J24", + "tile": "58-3", + "rotation": 1 + }, + { + "hex": "H12", + "tile": "L1-2", + "type": "lay_tile", + "entity": "4", + "rotation": 0, + "entity_type": "corporation", + "id": 126, + "user": 2006, + "created_at": 1693829911 + }, + { + "type": "undo", + "entity": "4", + "entity_type": "corporation", + "id": 127, + "user": 2006, + "created_at": 1693829915 + }, + { + "hex": "E23", + "tile": "L4-1", + "type": "lay_tile", + "entity": "4", + "rotation": 2, + "entity_type": "corporation", + "id": 128, + "user": 2006, + "created_at": 1693829925 + }, + { + "type": "undo", + "entity": "4", + "entity_type": "corporation", + "id": 129, + "user": 2006, + "created_at": 1693829934 + }, + { + "type": "lay_tile", + "entity": "4", + "entity_type": "corporation", + "id": 130, + "created_at": 1693829941, + "hex": "G19", + "tile": "L2-5", + "rotation": 1 + }, + { + "type": "lay_tile", + "entity": "4", + "entity_type": "corporation", + "id": 131, + "created_at": 1693829945, + "hex": "F26", + "tile": "4-0", + "rotation": 1 + }, + { + "type": "pass", + "entity": "4", + "entity_type": "corporation", + "id": 132, + "created_at": 1693829948 + }, + { + "type": "run_routes", + "entity": "4", + "entity_type": "corporation", + "id": 133, + "created_at": 1693829951, + "routes": [ + { + "train": "O1-0", + "connections": [ + [ + "F26", + "F28" + ], + [ + "F28", + "F30" + ], + [ + "F30", + "G29" + ], + [ + "G29", + "H30" + ], + [ + "H30", + "H28" + ], + [ + "H28", + "I27" + ], + [ + "I27", + "I25" + ], + [ + "I25", + "J24" + ], + [ + "J24", + "J22" + ] + ], + "hexes": [ + "F26", + "F28", + "F30", + "G29", + "H30", + "H28", + "I27", + "I25", + "J24", + "J22" + ], + "revenue": 140, + "revenue_str": "F26-F28-F30-G29-H30-H28-I27-I25-J24-J22", + "nodes": [ + "F26-0", + "F28-0", + "F30-0", + "G29-0", + "H30-0", + "H28-0", + "I27-0", + "I25-0", + "J24-0", + "J22-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "4", + "entity_type": "corporation", + "id": 134, + "created_at": 1693829952 + }, + { + "type": "lay_tile", + "entity": "5", + "entity_type": "corporation", + "id": 135, + "created_at": 1693829981, + "hex": "F16", + "tile": "58-4", + "rotation": 4 + }, + { + "type": "lay_tile", + "entity": "5", + "entity_type": "corporation", + "id": 136, + "created_at": 1693830014, + "hex": "B14", + "tile": "L1-2", + "rotation": 4 + }, + { + "type": "pass", + "entity": "5", + "entity_type": "corporation", + "id": 137, + "created_at": 1693830029 + }, + { + "type": "pass", + "entity": "5", + "entity_type": "corporation", + "id": 138, + "created_at": 1693830040 + }, + { + "type": "run_routes", + "entity": "5", + "entity_type": "corporation", + "id": 139, + "created_at": 1693830045, + "routes": [ + { + "train": "O1-1", + "connections": [ + [ + "E17", + "E15" + ], + [ + "E15", + "F14" + ], + [ + "F14", + "G15" + ], + [ + "G15", + "F16" + ] + ], + "hexes": [ + "E17", + "E15", + "F14", + "G15", + "F16" + ], + "revenue": 110, + "revenue_str": "E17-E15-F14-G15-F16", + "nodes": [ + "E17-0", + "E15-0", + "F14-0", + "G15-0", + "F16-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "5", + "entity_type": "corporation", + "id": 140, + "created_at": 1693830049 + }, + { + "type": "lay_tile", + "entity": "18", + "entity_type": "corporation", + "id": 141, + "created_at": 1693830062, + "hex": "I23", + "tile": "3-0", + "rotation": 1 + }, + { + "type": "lay_tile", + "entity": "18", + "entity_type": "corporation", + "id": 142, + "created_at": 1693830072, + "hex": "G17", + "tile": "L1-3", + "rotation": 4 + }, + { + "type": "place_token", + "entity": "18", + "entity_type": "corporation", + "id": 143, + "created_at": 1693830074, + "city": "619-0-0", + "slot": 1, + "tokener": "18" + }, + { + "type": "pass", + "entity": "18", + "entity_type": "corporation", + "id": 144, + "created_at": 1693830077 + }, + { + "type": "run_routes", + "entity": "18", + "entity_type": "corporation", + "id": 145, + "created_at": 1693830089, + "routes": [ + { + "train": "O1-2", + "connections": [ + [ + "H22", + "I23" + ], + [ + "I23", + "I21" + ], + [ + "I21", + "J22" + ], + [ + "J22", + "J24" + ], + [ + "J24", + "I25" + ], + [ + "I25", + "I27" + ], + [ + "I27", + "H28" + ], + [ + "H28", + "H30" + ], + [ + "H30", + "G29" + ], + [ + "G29", + "F30" + ] + ], + "hexes": [ + "H22", + "I23", + "I21", + "J22", + "J24", + "I25", + "I27", + "H28", + "H30", + "G29", + "F30" + ], + "revenue": 160, + "revenue_str": "H22-I23-I21-J22-J24-I25-I27-H28-H30-G29-F30", + "nodes": [ + "H22-0", + "I23-0", + "I21-0", + "J22-0", + "J24-0", + "I25-0", + "I27-0", + "H28-0", + "H30-0", + "G29-0", + "F30-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "18", + "entity_type": "corporation", + "id": 146, + "created_at": 1693830099 + }, + { + "type": "dividend", + "entity": "WT", + "entity_type": "corporation", + "id": 147, + "created_at": 1693830140, + "kind": "variable", + "amount": 200 + }, + { + "type": "dividend", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 148, + "created_at": 1693830215, + "auto_actions": [ + { + "type": "run_routes", + "entity": "W", + "entity_type": "corporation", + "created_at": 1693830214, + "routes": [ + { + "train": "City-0", + "connections": [ + [ + "G23", + "F24" + ], + [ + "G21", + "G23" + ], + [ + "G19", + "G21" + ], + [ + "G17", + "G19" + ], + [ + "H16", + "G17" + ], + [ + "I15", + "H16" + ], + [ + "I13", + "I15" + ], + [ + "I11", + "I13" + ] + ], + "hexes": [ + "F24", + "G23", + "G21", + "G19", + "G17", + "H16", + "I15", + "I13", + "I11" + ], + "revenue": 130, + "revenue_str": "F24-G23-G21-G19-G17-H16-I15-I13-I11", + "nodes": [ + "G23-0", + "F24-1", + "G21-0", + "G19-0", + "G17-0", + "H16-0", + "I15-0", + "I13-0", + "I11-1" + ] + } + ] + }, + { + "type": "run_routes", + "entity": "D", + "entity_type": "corporation", + "created_at": 1693830214, + "routes": [ + { + "train": "City-2", + "connections": [ + [ + "C21", + "D22" + ], + [ + "B20", + "C21" + ], + [ + "A19", + "B20" + ], + [ + "A17", + "A19" + ] + ], + "hexes": [ + "D22", + "C21", + "B20", + "A19", + "A17" + ], + "revenue": 90, + "revenue_str": "D22-C21-B20-A19-A17", + "nodes": [ + "C21-0", + "D22-0", + "B20-0", + "A19-0", + "A17-2" + ] + } + ] + }, + { + "type": "run_routes", + "entity": "G", + "entity_type": "corporation", + "created_at": 1693830214, + "routes": [ + { + "train": "City-1", + "connections": [ + [ + "B16", + "B14" + ], + [ + "A17", + "B16" + ] + ], + "hexes": [ + "B14", + "B16", + "A17" + ], + "revenue": 60, + "revenue_str": "B14-B16-A17", + "nodes": [ + "B16-0", + "B14-0", + "A17-0" + ] + } + ] + } + ], + "kind": "variable", + "amount": 0 + }, + { + "type": "buy_train", + "entity": "WT", + "entity_type": "corporation", + "id": 149, + "created_at": 1693830223, + "train": "R1-0", + "price": 400, + "variant": "R2" + }, + { + "type": "reassign_trains", + "entity": "WT", + "entity_type": "corporation", + "id": 150, + "created_at": 1693830229, + "assignments": [ + { + "train": "O1-0", + "corporation": "4" + }, + { + "train": "O1-2", + "corporation": "18" + }, + { + "train": "R1-0", + "corporation": "WT" + } + ] + }, + { + "type": "pass", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 151, + "created_at": 1693830285 + }, + { + "type": "reassign_trains", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 152, + "created_at": 1693830289, + "assignments": [ + { + "train": "O1-1", + "corporation": "5" + }, + { + "train": "Y1-0", + "corporation": "2" + } + ] + }, + { + "type": "merge", + "entity": "WT", + "entity_type": "corporation", + "id": 153, + "created_at": 1693830304, + "corporation": "7" + }, + { + "type": "bid", + "entity": "WT", + "entity_type": "corporation", + "id": 154, + "created_at": 1693830305, + "corporation": "7", + "price": 20 + }, + { + "type": "pass", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 155, + "created_at": 1693830322 + }, + { + "type": "pass", + "entity": "WT", + "entity_type": "corporation", + "id": 156, + "created_at": 1693830326 + }, + { + "type": "reassign_trains", + "entity": "WT", + "entity_type": "corporation", + "id": 157, + "created_at": 1693830337, + "assignments": [ + { + "train": "O1-0", + "corporation": "4" + }, + { + "train": "O1-2", + "corporation": "18" + }, + { + "train": "R1-0", + "corporation": "7" + } + ] + }, + { + "type": "merge", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 158, + "created_at": 1693830343, + "corporation": "15" + }, + { + "type": "bid", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 159, + "created_at": 1693830346, + "corporation": "15", + "price": 20 + }, + { + "type": "pass", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 160, + "created_at": 1693830359 + }, + { + "type": "reassign_trains", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 161, + "created_at": 1693830364, + "assignments": [ + { + "train": "O1-1", + "corporation": "5" + }, + { + "train": "Y1-0", + "corporation": "2" + } + ] + }, + { + "type": "buy_shares", + "entity": 621, + "entity_type": "player", + "id": 162, + "created_at": 1693830389, + "shares": [ + "D_0" + ], + "percent": 10 + }, + { + "type": "buy_shares", + "entity": 2006, + "entity_type": "player", + "id": 163, + "created_at": 1693830395, + "shares": [ + "W_1" + ], + "percent": 10 + }, + { + "type": "buy_shares", + "entity": 621, + "entity_type": "player", + "id": 164, + "created_at": 1693830399, + "shares": [ + "D_1" + ], + "percent": 10 + }, + { + "type": "buy_shares", + "entity": 2006, + "entity_type": "player", + "id": 165, + "created_at": 1693830404, + "shares": [ + "D_2" + ], + "percent": 10 + }, + { + "type": "pass", + "entity": 621, + "entity_type": "player", + "id": 166, + "created_at": 1693830408 + }, + { + "type": "pass", + "entity": 2006, + "entity_type": "player", + "id": 167, + "created_at": 1693830410 + }, + { + "type": "lay_tile", + "entity": "2", + "entity_type": "corporation", + "id": 168, + "created_at": 1693830424, + "hex": "F14", + "tile": "14-0", + "rotation": 2 + }, + { + "type": "remove_token", + "entity": "2", + "entity_type": "corporation", + "id": 169, + "created_at": 1693830428, + "city": "E23-0-0", + "slot": 0 + }, + { + "type": "lay_tile", + "entity": "2", + "entity_type": "corporation", + "id": 170, + "created_at": 1693830435, + "hex": "E23", + "tile": "L4-1", + "rotation": 2 + }, + { + "type": "place_token", + "entity": "2", + "entity_type": "corporation", + "id": 171, + "created_at": 1693830437, + "city": "14-0-0", + "slot": 1, + "tokener": "2" + }, + { + "type": "pass", + "entity": "2", + "entity_type": "corporation", + "id": 172, + "created_at": 1693830441 + }, + { + "type": "run_routes", + "entity": "2", + "entity_type": "corporation", + "id": 173, + "created_at": 1693830446, + "routes": [ + { + "train": "Y1-0", + "connections": [ + [ + "D20", + "D18" + ], + [ + "D18", + "D16" + ], + [ + "D16", + "E15" + ], + [ + "E15", + "F14" + ], + [ + "F14", + "G15" + ] + ], + "hexes": [ + "D20", + "D18", + "D16", + "E15", + "F14", + "G15" + ], + "revenue": 150, + "revenue_str": "D20-D18-D16-E15-F14-G15", + "nodes": [ + "D20-0", + "D18-0", + "D16-0", + "E15-0", + "F14-0", + "G15-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "2", + "entity_type": "corporation", + "id": 174, + "created_at": 1693830448 + }, + { + "type": "lay_tile", + "entity": "4", + "entity_type": "corporation", + "id": 175, + "created_at": 1693830457, + "hex": "I21", + "tile": "14-1", + "rotation": 1 + }, + { + "type": "lay_tile", + "entity": "4", + "entity_type": "corporation", + "id": 176, + "created_at": 1693830464, + "hex": "C13", + "tile": "L2-6", + "rotation": 0 + }, + { + "type": "lay_tile", + "entity": "4", + "entity_type": "corporation", + "id": 177, + "created_at": 1693830471, + "hex": "F24", + "tile": "L31b-0", + "rotation": 0 + }, + { + "type": "place_token", + "entity": "4", + "entity_type": "corporation", + "id": 178, + "created_at": 1693830479, + "city": "14-1-0", + "slot": 1, + "tokener": "4" + }, + { + "type": "buy_company", + "entity": "4", + "entity_type": "corporation", + "id": 179, + "created_at": 1693830496, + "company": "SB", + "price": 30 + }, + { + "type": "pass", + "entity": "4", + "entity_type": "corporation", + "id": 180, + "created_at": 1693830499 + }, + { + "type": "run_routes", + "entity": "4", + "entity_type": "corporation", + "id": 181, + "created_at": 1693830505, + "routes": [ + { + "train": "O1-0", + "connections": [ + [ + "H22", + "I23" + ], + [ + "I23", + "I21" + ], + [ + "I21", + "J22" + ], + [ + "J22", + "J24" + ], + [ + "J24", + "I25" + ], + [ + "I25", + "I27" + ], + [ + "I27", + "H28" + ], + [ + "H28", + "H30" + ], + [ + "H30", + "G29" + ], + [ + "G29", + "F30" + ], + [ + "F30", + "F28" + ], + [ + "F28", + "F26" + ], + [ + "F26", + "F24" + ] + ], + "hexes": [ + "H22", + "I23", + "I21", + "J22", + "J24", + "I25", + "I27", + "H28", + "H30", + "G29", + "F30", + "F28", + "F26", + "F24" + ], + "revenue": 230, + "revenue_str": "H22-I23-I21-J22-J24-I25-I27-H28-H30-G29-F30-F28-F26-F24 (Schloss Belvedere)", + "nodes": [ + "H22-0", + "I23-0", + "I21-0", + "J22-0", + "J24-0", + "I25-0", + "I27-0", + "H28-0", + "H30-0", + "G29-0", + "F30-0", + "F28-0", + "F26-0", + "F24-2" + ] + } + ] + }, + { + "type": "pass", + "entity": "4", + "entity_type": "corporation", + "id": 182, + "created_at": 1693830509 + }, + { + "type": "lay_tile", + "entity": "5", + "entity_type": "corporation", + "id": 183, + "created_at": 1693830542, + "hex": "E17", + "tile": "8860-0", + "rotation": 2 + }, + { + "type": "place_token", + "entity": "5", + "entity_type": "corporation", + "id": 184, + "created_at": 1693830543, + "city": "8859-0-1", + "slot": 0, + "tokener": "5" + }, + { + "type": "lay_tile", + "entity": "5", + "entity_type": "corporation", + "id": 185, + "created_at": 1693830560, + "hex": "D12", + "tile": "L3-1", + "rotation": 3 + }, + { + "type": "lay_tile", + "entity": "5", + "entity_type": "corporation", + "id": 186, + "created_at": 1693830569, + "hex": "G15", + "tile": "14-2", + "rotation": 2 + }, + { + "type": "pass", + "entity": "5", + "entity_type": "corporation", + "id": 187, + "created_at": 1693830571 + }, + { + "type": "run_routes", + "entity": "5", + "entity_type": "corporation", + "id": 188, + "created_at": 1693830575, + "routes": [ + { + "train": "O1-1", + "connections": [ + [ + "D18", + "E17" + ], + [ + "E17", + "E15" + ], + [ + "E15", + "F14" + ], + [ + "F14", + "G15" + ], + [ + "G15", + "F16" + ] + ], + "hexes": [ + "D18", + "E17", + "E15", + "F14", + "G15", + "F16" + ], + "revenue": 180, + "revenue_str": "D18-E17-E15-F14-G15-F16", + "nodes": [ + "D18-1", + "E17-0", + "E15-0", + "F14-0", + "G15-0", + "F16-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "5", + "entity_type": "corporation", + "id": 189, + "created_at": 1693830577 + }, + { + "type": "lay_tile", + "entity": "7", + "entity_type": "corporation", + "id": 190, + "created_at": 1693830590, + "hex": "F18", + "tile": "57-1", + "rotation": 1 + }, + { + "city": "14-2-0", + "slot": 1, + "type": "place_token", + "entity": "7", + "tokener": "7", + "entity_type": "corporation", + "id": 191, + "user": 2006, + "created_at": 1693830596 + }, + { + "type": "undo", + "entity": "7", + "entity_type": "corporation", + "id": 192, + "user": 2006, + "created_at": 1693830601 + }, + { + "type": "lay_tile", + "entity": "7", + "entity_type": "corporation", + "id": 193, + "created_at": 1693830609, + "hex": "E13", + "tile": "L1-4", + "rotation": 0 + }, + { + "type": "place_token", + "entity": "7", + "entity_type": "corporation", + "id": 194, + "created_at": 1693830611, + "city": "14-2-0", + "slot": 1, + "tokener": "7" + }, + { + "type": "pass", + "entity": "7", + "entity_type": "corporation", + "id": 195, + "created_at": 1693830613 + }, + { + "type": "run_routes", + "entity": "7", + "entity_type": "corporation", + "id": 196, + "created_at": 1693830618, + "routes": [ + { + "train": "R1-0", + "connections": [ + [ + "F18", + "F16" + ], + [ + "F16", + "G15" + ], + [ + "G15", + "F14" + ] + ], + "hexes": [ + "F18", + "F16", + "G15", + "F14" + ], + "revenue": 60, + "revenue_str": "F18-F16-G15-F14", + "nodes": [ + "F18-0", + "F16-0", + "G15-0", + "F14-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "7", + "entity_type": "corporation", + "id": 197, + "created_at": 1693830624 + }, + { + "type": "lay_tile", + "entity": "15", + "entity_type": "corporation", + "id": 198, + "created_at": 1693830637, + "hex": "J16", + "tile": "5-2", + "rotation": 0 + }, + { + "type": "place_token", + "entity": "15", + "entity_type": "corporation", + "id": 199, + "created_at": 1693830641, + "city": "K15-0-0", + "slot": 0, + "tokener": "15" + }, + { + "type": "pass", + "entity": "15", + "entity_type": "corporation", + "id": 200, + "user": 621, + "created_at": 1693830644 + }, + { + "type": "pass", + "entity": "15", + "entity_type": "corporation", + "id": 201, + "user": 621, + "created_at": 1693830646 + }, + { + "type": "undo", + "entity": "18", + "entity_type": "corporation", + "id": 202, + "user": 621, + "created_at": 1693830659 + }, + { + "type": "undo", + "entity": "15", + "entity_type": "corporation", + "id": 203, + "user": 621, + "created_at": 1693830663 + }, + { + "type": "lay_tile", + "entity": "15", + "entity_type": "corporation", + "id": 204, + "created_at": 1693830672, + "hex": "F12", + "tile": "L2-7", + "rotation": 0 + }, + { + "type": "lay_tile", + "entity": "15", + "entity_type": "corporation", + "id": 205, + "created_at": 1693830675, + "hex": "J14", + "tile": "4-1", + "rotation": 1 + }, + { + "type": "pass", + "entity": "15", + "entity_type": "corporation", + "id": 206, + "created_at": 1693830679 + }, + { + "type": "pass", + "entity": "15", + "entity_type": "corporation", + "id": 207, + "created_at": 1693830682 + }, + { + "type": "lay_tile", + "entity": "18", + "entity_type": "corporation", + "id": 208, + "created_at": 1693830691, + "hex": "F28", + "tile": "619-2", + "rotation": 4 + }, + { + "type": "lay_tile", + "entity": "18", + "entity_type": "corporation", + "id": 209, + "created_at": 1693830697, + "hex": "G11", + "tile": "L1-5", + "rotation": 3 + }, + { + "type": "lay_tile", + "entity": "18", + "entity_type": "corporation", + "id": 210, + "created_at": 1693830701, + "hex": "F22", + "tile": "6-3", + "rotation": 2 + }, + { + "type": "pass", + "entity": "18", + "entity_type": "corporation", + "id": 211, + "created_at": 1693830715 + }, + { + "type": "run_routes", + "entity": "18", + "entity_type": "corporation", + "id": 212, + "created_at": 1693830721, + "routes": [ + { + "train": "O1-2", + "connections": [ + [ + "H22", + "I23" + ], + [ + "I23", + "I21" + ], + [ + "I21", + "J22" + ], + [ + "J22", + "J24" + ], + [ + "J24", + "I25" + ], + [ + "I25", + "I27" + ], + [ + "I27", + "H28" + ], + [ + "H28", + "H30" + ], + [ + "H30", + "G29" + ], + [ + "G29", + "F30" + ], + [ + "F30", + "F28" + ], + [ + "F28", + "F26" + ], + [ + "F26", + "F24" + ] + ], + "hexes": [ + "H22", + "I23", + "I21", + "J22", + "J24", + "I25", + "I27", + "H28", + "H30", + "G29", + "F30", + "F28", + "F26", + "F24" + ], + "revenue": 210, + "revenue_str": "H22-I23-I21-J22-J24-I25-I27-H28-H30-G29-F30-F28-F26-F24 (Schloss Belvedere)", + "nodes": [ + "H22-0", + "I23-0", + "I21-0", + "J22-0", + "J24-0", + "I25-0", + "I27-0", + "H28-0", + "H30-0", + "G29-0", + "F30-0", + "F28-0", + "F26-0", + "F24-2" + ] + } + ] + }, + { + "type": "lay_tile", + "entity": "2", + "entity_type": "corporation", + "id": 213, + "created_at": 1693830738, + "hex": "G13", + "tile": "58-5", + "rotation": 3 + }, + { + "type": "lay_tile", + "entity": "2", + "entity_type": "corporation", + "id": 214, + "created_at": 1693830752, + "hex": "H12", + "tile": "L1-6", + "rotation": 0 + }, + { + "type": "pass", + "entity": "2", + "entity_type": "corporation", + "id": 215, + "created_at": 1693830761 + }, + { + "type": "pass", + "entity": "2", + "entity_type": "corporation", + "id": 216, + "created_at": 1693830769 + }, + { + "type": "run_routes", + "entity": "2", + "entity_type": "corporation", + "id": 217, + "created_at": 1693830774, + "routes": [ + { + "train": "Y1-0", + "connections": [ + [ + "D20", + "D18" + ], + [ + "D18", + "D16" + ], + [ + "D16", + "E15" + ], + [ + "E15", + "F14" + ], + [ + "F14", + "G13" + ] + ], + "hexes": [ + "D20", + "D18", + "D16", + "E15", + "F14", + "G13" + ], + "revenue": 160, + "revenue_str": "D20-D18-D16-E15-F14-G13", + "nodes": [ + "D20-0", + "D18-0", + "D16-0", + "E15-0", + "F14-0", + "G13-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "2", + "entity_type": "corporation", + "id": 218, + "created_at": 1693830778 + }, + { + "type": "lay_tile", + "entity": "4", + "entity_type": "corporation", + "id": 219, + "created_at": 1693830788, + "hex": "H24", + "tile": "58-6", + "rotation": 1 + }, + { + "type": "pass", + "entity": "4", + "entity_type": "corporation", + "id": 220, + "created_at": 1693830791 + }, + { + "type": "run_routes", + "entity": "4", + "entity_type": "corporation", + "id": 221, + "created_at": 1693830797, + "routes": [ + { + "train": "O1-0", + "connections": [ + [ + "F24", + "F26" + ], + [ + "F26", + "F28" + ], + [ + "F28", + "F30" + ], + [ + "F30", + "G29" + ], + [ + "G29", + "H30" + ], + [ + "H30", + "H28" + ], + [ + "H28", + "I27" + ], + [ + "I27", + "I25" + ], + [ + "I25", + "J24" + ], + [ + "J24", + "J22" + ], + [ + "J22", + "I21" + ], + [ + "I21", + "I23" + ], + [ + "I23", + "H22" + ], + [ + "H22", + "H24" + ] + ], + "hexes": [ + "F24", + "F26", + "F28", + "F30", + "G29", + "H30", + "H28", + "I27", + "I25", + "J24", + "J22", + "I21", + "I23", + "H22", + "H24" + ], + "revenue": 250, + "revenue_str": "F24-F26-F28-F30-G29-H30-H28-I27-I25-J24-J22-I21-I23-H22-H24 (Schloss Belvedere)", + "nodes": [ + "F24-2", + "F26-0", + "F28-0", + "F30-0", + "G29-0", + "H30-0", + "H28-0", + "I27-0", + "I25-0", + "J24-0", + "J22-0", + "I21-0", + "I23-0", + "H22-0", + "H24-0" + ] + } + ] + }, + { + "type": "lay_tile", + "entity": "5", + "entity_type": "corporation", + "id": 222, + "created_at": 1693830812, + "hex": "H16", + "tile": "L9-0", + "rotation": 2 + }, + { + "type": "pass", + "entity": "5", + "entity_type": "corporation", + "id": 223, + "created_at": 1693830829 + }, + { + "type": "run_routes", + "entity": "5", + "entity_type": "corporation", + "id": 224, + "created_at": 1693830833, + "routes": [ + { + "train": "O1-1", + "connections": [ + [ + "D18", + "E17" + ], + [ + "E17", + "E15" + ], + [ + "E15", + "F14" + ], + [ + "F14", + "G15" + ], + [ + "G15", + "H16" + ] + ], + "hexes": [ + "D18", + "E17", + "E15", + "F14", + "G15", + "H16" + ], + "revenue": 180, + "revenue_str": "D18-E17-E15-F14-G15-H16", + "nodes": [ + "D18-1", + "E17-0", + "E15-0", + "F14-0", + "G15-0", + "H16-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "5", + "entity_type": "corporation", + "id": 225, + "created_at": 1693830834 + }, + { + "type": "lay_tile", + "entity": "7", + "entity_type": "corporation", + "id": 226, + "created_at": 1693830842, + "hex": "I17", + "tile": "58-7", + "rotation": 2 + }, + { + "type": "pass", + "entity": "7", + "entity_type": "corporation", + "id": 227, + "created_at": 1693830848 + }, + { + "type": "run_routes", + "entity": "7", + "entity_type": "corporation", + "id": 228, + "created_at": 1693830854, + "routes": [ + { + "train": "R1-0", + "connections": [ + [ + "F18", + "F16" + ], + [ + "F16", + "G15" + ], + [ + "G15", + "H16" + ], + [ + "H16", + "I17" + ] + ], + "hexes": [ + "F18", + "F16", + "G15", + "H16", + "I17" + ], + "revenue": 80, + "revenue_str": "F18-F16-G15-H16-I17", + "nodes": [ + "F18-0", + "F16-0", + "G15-0", + "H16-0", + "I17-0" + ] + } + ] + }, + { + "type": "lay_tile", + "entity": "15", + "entity_type": "corporation", + "id": 229, + "created_at": 1693830863, + "hex": "J16", + "tile": "14-3", + "rotation": 0 + }, + { + "type": "pass", + "entity": "15", + "entity_type": "corporation", + "id": 230, + "created_at": 1693830868 + }, + { + "type": "pass", + "entity": "15", + "entity_type": "corporation", + "id": 231, + "created_at": 1693830868 + }, + { + "type": "lay_tile", + "entity": "18", + "entity_type": "corporation", + "id": 232, + "created_at": 1693830877, + "hex": "I19", + "tile": "4-2", + "rotation": 1 + }, + { + "type": "pass", + "entity": "18", + "entity_type": "corporation", + "id": 233, + "created_at": 1693830880 + }, + { + "type": "run_routes", + "entity": "18", + "entity_type": "corporation", + "id": 234, + "created_at": 1693830884, + "routes": [ + { + "train": "O1-2", + "connections": [ + [ + "F24", + "F26" + ], + [ + "F26", + "F28" + ], + [ + "F28", + "F30" + ], + [ + "F30", + "G29" + ], + [ + "G29", + "H30" + ], + [ + "H30", + "H28" + ], + [ + "H28", + "I27" + ], + [ + "I27", + "I25" + ], + [ + "I25", + "J24" + ], + [ + "J24", + "J22" + ], + [ + "J22", + "I21" + ], + [ + "I21", + "I23" + ], + [ + "I23", + "H22" + ], + [ + "H22", + "H24" + ] + ], + "hexes": [ + "F24", + "F26", + "F28", + "F30", + "G29", + "H30", + "H28", + "I27", + "I25", + "J24", + "J22", + "I21", + "I23", + "H22", + "H24" + ], + "revenue": 220, + "revenue_str": "F24-F26-F28-F30-G29-H30-H28-I27-I25-J24-J22-I21-I23-H22-H24 (Schloss Belvedere)", + "nodes": [ + "F24-2", + "F26-0", + "F28-0", + "F30-0", + "G29-0", + "H30-0", + "H28-0", + "I27-0", + "I25-0", + "J24-0", + "J22-0", + "I21-0", + "I23-0", + "H22-0", + "H24-0" + ] + } + ] + }, + { + "type": "dividend", + "entity": "WT", + "entity_type": "corporation", + "id": 235, + "created_at": 1693830902, + "kind": "variable", + "amount": 400 + }, + { + "type": "dividend", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 236, + "created_at": 1693830946, + "auto_actions": [ + { + "type": "run_routes", + "entity": "W", + "entity_type": "corporation", + "created_at": 1693830946, + "routes": [ + { + "train": "City-0", + "connections": [ + [ + "G23", + "F24" + ], + [ + "G21", + "G23" + ], + [ + "G19", + "G21" + ], + [ + "G17", + "G19" + ], + [ + "H16", + "G17" + ], + [ + "I15", + "H16" + ], + [ + "I13", + "I15" + ], + [ + "I11", + "I13" + ] + ], + "hexes": [ + "F24", + "G23", + "G21", + "G19", + "G17", + "H16", + "I15", + "I13", + "I11" + ], + "revenue": 120, + "revenue_str": "F24-G23-G21-G19-G17-H16-I15-I13-I11", + "nodes": [ + "G23-0", + "F24-0", + "G21-0", + "G19-0", + "G17-0", + "H16-1", + "I15-0", + "I13-0", + "I11-1" + ] + } + ] + }, + { + "type": "run_routes", + "entity": "D", + "entity_type": "corporation", + "created_at": 1693830946, + "routes": [ + { + "train": "City-2", + "connections": [ + [ + "A19", + "A17" + ], + [ + "B20", + "A19" + ], + [ + "C21", + "B20" + ], + [ + "D22", + "C21" + ], + [ + "E23", + "D22" + ], + [ + "F24", + "E23" + ] + ], + "hexes": [ + "A17", + "A19", + "B20", + "C21", + "D22", + "E23", + "F24" + ], + "revenue": 100, + "revenue_str": "A17-A19-B20-C21-D22-E23-F24", + "nodes": [ + "A19-0", + "A17-2", + "B20-0", + "C21-0", + "D22-0", + "E23-0", + "F24-1" + ] + } + ] + }, + { + "type": "run_routes", + "entity": "G", + "entity_type": "corporation", + "created_at": 1693830946, + "routes": [ + { + "train": "City-1", + "connections": [ + [ + "B16", + "A17" + ], + [ + "B14", + "B16" + ], + [ + "C13", + "B14" + ], + [ + "D12", + "C13" + ], + [ + "E13", + "D12" + ], + [ + "F12", + "E13" + ], + [ + "G11", + "F12" + ], + [ + "H12", + "G11" + ], + [ + "I11", + "H12" + ] + ], + "hexes": [ + "A17", + "B16", + "B14", + "C13", + "D12", + "E13", + "F12", + "G11", + "H12", + "I11" + ], + "revenue": 160, + "revenue_str": "A17-B16-B14-C13-D12-E13-F12-G11-H12-I11", + "nodes": [ + "B16-0", + "A17-0", + "B14-0", + "C13-0", + "D12-0", + "E13-0", + "F12-0", + "G11-0", + "H12-0", + "I11-0" + ] + } + ] + } + ], + "kind": "variable", + "amount": 170 + }, + { + "type": "pass", + "entity": "WT", + "entity_type": "corporation", + "id": 237, + "created_at": 1693830952 + }, + { + "type": "reassign_trains", + "entity": "WT", + "entity_type": "corporation", + "id": 238, + "created_at": 1693830955, + "assignments": [ + { + "train": "O1-0", + "corporation": "4" + }, + { + "train": "O1-2", + "corporation": "18" + }, + { + "train": "R1-0", + "corporation": "7" + } + ] + }, + { + "type": "pass", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 239, + "user": 621, + "created_at": 1693830958 + }, + { + "type": "reassign_trains", + "entity": "GWStStB", + "assignments": [ + { + "train": "O1-1", + "corporation": "5" + }, + { + "train": "Y1-0", + "corporation": "2" + } + ], + "entity_type": "corporation", + "id": 240, + "user": 621, + "created_at": 1693830960 + }, + { + "type": "undo", + "entity": 621, + "entity_type": "player", + "id": 241, + "user": 621, + "created_at": 1693830980 + }, + { + "type": "undo", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 242, + "user": 621, + "created_at": 1693830981 + }, + { + "type": "buy_train", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 243, + "created_at": 1693830984, + "train": "Pi1-0", + "price": 500, + "variant": "Pi2" + }, + { + "type": "reassign_trains", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 244, + "created_at": 1693831008, + "assignments": [ + { + "train": "O1-1", + "corporation": "5" + }, + { + "train": "Y1-0", + "corporation": "15" + }, + { + "train": "Pi1-0", + "corporation": "2" + } + ] + }, + { + "type": "buy_shares", + "entity": 621, + "entity_type": "player", + "id": 245, + "created_at": 1693831011, + "shares": [ + "G_0" + ], + "percent": 10 + }, + { + "type": "buy_shares", + "entity": 2006, + "entity_type": "player", + "id": 246, + "created_at": 1693831023, + "shares": [ + "G_1" + ], + "percent": 10 + }, + { + "type": "buy_shares", + "entity": 621, + "entity_type": "player", + "id": 247, + "created_at": 1693831026, + "shares": [ + "G_2" + ], + "percent": 10 + }, + { + "type": "buy_shares", + "entity": 2006, + "entity_type": "player", + "id": 248, + "created_at": 1693831029, + "shares": [ + "G_3" + ], + "percent": 10 + }, + { + "type": "buy_shares", + "entity": 621, + "entity_type": "player", + "id": 249, + "created_at": 1693831031, + "shares": [ + "G_4" + ], + "percent": 10 + }, + { + "type": "buy_shares", + "entity": 2006, + "entity_type": "player", + "id": 250, + "created_at": 1693831034, + "shares": [ + "G_5" + ], + "percent": 10 + }, + { + "type": "buy_shares", + "entity": 621, + "entity_type": "player", + "id": 251, + "created_at": 1693831036, + "shares": [ + "G_6" + ], + "percent": 10 + }, + { + "type": "buy_shares", + "entity": 2006, + "entity_type": "player", + "id": 252, + "created_at": 1693831038, + "shares": [ + "G_7" + ], + "percent": 10 + }, + { + "type": "pass", + "entity": 621, + "entity_type": "player", + "id": 253, + "created_at": 1693831043 + }, + { + "type": "buy_shares", + "entity": 2006, + "entity_type": "player", + "id": 254, + "created_at": 1693831047, + "shares": [ + "G_8" + ], + "percent": 10 + }, + { + "type": "pass", + "entity": 621, + "entity_type": "player", + "id": 255, + "created_at": 1693831054 + }, + { + "type": "pass", + "entity": 2006, + "entity_type": "player", + "id": 256, + "created_at": 1693831056 + }, + { + "type": "lay_tile", + "entity": "2", + "entity_type": "corporation", + "id": 257, + "created_at": 1693831111, + "hex": "D18", + "tile": "L17-0", + "rotation": 1 + }, + { + "type": "pass", + "entity": "2", + "entity_type": "corporation", + "id": 258, + "created_at": 1693831118 + }, + { + "type": "run_routes", + "entity": "2", + "entity_type": "corporation", + "id": 259, + "created_at": 1693831122, + "routes": [ + { + "train": "Pi1-0", + "connections": [ + [ + "D20", + "D18" + ], + [ + "D18", + "D16" + ], + [ + "D16", + "E15" + ], + [ + "E15", + "F14" + ], + [ + "F14", + "G13" + ] + ], + "hexes": [ + "D20", + "D18", + "D16", + "E15", + "F14", + "G13" + ], + "revenue": 190, + "revenue_str": "D20-D18-D16-E15-F14-G13", + "nodes": [ + "D20-0", + "D18-0", + "D16-0", + "E15-0", + "F14-0", + "G13-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "2", + "entity_type": "corporation", + "id": 260, + "created_at": 1693831124 + }, + { + "type": "lay_tile", + "entity": "4", + "entity_type": "corporation", + "id": 261, + "created_at": 1693831140, + "hex": "I21", + "tile": "611-0", + "rotation": 4 + }, + { + "type": "place_token", + "entity": "4", + "entity_type": "corporation", + "id": 262, + "created_at": 1693831144, + "city": "6-3-0", + "slot": 0, + "tokener": "4" + }, + { + "type": "pass", + "entity": "4", + "entity_type": "corporation", + "id": 263, + "created_at": 1693831162 + }, + { + "type": "run_routes", + "entity": "4", + "entity_type": "corporation", + "id": 264, + "created_at": 1693831171, + "routes": [ + { + "train": "O1-0", + "connections": [ + [ + "F22", + "F24" + ], + [ + "F24", + "F26" + ], + [ + "F26", + "F28" + ], + [ + "F28", + "F30" + ], + [ + "F30", + "G29" + ], + [ + "G29", + "H30" + ], + [ + "H30", + "H28" + ], + [ + "H28", + "I27" + ], + [ + "I27", + "I25" + ], + [ + "I25", + "J24" + ], + [ + "J24", + "J22" + ], + [ + "J22", + "I21" + ], + [ + "I21", + "I23" + ], + [ + "I23", + "H22" + ], + [ + "H22", + "H24" + ] + ], + "hexes": [ + "F22", + "F24", + "F26", + "F28", + "F30", + "G29", + "H30", + "H28", + "I27", + "I25", + "J24", + "J22", + "I21", + "I23", + "H22", + "H24" + ], + "revenue": 320, + "revenue_str": "F22-F24-F26-F28-F30-G29-H30-H28-I27-I25-J24-J22-I21-I23-H22-H24 (Schloss Belvedere)", + "nodes": [ + "F22-0", + "F24-2", + "F26-0", + "F28-0", + "F30-0", + "G29-0", + "H30-0", + "H28-0", + "I27-0", + "I25-0", + "J24-0", + "J22-0", + "I21-0", + "I23-0", + "H22-0", + "H24-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "4", + "entity_type": "corporation", + "id": 265, + "created_at": 1693831174 + }, + { + "hex": "I17", + "tile": "144-0", + "type": "lay_tile", + "entity": "5", + "rotation": 0, + "entity_type": "corporation", + "id": 266, + "user": 621, + "created_at": 1693831180 + }, + { + "type": "undo", + "entity": "5", + "action_id": 265, + "entity_type": "corporation", + "id": 267, + "user": 621, + "created_at": 1693831195 + }, + { + "type": "lay_tile", + "entity": "5", + "entity_type": "corporation", + "id": 268, + "created_at": 1693831211, + "hex": "C19", + "tile": "58-8", + "rotation": 4 + }, + { + "type": "pass", + "entity": "5", + "entity_type": "corporation", + "id": 269, + "created_at": 1693831213 + }, + { + "type": "run_routes", + "entity": "5", + "entity_type": "corporation", + "id": 270, + "created_at": 1693831216, + "routes": [ + { + "train": "O1-1", + "connections": [ + [ + "I19", + "I17" + ], + [ + "I17", + "H16" + ], + [ + "H16", + "G15" + ], + [ + "G15", + "F14" + ], + [ + "F14", + "E15" + ], + [ + "E15", + "E17" + ], + [ + "E17", + "D18" + ], + [ + "D18", + "C19" + ] + ], + "hexes": [ + "I19", + "I17", + "H16", + "G15", + "F14", + "E15", + "E17", + "D18", + "C19" + ], + "revenue": 230, + "revenue_str": "I19-I17-H16-G15-F14-E15-E17-D18-C19", + "nodes": [ + "I19-0", + "I17-0", + "H16-0", + "G15-0", + "F14-0", + "E15-0", + "E17-0", + "D18-0", + "C19-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "5", + "entity_type": "corporation", + "id": 271, + "created_at": 1693831218 + }, + { + "type": "lay_tile", + "entity": "7", + "entity_type": "corporation", + "id": 272, + "created_at": 1693831224, + "hex": "I17", + "tile": "144-0", + "rotation": 0 + }, + { + "type": "place_token", + "entity": "7", + "entity_type": "corporation", + "id": 273, + "created_at": 1693831225, + "city": "14-3-0", + "slot": 1, + "tokener": "7" + }, + { + "type": "pass", + "entity": "7", + "entity_type": "corporation", + "id": 274, + "created_at": 1693831228 + }, + { + "type": "run_routes", + "entity": "7", + "entity_type": "corporation", + "id": 275, + "created_at": 1693831237, + "routes": [ + { + "train": "R1-0", + "connections": [ + [ + "F18", + "F16" + ], + [ + "F16", + "G15" + ], + [ + "G15", + "H16" + ], + [ + "H16", + "I17" + ], + [ + "I17", + "J16" + ], + [ + "J16", + "J14" + ] + ], + "hexes": [ + "F18", + "F16", + "G15", + "H16", + "I17", + "J16", + "J14" + ], + "revenue": 120, + "revenue_str": "F18-F16-G15-H16-I17-J16-J14", + "nodes": [ + "F18-0", + "F16-0", + "G15-0", + "H16-0", + "I17-0", + "J16-0", + "J14-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "7", + "entity_type": "corporation", + "id": 276, + "created_at": 1693831239 + }, + { + "type": "lay_tile", + "entity": "15", + "entity_type": "corporation", + "id": 277, + "created_at": 1693831262, + "hex": "J12", + "tile": "58-9", + "rotation": 4 + }, + { + "type": "pass", + "entity": "15", + "entity_type": "corporation", + "id": 278, + "created_at": 1693831267 + }, + { + "type": "scrap_train", + "entity": "15", + "entity_type": "corporation", + "id": 279, + "created_at": 1693831269, + "train": "Y1-0" + }, + { + "type": "pass", + "entity": "15", + "entity_type": "corporation", + "id": 280, + "created_at": 1693831271 + }, + { + "type": "lay_tile", + "entity": "18", + "entity_type": "corporation", + "id": 281, + "created_at": 1693831287, + "hex": "F22", + "tile": "15-0", + "rotation": 1 + }, + { + "type": "place_token", + "entity": "18", + "entity_type": "corporation", + "id": 282, + "created_at": 1693831288, + "city": "15-0-0", + "slot": 1, + "tokener": "18" + }, + { + "type": "pass", + "entity": "18", + "entity_type": "corporation", + "id": 283, + "created_at": 1693831291 + }, + { + "type": "run_routes", + "entity": "18", + "entity_type": "corporation", + "id": 284, + "created_at": 1693831295, + "routes": [ + { + "train": "O1-2", + "connections": [ + [ + "F22", + "F24" + ], + [ + "F24", + "F26" + ], + [ + "F26", + "F28" + ], + [ + "F28", + "F30" + ], + [ + "F30", + "G29" + ], + [ + "G29", + "H30" + ], + [ + "H30", + "H28" + ], + [ + "H28", + "I27" + ], + [ + "I27", + "I25" + ], + [ + "I25", + "J24" + ], + [ + "J24", + "J22" + ], + [ + "J22", + "I21" + ], + [ + "I21", + "I23" + ], + [ + "I23", + "H22" + ], + [ + "H22", + "H24" + ] + ], + "hexes": [ + "F22", + "F24", + "F26", + "F28", + "F30", + "G29", + "H30", + "H28", + "I27", + "I25", + "J24", + "J22", + "I21", + "I23", + "H22", + "H24" + ], + "revenue": 300, + "revenue_str": "F22-F24-F26-F28-F30-G29-H30-H28-I27-I25-J24-J22-I21-I23-H22-H24 (Schloss Belvedere)", + "nodes": [ + "F22-0", + "F24-2", + "F26-0", + "F28-0", + "F30-0", + "G29-0", + "H30-0", + "H28-0", + "I27-0", + "I25-0", + "J24-0", + "J22-0", + "I21-0", + "I23-0", + "H22-0", + "H24-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "18", + "entity_type": "corporation", + "id": 285, + "created_at": 1693831296 + }, + { + "type": "lay_tile", + "entity": "2", + "entity_type": "corporation", + "id": 286, + "created_at": 1693831315, + "hex": "C21", + "tile": "L9-1", + "rotation": 1 + }, + { + "type": "pass", + "entity": "2", + "entity_type": "corporation", + "id": 287, + "created_at": 1693831322 + }, + { + "type": "run_routes", + "entity": "2", + "entity_type": "corporation", + "id": 288, + "created_at": 1693831325, + "routes": [ + { + "train": "Pi1-0", + "connections": [ + [ + "D20", + "D18" + ], + [ + "D18", + "D16" + ], + [ + "D16", + "E15" + ], + [ + "E15", + "F14" + ], + [ + "F14", + "G13" + ] + ], + "hexes": [ + "D20", + "D18", + "D16", + "E15", + "F14", + "G13" + ], + "revenue": 190, + "revenue_str": "D20-D18-D16-E15-F14-G13", + "nodes": [ + "D20-0", + "D18-0", + "D16-0", + "E15-0", + "F14-0", + "G13-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "2", + "entity_type": "corporation", + "id": 289, + "created_at": 1693831327 + }, + { + "type": "lay_tile", + "entity": "4", + "entity_type": "corporation", + "id": 290, + "created_at": 1693831340, + "hex": "E23", + "tile": "L12-0", + "rotation": 0 + }, + { + "type": "pass", + "entity": "4", + "entity_type": "corporation", + "id": 291, + "user": 2006, + "created_at": 1693831347 + }, + { + "type": "undo", + "entity": "4", + "entity_type": "corporation", + "id": 292, + "user": 2006, + "created_at": 1693831355 + }, + { + "type": "place_token", + "entity": "4", + "entity_type": "corporation", + "id": 293, + "created_at": 1693831356, + "city": "L12-0-0", + "slot": 0, + "tokener": "4" + }, + { + "type": "pass", + "entity": "4", + "entity_type": "corporation", + "id": 294, + "created_at": 1693831358 + }, + { + "type": "run_routes", + "entity": "4", + "entity_type": "corporation", + "id": 295, + "created_at": 1693831365, + "routes": [ + { + "train": "O1-0", + "connections": [ + [ + "E23", + "F22" + ], + [ + "F22", + "F24" + ], + [ + "F24", + "F26" + ], + [ + "F26", + "F28" + ], + [ + "F28", + "F30" + ], + [ + "F30", + "G29" + ], + [ + "G29", + "H30" + ], + [ + "H30", + "H28" + ], + [ + "H28", + "I27" + ], + [ + "I27", + "I25" + ], + [ + "I25", + "J24" + ], + [ + "J24", + "J22" + ], + [ + "J22", + "I21" + ], + [ + "I21", + "I23" + ], + [ + "I23", + "H22" + ], + [ + "H22", + "H24" + ] + ], + "hexes": [ + "E23", + "F22", + "F24", + "F26", + "F28", + "F30", + "G29", + "H30", + "H28", + "I27", + "I25", + "J24", + "J22", + "I21", + "I23", + "H22", + "H24" + ], + "revenue": 370, + "revenue_str": "E23-F22-F24-F26-F28-F30-G29-H30-H28-I27-I25-J24-J22-I21-I23-H22-H24 (Schloss Belvedere)", + "nodes": [ + "E23-0", + "F22-0", + "F24-2", + "F26-0", + "F28-0", + "F30-0", + "G29-0", + "H30-0", + "H28-0", + "I27-0", + "I25-0", + "J24-0", + "J22-0", + "I21-0", + "I23-0", + "H22-0", + "H24-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "4", + "entity_type": "corporation", + "id": 296, + "created_at": 1693831367 + }, + { + "type": "lay_tile", + "entity": "5", + "entity_type": "corporation", + "id": 297, + "created_at": 1693831371, + "hex": "C23", + "tile": "3-1", + "rotation": 1 + }, + { + "type": "pass", + "entity": "5", + "entity_type": "corporation", + "id": 298, + "created_at": 1693831373 + }, + { + "type": "run_routes", + "entity": "5", + "entity_type": "corporation", + "id": 299, + "created_at": 1693831379, + "routes": [ + { + "train": "O1-1", + "connections": [ + [ + "B22", + "C23" + ], + [ + "C23", + "C21" + ], + [ + "C21", + "C19" + ], + [ + "C19", + "D18" + ], + [ + "D18", + "E17" + ], + [ + "E17", + "E15" + ], + [ + "E15", + "F14" + ], + [ + "F14", + "G15" + ], + [ + "G15", + "H16" + ], + [ + "H16", + "I17" + ], + [ + "I17", + "I19" + ] + ], + "hexes": [ + "B22", + "C23", + "C21", + "C19", + "D18", + "E17", + "E15", + "F14", + "G15", + "H16", + "I17", + "I19" + ], + "revenue": 270, + "revenue_str": "B22-C23-C21-C19-D18-E17-E15-F14-G15-H16-I17-I19", + "nodes": [ + "B22-0", + "C23-0", + "C21-0", + "C19-0", + "D18-0", + "E17-0", + "E15-0", + "F14-0", + "G15-0", + "H16-0", + "I17-0", + "I19-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "5", + "entity_type": "corporation", + "id": 300, + "created_at": 1693831384 + }, + { + "type": "lay_tile", + "entity": "7", + "entity_type": "corporation", + "id": 301, + "created_at": 1693831397, + "hex": "J16", + "tile": "611-1", + "rotation": 3 + }, + { + "type": "place_token", + "entity": "7", + "entity_type": "corporation", + "id": 302, + "created_at": 1693831399, + "city": "K9-0-0", + "slot": 1, + "tokener": "7" + }, + { + "type": "pass", + "entity": "7", + "entity_type": "corporation", + "id": 303, + "created_at": 1693831401 + }, + { + "type": "run_routes", + "entity": "7", + "entity_type": "corporation", + "id": 304, + "created_at": 1693831406, + "routes": [ + { + "train": "R1-0", + "connections": [ + [ + "K9", + "K11", + "J12" + ], + [ + "J12", + "J14" + ], + [ + "J14", + "J16" + ], + [ + "J16", + "I17" + ], + [ + "I17", + "H16" + ], + [ + "H16", + "G15" + ], + [ + "G15", + "F16" + ], + [ + "F16", + "F18" + ] + ], + "hexes": [ + "K9", + "J12", + "J14", + "J16", + "I17", + "H16", + "G15", + "F16", + "F18" + ], + "revenue": 190, + "revenue_str": "K9-J12-J14-J16-I17-H16-G15-F16-F18", + "nodes": [ + "K9-0", + "J12-0", + "J14-0", + "J16-0", + "I17-0", + "H16-0", + "G15-0", + "F16-0", + "F18-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "7", + "entity_type": "corporation", + "id": 305, + "created_at": 1693831407 + }, + { + "type": "lay_tile", + "entity": "15", + "entity_type": "corporation", + "id": 306, + "created_at": 1693831415, + "hex": "I19", + "tile": "142-0", + "rotation": 1 + }, + { + "type": "pass", + "entity": "15", + "entity_type": "corporation", + "id": 307, + "created_at": 1693831424 + }, + { + "type": "pass", + "entity": "15", + "entity_type": "corporation", + "id": 308, + "created_at": 1693831424 + }, + { + "type": "lay_tile", + "entity": "18", + "entity_type": "corporation", + "id": 309, + "created_at": 1693831433, + "hex": "D24", + "tile": "5-3", + "rotation": 0 + }, + { + "type": "place_token", + "entity": "18", + "entity_type": "corporation", + "id": 310, + "created_at": 1693831439, + "city": "L12-0-0", + "slot": 1, + "tokener": "18" + }, + { + "type": "pass", + "entity": "18", + "entity_type": "corporation", + "id": 311, + "created_at": 1693831442 + }, + { + "type": "run_routes", + "entity": "18", + "entity_type": "corporation", + "id": 312, + "created_at": 1693831447, + "routes": [ + { + "train": "O1-2", + "connections": [ + [ + "D24", + "E23" + ], + [ + "E23", + "F22" + ], + [ + "F22", + "F24" + ], + [ + "F24", + "F26" + ], + [ + "F26", + "F28" + ], + [ + "F28", + "F30" + ], + [ + "F30", + "G29" + ], + [ + "G29", + "H30" + ], + [ + "H30", + "H28" + ], + [ + "H28", + "I27" + ], + [ + "I27", + "I25" + ], + [ + "I25", + "J24" + ], + [ + "J24", + "J22" + ], + [ + "J22", + "I21" + ], + [ + "I21", + "I23" + ], + [ + "I23", + "H22" + ], + [ + "H22", + "H24" + ] + ], + "hexes": [ + "D24", + "E23", + "F22", + "F24", + "F26", + "F28", + "F30", + "G29", + "H30", + "H28", + "I27", + "I25", + "J24", + "J22", + "I21", + "I23", + "H22", + "H24" + ], + "revenue": 340, + "revenue_str": "D24-E23-F22-F24-F26-F28-F30-G29-H30-H28-I27-I25-J24-J22-I21-I23-H22-H24 (Schloss Belvedere)", + "nodes": [ + "D24-0", + "E23-0", + "F22-0", + "F24-2", + "F26-0", + "F28-0", + "F30-0", + "G29-0", + "H30-0", + "H28-0", + "I27-0", + "I25-0", + "J24-0", + "J22-0", + "I21-0", + "I23-0", + "H22-0", + "H24-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "18", + "entity_type": "corporation", + "id": 313, + "created_at": 1693831449 + }, + { + "type": "dividend", + "entity": "WT", + "entity_type": "corporation", + "id": 314, + "created_at": 1693831490, + "kind": "variable", + "amount": 200 + }, + { + "type": "dividend", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 315, + "created_at": 1693831510, + "auto_actions": [ + { + "type": "run_routes", + "entity": "W", + "entity_type": "corporation", + "created_at": 1693831509, + "routes": [ + { + "train": "City-0", + "connections": [ + [ + "G23", + "F24" + ], + [ + "G21", + "G23" + ], + [ + "G19", + "G21" + ], + [ + "G17", + "G19" + ], + [ + "H16", + "G17" + ], + [ + "I15", + "H16" + ], + [ + "I13", + "I15" + ], + [ + "I11", + "I13" + ] + ], + "hexes": [ + "F24", + "G23", + "G21", + "G19", + "G17", + "H16", + "I15", + "I13", + "I11" + ], + "revenue": 140, + "revenue_str": "F24-G23-G21-G19-G17-H16-I15-I13-I11", + "nodes": [ + "G23-0", + "F24-0", + "G21-0", + "G19-0", + "G17-0", + "H16-1", + "I15-0", + "I13-0", + "I11-1" + ] + } + ] + }, + { + "type": "run_routes", + "entity": "D", + "entity_type": "corporation", + "created_at": 1693831509, + "routes": [ + { + "train": "City-2", + "connections": [ + [ + "A19", + "A17" + ], + [ + "B20", + "A19" + ], + [ + "C21", + "B20" + ], + [ + "D22", + "C21" + ], + [ + "E23", + "D22" + ], + [ + "F24", + "E23" + ] + ], + "hexes": [ + "A17", + "A19", + "B20", + "C21", + "D22", + "E23", + "F24" + ], + "revenue": 120, + "revenue_str": "A17-A19-B20-C21-D22-E23-F24", + "nodes": [ + "A19-0", + "A17-2", + "B20-0", + "C21-1", + "D22-0", + "E23-0", + "F24-1" + ] + } + ] + }, + { + "type": "run_routes", + "entity": "G", + "entity_type": "corporation", + "created_at": 1693831509, + "routes": [ + { + "train": "City-1", + "connections": [ + [ + "B16", + "A17" + ], + [ + "B14", + "B16" + ], + [ + "C13", + "B14" + ], + [ + "D12", + "C13" + ], + [ + "E13", + "D12" + ], + [ + "F12", + "E13" + ], + [ + "G11", + "F12" + ], + [ + "H12", + "G11" + ], + [ + "I11", + "H12" + ] + ], + "hexes": [ + "A17", + "B16", + "B14", + "C13", + "D12", + "E13", + "F12", + "G11", + "H12", + "I11" + ], + "revenue": 160, + "revenue_str": "A17-B16-B14-C13-D12-E13-F12-G11-H12-I11", + "nodes": [ + "B16-0", + "A17-0", + "B14-0", + "C13-0", + "D12-0", + "E13-0", + "F12-0", + "G11-0", + "H12-0", + "I11-0" + ] + } + ] + } + ], + "kind": "variable", + "amount": 680 + }, + { + "type": "scrap_train", + "entity": "WT", + "entity_type": "corporation", + "id": 316, + "created_at": 1693831514, + "train": "O1-0" + }, + { + "type": "scrap_train", + "entity": "WT", + "entity_type": "corporation", + "id": 317, + "created_at": 1693831517, + "train": "O1-2" + }, + { + "type": "buy_train", + "entity": "WT", + "entity_type": "corporation", + "id": 318, + "created_at": 1693831520, + "train": "Pu1-0", + "price": 600, + "variant": "Pu2" + }, + { + "type": "buy_train", + "entity": "WT", + "entity_type": "corporation", + "id": 319, + "created_at": 1693831532, + "train": "Pu1-1", + "price": 600, + "variant": "Pu2" + }, + { + "type": "reassign_trains", + "entity": "WT", + "entity_type": "corporation", + "id": 320, + "created_at": 1693831539, + "assignments": [ + { + "train": "R1-0", + "corporation": "7" + }, + { + "train": "Pu1-0", + "corporation": "4" + }, + { + "train": "Pu1-1", + "corporation": "18" + } + ] + }, + { + "type": "pass", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 321, + "created_at": 1693831544 + }, + { + "type": "reassign_trains", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 322, + "created_at": 1693831546, + "assignments": [ + { + "train": "O1-1", + "corporation": "5" + }, + { + "train": "Pi1-0", + "corporation": "2" + } + ] + }, + { + "type": "buy_shares", + "entity": 621, + "entity_type": "player", + "id": 323, + "created_at": 1693831558, + "shares": [ + "G_9" + ], + "percent": 10 + }, + { + "type": "buy_shares", + "entity": 2006, + "entity_type": "player", + "id": 324, + "created_at": 1693831567, + "shares": [ + "W_2" + ], + "percent": 10 + }, + { + "type": "buy_shares", + "entity": 621, + "entity_type": "player", + "id": 325, + "created_at": 1693831569, + "shares": [ + "D_3" + ], + "percent": 10 + }, + { + "type": "buy_shares", + "entity": 2006, + "entity_type": "player", + "id": 326, + "created_at": 1693831574, + "shares": [ + "W_3" + ], + "percent": 10 + }, + { + "type": "buy_shares", + "entity": 621, + "entity_type": "player", + "id": 327, + "created_at": 1693831576, + "shares": [ + "D_4" + ], + "percent": 10 + }, + { + "type": "buy_shares", + "entity": 2006, + "entity_type": "player", + "id": 328, + "created_at": 1693831578, + "shares": [ + "W_4" + ], + "percent": 10 + }, + { + "type": "buy_shares", + "entity": 621, + "entity_type": "player", + "id": 329, + "created_at": 1693831581, + "shares": [ + "D_5" + ], + "percent": 10 + }, + { + "type": "buy_shares", + "entity": 2006, + "entity_type": "player", + "id": 330, + "created_at": 1693831587, + "shares": [ + "W_5" + ], + "percent": 10 + }, + { + "type": "buy_shares", + "entity": 621, + "entity_type": "player", + "id": 331, + "created_at": 1693831590, + "shares": [ + "D_6" + ], + "percent": 10 + }, + { + "type": "program_share_pass", + "entity": 2006, + "entity_type": "player", + "id": 332, + "created_at": 1693831596, + "auto_actions": [ + { + "type": "pass", + "entity": 2006, + "entity_type": "player", + "created_at": 1693831596 + } + ], + "unconditional": false, + "indefinite": false + }, + { + "type": "buy_shares", + "entity": 621, + "entity_type": "player", + "id": 333, + "created_at": 1693831604, + "auto_actions": [ + { + "type": "pass", + "entity": 2006, + "entity_type": "player", + "created_at": 1693831604 + } + ], + "shares": [ + "W_6" + ], + "percent": 10 + }, + { + "type": "pass", + "entity": 621, + "entity_type": "player", + "id": 334, + "created_at": 1693831613 + }, + { + "type": "lay_tile", + "entity": "2", + "entity_type": "corporation", + "id": 335, + "created_at": 1693831659, + "hex": "D22", + "tile": "L12-1", + "rotation": 0 + }, + { + "type": "pass", + "entity": "2", + "entity_type": "corporation", + "id": 336, + "created_at": 1693831661 + }, + { + "type": "run_routes", + "entity": "2", + "entity_type": "corporation", + "id": 337, + "created_at": 1693831665, + "routes": [ + { + "train": "Pi1-0", + "connections": [ + [ + "D20", + "D18" + ], + [ + "D18", + "D16" + ], + [ + "D16", + "E15" + ], + [ + "E15", + "F14" + ], + [ + "F14", + "G13" + ] + ], + "hexes": [ + "D20", + "D18", + "D16", + "E15", + "F14", + "G13" + ], + "revenue": 210, + "revenue_str": "D20-D18-D16-E15-F14-G13", + "nodes": [ + "D20-0", + "D18-0", + "D16-0", + "E15-0", + "F14-0", + "G13-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "2", + "entity_type": "corporation", + "id": 338, + "created_at": 1693831667 + }, + { + "hex": "D24", + "tile": "15-1", + "type": "lay_tile", + "entity": "4", + "rotation": 0, + "entity_type": "corporation", + "id": 339, + "user": 2006, + "created_at": 1693831685 + }, + { + "type": "undo", + "entity": "4", + "entity_type": "corporation", + "id": 340, + "user": 2006, + "created_at": 1693831694 + }, + { + "type": "lay_tile", + "entity": "4", + "entity_type": "corporation", + "id": 341, + "created_at": 1693831698, + "hex": "D22", + "tile": "L16-0", + "rotation": 0 + }, + { + "type": "place_token", + "entity": "4", + "entity_type": "corporation", + "id": 342, + "created_at": 1693831704, + "city": "L22-0-0", + "slot": 1, + "tokener": "4" + }, + { + "type": "pass", + "entity": "4", + "entity_type": "corporation", + "id": 343, + "created_at": 1693831714 + }, + { + "type": "run_routes", + "entity": "4", + "entity_type": "corporation", + "id": 344, + "created_at": 1693831728, + "routes": [ + { + "train": "Pu1-0", + "connections": [ + [ + "D20", + "D22" + ], + [ + "D22", + "D24" + ], + [ + "D24", + "E23" + ], + [ + "E23", + "F22" + ], + [ + "F22", + "F24" + ], + [ + "F24", + "F26" + ], + [ + "F26", + "F28" + ], + [ + "F28", + "F30" + ], + [ + "F30", + "G29" + ], + [ + "G29", + "H30" + ], + [ + "H30", + "H28" + ], + [ + "H28", + "I27" + ], + [ + "I27", + "I25" + ], + [ + "I25", + "J24" + ], + [ + "J24", + "J22" + ], + [ + "J22", + "I21" + ], + [ + "I21", + "I23" + ], + [ + "I23", + "H22" + ], + [ + "H22", + "H24" + ] + ], + "hexes": [ + "D20", + "D22", + "D24", + "E23", + "F22", + "F24", + "F26", + "F28", + "F30", + "G29", + "H30", + "H28", + "I27", + "I25", + "J24", + "J22", + "I21", + "I23", + "H22", + "H24" + ], + "revenue": 440, + "revenue_str": "D20-D22-D24-E23-F22-F24-F26-F28-F30-G29-H30-H28-I27-I25-J24-J22-I21-I23-H22-H24 (Schloss Belvedere)", + "nodes": [ + "D20-0", + "D22-0", + "D24-0", + "E23-0", + "F22-0", + "F24-2", + "F26-0", + "F28-0", + "F30-0", + "G29-0", + "H30-0", + "H28-0", + "I27-0", + "I25-0", + "J24-0", + "J22-0", + "I21-0", + "I23-0", + "H22-0", + "H24-0" + ] + } + ] + }, + { + "type": "lay_tile", + "entity": "5", + "entity_type": "corporation", + "id": 345, + "created_at": 1693831737, + "hex": "B24", + "tile": "58-10", + "rotation": 5 + }, + { + "type": "pass", + "entity": "5", + "entity_type": "corporation", + "id": 346, + "created_at": 1693831740 + }, + { + "type": "scrap_train", + "entity": "5", + "entity_type": "corporation", + "id": 347, + "created_at": 1693831758, + "train": "O1-1" + }, + { + "type": "pass", + "entity": "5", + "entity_type": "corporation", + "id": 348, + "created_at": 1693831760 + }, + { + "type": "lay_tile", + "entity": "7", + "entity_type": "corporation", + "id": 349, + "created_at": 1693831772, + "hex": "F20", + "tile": "57-2", + "rotation": 1 + }, + { + "type": "pass", + "entity": "7", + "entity_type": "corporation", + "id": 350, + "created_at": 1693831776 + }, + { + "type": "run_routes", + "entity": "7", + "entity_type": "corporation", + "id": 351, + "created_at": 1693831782, + "routes": [ + { + "train": "R1-0", + "connections": [ + [ + "K9", + "K11", + "J12" + ], + [ + "J12", + "J14" + ], + [ + "J14", + "J16" + ], + [ + "J16", + "I17" + ], + [ + "I17", + "H16" + ], + [ + "H16", + "G15" + ], + [ + "G15", + "F16" + ], + [ + "F16", + "F18" + ], + [ + "F18", + "F20" + ], + [ + "F20", + "F22" + ] + ], + "hexes": [ + "K9", + "J12", + "J14", + "J16", + "I17", + "H16", + "G15", + "F16", + "F18", + "F20", + "F22" + ], + "revenue": 200, + "revenue_str": "K9-J12-J14-J16-I17-H16-G15-F16-F18-F20-F22", + "nodes": [ + "K9-0", + "J12-0", + "J14-0", + "J16-0", + "I17-0", + "H16-0", + "G15-0", + "F16-0", + "F18-0", + "F20-0", + "F22-0" + ] + } + ] + }, + { + "type": "lay_tile", + "entity": "15", + "entity_type": "corporation", + "id": 352, + "created_at": 1693831796, + "hex": "J18", + "tile": "4-3", + "rotation": 1 + }, + { + "type": "pass", + "entity": "15", + "entity_type": "corporation", + "id": 353, + "created_at": 1693831798 + }, + { + "type": "pass", + "entity": "15", + "entity_type": "corporation", + "id": 354, + "created_at": 1693831799 + }, + { + "type": "lay_tile", + "entity": "18", + "entity_type": "corporation", + "id": 355, + "created_at": 1693831809, + "hex": "H28", + "tile": "611-2", + "rotation": 2 + }, + { + "type": "pass", + "entity": "18", + "entity_type": "corporation", + "id": 356, + "created_at": 1693831811 + }, + { + "type": "run_routes", + "entity": "18", + "entity_type": "corporation", + "id": 357, + "created_at": 1693831823, + "routes": [ + { + "train": "Pu1-1", + "connections": [ + [ + "D24", + "E23" + ], + [ + "E23", + "F22" + ], + [ + "F22", + "F24" + ], + [ + "F24", + "F26" + ], + [ + "F26", + "F28" + ], + [ + "F28", + "F30" + ], + [ + "F30", + "G29" + ], + [ + "G29", + "H30" + ], + [ + "H30", + "H28" + ], + [ + "H28", + "I27" + ], + [ + "I27", + "I25" + ], + [ + "I25", + "J24" + ], + [ + "J24", + "J22" + ], + [ + "J22", + "I21" + ], + [ + "I21", + "I23" + ], + [ + "I23", + "H22" + ], + [ + "H22", + "H24" + ] + ], + "hexes": [ + "D24", + "E23", + "F22", + "F24", + "F26", + "F28", + "F30", + "G29", + "H30", + "H28", + "I27", + "I25", + "J24", + "J22", + "I21", + "I23", + "H22", + "H24" + ], + "revenue": 350, + "revenue_str": "D24-E23-F22-F24-F26-F28-F30-G29-H30-H28-I27-I25-J24-J22-I21-I23-H22-H24 (Schloss Belvedere)", + "nodes": [ + "D24-0", + "E23-0", + "F22-0", + "F24-2", + "F26-0", + "F28-0", + "F30-0", + "G29-0", + "H30-0", + "H28-0", + "I27-0", + "I25-0", + "J24-0", + "J22-0", + "I21-0", + "I23-0", + "H22-0", + "H24-0" + ] + } + ] + }, + { + "type": "lay_tile", + "entity": "2", + "entity_type": "corporation", + "id": 358, + "created_at": 1693831833, + "hex": "C25", + "tile": "58-11", + "rotation": 0 + }, + { + "type": "pass", + "entity": "2", + "entity_type": "corporation", + "id": 359, + "created_at": 1693831835 + }, + { + "type": "run_routes", + "entity": "2", + "entity_type": "corporation", + "id": 360, + "created_at": 1693831839, + "routes": [ + { + "train": "Pi1-0", + "connections": [ + [ + "G13", + "F14" + ], + [ + "F14", + "E15" + ], + [ + "E15", + "D16" + ], + [ + "D16", + "D18" + ], + [ + "D18", + "C19" + ], + [ + "C19", + "C21" + ], + [ + "C21", + "C23" + ], + [ + "C23", + "B22" + ], + [ + "B22", + "B24" + ], + [ + "B24", + "C25" + ] + ], + "hexes": [ + "G13", + "F14", + "E15", + "D16", + "D18", + "C19", + "C21", + "C23", + "B22", + "B24", + "C25" + ], + "revenue": 210, + "revenue_str": "G13-F14-E15-D16-D18-C19-C21-C23-B22-B24-C25", + "nodes": [ + "G13-0", + "F14-0", + "E15-0", + "D16-0", + "D18-0", + "C19-0", + "C21-0", + "C23-0", + "B22-0", + "B24-0", + "C25-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "2", + "entity_type": "corporation", + "id": 361, + "created_at": 1693831840 + }, + { + "type": "lay_tile", + "entity": "4", + "entity_type": "corporation", + "id": 362, + "created_at": 1693831858, + "hex": "G25", + "tile": "6-4", + "rotation": 0 + }, + { + "type": "pass", + "entity": "4", + "entity_type": "corporation", + "id": 363, + "created_at": 1693831860 + }, + { + "type": "run_routes", + "entity": "4", + "entity_type": "corporation", + "id": 364, + "created_at": 1693831868, + "routes": [ + { + "train": "Pu1-0", + "connections": [ + [ + "D20", + "D22" + ], + [ + "D22", + "D24" + ], + [ + "D24", + "E23" + ], + [ + "E23", + "F22" + ], + [ + "F22", + "F24" + ], + [ + "F24", + "G25" + ], + [ + "G25", + "H24" + ], + [ + "H24", + "H22" + ], + [ + "H22", + "I23" + ], + [ + "I23", + "I21" + ], + [ + "I21", + "J22" + ], + [ + "J22", + "J24" + ], + [ + "J24", + "I25" + ], + [ + "I25", + "I27" + ], + [ + "I27", + "H28" + ], + [ + "H28", + "H30" + ], + [ + "H30", + "G29" + ], + [ + "G29", + "F30" + ], + [ + "F30", + "F28" + ], + [ + "F28", + "F26" + ] + ], + "hexes": [ + "D20", + "D22", + "D24", + "E23", + "F22", + "F24", + "G25", + "H24", + "H22", + "I23", + "I21", + "J22", + "J24", + "I25", + "I27", + "H28", + "H30", + "G29", + "F30", + "F28", + "F26" + ], + "revenue": 450, + "revenue_str": "D20-D22-D24-E23-F22-F24-G25-H24-H22-I23-I21-J22-J24-I25-I27-H28-H30-G29-F30-F28-F26 (Schloss Belvedere)", + "nodes": [ + "D20-0", + "D22-0", + "D24-0", + "E23-0", + "F22-0", + "F24-2", + "G25-0", + "H24-0", + "H22-0", + "I23-0", + "I21-0", + "J22-0", + "J24-0", + "I25-0", + "I27-0", + "H28-0", + "H30-0", + "G29-0", + "F30-0", + "F28-0", + "F26-0" + ] + } + ] + }, + { + "type": "lay_tile", + "entity": "5", + "entity_type": "corporation", + "id": 365, + "created_at": 1693831874, + "hex": "D24", + "tile": "619-3", + "rotation": 3 + }, + { + "type": "pass", + "entity": "5", + "entity_type": "corporation", + "id": 366, + "created_at": 1693831877 + }, + { + "type": "pass", + "entity": "5", + "entity_type": "corporation", + "id": 367, + "created_at": 1693831878 + }, + { + "type": "pass", + "entity": "7", + "entity_type": "corporation", + "id": 368, + "created_at": 1693831886 + }, + { + "type": "run_routes", + "entity": "7", + "entity_type": "corporation", + "id": 369, + "created_at": 1693831889, + "routes": [ + { + "train": "R1-0", + "connections": [ + [ + "K9", + "K11", + "J12" + ], + [ + "J12", + "J14" + ], + [ + "J14", + "J16" + ], + [ + "J16", + "I17" + ], + [ + "I17", + "H16" + ], + [ + "H16", + "G15" + ], + [ + "G15", + "F16" + ], + [ + "F16", + "F18" + ], + [ + "F18", + "F20" + ], + [ + "F20", + "F22" + ] + ], + "hexes": [ + "K9", + "J12", + "J14", + "J16", + "I17", + "H16", + "G15", + "F16", + "F18", + "F20", + "F22" + ], + "revenue": 200, + "revenue_str": "K9-J12-J14-J16-I17-H16-G15-F16-F18-F20-F22", + "nodes": [ + "K9-0", + "J12-0", + "J14-0", + "J16-0", + "I17-0", + "H16-0", + "G15-0", + "F16-0", + "F18-0", + "F20-0", + "F22-0" + ] + } + ] + }, + { + "type": "lay_tile", + "entity": "15", + "entity_type": "corporation", + "id": 370, + "created_at": 1693831910, + "hex": "J18", + "tile": "142-1", + "rotation": 4 + }, + { + "type": "pass", + "entity": "15", + "entity_type": "corporation", + "id": 371, + "created_at": 1693831912 + }, + { + "type": "pass", + "entity": "15", + "entity_type": "corporation", + "id": 372, + "created_at": 1693831913 + }, + { + "type": "lay_tile", + "entity": "18", + "entity_type": "corporation", + "id": 373, + "created_at": 1693831920, + "hex": "C19", + "tile": "143-0", + "rotation": 4 + }, + { + "type": "pass", + "entity": "18", + "entity_type": "corporation", + "id": 374, + "created_at": 1693831926 + }, + { + "type": "run_routes", + "entity": "18", + "entity_type": "corporation", + "id": 375, + "created_at": 1693831936, + "routes": [ + { + "train": "Pu1-1", + "connections": [ + [ + "H24", + "H22" + ], + [ + "H22", + "I23" + ], + [ + "I23", + "I21" + ], + [ + "I21", + "J22" + ], + [ + "J22", + "J24" + ], + [ + "J24", + "I25" + ], + [ + "I25", + "I27" + ], + [ + "I27", + "H28" + ], + [ + "H28", + "H30" + ], + [ + "H30", + "G29" + ], + [ + "G29", + "F30" + ], + [ + "F30", + "F28" + ], + [ + "F28", + "F26" + ], + [ + "F26", + "F24" + ], + [ + "F24", + "F22" + ], + [ + "F22", + "E23" + ], + [ + "E23", + "D24" + ], + [ + "D24", + "C25" + ], + [ + "C25", + "B24" + ], + [ + "B24", + "B22" + ], + [ + "B22", + "C23" + ], + [ + "C23", + "C21" + ], + [ + "C21", + "C19" + ] + ], + "hexes": [ + "H24", + "H22", + "I23", + "I21", + "J22", + "J24", + "I25", + "I27", + "H28", + "H30", + "G29", + "F30", + "F28", + "F26", + "F24", + "F22", + "E23", + "D24", + "C25", + "B24", + "B22", + "C23", + "C21", + "C19" + ], + "revenue": 420, + "revenue_str": "H24-H22-I23-I21-J22-J24-I25-I27-H28-H30-G29-F30-F28-F26-F24-F22-E23-D24-C25-B24-B22-C23-C21-C19 (Schloss Belvedere)", + "nodes": [ + "H24-0", + "H22-0", + "I23-0", + "I21-0", + "J22-0", + "J24-0", + "I25-0", + "I27-0", + "H28-0", + "H30-0", + "G29-0", + "F30-0", + "F28-0", + "F26-0", + "F24-2", + "F22-0", + "E23-0", + "D24-0", + "C25-0", + "B24-0", + "B22-0", + "C23-0", + "C21-0", + "C19-0" + ] + } + ] + }, + { + "type": "lay_tile", + "entity": "2", + "entity_type": "corporation", + "id": 376, + "created_at": 1693831948, + "hex": "E25", + "tile": "58-7", + "rotation": 0 + }, + { + "type": "pass", + "entity": "2", + "entity_type": "corporation", + "id": 377, + "created_at": 1693831951 + }, + { + "type": "run_routes", + "entity": "2", + "entity_type": "corporation", + "id": 378, + "created_at": 1693831955, + "routes": [ + { + "train": "Pi1-0", + "connections": [ + [ + "G13", + "F14" + ], + [ + "F14", + "E15" + ], + [ + "E15", + "D16" + ], + [ + "D16", + "D18" + ], + [ + "D18", + "C19" + ], + [ + "C19", + "C21" + ], + [ + "C21", + "C23" + ], + [ + "C23", + "B22" + ], + [ + "B22", + "B24" + ], + [ + "B24", + "C25" + ], + [ + "C25", + "D24" + ], + [ + "D24", + "E25" + ], + [ + "E25", + "F24" + ], + [ + "F24", + "G25" + ], + [ + "G25", + "H24" + ], + [ + "H24", + "H22" + ], + [ + "H22", + "I23" + ] + ], + "hexes": [ + "G13", + "F14", + "E15", + "D16", + "D18", + "C19", + "C21", + "C23", + "B22", + "B24", + "C25", + "D24", + "E25", + "F24", + "G25", + "H24", + "H22", + "I23" + ], + "revenue": 290, + "revenue_str": "G13-F14-E15-D16-D18-C19-C21-C23-B22-B24-C25-D24-E25-F24-G25-H24-H22-I23", + "nodes": [ + "G13-0", + "F14-0", + "E15-0", + "D16-0", + "D18-0", + "C19-0", + "C21-0", + "C23-0", + "B22-0", + "B24-0", + "C25-0", + "D24-0", + "E25-0", + "F24-2", + "G25-0", + "H24-0", + "H22-0", + "I23-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "2", + "entity_type": "corporation", + "id": 379, + "created_at": 1693831957 + }, + { + "type": "pass", + "entity": "4", + "entity_type": "corporation", + "id": 380, + "created_at": 1693831971 + }, + { + "type": "run_routes", + "entity": "4", + "entity_type": "corporation", + "id": 381, + "created_at": 1693831984, + "routes": [ + { + "train": "Pu1-0", + "connections": [ + [ + "D20", + "C19" + ], + [ + "C19", + "C21" + ], + [ + "C21", + "C23" + ], + [ + "C23", + "B22" + ], + [ + "B22", + "B24" + ], + [ + "B24", + "C25" + ], + [ + "C25", + "D24" + ], + [ + "D24", + "E23" + ], + [ + "E23", + "F22" + ], + [ + "F22", + "F24" + ], + [ + "F24", + "G25" + ], + [ + "G25", + "H24" + ], + [ + "H24", + "H22" + ], + [ + "H22", + "I23" + ], + [ + "I23", + "I21" + ], + [ + "I21", + "J22" + ], + [ + "J22", + "J24" + ], + [ + "J24", + "I25" + ], + [ + "I25", + "I27" + ], + [ + "I27", + "H28" + ], + [ + "H28", + "H30" + ], + [ + "H30", + "G29" + ], + [ + "G29", + "F30" + ], + [ + "F30", + "F28" + ], + [ + "F28", + "F26" + ] + ], + "hexes": [ + "D20", + "C19", + "C21", + "C23", + "B22", + "B24", + "C25", + "D24", + "E23", + "F22", + "F24", + "G25", + "H24", + "H22", + "I23", + "I21", + "J22", + "J24", + "I25", + "I27", + "H28", + "H30", + "G29", + "F30", + "F28", + "F26" + ], + "revenue": 520, + "revenue_str": "D20-C19-C21-C23-B22-B24-C25-D24-E23-F22-F24-G25-H24-H22-I23-I21-J22-J24-I25-I27-H28-H30-G29-F30-F28-F26 (Schloss Belvedere)", + "nodes": [ + "D20-0", + "C19-0", + "C21-0", + "C23-0", + "B22-0", + "B24-0", + "C25-0", + "D24-0", + "E23-0", + "F22-0", + "F24-2", + "G25-0", + "H24-0", + "H22-0", + "I23-0", + "I21-0", + "J22-0", + "J24-0", + "I25-0", + "I27-0", + "H28-0", + "H30-0", + "G29-0", + "F30-0", + "F28-0", + "F26-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "5", + "entity_type": "corporation", + "id": 382, + "created_at": 1693831988 + }, + { + "type": "pass", + "entity": "5", + "entity_type": "corporation", + "id": 383, + "created_at": 1693831989 + }, + { + "type": "pass", + "entity": "7", + "entity_type": "corporation", + "id": 384, + "created_at": 1693831998 + }, + { + "type": "run_routes", + "entity": "7", + "entity_type": "corporation", + "id": 385, + "created_at": 1693831999, + "routes": [ + { + "train": "R1-0", + "connections": [ + [ + "K9", + "K11", + "J12" + ], + [ + "J12", + "J14" + ], + [ + "J14", + "J16" + ], + [ + "J16", + "I17" + ], + [ + "I17", + "H16" + ], + [ + "H16", + "G15" + ], + [ + "G15", + "F16" + ], + [ + "F16", + "F18" + ], + [ + "F18", + "F20" + ], + [ + "F20", + "F22" + ] + ], + "hexes": [ + "K9", + "J12", + "J14", + "J16", + "I17", + "H16", + "G15", + "F16", + "F18", + "F20", + "F22" + ], + "revenue": 200, + "revenue_str": "K9-J12-J14-J16-I17-H16-G15-F16-F18-F20-F22", + "nodes": [ + "K9-0", + "J12-0", + "J14-0", + "J16-0", + "I17-0", + "H16-0", + "G15-0", + "F16-0", + "F18-0", + "F20-0", + "F22-0" + ] + } + ] + }, + { + "type": "pass", + "entity": "15", + "entity_type": "corporation", + "id": 386, + "created_at": 1693832001 + }, + { + "type": "pass", + "entity": "15", + "entity_type": "corporation", + "id": 387, + "created_at": 1693832002 + }, + { + "type": "pass", + "entity": "18", + "entity_type": "corporation", + "id": 388, + "created_at": 1693832005 + }, + { + "type": "run_routes", + "entity": "18", + "entity_type": "corporation", + "id": 389, + "created_at": 1693832007, + "routes": [ + { + "train": "Pu1-1", + "connections": [ + [ + "H24", + "H22" + ], + [ + "H22", + "I23" + ], + [ + "I23", + "I21" + ], + [ + "I21", + "J22" + ], + [ + "J22", + "J24" + ], + [ + "J24", + "I25" + ], + [ + "I25", + "I27" + ], + [ + "I27", + "H28" + ], + [ + "H28", + "H30" + ], + [ + "H30", + "G29" + ], + [ + "G29", + "F30" + ], + [ + "F30", + "F28" + ], + [ + "F28", + "F26" + ], + [ + "F26", + "F24" + ], + [ + "F24", + "F22" + ], + [ + "F22", + "E23" + ], + [ + "E23", + "D24" + ], + [ + "D24", + "C25" + ], + [ + "C25", + "B24" + ], + [ + "B24", + "B22" + ], + [ + "B22", + "C23" + ], + [ + "C23", + "C21" + ], + [ + "C21", + "C19" + ] + ], + "hexes": [ + "H24", + "H22", + "I23", + "I21", + "J22", + "J24", + "I25", + "I27", + "H28", + "H30", + "G29", + "F30", + "F28", + "F26", + "F24", + "F22", + "E23", + "D24", + "C25", + "B24", + "B22", + "C23", + "C21", + "C19" + ], + "revenue": 420, + "revenue_str": "H24-H22-I23-I21-J22-J24-I25-I27-H28-H30-G29-F30-F28-F26-F24-F22-E23-D24-C25-B24-B22-C23-C21-C19 (Schloss Belvedere)", + "nodes": [ + "H24-0", + "H22-0", + "I23-0", + "I21-0", + "J22-0", + "J24-0", + "I25-0", + "I27-0", + "H28-0", + "H30-0", + "G29-0", + "F30-0", + "F28-0", + "F26-0", + "F24-2", + "F22-0", + "E23-0", + "D24-0", + "C25-0", + "B24-0", + "B22-0", + "C23-0", + "C21-0", + "C19-0" + ] + } + ] + }, + { + "type": "dividend", + "entity": "WT", + "entity_type": "corporation", + "id": 390, + "created_at": 1693832012, + "kind": "variable", + "amount": 4100 + }, + { + "type": "dividend", + "entity": "GWStStB", + "entity_type": "corporation", + "id": 391, + "created_at": 1693832015, + "auto_actions": [ + { + "type": "run_routes", + "entity": "W", + "entity_type": "corporation", + "created_at": 1693832015, + "routes": [ + { + "train": "City-0", + "connections": [ + [ + "G23", + "F24" + ], + [ + "G21", + "G23" + ], + [ + "G19", + "G21" + ], + [ + "G17", + "G19" + ], + [ + "H16", + "G17" + ], + [ + "I15", + "H16" + ], + [ + "I13", + "I15" + ], + [ + "I11", + "I13" + ] + ], + "hexes": [ + "F24", + "G23", + "G21", + "G19", + "G17", + "H16", + "I15", + "I13", + "I11" + ], + "revenue": 140, + "revenue_str": "F24-G23-G21-G19-G17-H16-I15-I13-I11", + "nodes": [ + "G23-0", + "F24-0", + "G21-0", + "G19-0", + "G17-0", + "H16-1", + "I15-0", + "I13-0", + "I11-1" + ] + } + ] + }, + { + "type": "run_routes", + "entity": "G", + "entity_type": "corporation", + "created_at": 1693832015, + "routes": [ + { + "train": "City-1", + "connections": [ + [ + "B16", + "A17" + ], + [ + "B14", + "B16" + ], + [ + "C13", + "B14" + ], + [ + "D12", + "C13" + ], + [ + "E13", + "D12" + ], + [ + "F12", + "E13" + ], + [ + "G11", + "F12" + ], + [ + "H12", + "G11" + ], + [ + "I11", + "H12" + ] + ], + "hexes": [ + "A17", + "B16", + "B14", + "C13", + "D12", + "E13", + "F12", + "G11", + "H12", + "I11" + ], + "revenue": 160, + "revenue_str": "A17-B16-B14-C13-D12-E13-F12-G11-H12-I11", + "nodes": [ + "B16-0", + "A17-0", + "B14-0", + "C13-0", + "D12-0", + "E13-0", + "F12-0", + "G11-0", + "H12-0", + "I11-0" + ] + } + ] + }, + { + "type": "run_routes", + "entity": "D", + "entity_type": "corporation", + "created_at": 1693832015, + "routes": [ + { + "train": "City-2", + "connections": [ + [ + "A19", + "A17" + ], + [ + "B20", + "A19" + ], + [ + "C21", + "B20" + ], + [ + "D22", + "C21" + ], + [ + "E23", + "D22" + ], + [ + "F24", + "E23" + ] + ], + "hexes": [ + "A17", + "A19", + "B20", + "C21", + "D22", + "E23", + "F24" + ], + "revenue": 120, + "revenue_str": "A17-A19-B20-C21-D22-E23-F24", + "nodes": [ + "A19-0", + "A17-2", + "B20-0", + "C21-1", + "D22-0", + "E23-0", + "F24-1" + ] + } + ] + } + ], + "kind": "variable", + "amount": 710 + } + ], + "loaded": true, + "created_at": 1693828544, + "updated_at": 1693832015, + "finished_at": 1693832015 + } \ No newline at end of file diff --git a/public/fixtures/1840/3player.json b/public/fixtures/1840/3player.json deleted file mode 100644 index e9e11de26b..0000000000 --- a/public/fixtures/1840/3player.json +++ /dev/null @@ -1 +0,0 @@ -{"id":73646,"description":"Snow Day","user":{"id":336,"name":"brenthenson"},"players":[{"id":336,"name":"brenthenson"},{"id":343,"name":"coroner"},{"id":10723,"name":"thefeds"}],"max_players":3,"title":"1840","settings":{"seed":465350266,"is_async":true,"unlisted":true,"auto_routing":true,"player_order":null,"optional_rules":["three_player_small"]},"user_settings":null,"status":"finished","turn":6,"round":"Company Round","acting":[336,343,10723],"result":{"336":12983,"343":10743,"10723":9002},"actions":[{"type":"bid","entity":336,"entity_type":"player","id":1,"created_at":1645139462,"company":"HB","price":40},{"type":"bid","entity":343,"entity_type":"player","id":2,"created_at":1645139483,"company":"HB","price":45},{"type":"bid","entity":10723,"entity_type":"player","id":3,"created_at":1645139582,"company":"HB","price":50},{"type":"bid","entity":336,"entity_type":"player","id":4,"created_at":1645139610,"company":"HB","price":55},{"type":"bid","entity":343,"entity_type":"player","id":5,"created_at":1645139615,"company":"HB","price":60},{"type":"pass","entity":10723,"entity_type":"player","id":6,"created_at":1645139679},{"type":"bid","entity":336,"entity_type":"player","id":7,"created_at":1645139734,"company":"HB","price":65},{"type":"bid","entity":343,"entity_type":"player","id":8,"created_at":1645139735,"company":"HB","price":70},{"type":"bid","entity":336,"entity_type":"player","id":9,"created_at":1645139748,"company":"HB","price":75},{"type":"bid","entity":343,"entity_type":"player","id":10,"created_at":1645139751,"company":"HB","price":80},{"type":"pass","entity":336,"entity_type":"player","id":11,"created_at":1645139754},{"type":"bid","entity":343,"entity_type":"player","id":12,"created_at":1645139773,"company":"SD","price":60},{"type":"bid","entity":10723,"entity_type":"player","id":13,"created_at":1645139798,"company":"SD","price":65},{"type":"bid","entity":336,"entity_type":"player","id":14,"created_at":1645139800,"company":"SD","price":70},{"type":"bid","entity":343,"entity_type":"player","id":15,"created_at":1645139802,"company":"SD","price":75},{"type":"bid","entity":10723,"entity_type":"player","id":16,"created_at":1645139810,"company":"SD","price":80},{"type":"bid","entity":336,"entity_type":"player","id":17,"created_at":1645139819,"company":"SD","price":85},{"type":"bid","entity":343,"entity_type":"player","id":18,"created_at":1645139828,"company":"SD","price":90},{"type":"pass","entity":10723,"entity_type":"player","id":19,"created_at":1645139860},{"type":"bid","entity":336,"entity_type":"player","id":20,"created_at":1645139897,"company":"SD","price":95},{"type":"pass","entity":343,"entity_type":"player","id":21,"created_at":1645139902},{"type":"bid","entity":10723,"entity_type":"player","id":22,"created_at":1645139977,"company":"SB","price":50},{"type":"pass","entity":336,"entity_type":"player","id":23,"created_at":1645140025},{"type":"bid","entity":343,"entity_type":"player","id":24,"created_at":1645140035,"company":"SB","price":55},{"type":"bid","entity":10723,"entity_type":"player","id":25,"created_at":1645140079,"company":"SB","price":60},{"type":"bid","entity":343,"entity_type":"player","id":26,"created_at":1645140084,"company":"SB","price":65},{"type":"bid","entity":10723,"entity_type":"player","id":27,"created_at":1645140087,"company":"SB","price":70},{"type":"bid","entity":343,"entity_type":"player","id":28,"created_at":1645140089,"company":"SB","price":75},{"type":"bid","entity":10723,"entity_type":"player","id":29,"created_at":1645140092,"company":"SB","price":80},{"type":"pass","entity":343,"entity_type":"player","id":30,"created_at":1645140096},{"type":"bid","entity":336,"entity_type":"player","id":31,"created_at":1645140176,"company":"SSB","price":105},{"type":"pass","entity":343,"entity_type":"player","id":32,"created_at":1645140218},{"type":"bid","entity":10723,"entity_type":"player","id":33,"created_at":1645140220,"company":"SSB","price":110},{"type":"bid","entity":336,"entity_type":"player","id":34,"created_at":1645140234,"company":"SSB","price":120},{"type":"bid","entity":10723,"entity_type":"player","id":35,"created_at":1645140252,"company":"SSB","price":125},{"type":"bid","entity":336,"entity_type":"player","id":36,"created_at":1645140335,"company":"SSB","price":130},{"type":"pass","entity":10723,"entity_type":"player","id":37,"created_at":1645140341},{"type":"bid","entity":343,"entity_type":"player","id":38,"created_at":1645140359,"company":"KK","price":35},{"type":"bid","entity":10723,"entity_type":"player","id":39,"created_at":1645140385,"company":"KK","price":45},{"type":"pass","entity":336,"entity_type":"player","id":40,"created_at":1645140537},{"type":"pass","entity":343,"entity_type":"player","id":41,"created_at":1645140541},{"type":"choose","entity":336,"entity_type":"player","id":42,"created_at":1645140546,"choice":0},{"type":"choose","entity":10723,"entity_type":"player","id":43,"created_at":1645140555,"choice":1},{"type":"par","entity":336,"corporation":"GWStStB","entity_type":"player","share_price":"70,4,2","id":44,"user":336,"created_at":1645140640,"skip":true},{"skip":true,"type":"undo","entity":10723,"entity_type":"player","id":45,"user":336,"created_at":1645140657},{"type":"par","entity":336,"entity_type":"player","id":46,"created_at":1645140670,"corporation":"GWStStB","share_price":"80,3,2"},{"type":"par","entity":10723,"entity_type":"player","id":47,"created_at":1645140940,"corporation":"SJE","share_price":"70,4,2"},{"type":"par","entity":343,"entity_type":"player","id":48,"created_at":1645141141,"corporation":"BBG","share_price":"70,4,2"},{"type":"buy_shares","entity":10723,"entity_type":"player","id":49,"created_at":1645141229,"shares":["SJE_1"],"percent":10},{"type":"buy_shares","entity":343,"entity_type":"player","id":50,"created_at":1645141250,"shares":["SJE_2"],"percent":10},{"type":"buy_shares","entity":10723,"entity_type":"player","id":51,"created_at":1645141288,"shares":["GWStStB_1"],"percent":10},{"type":"buy_shares","entity":343,"entity_type":"player","id":52,"created_at":1645141294,"shares":["GWStStB_2"],"percent":10},{"type":"buy_shares","entity":343,"entity_type":"player","id":53,"created_at":1645141297,"auto_actions":[{"type":"run_routes","entity":"D","entity_type":"corporation","created_at":1645141298,"routes":[{"train":"City-2","connections":[["A17","A19"]],"hexes":["A19","A17"],"revenue":70,"revenue_str":"A19-A17","nodes":[]}]}],"shares":["BBG_1"],"percent":10},{"type":"buy_train","entity":"GWStStB","entity_type":"corporation","id":54,"created_at":1645141463,"train":"Y1-0","price":100,"variant":"Y1"},{"type":"pass","entity":"GWStStB","entity_type":"corporation","id":55,"created_at":1645141469},{"type":"buy_train","entity":"SJE","entity_type":"corporation","id":56,"created_at":1645141513,"train":"Y1-1","price":100,"variant":"Y1"},{"type":"pass","entity":"SJE","entity_type":"corporation","id":57,"created_at":1645141570},{"type":"buy_train","entity":"BBG","entity_type":"corporation","id":58,"created_at":1645141598,"train":"Y1-2","price":100,"variant":"Y1"},{"type":"pass","entity":"BBG","entity_type":"corporation","id":59,"created_at":1645141601},{"type":"merge","entity":"GWStStB","entity_type":"corporation","id":60,"created_at":1645141784,"corporation":"1"},{"type":"bid","entity":"GWStStB","entity_type":"corporation","id":61,"created_at":1645141787,"corporation":"1","price":20},{"type":"pass","entity":"SJE","entity_type":"corporation","id":62,"created_at":1645141817},{"type":"bid","entity":"BBG","entity_type":"corporation","id":63,"created_at":1645141892,"corporation":"1","price":25},{"type":"bid","entity":"GWStStB","entity_type":"corporation","id":64,"created_at":1645141912,"corporation":"1","price":30},{"type":"bid","entity":"BBG","entity_type":"corporation","id":65,"created_at":1645141942,"corporation":"1","price":35},{"type":"bid","entity":"GWStStB","entity_type":"corporation","id":66,"created_at":1645141947,"corporation":"1","price":40},{"type":"bid","entity":"BBG","entity_type":"corporation","id":67,"created_at":1645141954,"corporation":"1","price":45},{"type":"pass","entity":"GWStStB","entity_type":"corporation","id":68,"created_at":1645142022},{"type":"pass","entity":"BBG","entity_type":"corporation","id":69,"created_at":1645142113,"auto_actions":[{"type":"reassign_trains","entity":"BBG","entity_type":"corporation","created_at":1645142113,"assignments":[{"train":"Y1-2","corporation":"1"}]}]},{"type":"merge","entity":"GWStStB","entity_type":"corporation","id":70,"created_at":1645142162,"corporation":"8"},{"type":"bid","entity":"GWStStB","entity_type":"corporation","id":71,"created_at":1645142174,"corporation":"8","price":20},{"type":"pass","entity":"SJE","entity_type":"corporation","id":72,"created_at":1645142192},{"type":"pass","entity":"GWStStB","entity_type":"corporation","id":73,"created_at":1645142203,"auto_actions":[{"type":"reassign_trains","entity":"GWStStB","entity_type":"corporation","created_at":1645142202,"assignments":[{"train":"Y1-0","corporation":"8"}]}]},{"type":"merge","entity":"SJE","entity_type":"corporation","id":74,"created_at":1645142214,"corporation":"6"},{"type":"bid","entity":"SJE","entity_type":"corporation","id":75,"created_at":1645142219,"corporation":"6","price":20},{"type":"pass","entity":"SJE","entity_type":"corporation","id":76,"created_at":1645142230,"auto_actions":[{"type":"reassign_trains","entity":"SJE","entity_type":"corporation","created_at":1645142236,"assignments":[{"train":"Y1-1","corporation":"6"}]}]},{"type":"lay_tile","entity":"1","entity_type":"corporation","id":77,"created_at":1645142453,"hex":"D18","tile":"235-0","rotation":2},{"type":"place_token","entity":"1","entity_type":"corporation","id":78,"created_at":1645142632,"city":"235-0-0","slot":0,"tokener":"1"},{"type":"lay_tile","entity":"1","entity_type":"corporation","id":79,"created_at":1645142674,"hex":"B20","tile":"L2-0","rotation":2},{"type":"lay_tile","entity":"1","entity_type":"corporation","id":80,"created_at":1645142725,"hex":"C17","tile":"L26-0","rotation":1},{"type":"pass","entity":"1","entity_type":"corporation","id":81,"created_at":1645142768},{"type":"run_routes","entity":"1","entity_type":"corporation","id":82,"created_at":1645142788,"routes":[{"train":"Y1-2","connections":[["D18","C17"]],"hexes":["D18","C17"],"revenue":60,"revenue_str":"D18-C17","nodes":[]}]},{"hex":"J28","tile":"57-0","type":"lay_tile","entity":"6","rotation":0,"entity_type":"corporation","id":83,"user":10723,"created_at":1645142867,"skip":true},{"city":"57-0-0","slot":0,"type":"place_token","entity":"6","tokener":"6","entity_type":"corporation","id":84,"user":10723,"created_at":1645142873,"skip":true},{"type":"pass","entity":"6","entity_type":"corporation","id":85,"user":10723,"created_at":1645142887,"skip":true},{"skip":true,"type":"undo","entity":"6","entity_type":"corporation","id":86,"user":10723,"created_at":1645142920},{"skip":true,"type":"undo","entity":"6","entity_type":"corporation","id":87,"user":10723,"created_at":1645142923},{"skip":true,"type":"undo","entity":"6","entity_type":"corporation","id":88,"user":10723,"created_at":1645142928},{"hex":"J28","tile":"6-0","type":"lay_tile","entity":"6","rotation":0,"entity_type":"corporation","id":89,"user":10723,"created_at":1645142937,"skip":true},{"city":"6-0-0","slot":0,"type":"place_token","entity":"6","tokener":"6","entity_type":"corporation","id":90,"user":10723,"created_at":1645142941,"skip":true},{"type":"pass","entity":"6","entity_type":"corporation","id":91,"user":10723,"created_at":1645142967,"skip":true},{"type":"run_routes","entity":"6","routes":[{"hexes":["K27","J28","I27"],"nodes":[],"train":"Y1-1","revenue":40,"connections":[["K27","J28"],["J28","I27"]],"revenue_str":"K27-J28-I27"}],"entity_type":"corporation","id":92,"user":10723,"created_at":1645142972,"skip":true},{"skip":true,"type":"undo","entity":"8","entity_type":"corporation","id":93,"user":10723,"created_at":1645142991},{"skip":true,"type":"undo","entity":"6","entity_type":"corporation","id":94,"user":10723,"created_at":1645142993},{"skip":true,"type":"undo","entity":"6","entity_type":"corporation","id":95,"user":10723,"created_at":1645142997},{"skip":true,"type":"undo","entity":"6","entity_type":"corporation","id":96,"user":10723,"created_at":1645142999},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":97,"created_at":1645143005,"hex":"J28","tile":"57-0","rotation":0},{"type":"place_token","entity":"6","entity_type":"corporation","id":98,"created_at":1645143010,"city":"57-0-0","slot":0,"tokener":"6"},{"type":"pass","entity":"6","entity_type":"corporation","id":99,"user":10723,"created_at":1645143013,"skip":true},{"type":"run_routes","entity":"6","routes":[{"hexes":["J28","K27"],"nodes":[],"train":"Y1-1","revenue":40,"connections":[["J28","K27"]],"revenue_str":"J28-K27"}],"entity_type":"corporation","id":100,"user":10723,"created_at":1645143018,"skip":true},{"skip":true,"type":"undo","entity":"8","entity_type":"corporation","id":101,"user":10723,"created_at":1645143080},{"skip":true,"type":"undo","entity":"6","entity_type":"corporation","id":102,"user":10723,"created_at":1645143087},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":103,"created_at":1645143092,"hex":"G23","tile":"L1-0","rotation":1},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":104,"created_at":1645143099,"hex":"I29","tile":"3-0","rotation":0},{"type":"pass","entity":"6","entity_type":"corporation","id":105,"created_at":1645143172},{"type":"run_routes","entity":"6","entity_type":"corporation","id":106,"created_at":1645143177,"routes":[{"train":"Y1-1","connections":[["K27","J28"],["J28","I29"],["I29","I27"]],"hexes":["K27","J28","I29","I27"],"revenue":50,"revenue_str":"K27-J28-I29-I27","nodes":[]}]},{"hex":"J10","tile":"6-0","type":"lay_tile","entity":"8","rotation":1,"entity_type":"corporation","id":107,"user":336,"created_at":1645143205,"skip":true},{"hex":"B16","tile":"L1-1","type":"lay_tile","entity":"8","rotation":1,"entity_type":"corporation","id":108,"user":336,"created_at":1645143217,"skip":true},{"hex":"J12","tile":"58-0","type":"lay_tile","entity":"8","rotation":0,"entity_type":"corporation","id":109,"user":336,"created_at":1645143221,"skip":true},{"city":"K9-0-0","slot":1,"type":"place_token","entity":"8","tokener":"8","entity_type":"corporation","id":110,"user":336,"created_at":1645143228,"skip":true},{"type":"pass","entity":"8","entity_type":"corporation","id":111,"user":336,"created_at":1645143246,"skip":true},{"skip":true,"type":"undo","entity":"8","entity_type":"corporation","id":112,"user":336,"created_at":1645143384},{"skip":true,"type":"undo","entity":"8","entity_type":"corporation","id":113,"user":336,"created_at":1645143395},{"skip":true,"type":"undo","entity":"8","entity_type":"corporation","id":114,"user":336,"created_at":1645143396},{"skip":true,"type":"undo","entity":"8","entity_type":"corporation","id":115,"user":336,"created_at":1645143397},{"skip":true,"type":"undo","entity":"8","entity_type":"corporation","id":116,"user":336,"created_at":1645143402},{"hex":"J10","tile":"5-0","type":"lay_tile","entity":"8","rotation":0,"entity_type":"corporation","id":117,"user":336,"created_at":1645143406,"skip":true},{"city":"K9-0-0","slot":1,"type":"place_token","entity":"8","tokener":"8","entity_type":"corporation","id":118,"user":336,"created_at":1645143411,"skip":true},{"hex":"B16","tile":"L1-1","type":"lay_tile","entity":"8","rotation":1,"entity_type":"corporation","id":119,"user":336,"created_at":1645143417,"skip":true},{"hex":"J8","tile":"58-0","type":"lay_tile","entity":"8","rotation":4,"entity_type":"corporation","id":120,"user":336,"created_at":1645143428,"skip":true},{"skip":true,"type":"undo","entity":"8","entity_type":"corporation","id":121,"user":336,"created_at":1645143456},{"skip":true,"type":"undo","entity":"8","action_id":106,"entity_type":"corporation","id":122,"user":336,"created_at":1645143460},{"type":"lay_tile","entity":"8","entity_type":"corporation","id":123,"created_at":1645143471,"hex":"J10","tile":"6-0","rotation":1},{"type":"lay_tile","entity":"8","entity_type":"corporation","id":124,"created_at":1645143479,"hex":"B16","tile":"L1-1","rotation":1},{"type":"lay_tile","entity":"8","entity_type":"corporation","id":125,"created_at":1645143481,"hex":"J12","tile":"58-0","rotation":0},{"type":"place_token","entity":"8","entity_type":"corporation","id":126,"created_at":1645143482,"city":"K9-0-0","slot":1,"tokener":"8"},{"type":"pass","entity":"8","entity_type":"corporation","id":127,"created_at":1645143486},{"type":"run_routes","entity":"8","entity_type":"corporation","id":128,"created_at":1645143489,"routes":[{"train":"Y1-0","connections":[["K9","K11","J12"],["J12","I11"],["I11","J10"]],"hexes":["K9","J12","I11","J10"],"revenue":70,"revenue_str":"K9-J12-I11-J10","nodes":[]}]},{"type":"lay_tile","entity":"1","entity_type":"corporation","id":129,"created_at":1645143554,"hex":"C15","tile":"6-1","rotation":4},{"city":"E23-0-0","slot":0,"type":"remove_token","entity":"1","entity_type":"corporation","id":130,"user":343,"created_at":1645143573,"skip":true},{"hex":"E23","tile":"L4-0","type":"lay_tile","entity":"1","rotation":2,"entity_type":"corporation","id":131,"user":343,"created_at":1645143675,"skip":true},{"city":"6-1-0","slot":0,"type":"place_token","entity":"1","tokener":"1","entity_type":"corporation","id":132,"user":343,"created_at":1645143676,"skip":true},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":133,"user":343,"created_at":1645143708},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":134,"user":343,"created_at":1645143710},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":135,"user":343,"created_at":1645143715},{"type":"lay_tile","entity":"1","entity_type":"corporation","id":136,"created_at":1645143732,"hex":"E23","tile":"L4-0","rotation":2},{"type":"place_token","entity":"1","entity_type":"corporation","id":137,"created_at":1645143752,"city":"6-1-0","slot":0,"tokener":"1"},{"type":"pass","entity":"1","entity_type":"corporation","id":138,"created_at":1645143762},{"type":"run_routes","entity":"1","entity_type":"corporation","id":139,"created_at":1645143796,"routes":[{"train":"Y1-2","connections":[["D18","C17"],["C17","C15"]],"hexes":["D18","C17","C15"],"revenue":80,"revenue_str":"D18-C17-C15","nodes":[]}]},{"skip":true,"type":"undo","entity":"6","entity_type":"corporation","id":140,"user":10723,"created_at":1645143864},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":141,"user":10723,"created_at":1645143876},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":142,"user":10723,"created_at":1645143877},{"skip":true,"type":"redo","entity":"1","entity_type":"corporation","id":143,"user":336,"created_at":1645143885},{"skip":true,"type":"redo","entity":"1","entity_type":"corporation","id":144,"user":336,"created_at":1645143888},{"skip":true,"type":"redo","entity":"1","entity_type":"corporation","id":145,"user":336,"created_at":1645143890},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":146,"created_at":1645143904,"hex":"G21","tile":"L2-1","rotation":1},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":147,"created_at":1645143918,"hex":"I27","tile":"L25-0","rotation":0},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":148,"created_at":1645144035,"hex":"J26","tile":"6-2","rotation":1},{"type":"place_token","entity":"6","entity_type":"corporation","id":149,"created_at":1645144042,"city":"6-2-0","slot":0,"tokener":"6"},{"type":"pass","entity":"6","entity_type":"corporation","id":150,"created_at":1645144052},{"type":"run_routes","entity":"6","entity_type":"corporation","id":151,"created_at":1645144093,"routes":[{"train":"Y1-1","connections":[["J26","I27"],["I27","I29"],["I29","J28"],["J28","K27"]],"hexes":["J26","I27","I29","J28","K27"],"revenue":90,"revenue_str":"J26-I27-I29-J28-K27","nodes":[]}]},{"type":"lay_tile","entity":"8","entity_type":"corporation","id":152,"created_at":1645144105,"hex":"J8","tile":"58-1","rotation":4},{"type":"lay_tile","entity":"8","entity_type":"corporation","id":153,"created_at":1645144113,"hex":"H12","tile":"L1-2","rotation":0},{"type":"lay_tile","entity":"8","entity_type":"corporation","id":154,"created_at":1645144118,"hex":"J6","tile":"58-2","rotation":5},{"type":"place_token","entity":"8","entity_type":"corporation","id":155,"created_at":1645144119,"city":"J4-0-0","slot":1,"tokener":"8"},{"type":"pass","entity":"8","entity_type":"corporation","id":156,"created_at":1645144127},{"type":"run_routes","entity":"8","entity_type":"corporation","id":157,"created_at":1645144130,"routes":[{"train":"Y1-0","connections":[["K9","K11","J12"],["J12","I11"],["I11","J10"],["J10","J8"],["J8","K7"],["K7","J6"],["J6","J4"]],"hexes":["K9","J12","I11","J10","J8","K7","J6","J4"],"revenue":140,"revenue_str":"K9-J12-I11-J10-J8-K7-J6-J4","nodes":[]}]},{"type":"dividend","entity":"GWStStB","entity_type":"corporation","id":158,"created_at":1645144161,"kind":"variable","amount":210},{"type":"dividend","entity":"SJE","entity_type":"corporation","id":159,"created_at":1645144252,"kind":"variable","amount":100},{"type":"dividend","entity":"BBG","entity_type":"corporation","id":160,"created_at":1645144407,"auto_actions":[{"type":"run_routes","entity":"W","entity_type":"corporation","created_at":1645144407,"routes":[{"train":"City-0","connections":[["G23","G21"],["F24","G23"]],"hexes":["G21","G23","F24"],"revenue":40,"revenue_str":"G21-G23-F24","nodes":[]}]},{"type":"run_routes","entity":"G","entity_type":"corporation","created_at":1645144407,"routes":[{"train":"City-1","connections":[["H12","G11"],["I11","H12"]],"hexes":["G11","H12","I11"],"revenue":50,"revenue_str":"G11-H12-I11","nodes":[]}]},{"type":"run_routes","entity":"D","entity_type":"corporation","created_at":1645144407,"routes":[{"train":"City-2","connections":[["A19","B20"],["A17","A19"]],"hexes":["B20","A19","A17"],"revenue":80,"revenue_str":"B20-A19-A17","nodes":[]}]}],"kind":"variable","amount":140},{"type":"buy_train","price":50,"train":"Y1-3","entity":"GWStStB","variant":"Y2","entity_type":"corporation","id":161,"user":336,"created_at":1645144420,"skip":true},{"type":"pass","entity":"GWStStB","entity_type":"corporation","id":162,"user":336,"created_at":1645144424,"skip":true},{"skip":true,"type":"undo","entity":"GWStStB","entity_type":"corporation","id":163,"user":336,"created_at":1645144662},{"type":"pass","entity":"GWStStB","entity_type":"corporation","id":164,"user":336,"created_at":1645144693,"skip":true},{"skip":true,"type":"undo","entity":"GWStStB","entity_type":"corporation","id":165,"user":336,"created_at":1645144855},{"skip":true,"type":"undo","entity":"GWStStB","entity_type":"corporation","id":166,"user":336,"created_at":1645144877},{"type":"pass","entity":"GWStStB","entity_type":"corporation","id":167,"created_at":1645144879},{"type":"pass","entity":"SJE","entity_type":"corporation","id":168,"created_at":1645144882},{"type":"pass","entity":"BBG","entity_type":"corporation","id":169,"created_at":1645144903},{"type":"merge","entity":"GWStStB","entity_type":"corporation","id":170,"created_at":1645144960,"corporation":"15"},{"type":"bid","entity":"GWStStB","entity_type":"corporation","id":171,"created_at":1645144962,"corporation":"15","price":20},{"type":"pass","entity":"SJE","entity_type":"corporation","id":172,"created_at":1645145013},{"type":"pass","entity":"BBG","entity_type":"corporation","id":173,"created_at":1645145067},{"type":"buy_train","entity":"GWStStB","entity_type":"corporation","id":174,"created_at":1645145084,"train":"Y1-3","price":50,"variant":"Y2"},{"type":"pass","entity":"GWStStB","entity_type":"corporation","id":175,"created_at":1645145088},{"type":"reassign_trains","entity":"GWStStB","entity_type":"corporation","id":176,"created_at":1645145091,"assignments":[{"train":"Y1-0","corporation":"8"},{"train":"Y1-3","corporation":"15"}]},{"type":"merge","entity":"SJE","entity_type":"corporation","id":177,"created_at":1645145148,"corporation":"18"},{"type":"bid","entity":"SJE","entity_type":"corporation","id":178,"created_at":1645145151,"corporation":"18","price":20},{"type":"pass","entity":"BBG","entity_type":"corporation","id":179,"created_at":1645145169},{"type":"buy_train","entity":"SJE","entity_type":"corporation","id":180,"created_at":1645145301,"train":"O1-0","price":200,"variant":"O2"},{"type":"pass","entity":"SJE","entity_type":"corporation","id":181,"created_at":1645145314},{"type":"reassign_trains","entity":"SJE","entity_type":"corporation","id":182,"created_at":1645145362,"assignments":[{"train":"Y1-1","corporation":"6"},{"train":"O1-0","corporation":"18"}]},{"type":"pass","entity":"BBG","entity_type":"corporation","id":183,"user":343,"created_at":1645145514,"skip":true},{"skip":true,"type":"undo","entity":"BBG","entity_type":"corporation","id":184,"user":343,"created_at":1645145521},{"type":"merge","entity":"BBG","entity_type":"corporation","id":185,"created_at":1645145530,"corporation":"3"},{"type":"bid","entity":"BBG","entity_type":"corporation","id":186,"created_at":1645145533,"corporation":"3","price":20},{"type":"buy_train","entity":"BBG","entity_type":"corporation","id":187,"created_at":1645145546,"train":"O1-1","price":200,"variant":"O2"},{"type":"pass","entity":"BBG","entity_type":"corporation","id":188,"created_at":1645145547},{"type":"reassign_trains","entity":"BBG","entity_type":"corporation","id":189,"created_at":1645145563,"assignments":[{"train":"Y1-2","corporation":"1"},{"train":"O1-1","corporation":"3"}]},{"type":"buy_shares","entity":336,"entity_type":"player","id":190,"created_at":1645145962,"shares":["BBG_2"],"percent":10},{"type":"buy_shares","entity":10723,"entity_type":"player","id":191,"created_at":1645145972,"shares":["BBG_3"],"percent":10},{"type":"buy_shares","entity":343,"entity_type":"player","id":192,"created_at":1645146001,"shares":["GWStStB_3"],"percent":10},{"type":"buy_shares","entity":336,"shares":["BBG_4"],"percent":10,"entity_type":"player","id":193,"user":336,"created_at":1645146021,"skip":true},{"skip":true,"type":"undo","entity":10723,"entity_type":"player","id":194,"user":336,"created_at":1645146029},{"type":"buy_shares","entity":336,"shares":["BBG_4"],"percent":10,"entity_type":"player","id":195,"user":336,"created_at":1645146036,"skip":true},{"skip":true,"type":"undo","entity":10723,"entity_type":"player","id":196,"user":336,"created_at":1645146059},{"type":"buy_shares","entity":336,"entity_type":"player","id":197,"created_at":1645146061,"shares":["GWStStB_4"],"percent":10},{"type":"buy_shares","entity":10723,"entity_type":"player","id":198,"created_at":1645146119,"shares":["GWStStB_5"],"percent":10},{"type":"buy_shares","entity":343,"entity_type":"player","id":199,"created_at":1645146145,"shares":["D_0"],"percent":10},{"type":"buy_shares","entity":336,"entity_type":"player","id":200,"created_at":1645146152,"shares":["BBG_4"],"percent":10},{"type":"pass","entity":10723,"entity_type":"player","id":201,"created_at":1645146168},{"type":"pass","entity":343,"entity_type":"player","id":202,"created_at":1645146176},{"type":"pass","entity":336,"entity_type":"player","id":203,"created_at":1645146182},{"hex":"D18","tile":"8858-0","type":"lay_tile","entity":"1","rotation":0,"entity_type":"corporation","id":204,"user":343,"created_at":1645146256,"skip":true},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":205,"user":343,"created_at":1645146275},{"type":"lay_tile","entity":"1","entity_type":"corporation","id":206,"created_at":1645146474,"hex":"D18","tile":"8859-0","rotation":0},{"type":"lay_tile","entity":"1","entity_type":"corporation","id":207,"created_at":1645146516,"hex":"C21","tile":"L2-2","rotation":2},{"hex":"E19","tile":"L23-0","type":"lay_tile","entity":"1","rotation":2,"entity_type":"corporation","id":208,"user":343,"created_at":1645146571,"skip":true},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":209,"user":343,"created_at":1645146583},{"type":"lay_tile","entity":"1","entity_type":"corporation","id":210,"created_at":1645146601,"hex":"E19","tile":"L23-0","rotation":2},{"type":"place_token","entity":"1","entity_type":"corporation","id":211,"created_at":1645146614,"city":"L23-0-0","slot":0,"tokener":"1"},{"type":"buy_company","entity":"1","entity_type":"corporation","id":212,"created_at":1645146651,"company":"HB","price":40},{"type":"pass","entity":"1","entity_type":"corporation","id":213,"created_at":1645146668},{"type":"run_routes","entity":"1","entity_type":"corporation","id":214,"created_at":1645146680,"routes":[{"train":"Y1-2","connections":[["E19","D18"],["D18","C17"],["C17","C15"]],"hexes":["E19","D18","C17","C15"],"revenue":160,"revenue_str":"E19-D18-C17-C15 (Hofburg)","nodes":[]}]},{"type":"pass","entity":"1","entity_type":"corporation","id":215,"created_at":1645146696},{"hex":"E17","tile":"235-1","type":"lay_tile","entity":"3","rotation":3,"entity_type":"corporation","id":216,"user":343,"created_at":1645146705,"skip":true},{"city":"235-1-0","slot":0,"type":"place_token","entity":"3","tokener":"3","entity_type":"corporation","id":217,"user":343,"created_at":1645146708,"skip":true},{"skip":true,"type":"undo","entity":"3","entity_type":"corporation","id":218,"user":343,"created_at":1645146766},{"skip":true,"type":"undo","entity":"3","entity_type":"corporation","id":219,"user":343,"created_at":1645146772},{"hex":"E17","tile":"235-1","type":"lay_tile","entity":"3","rotation":5,"entity_type":"corporation","id":220,"user":343,"created_at":1645146849,"skip":true},{"city":"235-1-0","slot":0,"type":"place_token","entity":"3","tokener":"3","entity_type":"corporation","id":221,"user":343,"created_at":1645146854,"skip":true},{"hex":"D22","tile":"L4-1","type":"lay_tile","entity":"3","rotation":2,"entity_type":"corporation","id":222,"user":343,"created_at":1645146858,"skip":true},{"hex":"F18","tile":"5-0","type":"lay_tile","entity":"3","rotation":2,"entity_type":"corporation","id":223,"user":343,"created_at":1645146862,"skip":true},{"skip":true,"type":"undo","entity":"3","entity_type":"corporation","id":224,"user":343,"created_at":1645146892},{"skip":true,"type":"undo","entity":"3","entity_type":"corporation","id":225,"user":343,"created_at":1645146894},{"skip":true,"type":"undo","entity":"3","entity_type":"corporation","id":226,"user":343,"created_at":1645146900},{"skip":true,"type":"undo","entity":"3","entity_type":"corporation","id":227,"user":343,"created_at":1645146904},{"type":"lay_tile","entity":"3","entity_type":"corporation","id":228,"created_at":1645146912,"hex":"E17","tile":"235-1","rotation":4},{"type":"place_token","entity":"3","entity_type":"corporation","id":229,"created_at":1645146914,"city":"235-1-0","slot":0,"tokener":"3"},{"type":"place_token","entity":"3","entity_type":"corporation","id":230,"created_at":1645146933,"city":"L23-0-0","slot":1,"tokener":"3"},{"type":"pass","entity":"3","entity_type":"corporation","id":231,"created_at":1645146940},{"type":"run_routes","entity":"3","entity_type":"corporation","id":232,"created_at":1645146957,"routes":[{"train":"O1-1","connections":[["E19","E17"]],"hexes":["E19","E17"],"revenue":100,"revenue_str":"E19-E17 (Hofburg)","nodes":[]}]},{"type":"pass","entity":"3","entity_type":"corporation","id":233,"created_at":1645146960},{"hex":"J24","tile":"58-3","type":"lay_tile","entity":"6","rotation":2,"entity_type":"corporation","id":234,"user":10723,"created_at":1645147042,"skip":true},{"hex":"G19","tile":"L2-3","type":"lay_tile","entity":"6","rotation":1,"entity_type":"corporation","id":235,"user":10723,"created_at":1645147051,"skip":true},{"hex":"I23","tile":"4-0","type":"lay_tile","entity":"6","rotation":2,"entity_type":"corporation","id":236,"user":10723,"created_at":1645147059,"skip":true},{"type":"buy_company","price":30,"entity":"6","company":"SB","entity_type":"corporation","id":237,"user":10723,"created_at":1645147119,"skip":true},{"type":"pass","entity":"6","entity_type":"corporation","id":238,"user":10723,"created_at":1645147131,"skip":true},{"type":"run_routes","entity":"6","routes":[{"hexes":["K27","J28","I29","I27","J26","J24","I23","H22"],"nodes":[],"train":"Y1-1","revenue":160,"connections":[["K27","J28"],["J28","I29"],["I29","I27"],["I27","J26"],["J26","J24"],["J24","I23"],["I23","H22"]],"revenue_str":"K27-J28-I29-I27-J26-J24-I23-H22 (Schloss Belvedere)"}],"entity_type":"corporation","id":239,"user":10723,"created_at":1645147153,"skip":true},{"type":"pass","entity":"6","entity_type":"corporation","id":240,"user":10723,"created_at":1645147163,"skip":true},{"hex":"J12","tile":"144-0","type":"lay_tile","entity":"8","rotation":0,"entity_type":"corporation","id":241,"user":336,"created_at":1645147309,"skip":true},{"hex":"F12","tile":"L2-4","type":"lay_tile","entity":"8","rotation":0,"entity_type":"corporation","id":242,"user":336,"created_at":1645147321,"skip":true},{"hex":"J14","tile":"4-1","type":"lay_tile","entity":"8","rotation":1,"entity_type":"corporation","id":243,"user":336,"created_at":1645147333,"skip":true},{"type":"buy_company","price":60,"entity":"8","company":"SSB","entity_type":"corporation","id":244,"user":336,"created_at":1645147406,"skip":true},{"type":"pass","entity":"8","entity_type":"corporation","id":245,"user":336,"created_at":1645147504,"skip":true},{"type":"run_routes","entity":"8","routes":[{"hexes":["J4","J6","K7","J8","J10","I11","J12","K9"],"nodes":[],"train":"Y1-0","revenue":190,"connections":[["J4","J6"],["J6","K7"],["K7","J8"],["J8","J10"],["J10","I11"],["I11","J12"],["J12","K11","K9"]],"revenue_str":"J4-J6-K7-J8-J10-I11-J12-K9 (Schloss Schönbrunn)"}],"entity_type":"corporation","id":246,"user":336,"created_at":1645147557,"skip":true},{"type":"pass","entity":"8","entity_type":"corporation","id":247,"user":336,"created_at":1645147560,"skip":true},{"hex":"J16","tile":"57-1","type":"lay_tile","entity":"15","rotation":1,"entity_type":"corporation","id":248,"user":336,"created_at":1645147744,"skip":true},{"skip":true,"type":"undo","entity":"15","entity_type":"corporation","id":249,"user":336,"created_at":1645147750},{"hex":"D22","tile":"L4-1","type":"lay_tile","entity":"15","rotation":2,"entity_type":"corporation","id":250,"user":336,"created_at":1645147769,"skip":true},{"hex":"J16","tile":"57-1","type":"lay_tile","entity":"15","rotation":1,"entity_type":"corporation","id":251,"user":336,"created_at":1645147775,"skip":true},{"hex":"J10","tile":"619-0","type":"lay_tile","entity":"15","rotation":1,"entity_type":"corporation","id":252,"user":336,"created_at":1645147787,"skip":true},{"city":"J4-0-0","slot":1,"type":"place_token","entity":"15","tokener":"15","entity_type":"corporation","id":253,"user":336,"created_at":1645147791,"skip":true},{"type":"pass","entity":"15","entity_type":"corporation","id":254,"user":336,"created_at":1645147794,"skip":true},{"type":"run_routes","entity":"15","routes":[{"hexes":["J4","J6","K7","J8","J10","I11","J12","J14","J16"],"nodes":[],"train":"Y1-3","revenue":160,"connections":[["J4","J6"],["J6","K7"],["K7","J8"],["J8","J10"],["J10","I11"],["I11","J12"],["J12","J14"],["J14","J16"]],"revenue_str":"J4-J6-K7-J8-J10-I11-J12-J14-J16 (Schloss Schönbrunn)"}],"entity_type":"corporation","id":255,"user":336,"created_at":1645147812,"skip":true},{"type":"pass","entity":"15","entity_type":"corporation","id":256,"user":336,"created_at":1645147817,"skip":true},{"hex":"I21","tile":"6-3","type":"lay_tile","entity":"18","rotation":2,"entity_type":"corporation","id":257,"user":10723,"created_at":1645147927,"skip":true},{"skip":true,"type":"undo","entity":"18","entity_type":"corporation","id":258,"user":10723,"created_at":1645148020},{"hex":"I21","tile":"6-3","type":"lay_tile","entity":"18","rotation":2,"entity_type":"corporation","id":259,"user":10723,"created_at":1645148131,"skip":true},{"type":"pass","entity":"18","entity_type":"corporation","id":260,"user":10723,"created_at":1645148153,"skip":true},{"type":"run_routes","entity":"18","routes":[],"entity_type":"corporation","id":261,"user":10723,"created_at":1645148181,"skip":true},{"type":"pass","entity":"18","entity_type":"corporation","id":262,"user":10723,"created_at":1645148185,"skip":true},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":263,"user":336,"created_at":1645148216},{"skip":true,"type":"undo","entity":"18","action_id":256,"entity_type":"corporation","id":264,"user":336,"created_at":1645148340},{"skip":true,"type":"undo","entity":"18","entity_type":"corporation","id":265,"user":336,"created_at":1645148342},{"skip":true,"type":"undo","entity":"15","action_id":247,"entity_type":"corporation","id":266,"user":336,"created_at":1645148344},{"skip":true,"type":"undo","entity":"15","entity_type":"corporation","id":267,"user":336,"created_at":1645148346},{"skip":true,"type":"undo","entity":"8","action_id":240,"entity_type":"corporation","id":268,"user":336,"created_at":1645148349},{"skip":true,"type":"undo","entity":"8","entity_type":"corporation","id":269,"user":336,"created_at":1645148351},{"skip":true,"type":"undo","entity":"6","action_id":233,"entity_type":"corporation","id":270,"user":336,"created_at":1645148369},{"hex":"J24","tile":"58-3","type":"lay_tile","entity":"6","rotation":2,"entity_type":"corporation","id":271,"user":10723,"created_at":1645148393,"skip":true},{"hex":"G19","tile":"L2-3","type":"lay_tile","entity":"6","rotation":1,"entity_type":"corporation","id":272,"user":10723,"created_at":1645148399,"skip":true},{"hex":"I23","tile":"58-4","type":"lay_tile","entity":"6","rotation":5,"entity_type":"corporation","id":273,"user":10723,"created_at":1645148405,"skip":true},{"type":"buy_company","price":30,"entity":"6","company":"SB","entity_type":"corporation","id":274,"user":10723,"created_at":1645148424,"skip":true},{"skip":true,"type":"undo","entity":"6","entity_type":"corporation","id":275,"user":10723,"created_at":1645148433},{"type":"buy_company","price":30,"entity":"6","company":"SB","entity_type":"corporation","id":276,"user":10723,"created_at":1645148462,"skip":true},{"type":"pass","entity":"6","entity_type":"corporation","id":277,"user":10723,"created_at":1645148471,"skip":true},{"skip":true,"type":"undo","entity":"6","action_id":233,"entity_type":"corporation","id":278,"user":10723,"created_at":1645148550},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":279,"created_at":1645148616,"hex":"J24","tile":"58-3","rotation":2},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":280,"created_at":1645148623,"hex":"G19","tile":"L2-3","rotation":1},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":281,"created_at":1645148631,"hex":"I23","tile":"4-0","rotation":2},{"type":"buy_company","entity":"6","entity_type":"corporation","id":282,"created_at":1645148635,"company":"SB","price":30},{"type":"pass","entity":"6","entity_type":"corporation","id":283,"created_at":1645148642},{"type":"run_routes","entity":"6","entity_type":"corporation","id":284,"created_at":1645148650,"routes":[{"train":"Y1-1","connections":[["K27","J28"],["J28","I29"],["I29","I27"],["I27","J26"],["J26","J24"],["J24","I23"],["I23","H22"]],"hexes":["K27","J28","I29","I27","J26","J24","I23","H22"],"revenue":160,"revenue_str":"K27-J28-I29-I27-J26-J24-I23-H22 (Schloss Belvedere)","nodes":[]}]},{"type":"pass","entity":"6","entity_type":"corporation","id":285,"created_at":1645148686},{"type":"lay_tile","entity":"8","entity_type":"corporation","id":286,"created_at":1645148693,"hex":"J12","tile":"144-0","rotation":0},{"type":"lay_tile","entity":"8","entity_type":"corporation","id":287,"created_at":1645148696,"hex":"F12","tile":"L2-4","rotation":0},{"type":"lay_tile","entity":"8","entity_type":"corporation","id":288,"created_at":1645148701,"hex":"J14","tile":"4-1","rotation":1},{"type":"buy_company","entity":"8","entity_type":"corporation","id":289,"created_at":1645148712,"company":"SSB","price":60},{"type":"pass","entity":"8","entity_type":"corporation","id":290,"created_at":1645148715},{"type":"run_routes","entity":"8","entity_type":"corporation","id":291,"created_at":1645148722,"routes":[{"train":"Y1-0","connections":[["J4","J6"],["J6","K7"],["K7","J8"],["J8","J10"],["J10","I11"],["I11","J12"],["J12","K11","K9"]],"hexes":["J4","J6","K7","J8","J10","I11","J12","K9"],"revenue":190,"revenue_str":"J4-J6-K7-J8-J10-I11-J12-K9 (Schloss Schönbrunn)","nodes":[]}]},{"type":"pass","entity":"8","entity_type":"corporation","id":292,"created_at":1645148729},{"city":"D22-0-0","slot":0,"type":"remove_token","entity":"15","entity_type":"corporation","id":293,"user":336,"created_at":1645148731,"skip":true},{"skip":true,"type":"undo","entity":"15","entity_type":"corporation","id":294,"user":336,"created_at":1645148734},{"type":"lay_tile","entity":"15","entity_type":"corporation","id":295,"created_at":1645148738,"hex":"D22","tile":"L4-1","rotation":2},{"type":"lay_tile","entity":"15","entity_type":"corporation","id":296,"created_at":1645148754,"hex":"J16","tile":"57-1","rotation":1},{"type":"lay_tile","entity":"15","entity_type":"corporation","id":297,"created_at":1645148765,"hex":"J10","tile":"619-0","rotation":1},{"type":"place_token","entity":"15","entity_type":"corporation","id":298,"created_at":1645148767,"city":"J4-0-0","slot":1,"tokener":"15"},{"type":"pass","entity":"15","entity_type":"corporation","id":299,"created_at":1645148770},{"type":"run_routes","entity":"15","entity_type":"corporation","id":300,"created_at":1645148774,"routes":[{"train":"Y1-3","connections":[["J4","J6"],["J6","K7"],["K7","J8"],["J8","J10"],["J10","I11"],["I11","J12"],["J12","J14"],["J14","J16"]],"hexes":["J4","J6","K7","J8","J10","I11","J12","J14","J16"],"revenue":160,"revenue_str":"J4-J6-K7-J8-J10-I11-J12-J14-J16 (Schloss Schönbrunn)","nodes":[]}]},{"type":"pass","entity":"15","entity_type":"corporation","id":301,"created_at":1645148777},{"type":"lay_tile","entity":"18","entity_type":"corporation","id":302,"created_at":1645148789,"hex":"I21","tile":"6-3","rotation":2},{"type":"pass","entity":"18","entity_type":"corporation","id":303,"created_at":1645148793},{"type":"run_routes","entity":"18","entity_type":"corporation","id":304,"created_at":1645148794,"routes":[]},{"type":"pass","entity":"18","entity_type":"corporation","id":305,"created_at":1645148796},{"hex":"E17","tile":"8860-0","type":"lay_tile","entity":"1","rotation":0,"entity_type":"corporation","id":306,"user":343,"created_at":1645148839,"skip":true},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":307,"user":343,"created_at":1645148850},{"hex":"E17","tile":"8860-0","type":"lay_tile","entity":"1","rotation":3,"entity_type":"corporation","id":308,"user":343,"created_at":1645149091,"skip":true},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":309,"user":343,"created_at":1645149114},{"hex":"D14","tile":"58-4","type":"lay_tile","entity":"1","rotation":3,"entity_type":"corporation","id":310,"user":343,"created_at":1645149178,"skip":true},{"type":"pass","entity":"1","entity_type":"corporation","id":311,"user":343,"created_at":1645149217,"skip":true},{"type":"run_routes","entity":"1","routes":[{"hexes":["E19","D18","C17","C15","D14"],"nodes":[],"train":"Y1-2","revenue":170,"connections":[["E19","D18"],["D18","C17"],["C17","C15"],["C15","D14"]],"revenue_str":"E19-D18-C17-C15-D14 (Hofburg)"}],"entity_type":"corporation","id":312,"user":343,"created_at":1645149222,"skip":true},{"type":"pass","entity":"1","entity_type":"corporation","id":313,"user":343,"created_at":1645149225,"skip":true},{"skip":true,"type":"undo","entity":"3","entity_type":"corporation","id":314,"user":343,"created_at":1645149252},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":315,"user":343,"created_at":1645149254},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":316,"user":343,"created_at":1645149255},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":317,"user":343,"created_at":1645149257},{"hex":"D14","tile":"58-4","type":"lay_tile","entity":"1","rotation":3,"entity_type":"corporation","id":318,"user":343,"created_at":1645149385,"skip":true},{"type":"pass","entity":"1","entity_type":"corporation","id":319,"user":343,"created_at":1645149396,"skip":true},{"type":"run_routes","entity":"1","routes":[{"hexes":["E19","D18","C17","C15","D14"],"nodes":[],"train":"Y1-2","revenue":170,"connections":[["E19","D18"],["D18","C17"],["C17","C15"],["C15","D14"]],"revenue_str":"E19-D18-C17-C15-D14 (Hofburg)"}],"entity_type":"corporation","id":320,"user":343,"created_at":1645149401,"skip":true},{"type":"pass","entity":"1","entity_type":"corporation","id":321,"user":343,"created_at":1645149403,"skip":true},{"hex":"E17","tile":"8860-0","type":"lay_tile","entity":"3","rotation":2,"entity_type":"corporation","id":322,"user":343,"created_at":1645149440,"skip":true},{"skip":true,"type":"undo","entity":"3","entity_type":"corporation","id":323,"user":343,"created_at":1645149472},{"hex":"E17","tile":"8863-0","type":"lay_tile","entity":"3","rotation":5,"entity_type":"corporation","id":324,"user":343,"created_at":1645149507,"skip":true},{"skip":true,"type":"undo","entity":"3","entity_type":"corporation","id":325,"user":343,"created_at":1645149546},{"skip":true,"type":"undo","entity":"3","entity_type":"corporation","id":326,"user":343,"created_at":1645149554},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":327,"user":343,"created_at":1645149556},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":328,"user":343,"created_at":1645149558},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":329,"user":343,"created_at":1645149560},{"type":"lay_tile","entity":"1","entity_type":"corporation","id":330,"created_at":1645149576,"hex":"E17","tile":"8863-0","rotation":5},{"type":"pass","entity":"1","entity_type":"corporation","id":331,"created_at":1645149592},{"type":"run_routes","entity":"1","entity_type":"corporation","id":332,"created_at":1645149599,"routes":[{"train":"Y1-2","connections":[["E19","D18"],["D18","C17"],["C17","C15"]],"hexes":["E19","D18","C17","C15"],"revenue":160,"revenue_str":"E19-D18-C17-C15 (Hofburg)","nodes":[]}]},{"type":"pass","entity":"1","entity_type":"corporation","id":333,"created_at":1645149613},{"type":"lay_tile","entity":"3","entity_type":"corporation","id":334,"created_at":1645149620,"hex":"E15","tile":"6-4","rotation":2},{"type":"lay_tile","entity":"3","entity_type":"corporation","id":335,"created_at":1645149627,"hex":"E13","tile":"L1-3","rotation":0},{"type":"place_token","entity":"3","entity_type":"corporation","id":336,"created_at":1645149628,"city":"6-4-0","slot":0,"tokener":"3"},{"type":"pass","entity":"3","entity_type":"corporation","id":337,"created_at":1645149631},{"type":"run_routes","entity":"3","entity_type":"corporation","id":338,"created_at":1645149636,"routes":[{"train":"O1-1","connections":[["E19","E17"],["E17","E15"]],"hexes":["E19","E17","E15"],"revenue":130,"revenue_str":"E19-E17-E15 (Hofburg)","nodes":[]}]},{"type":"pass","entity":"3","entity_type":"corporation","id":339,"created_at":1645149637},{"hex":"I23","tile":"142-0","type":"lay_tile","entity":"6","rotation":2,"entity_type":"corporation","id":340,"user":10723,"created_at":1645149666,"skip":true},{"hex":"D12","tile":"L3-0","type":"lay_tile","entity":"6","rotation":3,"entity_type":"corporation","id":341,"user":10723,"created_at":1645149686,"skip":true},{"hex":"J26","tile":"15-0","type":"lay_tile","entity":"6","rotation":1,"entity_type":"corporation","id":342,"user":10723,"created_at":1645149710,"skip":true},{"type":"pass","entity":"6","entity_type":"corporation","id":343,"user":10723,"created_at":1645149722,"skip":true},{"type":"run_routes","entity":"6","routes":[{"hexes":["K27","J28","I29","I27","J26","J24","I23","H22"],"nodes":[],"train":"Y1-1","revenue":170,"connections":[["K27","J28"],["J28","I29"],["I29","I27"],["I27","J26"],["J26","J24"],["J24","I23"],["I23","H22"]],"revenue_str":"K27-J28-I29-I27-J26-J24-I23-H22 (Schloss Belvedere)"}],"entity_type":"corporation","id":344,"user":10723,"created_at":1645149747,"skip":true},{"type":"pass","entity":"6","entity_type":"corporation","id":345,"user":10723,"created_at":1645149755,"skip":true},{"skip":true,"type":"undo","entity":"8","entity_type":"corporation","id":346,"user":10723,"created_at":1645149873},{"skip":true,"type":"undo","entity":"6","action_id":339,"entity_type":"corporation","id":347,"user":10723,"created_at":1645149877},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":348,"created_at":1645149884,"hex":"I23","tile":"142-0","rotation":2},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":349,"created_at":1645149891,"hex":"D12","tile":"L3-0","rotation":3},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":350,"created_at":1645149897,"hex":"J26","tile":"619-1","rotation":1},{"type":"pass","entity":"6","entity_type":"corporation","id":351,"created_at":1645149903},{"type":"run_routes","entity":"6","entity_type":"corporation","id":352,"created_at":1645149908,"routes":[{"train":"Y1-1","connections":[["K27","J28"],["J28","I29"],["I29","I27"],["I27","J26"],["J26","J24"],["J24","I23"],["I23","H22"]],"hexes":["K27","J28","I29","I27","J26","J24","I23","H22"],"revenue":170,"revenue_str":"K27-J28-I29-I27-J26-J24-I23-H22 (Schloss Belvedere)","nodes":[]}]},{"type":"pass","entity":"6","entity_type":"corporation","id":353,"created_at":1645149912},{"type":"lay_tile","entity":"8","entity_type":"corporation","id":354,"created_at":1645149975,"hex":"J16","tile":"15-0","rotation":1},{"type":"lay_tile","entity":"8","entity_type":"corporation","id":355,"created_at":1645149982,"hex":"G17","tile":"L1-4","rotation":4},{"type":"place_token","entity":"8","entity_type":"corporation","id":356,"created_at":1645149986,"city":"15-0-0","slot":1,"tokener":"8"},{"type":"pass","entity":"8","entity_type":"corporation","id":357,"created_at":1645150074},{"type":"run_routes","entity":"8","entity_type":"corporation","id":358,"created_at":1645150088,"routes":[{"train":"Y1-0","connections":[["J4","J6"],["J6","K7"],["K7","J8"],["J8","J10"],["J10","I11"],["I11","J12"],["J12","J14"],["J14","J16"]],"hexes":["J4","J6","K7","J8","J10","I11","J12","J14","J16"],"revenue":200,"revenue_str":"J4-J6-K7-J8-J10-I11-J12-J14-J16 (Schloss Schönbrunn)","nodes":[]}]},{"type":"pass","entity":"8","entity_type":"corporation","id":359,"created_at":1645150093},{"hex":"J18","tile":"4-2","type":"lay_tile","entity":"15","rotation":1,"entity_type":"corporation","id":360,"user":336,"created_at":1645150107,"skip":true},{"skip":true,"type":"undo","entity":"15","entity_type":"corporation","id":361,"user":336,"created_at":1645150114},{"type":"lay_tile","entity":"15","entity_type":"corporation","id":362,"created_at":1645150174,"hex":"I17","tile":"58-4","rotation":0},{"type":"lay_tile","entity":"15","entity_type":"corporation","id":363,"created_at":1645150188,"hex":"H16","tile":"L2-5","rotation":0},{"type":"lay_tile","entity":"15","entity_type":"corporation","id":364,"created_at":1645150200,"hex":"H16","tile":"L6-0","rotation":0},{"type":"place_token","entity":"15","entity_type":"corporation","id":365,"created_at":1645150215,"city":"619-0-0","slot":1,"tokener":"15"},{"type":"pass","entity":"15","entity_type":"corporation","id":366,"created_at":1645150220},{"type":"run_routes","entity":"15","entity_type":"corporation","id":367,"created_at":1645150235,"routes":[{"train":"Y1-3","connections":[["J4","J6"],["J6","K7"],["K7","J8"],["J8","J10"],["J10","I11"],["I11","J12"],["J12","J14"],["J14","J16"],["J16","I17"],["I17","H16"]],"hexes":["J4","J6","K7","J8","J10","I11","J12","J14","J16","I17","H16"],"revenue":220,"revenue_str":"J4-J6-K7-J8-J10-I11-J12-J14-J16-I17-H16 (Schloss Schönbrunn)","nodes":[]}]},{"type":"pass","entity":"15","entity_type":"corporation","id":368,"created_at":1645150245},{"type":"lay_tile","entity":"18","entity_type":"corporation","id":369,"created_at":1645150363,"hex":"H20","tile":"6-0","rotation":3},{"hex":"C13","tile":"L2-6","type":"lay_tile","entity":"18","rotation":0,"entity_type":"corporation","id":370,"user":10723,"created_at":1645150375,"skip":true},{"skip":true,"type":"undo","entity":"18","entity_type":"corporation","id":371,"user":10723,"created_at":1645150378},{"hex":"I15","tile":"L3-1","type":"lay_tile","entity":"18","rotation":1,"entity_type":"corporation","id":372,"user":10723,"created_at":1645150412,"skip":true},{"city":"619-1-0","slot":1,"type":"place_token","entity":"18","tokener":"18","entity_type":"corporation","id":373,"user":10723,"created_at":1645150418,"skip":true},{"city":"K27-0-0","slot":1,"type":"place_token","entity":"18","tokener":"18","entity_type":"corporation","id":374,"user":10723,"created_at":1645150435,"skip":true},{"skip":true,"type":"undo","entity":"18","entity_type":"corporation","id":375,"user":10723,"created_at":1645150454},{"skip":true,"type":"undo","entity":"18","entity_type":"corporation","id":376,"user":10723,"created_at":1645150456},{"skip":true,"type":"undo","entity":"18","entity_type":"corporation","id":377,"user":10723,"created_at":1645150458},{"type":"place_token","entity":"18","entity_type":"corporation","id":378,"created_at":1645150465,"city":"619-1-0","slot":1,"tokener":"18"},{"city":"I15-1-0","slot":0,"type":"remove_token","entity":"18","entity_type":"corporation","id":379,"user":10723,"created_at":1645150470,"skip":true},{"skip":true,"type":"undo","entity":"18","entity_type":"corporation","id":380,"user":10723,"created_at":1645150480},{"type":"lay_tile","entity":"18","entity_type":"corporation","id":381,"created_at":1645150493,"hex":"I15","tile":"L3-1","rotation":1},{"type":"place_token","entity":"18","entity_type":"corporation","id":382,"created_at":1645150498,"city":"K27-0-0","slot":1,"tokener":"18"},{"type":"pass","entity":"18","entity_type":"corporation","id":383,"created_at":1645150513},{"type":"run_routes","entity":"18","entity_type":"corporation","id":384,"created_at":1645150560,"routes":[{"train":"O1-0","connections":[["H22","I23"],["I23","J24"],["J24","J26"],["J26","I27"],["I27","I29"],["I29","J28"]],"hexes":["H22","I23","J24","J26","I27","I29","J28"],"revenue":120,"revenue_str":"H22-I23-J24-J26-I27-I29-J28 (Schloss Belvedere)","nodes":[]}]},{"type":"pass","entity":"18","entity_type":"corporation","id":385,"created_at":1645150566},{"type":"dividend","entity":"GWStStB","entity_type":"corporation","id":386,"created_at":1645150698,"kind":"variable","amount":770},{"type":"dividend","entity":"SJE","entity_type":"corporation","id":387,"created_at":1645150914,"kind":"variable","amount":100},{"type":"dividend","entity":"BBG","entity_type":"corporation","id":388,"created_at":1645151010,"auto_actions":[{"type":"run_routes","entity":"W","entity_type":"corporation","created_at":1645151011,"routes":[{"train":"City-0","connections":[["H16","I15"],["G17","H16"],["G19","G17"],["G21","G19"],["G23","G21"],["F24","G23"]],"hexes":["I15","H16","G17","G19","G21","G23","F24"],"revenue":90,"revenue_str":"I15-H16-G17-G19-G21-G23-F24","nodes":[]}]},{"type":"run_routes","entity":"G","entity_type":"corporation","created_at":1645151011,"routes":[{"train":"City-1","connections":[["E13","D12"],["F12","E13"],["G11","F12"],["H12","G11"],["I11","H12"]],"hexes":["D12","E13","F12","G11","H12","I11"],"revenue":90,"revenue_str":"D12-E13-F12-G11-H12-I11","nodes":[]}]},{"type":"run_routes","entity":"D","entity_type":"corporation","created_at":1645151011,"routes":[{"train":"City-2","connections":[["A19","A17"],["B20","A19"],["C21","B20"],["D22","C21"],["E23","D22"],["F24","E23"]],"hexes":["A17","A19","B20","C21","D22","E23","F24"],"revenue":150,"revenue_str":"A17-A19-B20-C21-D22-E23-F24","nodes":[]}]}],"kind":"variable","amount":100},{"type":"buy_train","price":100,"train":"O1-2","entity":"GWStStB","variant":"O3","entity_type":"corporation","id":389,"user":336,"created_at":1645151049,"skip":true},{"skip":true,"type":"undo","entity":"GWStStB","entity_type":"corporation","id":390,"user":336,"created_at":1645151053},{"type":"scrap_train","entity":"GWStStB","entity_type":"corporation","id":391,"created_at":1645151060,"train":"Y1-0"},{"type":"buy_train","entity":"GWStStB","entity_type":"corporation","id":392,"created_at":1645151062,"train":"O1-2","price":100,"variant":"O3"},{"type":"buy_train","price":100,"train":"O1-3","entity":"GWStStB","variant":"O3","entity_type":"corporation","id":393,"user":336,"created_at":1645151063,"skip":true},{"skip":true,"type":"undo","entity":"GWStStB","entity_type":"corporation","id":394,"user":336,"created_at":1645151180},{"type":"scrap_train","entity":"GWStStB","entity_type":"corporation","id":395,"created_at":1645151196,"train":"Y1-3"},{"type":"buy_train","entity":"GWStStB","entity_type":"corporation","id":396,"created_at":1645151197,"train":"O1-3","price":100,"variant":"O3"},{"type":"pass","entity":"GWStStB","entity_type":"corporation","id":397,"created_at":1645151200},{"type":"reassign_trains","entity":"GWStStB","entity_type":"corporation","id":398,"created_at":1645151208,"assignments":[{"train":"O1-2","corporation":"8"},{"train":"O1-3","corporation":"15"}]},{"type":"pass","entity":"SJE","entity_type":"corporation","id":399,"created_at":1645151558},{"type":"reassign_trains","entity":"SJE","entity_type":"corporation","id":400,"created_at":1645151570,"assignments":[{"train":"Y1-1","corporation":"18"},{"train":"O1-0","corporation":"6"}]},{"type":"buy_train","price":400,"train":"R1-0","entity":"BBG","variant":"R2","entity_type":"corporation","id":401,"user":343,"created_at":1645151847,"skip":true},{"skip":true,"type":"undo","entity":"BBG","entity_type":"corporation","id":402,"user":343,"created_at":1645151881},{"type":"pass","entity":"BBG","entity_type":"corporation","id":403,"created_at":1645151883},{"type":"reassign_trains","entity":"BBG","entity_type":"corporation","id":404,"created_at":1645151887,"assignments":[{"train":"Y1-2","corporation":"1"},{"train":"O1-1","corporation":"3"}]},{"type":"pass","entity":"GWStStB","entity_type":"corporation","id":405,"created_at":1645152005},{"type":"merge","entity":"SJE","entity_type":"corporation","id":406,"created_at":1645152048,"corporation":"7"},{"type":"bid","entity":"SJE","entity_type":"corporation","id":407,"created_at":1645152067,"corporation":"7","price":20},{"type":"bid","entity":"BBG","entity_type":"corporation","id":408,"created_at":1645152084,"corporation":"7","price":25},{"type":"bid","entity":"SJE","entity_type":"corporation","id":409,"created_at":1645152090,"corporation":"7","price":30},{"type":"bid","entity":"BBG","entity_type":"corporation","id":410,"created_at":1645152092,"corporation":"7","price":35},{"type":"bid","entity":"SJE","entity_type":"corporation","id":411,"created_at":1645152096,"corporation":"7","price":40},{"type":"bid","entity":"BBG","entity_type":"corporation","id":412,"created_at":1645152099,"corporation":"7","price":45},{"type":"bid","entity":"SJE","entity_type":"corporation","id":413,"created_at":1645152104,"corporation":"7","price":50},{"type":"bid","entity":"BBG","entity_type":"corporation","id":414,"created_at":1645152136,"corporation":"7","price":55},{"type":"bid","entity":"SJE","entity_type":"corporation","id":415,"created_at":1645152248,"corporation":"7","price":60},{"type":"bid","entity":"BBG","entity_type":"corporation","id":416,"created_at":1645152255,"corporation":"7","price":65},{"type":"pass","entity":"SJE","entity_type":"corporation","id":417,"created_at":1645152336},{"type":"buy_train","entity":"BBG","entity_type":"corporation","id":418,"created_at":1645152364,"train":"R1-0","price":400,"variant":"R2"},{"type":"reassign_trains","entity":"BBG","entity_type":"corporation","id":419,"created_at":1645152392,"assignments":[{"train":"Y1-2","corporation":"3"},{"train":"O1-1","corporation":"7"},{"train":"R1-0","corporation":"1"}]},{"type":"merge","entity":"SJE","entity_type":"corporation","id":420,"created_at":1645152511,"corporation":"11"},{"type":"bid","entity":"SJE","entity_type":"corporation","id":421,"created_at":1645152514,"corporation":"11","price":20},{"type":"buy_train","entity":"SJE","entity_type":"corporation","id":422,"created_at":1645152525,"train":"R1-1","price":400,"variant":"R2"},{"type":"reassign_trains","entity":"SJE","entity_type":"corporation","id":423,"created_at":1645152552,"assignments":[{"train":"O1-0","corporation":"18"},{"train":"Y1-1","corporation":"11"},{"train":"R1-1","corporation":"6"}]},{"type":"pass","entity":"GWStStB","entity_type":"corporation","id":424,"created_at":1645152586},{"type":"reassign_trains","entity":"GWStStB","entity_type":"corporation","id":425,"created_at":1645152589,"assignments":[{"train":"O1-2","corporation":"8"},{"train":"O1-3","corporation":"15"}]},{"type":"buy_shares","entity":336,"entity_type":"player","id":426,"created_at":1645152613,"shares":["BBG_5"],"percent":10},{"type":"buy_shares","entity":343,"shares":["SJE_3"],"percent":10,"entity_type":"player","id":427,"user":343,"created_at":1645152747,"skip":true},{"skip":true,"type":"undo","entity":10723,"entity_type":"player","id":428,"user":343,"created_at":1645152772},{"type":"buy_shares","entity":343,"entity_type":"player","id":429,"created_at":1645152841,"shares":["D_1"],"percent":10},{"type":"buy_shares","entity":10723,"entity_type":"player","id":430,"created_at":1645152880,"shares":["D_2"],"percent":10},{"type":"buy_shares","entity":336,"entity_type":"player","id":431,"created_at":1645152894,"shares":["D_3"],"percent":10},{"type":"buy_shares","entity":343,"entity_type":"player","id":432,"created_at":1645152901,"shares":["D_4"],"percent":10},{"type":"buy_shares","entity":10723,"entity_type":"player","id":433,"created_at":1645152918,"shares":["W_0"],"percent":10},{"type":"buy_shares","entity":336,"entity_type":"player","id":434,"created_at":1645152993,"shares":["D_5"],"percent":10},{"type":"buy_shares","entity":343,"entity_type":"player","id":435,"created_at":1645153010,"shares":["D_6"],"percent":10},{"type":"buy_shares","entity":10723,"entity_type":"player","id":436,"created_at":1645153059,"shares":["D_7"],"percent":10},{"type":"buy_shares","entity":336,"entity_type":"player","id":437,"created_at":1645153066,"shares":["D_8"],"percent":10},{"type":"buy_shares","entity":343,"entity_type":"player","id":438,"created_at":1645153071,"shares":["D_9"],"percent":10},{"type":"pass","entity":10723,"entity_type":"player","id":439,"created_at":1645153078},{"type":"buy_shares","entity":336,"entity_type":"player","id":440,"created_at":1645153118,"shares":["W_1"],"percent":10},{"type":"program_share_pass","entity":343,"entity_type":"player","id":441,"created_at":1645153175,"auto_actions":[{"type":"pass","entity":343,"entity_type":"player","created_at":1645153175}],"unconditional":false,"indefinite":false},{"type":"program_share_pass","entity":10723,"entity_type":"player","id":442,"created_at":1645153179,"auto_actions":[{"type":"pass","entity":10723,"entity_type":"player","created_at":1645153185}],"unconditional":false,"indefinite":false},{"type":"buy_shares","entity":336,"entity_type":"player","id":443,"created_at":1645153189,"auto_actions":[{"type":"pass","entity":343,"entity_type":"player","created_at":1645153188},{"type":"pass","entity":10723,"entity_type":"player","created_at":1645153188}],"shares":["W_2"],"percent":10},{"type":"buy_shares","entity":336,"entity_type":"player","id":444,"created_at":1645153204,"auto_actions":[{"type":"pass","entity":343,"entity_type":"player","created_at":1645153203},{"type":"pass","entity":10723,"entity_type":"player","created_at":1645153203}],"shares":["W_3"],"percent":10},{"type":"pass","entity":336,"entity_type":"player","id":445,"created_at":1645153216},{"hex":"D14","tile":"58-5","type":"lay_tile","entity":"1","rotation":3,"entity_type":"corporation","id":446,"user":343,"created_at":1645153384,"skip":true},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":447,"user":343,"created_at":1645153407},{"hex":"D14","tile":"58-5","type":"lay_tile","entity":"1","rotation":3,"entity_type":"corporation","id":448,"user":343,"created_at":1645153430,"skip":true},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":449,"user":343,"created_at":1645153441},{"type":"lay_tile","entity":"1","entity_type":"corporation","id":450,"created_at":1645153447,"hex":"I13","tile":"L2-6","rotation":1},{"type":"lay_tile","entity":"1","entity_type":"corporation","id":451,"created_at":1645153454,"hex":"D14","tile":"58-5","rotation":3},{"hex":"C15","tile":"14-0","type":"lay_tile","entity":"1","rotation":0,"entity_type":"corporation","id":452,"user":343,"created_at":1645153474,"skip":true},{"type":"pass","entity":"1","entity_type":"corporation","id":453,"user":343,"created_at":1645153481,"skip":true},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":454,"user":343,"created_at":1645153500},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":455,"user":343,"created_at":1645153502},{"hex":"E15","tile":"14-0","type":"lay_tile","entity":"1","rotation":1,"entity_type":"corporation","id":456,"user":343,"created_at":1645153533,"skip":true},{"type":"pass","entity":"1","entity_type":"corporation","id":457,"user":343,"created_at":1645153570,"skip":true},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":458,"user":343,"created_at":1645153664},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":459,"user":343,"created_at":1645153666},{"type":"lay_tile","entity":"1","entity_type":"corporation","id":460,"created_at":1645153682,"hex":"E15","tile":"14-0","rotation":1},{"type":"pass","entity":"1","entity_type":"corporation","id":461,"created_at":1645153688},{"type":"run_routes","entity":"1","entity_type":"corporation","id":462,"created_at":1645153693,"routes":[{"train":"R1-0","connections":[["E19","D18"],["D18","C17"],["C17","C15"],["C15","D14"],["D14","E15"],["E15","E17"]],"hexes":["E19","D18","C17","C15","D14","E15","E17"],"revenue":170,"revenue_str":"E19-D18-C17-C15-D14-E15-E17 (Hofburg)","nodes":[]}]},{"type":"pass","entity":"1","entity_type":"corporation","id":463,"created_at":1645153697},{"type":"lay_tile","entity":"3","entity_type":"corporation","id":464,"created_at":1645153741,"hex":"I9","tile":"L4-2","rotation":1},{"type":"lay_tile","entity":"3","entity_type":"corporation","id":465,"created_at":1645153745,"hex":"E13","tile":"L8-0","rotation":1},{"type":"lay_tile","entity":"3","entity_type":"corporation","id":466,"created_at":1645153756,"hex":"E11","tile":"6-2","rotation":4},{"type":"pass","entity":"3","entity_type":"corporation","id":467,"created_at":1645153767},{"type":"run_routes","entity":"3","entity_type":"corporation","id":468,"created_at":1645153789,"routes":[{"train":"Y1-2","connections":[["E19","E17"],["E17","E15"],["E15","E13"],["E13","E11"],["E11","F10"]],"hexes":["E19","E17","E15","E13","E11","F10"],"revenue":160,"revenue_str":"E19-E17-E15-E13-E11-F10 (Hofburg)","nodes":[]}]},{"type":"pass","entity":"3","entity_type":"corporation","id":469,"created_at":1645153791},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":470,"created_at":1645153871,"hex":"H24","tile":"58-6","rotation":1},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":471,"created_at":1645153880,"hex":"I7","tile":"L2-7","rotation":1},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":472,"created_at":1645153893,"hex":"G25","tile":"6-4","rotation":0},{"type":"pass","entity":"6","entity_type":"corporation","id":473,"created_at":1645153931},{"type":"run_routes","entity":"6","entity_type":"corporation","id":474,"created_at":1645153942,"routes":[{"train":"R1-1","connections":[["K27","J28"],["J28","I29"],["I29","I27"],["I27","J26"],["J26","J24"],["J24","I23"],["I23","H22"],["H22","H24"],["H24","G25"],["G25","F24"]],"hexes":["K27","J28","I29","I27","J26","J24","I23","H22","H24","G25","F24"],"revenue":180,"revenue_str":"K27-J28-I29-I27-J26-J24-I23-H22-H24-G25-F24 (Schloss Belvedere)","nodes":[]}]},{"type":"pass","entity":"6","entity_type":"corporation","id":475,"created_at":1645153949},{"hex":"F18","tile":"5-0","type":"lay_tile","entity":"7","rotation":2,"entity_type":"corporation","id":476,"user":343,"created_at":1645153964,"skip":true},{"skip":true,"type":"undo","entity":"7","entity_type":"corporation","id":477,"user":343,"created_at":1645153986},{"skip":true,"type":"undo","entity":"7","entity_type":"corporation","id":478,"user":343,"created_at":1645154000},{"skip":true,"type":"redo","entity":"6","entity_type":"corporation","id":479,"user":343,"created_at":1645154011},{"type":"lay_tile","entity":"7","entity_type":"corporation","id":480,"created_at":1645154068,"hex":"F18","tile":"57-2","rotation":2},{"type":"place_token","entity":"7","entity_type":"corporation","id":481,"created_at":1645154098,"city":"8863-0-0","slot":0,"tokener":"7"},{"type":"pass","entity":"7","entity_type":"corporation","id":482,"created_at":1645154104},{"type":"run_routes","entity":"7","entity_type":"corporation","id":483,"created_at":1645154110,"routes":[{"train":"O1-1","connections":[["E17","F18"]],"hexes":["E17","F18"],"revenue":60,"revenue_str":"E17-F18","nodes":[]}]},{"type":"pass","entity":"7","entity_type":"corporation","id":484,"created_at":1645154112},{"type":"lay_tile","entity":"8","entity_type":"corporation","id":485,"created_at":1645154127,"hex":"H14","tile":"58-7","rotation":2},{"type":"pass","entity":"8","entity_type":"corporation","id":486,"created_at":1645154155},{"type":"run_routes","entity":"8","entity_type":"corporation","id":487,"created_at":1645154161,"routes":[{"train":"O1-2","connections":[["J4","J6"],["J6","K7"],["K7","J8"],["J8","J10"],["J10","I11"],["I11","J12"],["J12","J14"],["J14","J16"],["J16","I17"],["I17","H16"],["H16","H14"]],"hexes":["J4","J6","K7","J8","J10","I11","J12","J14","J16","I17","H16","H14"],"revenue":230,"revenue_str":"J4-J6-K7-J8-J10-I11-J12-J14-J16-I17-H16-H14 (Schloss Schönbrunn)","nodes":[]}]},{"type":"pass","entity":"8","entity_type":"corporation","id":488,"created_at":1645154164},{"type":"lay_tile","entity":"11","entity_type":"corporation","id":489,"created_at":1645154200,"hex":"B12","tile":"57-3","rotation":0},{"type":"place_token","entity":"11","entity_type":"corporation","id":490,"created_at":1645154203,"city":"A13-0-0","slot":0,"tokener":"11"},{"hex":"C13","tile":"L2-8","type":"lay_tile","entity":"11","rotation":0,"entity_type":"corporation","id":491,"user":10723,"created_at":1645154210,"skip":true},{"skip":true,"type":"undo","entity":"11","entity_type":"corporation","id":492,"user":10723,"created_at":1645154237},{"type":"pass","entity":"11","entity_type":"corporation","id":493,"created_at":1645154261},{"type":"run_routes","entity":"11","entity_type":"corporation","id":494,"created_at":1645154285,"routes":[{"train":"Y1-1","connections":[["A13","B12"]],"hexes":["A13","B12"],"revenue":50,"revenue_str":"A13-B12","nodes":[]}]},{"type":"pass","entity":"11","entity_type":"corporation","id":495,"created_at":1645154288},{"type":"lay_tile","entity":"15","entity_type":"corporation","id":496,"created_at":1645154295,"hex":"G13","tile":"58-8","rotation":5},{"type":"lay_tile","entity":"15","entity_type":"corporation","id":497,"created_at":1645154300,"hex":"I5","tile":"L2-8","rotation":1},{"hex":"G11","tile":"L30a-0","type":"lay_tile","entity":"15","rotation":0,"entity_type":"corporation","id":498,"user":336,"created_at":1645154311,"skip":true},{"skip":true,"type":"undo","entity":"15","entity_type":"corporation","id":499,"user":336,"created_at":1645154316},{"type":"lay_tile","entity":"15","entity_type":"corporation","id":500,"created_at":1645154322,"hex":"G11","tile":"L31a-0","rotation":0},{"type":"pass","entity":"15","entity_type":"corporation","id":501,"created_at":1645154334},{"type":"run_routes","entity":"15","entity_type":"corporation","id":502,"created_at":1645154338,"routes":[{"train":"O1-3","connections":[["J4","J6"],["J6","K7"],["K7","J8"],["J8","J10"],["J10","I11"],["I11","J12"],["J12","J14"],["J14","J16"],["J16","I17"],["I17","H16"],["H16","H14"],["H14","G13"],["G13","G11"],["G11","F10"]],"hexes":["J4","J6","K7","J8","J10","I11","J12","J14","J16","I17","H16","H14","G13","G11","F10"],"revenue":260,"revenue_str":"J4-J6-K7-J8-J10-I11-J12-J14-J16-I17-H16-H14-G13-G11-F10 (Schloss Schönbrunn)","nodes":[]}]},{"type":"pass","entity":"15","entity_type":"corporation","id":503,"created_at":1645154340},{"type":"lay_tile","entity":"18","entity_type":"corporation","id":504,"created_at":1645154351,"hex":"G21","tile":"L9-0","rotation":0},{"type":"pass","entity":"18","entity_type":"corporation","id":505,"created_at":1645154412},{"type":"run_routes","entity":"18","entity_type":"corporation","id":506,"created_at":1645154422,"routes":[{"train":"O1-0","connections":[["H24","H22"],["H22","I23"],["I23","J24"],["J24","J26"],["J26","I27"],["I27","I29"]],"hexes":["H24","H22","I23","J24","J26","I27","I29"],"revenue":130,"revenue_str":"H24-H22-I23-J24-J26-I27-I29 (Schloss Belvedere)","nodes":[]}]},{"type":"pass","entity":"18","entity_type":"corporation","id":507,"created_at":1645154425},{"type":"lay_tile","entity":"1","entity_type":"corporation","id":508,"created_at":1645154528,"hex":"F16","tile":"3-1","rotation":1},{"type":"pass","entity":"1","entity_type":"corporation","id":509,"created_at":1645154542},{"type":"run_routes","entity":"1","entity_type":"corporation","id":510,"created_at":1645154548,"routes":[{"train":"R1-0","connections":[["E19","D18"],["D18","C17"],["C17","C15"],["C15","D14"],["D14","E15"],["E15","E13"],["E13","E11"],["E11","F10"]],"hexes":["E19","D18","C17","C15","D14","E15","E13","E11","F10"],"revenue":190,"revenue_str":"E19-D18-C17-C15-D14-E15-E13-E11-F10 (Hofburg)","nodes":[]}]},{"type":"pass","entity":"1","entity_type":"corporation","id":511,"created_at":1645154550},{"type":"lay_tile","entity":"3","entity_type":"corporation","id":512,"created_at":1645154565,"hex":"E9","tile":"58-9","rotation":3},{"type":"pass","entity":"3","entity_type":"corporation","id":513,"created_at":1645154573},{"type":"run_routes","entity":"3","entity_type":"corporation","id":514,"created_at":1645154577,"routes":[{"train":"Y1-2","connections":[["E19","E17"],["E17","E15"],["E15","E13"],["E13","E11"],["E11","F10"],["F10","E9"]],"hexes":["E19","E17","E15","E13","E11","F10","E9"],"revenue":170,"revenue_str":"E19-E17-E15-E13-E11-F10-E9 (Hofburg)","nodes":[]}]},{"type":"pass","entity":"3","entity_type":"corporation","id":515,"created_at":1645154580},{"hex":"C13","tile":"L2-9","type":"lay_tile","entity":"6","rotation":0,"entity_type":"corporation","id":516,"user":10723,"created_at":1645154611,"skip":true},{"hex":"F24","tile":"L31b-0","type":"lay_tile","entity":"6","rotation":0,"entity_type":"corporation","id":517,"user":10723,"created_at":1645154632,"skip":true},{"skip":true,"type":"undo","entity":"6","action_id":515,"entity_type":"corporation","id":518,"user":10723,"created_at":1645154643},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":519,"created_at":1645154702,"hex":"I21","tile":"14-1","rotation":1},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":520,"created_at":1645154714,"hex":"C13","tile":"L2-9","rotation":0},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":521,"created_at":1645154720,"hex":"F24","tile":"L31b-0","rotation":0},{"type":"pass","entity":"6","entity_type":"corporation","id":522,"created_at":1645154749},{"type":"run_routes","entity":"6","entity_type":"corporation","id":523,"created_at":1645154788,"routes":[{"train":"R1-1","connections":[["K27","J28"],["J28","I29"],["I29","I27"],["I27","J26"],["J26","J24"],["J24","I23"],["I23","H22"],["H22","H24"],["H24","G25"],["G25","F24"]],"hexes":["K27","J28","I29","I27","J26","J24","I23","H22","H24","G25","F24"],"revenue":190,"revenue_str":"K27-J28-I29-I27-J26-J24-I23-H22-H24-G25-F24 (Schloss Belvedere)","nodes":[]}]},{"type":"pass","entity":"6","entity_type":"corporation","id":524,"created_at":1645154796},{"type":"lay_tile","entity":"7","entity_type":"corporation","id":525,"created_at":1645154844,"hex":"G19","tile":"L10-0","rotation":2},{"type":"pass","entity":"7","entity_type":"corporation","id":526,"created_at":1645154860},{"type":"run_routes","entity":"7","entity_type":"corporation","id":527,"created_at":1645154866,"routes":[{"train":"O1-1","connections":[["E17","F18"],["F18","G19"]],"hexes":["E17","F18","G19"],"revenue":70,"revenue_str":"E17-F18-G19","nodes":[]}]},{"type":"pass","entity":"7","entity_type":"corporation","id":528,"created_at":1645154870},{"type":"lay_tile","entity":"8","entity_type":"corporation","id":529,"created_at":1645154901,"hex":"H10","tile":"235-2","rotation":3},{"type":"place_token","entity":"8","entity_type":"corporation","id":530,"created_at":1645154903,"city":"235-2-0","slot":0,"tokener":"8"},{"type":"pass","entity":"8","entity_type":"corporation","id":531,"created_at":1645154941},{"type":"run_routes","entity":"8","entity_type":"corporation","id":532,"created_at":1645154976,"routes":[{"train":"O1-2","connections":[["J4","J6"],["J6","K7"],["K7","J8"],["J8","J10"],["J10","I11"],["I11","J12"],["J12","J14"],["J14","J16"],["J16","I17"],["I17","H16"],["H16","H14"],["H14","G13"],["G13","G11"],["G11","H10"]],"hexes":["J4","J6","K7","J8","J10","I11","J12","J14","J16","I17","H16","H14","G13","G11","H10"],"revenue":280,"revenue_str":"J4-J6-K7-J8-J10-I11-J12-J14-J16-I17-H16-H14-G13-G11-H10 (Schloss Schönbrunn)","nodes":[]}]},{"type":"pass","entity":"8","entity_type":"corporation","id":533,"created_at":1645154978},{"type":"lay_tile","entity":"11","entity_type":"corporation","id":534,"created_at":1645155005,"hex":"B12","tile":"619-2","rotation":3},{"type":"pass","entity":"11","entity_type":"corporation","id":535,"created_at":1645155011},{"type":"run_routes","entity":"11","entity_type":"corporation","id":536,"created_at":1645155014,"routes":[{"train":"Y1-1","connections":[["A13","B12"]],"hexes":["A13","B12"],"revenue":60,"revenue_str":"A13-B12","nodes":[]}]},{"type":"pass","entity":"11","entity_type":"corporation","id":537,"created_at":1645155017},{"type":"lay_tile","entity":"15","entity_type":"corporation","id":538,"created_at":1645155045,"hex":"H10","tile":"8858-0","rotation":0},{"type":"pass","entity":"15","entity_type":"corporation","id":539,"created_at":1645155145},{"type":"run_routes","entity":"15","entity_type":"corporation","id":540,"created_at":1645155151,"routes":[{"train":"O1-3","connections":[["J4","J6"],["J6","K7"],["K7","J8"],["J8","J10"],["J10","I11"],["I11","J12"],["J12","J14"],["J14","J16"],["J16","I17"],["I17","H16"],["H16","H14"],["H14","G13"],["G13","G11"],["G11","F10"]],"hexes":["J4","J6","K7","J8","J10","I11","J12","J14","J16","I17","H16","H14","G13","G11","F10"],"revenue":260,"revenue_str":"J4-J6-K7-J8-J10-I11-J12-J14-J16-I17-H16-H14-G13-G11-F10 (Schloss Schönbrunn)","nodes":[]}]},{"type":"pass","entity":"15","entity_type":"corporation","id":541,"created_at":1645155155},{"type":"lay_tile","entity":"18","entity_type":"corporation","id":542,"created_at":1645155164,"hex":"F22","tile":"6-3","rotation":0},{"type":"lay_tile","entity":"18","entity_type":"corporation","id":543,"created_at":1645155169,"hex":"I3","tile":"L2-10","rotation":1},{"type":"lay_tile","entity":"18","entity_type":"corporation","id":544,"created_at":1645155230,"hex":"E21","tile":"L21-0","rotation":0},{"type":"pass","entity":"18","entity_type":"corporation","id":545,"created_at":1645155320},{"type":"run_routes","entity":"18","entity_type":"corporation","id":546,"created_at":1645155325,"routes":[{"train":"O1-0","connections":[["H24","H22"],["H22","I23"],["I23","J24"],["J24","J26"],["J26","I27"],["I27","I29"]],"hexes":["H24","H22","I23","J24","J26","I27","I29"],"revenue":130,"revenue_str":"H24-H22-I23-J24-J26-I27-I29 (Schloss Belvedere)","nodes":[]}]},{"type":"pass","entity":"18","entity_type":"corporation","id":547,"created_at":1645155336},{"kind":"variable","type":"dividend","amount":10,"entity":"GWStStB","entity_type":"corporation","id":548,"user":336,"created_at":1645155977,"skip":true},{"kind":"variable","type":"dividend","amount":10,"entity":"BBG","entity_type":"corporation","id":549,"user":343,"created_at":1645156011,"skip":true},{"kind":"variable","type":"dividend","amount":10,"entity":"SJE","entity_type":"corporation","auto_actions":[{"type":"run_routes","entity":"W","routes":[{"hexes":["F24","G23","G21","G19","G17","H16","I15","I13","I11","I9","I7","I5","I3","I1"],"nodes":[],"train":"City-0","revenue":200,"connections":[["G23","F24"],["G21","G23"],["G19","G21"],["G17","G19"],["H16","G17"],["I15","H16"],["I13","I15"],["I11","I13"],["I9","I11"],["I7","I9"],["I5","I7"],["I3","I5"],["I1","I3"]],"revenue_str":"F24-G23-G21-G19-G17-H16-I15-I13-I11-I9-I7-I5-I3-I1"}],"created_at":1645156131,"entity_type":"corporation"},{"type":"run_routes","entity":"D","routes":[{"hexes":["A17","A19","B20","C21","D22","E23","F24"],"nodes":[],"train":"City-2","revenue":140,"connections":[["A19","A17"],["B20","A19"],["C21","B20"],["D22","C21"],["E23","D22"],["F24","E23"]],"revenue_str":"A17-A19-B20-C21-D22-E23-F24"}],"created_at":1645156131,"entity_type":"corporation"},{"type":"run_routes","entity":"G","routes":[{"hexes":["C13","D12","E13","F12","G11","H12","I11"],"nodes":[],"train":"City-1","revenue":100,"connections":[["D12","C13"],["E13","D12"],["F12","E13"],["G11","F12"],["H12","G11"],["I11","H12"]],"revenue_str":"C13-D12-E13-F12-G11-H12-I11"}],"created_at":1645156131,"entity_type":"corporation"}],"id":550,"user":10723,"created_at":1645156125,"skip":true},{"type":"scrap_train","train":"O1-2","entity":"GWStStB","entity_type":"corporation","id":551,"user":336,"created_at":1645156434,"skip":true},{"type":"scrap_train","train":"O1-3","entity":"GWStStB","entity_type":"corporation","id":552,"user":336,"created_at":1645156435,"skip":true},{"type":"buy_train","price":800,"train":"Pu1-0","entity":"GWStStB","variant":"Pu1","entity_type":"corporation","id":553,"user":336,"created_at":1645156438,"skip":true},{"skip":true,"type":"undo","entity":"GWStStB","entity_type":"corporation","id":554,"user":336,"created_at":1645156448},{"skip":true,"type":"undo","entity":"GWStStB","entity_type":"corporation","id":555,"user":336,"created_at":1645156450},{"skip":true,"type":"undo","entity":"GWStStB","entity_type":"corporation","id":556,"user":336,"created_at":1645156452},{"skip":true,"type":"undo","entity":"GWStStB","entity_type":"corporation","id":557,"user":336,"created_at":1645156498},{"skip":true,"type":"undo","entity":"SJE","entity_type":"corporation","id":558,"user":336,"created_at":1645156500},{"skip":true,"type":"undo","entity":"BBG","entity_type":"corporation","id":559,"user":336,"created_at":1645156502},{"type":"dividend","entity":"GWStStB","entity_type":"corporation","id":560,"created_at":1645156506,"kind":"variable","amount":0},{"kind":"variable","type":"dividend","amount":10,"entity":"BBG","entity_type":"corporation","id":561,"user":343,"created_at":1645156534,"skip":true},{"skip":true,"type":"undo","entity":"SJE","entity_type":"corporation","id":562,"user":343,"created_at":1645156542},{"type":"dividend","entity":"BBG","entity_type":"corporation","id":563,"created_at":1645156641,"kind":"variable","amount":10},{"type":"dividend","entity":"SJE","entity_type":"corporation","id":564,"created_at":1645156665,"auto_actions":[{"type":"run_routes","entity":"W","entity_type":"corporation","created_at":1645156671,"routes":[{"train":"City-0","connections":[["G23","F24"],["G21","G23"],["G19","G21"],["G17","G19"],["H16","G17"],["I15","H16"],["I13","I15"],["I11","I13"],["I9","I11"],["I7","I9"],["I5","I7"],["I3","I5"],["I1","I3"]],"hexes":["F24","G23","G21","G19","G17","H16","I15","I13","I11","I9","I7","I5","I3","I1"],"revenue":200,"revenue_str":"F24-G23-G21-G19-G17-H16-I15-I13-I11-I9-I7-I5-I3-I1","nodes":[]}]},{"type":"run_routes","entity":"D","entity_type":"corporation","created_at":1645156671,"routes":[{"train":"City-2","connections":[["A19","A17"],["B20","A19"],["C21","B20"],["D22","C21"],["E23","D22"],["F24","E23"]],"hexes":["A17","A19","B20","C21","D22","E23","F24"],"revenue":140,"revenue_str":"A17-A19-B20-C21-D22-E23-F24","nodes":[]}]},{"type":"run_routes","entity":"G","entity_type":"corporation","created_at":1645156671,"routes":[{"train":"City-1","connections":[["D12","C13"],["E13","D12"],["F12","E13"],["G11","F12"],["H12","G11"],["I11","H12"]],"hexes":["C13","D12","E13","F12","G11","H12","I11"],"revenue":100,"revenue_str":"C13-D12-E13-F12-G11-H12-I11","nodes":[]}]}],"kind":"variable","amount":10},{"type":"scrap_train","entity":"GWStStB","entity_type":"corporation","id":565,"created_at":1645156673,"train":"O1-2"},{"type":"scrap_train","entity":"GWStStB","entity_type":"corporation","id":566,"created_at":1645156674,"train":"O1-3"},{"type":"buy_train","entity":"GWStStB","entity_type":"corporation","id":567,"created_at":1645156677,"train":"Pu1-0","price":800,"variant":"Pu1"},{"type":"buy_train","entity":"GWStStB","entity_type":"corporation","id":568,"created_at":1645156679,"train":"R1-2","price":300,"variant":"R3"},{"type":"reassign_trains","entity":"GWStStB","entity_type":"corporation","id":569,"created_at":1645156687,"assignments":[{"train":"Pu1-0","corporation":"8"},{"train":"R1-2","corporation":"15"}]},{"type":"scrap_train","entity":"BBG","entity_type":"corporation","id":570,"created_at":1645156695,"train":"Y1-2"},{"type":"buy_train","entity":"BBG","entity_type":"corporation","id":571,"created_at":1645156703,"train":"Pu1-1","price":800,"variant":"Pu1"},{"type":"reassign_trains","entity":"BBG","entity_type":"corporation","id":572,"created_at":1645156722,"assignments":[{"train":"R1-0","corporation":"3"},{"train":"O1-1","corporation":"7"},{"train":"Pu1-1","corporation":"1"}]},{"type":"scrap_train","entity":"SJE","entity_type":"corporation","id":573,"created_at":1645156739,"train":"Y1-1"},{"type":"scrap_train","entity":"SJE","entity_type":"corporation","id":574,"created_at":1645156743,"train":"O1-0"},{"type":"buy_train","entity":"SJE","entity_type":"corporation","id":575,"created_at":1645156748,"train":"Pi1-0","price":500,"variant":"Pi2"},{"type":"pass","entity":"SJE","entity_type":"corporation","id":576,"created_at":1645156761},{"type":"reassign_trains","entity":"SJE","entity_type":"corporation","id":577,"created_at":1645156776,"assignments":[{"train":"R1-1","corporation":"18"},{"train":"Pi1-0","corporation":"6"}]},{"type":"pass","entity":"GWStStB","entity_type":"corporation","id":578,"created_at":1645156807},{"type":"pass","entity":"GWStStB","entity_type":"corporation","id":579,"created_at":1645156830},{"type":"reassign_trains","entity":"GWStStB","entity_type":"corporation","id":580,"created_at":1645156839,"assignments":[{"train":"Pu1-0","corporation":"8"},{"train":"R1-2","corporation":"15"}]},{"type":"buy_shares","entity":10723,"entity_type":"player","id":581,"created_at":1645156881,"shares":["W_4"],"percent":10},{"type":"buy_shares","entity":336,"entity_type":"player","id":582,"created_at":1645156890,"shares":["W_5"],"percent":10},{"type":"buy_shares","entity":343,"entity_type":"player","id":583,"created_at":1645156962,"shares":["W_6"],"percent":10},{"type":"pass","entity":10723,"entity_type":"player","id":584,"user":10723,"created_at":1645156967,"skip":true},{"skip":true,"type":"undo","entity":336,"entity_type":"player","id":585,"user":10723,"created_at":1645156970},{"type":"program_share_pass","entity":10723,"indefinite":false,"entity_type":"player","auto_actions":[{"type":"pass","entity":10723,"created_at":1645156977,"entity_type":"player"}],"unconditional":false,"id":586,"user":10723,"created_at":1645156971,"skip":true},{"skip":true,"type":"undo","entity":336,"entity_type":"player","id":587,"user":10723,"created_at":1645157048},{"type":"pass","entity":10723,"entity_type":"player","id":588,"created_at":1645157056},{"type":"buy_shares","entity":336,"entity_type":"player","id":589,"created_at":1645157064,"shares":["W_7"],"percent":10},{"type":"sell_shares","entity":343,"entity_type":"player","id":590,"created_at":1645157091,"shares":["SJE_2"],"percent":10},{"type":"buy_shares","entity":343,"entity_type":"player","id":591,"created_at":1645157094,"shares":["W_8"],"percent":10},{"type":"sell_shares","entity":10723,"entity_type":"player","id":592,"created_at":1645157169,"shares":["BBG_3"],"percent":10},{"type":"buy_shares","entity":10723,"entity_type":"player","id":593,"created_at":1645157174,"shares":["W_9"],"percent":10},{"type":"sell_shares","entity":336,"shares":["BBG_2"],"percent":10,"entity_type":"player","id":594,"user":336,"created_at":1645157491,"skip":true},{"skip":true,"type":"undo","entity":336,"entity_type":"player","id":595,"user":336,"created_at":1645157497},{"type":"pass","entity":336,"entity_type":"player","id":596,"created_at":1645157522},{"type":"pass","entity":343,"entity_type":"player","id":597,"created_at":1645157531},{"type":"program_share_pass","entity":10723,"entity_type":"player","id":598,"created_at":1645157535,"auto_actions":[{"type":"pass","entity":10723,"entity_type":"player","created_at":1645157541}],"unconditional":false,"indefinite":false},{"hex":"D10","tile":"4-2","type":"lay_tile","entity":"1","rotation":0,"entity_type":"corporation","id":599,"user":343,"created_at":1645157555,"skip":true},{"type":"pass","entity":"1","entity_type":"corporation","id":600,"user":343,"created_at":1645157558,"skip":true},{"type":"run_routes","entity":"1","routes":[{"hexes":["E19","D18","C17","C15","D14","E15","E13","E11","F10","E9","D10"],"nodes":[],"train":"Pu1-1","revenue":210,"connections":[["E19","D18"],["D18","C17"],["C17","C15"],["C15","D14"],["D14","E15"],["E15","E13"],["E13","E11"],["E11","F10"],["F10","E9"],["E9","D10"]],"revenue_str":"E19-D18-C17-C15-D14-E15-E13-E11-F10-E9-D10 (Hofburg)"}],"entity_type":"corporation","id":601,"user":343,"created_at":1645157562,"skip":true},{"type":"pass","entity":"1","entity_type":"corporation","id":602,"user":343,"created_at":1645157569,"skip":true},{"hex":"F16","tile":"143-0","type":"lay_tile","entity":"3","rotation":1,"entity_type":"corporation","id":603,"user":343,"created_at":1645157600,"skip":true},{"skip":true,"type":"undo","entity":"3","entity_type":"corporation","id":604,"user":343,"created_at":1645157632},{"skip":true,"type":"undo","entity":"3","entity_type":"corporation","id":605,"user":343,"created_at":1645157634},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":606,"user":343,"created_at":1645157644},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":607,"user":343,"created_at":1645157646},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":608,"user":343,"created_at":1645157649},{"hex":"F16","tile":"143-0","type":"lay_tile","entity":"1","rotation":1,"entity_type":"corporation","id":609,"user":343,"created_at":1645157684,"skip":true},{"type":"pass","entity":"1","entity_type":"corporation","id":610,"user":343,"created_at":1645157686,"skip":true},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":611,"user":343,"created_at":1645157700},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":612,"user":343,"created_at":1645157704},{"hex":"D10","tile":"4-2","type":"lay_tile","entity":"1","rotation":0,"entity_type":"corporation","id":613,"user":343,"created_at":1645157708,"skip":true},{"type":"pass","entity":"1","entity_type":"corporation","id":614,"user":343,"created_at":1645157713,"skip":true},{"type":"run_routes","entity":"1","routes":[{"hexes":["E19","D18","C17","C15","D14","E15","E13","E11","F10","E9","D10"],"nodes":[],"train":"Pu1-1","revenue":210,"connections":[["E19","D18"],["D18","C17"],["C17","C15"],["C15","D14"],["D14","E15"],["E15","E13"],["E13","E11"],["E11","F10"],["F10","E9"],["E9","D10"]],"revenue_str":"E19-D18-C17-C15-D14-E15-E13-E11-F10-E9-D10 (Hofburg)"}],"entity_type":"corporation","id":615,"user":343,"created_at":1645157717,"skip":true},{"type":"pass","entity":"1","entity_type":"corporation","id":616,"user":343,"created_at":1645157720,"skip":true},{"hex":"F16","tile":"143-0","type":"lay_tile","entity":"3","rotation":1,"entity_type":"corporation","id":617,"user":343,"created_at":1645157726,"skip":true},{"type":"pass","entity":"3","entity_type":"corporation","id":618,"user":343,"created_at":1645157728,"skip":true},{"type":"run_routes","entity":"3","routes":[{"hexes":["E19","E17","E15","E13","E11","F10","E9","D10"],"nodes":[],"train":"R1-0","revenue":200,"connections":[["E19","E17"],["E17","E15"],["E15","E13"],["E13","E11"],["E11","F10"],["F10","E9"],["E9","D10"]],"revenue_str":"E19-E17-E15-E13-E11-F10-E9-D10 (Hofburg)"}],"entity_type":"corporation","id":619,"user":343,"created_at":1645157731,"skip":true},{"type":"pass","entity":"3","entity_type":"corporation","id":620,"user":343,"created_at":1645157734,"skip":true},{"hex":"F22","tile":"619-3","type":"lay_tile","entity":"6","rotation":0,"entity_type":"corporation","id":621,"user":10723,"created_at":1645157760,"skip":true},{"city":"L21-0-0","slot":1,"type":"place_token","entity":"6","tokener":"6","entity_type":"corporation","id":622,"user":10723,"created_at":1645157768,"skip":true},{"skip":true,"type":"undo","entity":"6","entity_type":"corporation","id":623,"user":343,"created_at":1645157773},{"skip":true,"type":"undo","entity":"6","entity_type":"corporation","id":624,"user":343,"created_at":1645157782},{"skip":true,"type":"undo","entity":"6","entity_type":"corporation","id":625,"user":343,"created_at":1645157785},{"skip":true,"type":"undo","entity":"3","entity_type":"corporation","id":626,"user":343,"created_at":1645157786},{"skip":true,"type":"undo","entity":"3","entity_type":"corporation","id":627,"user":343,"created_at":1645157788},{"skip":true,"type":"undo","entity":"3","entity_type":"corporation","id":628,"user":343,"created_at":1645157789},{"skip":true,"type":"undo","entity":"3","entity_type":"corporation","id":629,"user":343,"created_at":1645157790},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":630,"user":343,"created_at":1645157792},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":631,"user":343,"created_at":1645157793},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":632,"user":343,"created_at":1645157794},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":633,"user":343,"created_at":1645157795},{"skip":true,"type":"redo","entity":10723,"entity_type":"player","id":634,"user":343,"created_at":1645157806},{"type":"lay_tile","entity":"1","entity_type":"corporation","id":635,"created_at":1645157818,"hex":"D18","tile":"L17-0","rotation":0},{"type":"pass","entity":"1","entity_type":"corporation","id":636,"created_at":1645157823},{"type":"run_routes","entity":"1","entity_type":"corporation","id":637,"created_at":1645157827,"routes":[{"train":"Pu1-1","connections":[["E19","D18"],["D18","C17"],["C17","C15"],["C15","D14"],["D14","E15"],["E15","E13"],["E13","E11"],["E11","F10"],["F10","E9"]],"hexes":["E19","D18","C17","C15","D14","E15","E13","E11","F10","E9"],"revenue":220,"revenue_str":"E19-D18-C17-C15-D14-E15-E13-E11-F10-E9 (Hofburg)","nodes":[]}]},{"type":"pass","entity":"1","entity_type":"corporation","id":638,"created_at":1645157829},{"type":"lay_tile","entity":"3","entity_type":"corporation","id":639,"created_at":1645157846,"hex":"E17","tile":"L17-1","rotation":1},{"type":"pass","entity":"3","entity_type":"corporation","id":640,"created_at":1645157851},{"type":"run_routes","entity":"3","entity_type":"corporation","id":641,"created_at":1645157855,"routes":[{"train":"R1-0","connections":[["E19","E17"],["E17","E15"],["E15","E13"],["E13","E11"],["E11","F10"],["F10","E9"]],"hexes":["E19","E17","E15","E13","E11","F10","E9"],"revenue":210,"revenue_str":"E19-E17-E15-E13-E11-F10-E9 (Hofburg)","nodes":[]}]},{"type":"pass","entity":"3","entity_type":"corporation","id":642,"created_at":1645157857},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":643,"created_at":1645157872,"hex":"F22","tile":"619-3","rotation":0},{"city":"619-3-0","slot":1,"type":"place_token","entity":"6","tokener":"6","entity_type":"corporation","id":644,"user":10723,"created_at":1645157884,"skip":true},{"skip":true,"type":"undo","entity":"6","entity_type":"corporation","id":645,"user":10723,"created_at":1645157889},{"type":"place_token","entity":"6","entity_type":"corporation","id":646,"created_at":1645157892,"city":"L21-0-0","slot":1,"tokener":"6"},{"type":"pass","entity":"6","entity_type":"corporation","id":647,"created_at":1645157901},{"type":"buy_company","entity":"6","entity_type":"corporation","id":648,"created_at":1645157907,"company":"KK","price":20},{"type":"run_routes","entity":"6","entity_type":"corporation","id":649,"created_at":1645157933,"routes":[{"train":"Pi1-0","connections":[["E21","F22"],["F22","F24"],["F24","G25"],["G25","H24"],["H24","H22"],["H22","I23"],["I23","J24"],["J24","J26"],["J26","I27"],["I27","I29"],["I29","J28"],["J28","K27"]],"hexes":["E21","F22","F24","G25","H24","H22","I23","J24","J26","I27","I29","J28","K27"],"revenue":300,"revenue_str":"E21-F22-F24-G25-H24-H22-I23-J24-J26-I27-I29-J28-K27 (Schloss Belvedere,Karlskirche)","nodes":[]}]},{"type":"pass","entity":"6","entity_type":"corporation","id":650,"created_at":1645157936},{"type":"lay_tile","entity":"7","entity_type":"corporation","id":651,"created_at":1645157964,"hex":"H20","tile":"14-2","rotation":2},{"type":"pass","entity":"7","entity_type":"corporation","id":652,"created_at":1645158005},{"type":"scrap_train","entity":"7","entity_type":"corporation","id":653,"created_at":1645158034,"train":"O1-1"},{"type":"pass","entity":"7","entity_type":"corporation","id":654,"created_at":1645158046},{"type":"lay_tile","entity":"8","entity_type":"corporation","id":655,"created_at":1645158064,"hex":"H10","tile":"L17-2","rotation":4},{"type":"pass","entity":"8","entity_type":"corporation","id":656,"created_at":1645158073},{"type":"run_routes","entity":"8","entity_type":"corporation","id":657,"created_at":1645158093,"routes":[{"train":"Pu1-0","connections":[["H10","G11"],["G11","G13"],["G13","H14"],["H14","H16"],["H16","I17"],["I17","J16"],["J16","J14"],["J14","J12"],["J12","I11"],["I11","J10"],["J10","J8"],["J8","K7"],["K7","J6"],["J6","J4"]],"hexes":["H10","G11","G13","H14","H16","I17","J16","J14","J12","I11","J10","J8","K7","J6","J4"],"revenue":340,"revenue_str":"H10-G11-G13-H14-H16-I17-J16-J14-J12-I11-J10-J8-K7-J6-J4 (Schloss Schönbrunn)","nodes":[]}]},{"type":"lay_tile","entity":"11","entity_type":"corporation","id":658,"created_at":1645158144,"hex":"C11","tile":"58-10","rotation":0},{"type":"pass","entity":"11","entity_type":"corporation","id":659,"created_at":1645158147},{"type":"pass","entity":"11","entity_type":"corporation","id":660,"created_at":1645158150},{"type":"lay_tile","entity":"15","entity_type":"corporation","id":661,"created_at":1645158164,"hex":"G9","tile":"58-11","rotation":5},{"type":"choose_ability","entity":"SSB","entity_type":"company","id":662,"created_at":1645158276,"choice":{"type":"sell"}},{"type":"place_token","entity":"15","entity_type":"corporation","id":663,"created_at":1645158277,"city":"L17-2-0","slot":1,"tokener":"15"},{"type":"pass","entity":"15","entity_type":"corporation","id":664,"created_at":1645158307},{"type":"run_routes","entity":"15","entity_type":"corporation","id":665,"created_at":1645158313,"routes":[{"train":"R1-2","connections":[["J4","J6"],["J6","K7"],["K7","J8"],["J8","J10"],["J10","I11"],["I11","J12"],["J12","J14"],["J14","J16"],["J16","I17"],["I17","H16"],["H16","H14"],["H14","G13"],["G13","G11"],["G11","H10"],["H10","G9"]],"hexes":["J4","J6","K7","J8","J10","I11","J12","J14","J16","I17","H16","H14","G13","G11","H10","G9"],"revenue":330,"revenue_str":"J4-J6-K7-J8-J10-I11-J12-J14-J16-I17-H16-H14-G13-G11-H10-G9","nodes":[]}]},{"type":"lay_tile","entity":"18","entity_type":"corporation","id":666,"created_at":1645158357,"hex":"F26","tile":"3-2","rotation":1},{"type":"place_token","entity":"18","entity_type":"corporation","id":667,"created_at":1645158402,"city":"L21-0-0","slot":1,"tokener":"18"},{"type":"pass","entity":"18","entity_type":"corporation","id":668,"created_at":1645158412},{"type":"run_routes","entity":"18","entity_type":"corporation","id":669,"created_at":1645158458,"routes":[{"train":"R1-1","connections":[["E21","F22"],["F22","F24"],["F24","G25"],["G25","H24"],["H24","H22"],["H22","I23"],["I23","J24"],["J24","J26"],["J26","K27"]],"hexes":["E21","F22","F24","G25","H24","H22","I23","J24","J26","K27"],"revenue":250,"revenue_str":"E21-F22-F24-G25-H24-H22-I23-J24-J26-K27 (Schloss Belvedere,Karlskirche)","nodes":[]}]},{"type":"pass","entity":"18","entity_type":"corporation","id":670,"created_at":1645158460},{"type":"lay_tile","entity":"1","entity_type":"corporation","id":671,"created_at":1645158501,"hex":"D10","tile":"4-2","rotation":0},{"type":"pass","entity":"1","entity_type":"corporation","id":672,"created_at":1645158513},{"type":"run_routes","entity":"1","entity_type":"corporation","id":673,"created_at":1645158521,"routes":[{"train":"Pu1-1","connections":[["E19","D18"],["D18","C17"],["C17","C15"],["C15","D14"],["D14","E15"],["E15","E13"],["E13","E11"],["E11","F10"],["F10","E9"],["E9","D10"],["D10","C11"],["C11","B10"],["B10","B12"],["B12","A13"]],"hexes":["E19","D18","C17","C15","D14","E15","E13","E11","F10","E9","D10","C11","B10","B12","A13"],"revenue":250,"revenue_str":"E19-D18-C17-C15-D14-E15-E13-E11-F10-E9-D10-C11-B10-B12-A13 (Hofburg)","nodes":[]}]},{"type":"pass","entity":"1","entity_type":"corporation","id":674,"created_at":1645158523},{"type":"lay_tile","entity":"3","entity_type":"corporation","id":675,"created_at":1645158541,"hex":"F14","tile":"57-4","rotation":1},{"type":"pass","entity":"3","entity_type":"corporation","id":676,"created_at":1645158545},{"type":"run_routes","entity":"3","entity_type":"corporation","id":677,"created_at":1645158550,"routes":[{"train":"R1-0","connections":[["E19","E17"],["E17","E15"],["E15","E13"],["E13","E11"],["E11","F10"],["F10","E9"],["E9","D10"],["D10","C11"],["C11","B10"],["B10","B12"],["B12","A13"]],"hexes":["E19","E17","E15","E13","E11","F10","E9","D10","C11","B10","B12","A13"],"revenue":240,"revenue_str":"E19-E17-E15-E13-E11-F10-E9-D10-C11-B10-B12-A13 (Hofburg)","nodes":[]}]},{"type":"pass","entity":"3","entity_type":"corporation","id":678,"created_at":1645158553},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":679,"created_at":1645158563,"hex":"E25","tile":"4-3","rotation":2},{"type":"pass","entity":"6","entity_type":"corporation","id":680,"created_at":1645158578},{"type":"run_routes","entity":"6","entity_type":"corporation","id":681,"created_at":1645158583,"routes":[{"train":"Pi1-0","connections":[["E21","F22"],["F22","F24"],["F24","G25"],["G25","H24"],["H24","H22"],["H22","I23"],["I23","J24"],["J24","J26"],["J26","I27"],["I27","I29"],["I29","J28"],["J28","K27"]],"hexes":["E21","F22","F24","G25","H24","H22","I23","J24","J26","I27","I29","J28","K27"],"revenue":300,"revenue_str":"E21-F22-F24-G25-H24-H22-I23-J24-J26-I27-I29-J28-K27 (Schloss Belvedere,Karlskirche)","nodes":[]}]},{"type":"pass","entity":"6","entity_type":"corporation","id":682,"created_at":1645158586},{"type":"lay_tile","entity":"7","entity_type":"corporation","id":683,"created_at":1645158644,"hex":"F12","tile":"L10-1","rotation":1},{"type":"pass","entity":"7","entity_type":"corporation","id":684,"created_at":1645158649},{"type":"pass","entity":"7","entity_type":"corporation","id":685,"created_at":1645158651},{"hex":"G7","tile":"3-3","type":"lay_tile","entity":"8","rotation":4,"entity_type":"corporation","id":686,"user":336,"created_at":1645158662,"skip":true},{"type":"pass","entity":"8","entity_type":"corporation","id":687,"user":336,"created_at":1645158677,"skip":true},{"type":"run_routes","entity":"8","routes":[{"hexes":["J4","J6","K7","J8","J10","I11","J12","J14","J16","I17","H16","H14","G13","G11","F10","F12","F14","F16","E15","E13","E11","F10","E9","D10","C11","B10","B12","A13"],"nodes":[],"train":"Pu1-0","revenue":350,"connections":[["J4","J6"],["J6","K7"],["K7","J8"],["J8","J10"],["J10","I11"],["I11","J12"],["J12","J14"],["J14","J16"],["J16","I17"],["I17","H16"],["H16","H14"],["H14","G13"],["G13","G11"],["G11","F10"],["F10","F12"],["F12","F14"],["F14","F16"],["F16","E15"],["E15","E13"],["E13","E11"],["E11","F10"],["F10","E9"],["E9","D10"],["D10","C11"],["C11","B10"],["B10","B12"],["B12","A13"]],"revenue_str":"J4-J6-K7-J8-J10-I11-J12-J14-J16-I17-H16-H14-G13-G11-F10-F12-F14-F16-E15-E13-E11-F10-E9-D10-C11-B10-B12-A13"}],"entity_type":"corporation","id":688,"user":336,"created_at":1645158706,"skip":true},{"hex":"B14","tile":"L1-5","type":"lay_tile","entity":"11","rotation":4,"entity_type":"corporation","id":689,"user":10723,"created_at":1645158729,"skip":true},{"skip":true,"type":"undo","entity":"11","entity_type":"corporation","id":690,"user":336,"created_at":1645158746},{"skip":true,"type":"undo","entity":"11","entity_type":"corporation","id":691,"user":336,"created_at":1645158749},{"skip":true,"type":"undo","entity":"8","entity_type":"corporation","id":692,"user":336,"created_at":1645158753},{"skip":true,"type":"undo","entity":"8","entity_type":"corporation","id":693,"user":336,"created_at":1645158759},{"hex":"I9","tile":"L11-0","type":"lay_tile","entity":"8","rotation":2,"entity_type":"corporation","id":694,"user":336,"created_at":1645158779,"skip":true},{"skip":true,"type":"undo","entity":"8","entity_type":"corporation","id":695,"user":336,"created_at":1645158784},{"type":"lay_tile","entity":"8","entity_type":"corporation","id":696,"created_at":1645158790,"hex":"J16","tile":"611-0","rotation":0},{"type":"pass","entity":"8","entity_type":"corporation","id":697,"created_at":1645158799},{"type":"run_routes","entity":"8","entity_type":"corporation","id":698,"created_at":1645158810,"routes":[{"train":"Pu1-0","connections":[["J4","J6"],["J6","K7"],["K7","J8"],["J8","J10"],["J10","I11"],["I11","J12"],["J12","J14"],["J14","J16"],["J16","I17"],["I17","H16"],["H16","H14"],["H14","G13"],["G13","G11"],["G11","F10"],["F10","F12"],["F12","F14"],["F14","F16"],["F16","E15"],["E15","E13"],["E13","E11"],["E11","F10"],["F10","E9"],["E9","D10"],["D10","C11"],["C11","B10"],["B10","B12"],["B12","A13"]],"hexes":["J4","J6","K7","J8","J10","I11","J12","J14","J16","I17","H16","H14","G13","G11","F10","F12","F14","F16","E15","E13","E11","F10","E9","D10","C11","B10","B12","A13"],"revenue":360,"revenue_str":"J4-J6-K7-J8-J10-I11-J12-J14-J16-I17-H16-H14-G13-G11-F10-F12-F14-F16-E15-E13-E11-F10-E9-D10-C11-B10-B12-A13","nodes":[]}]},{"hex":"B14","tile":"L1-5","type":"lay_tile","entity":"11","rotation":4,"entity_type":"corporation","id":699,"user":10723,"created_at":1645158867,"skip":true},{"skip":true,"type":"undo","entity":"11","entity_type":"corporation","id":700,"user":10723,"created_at":1645158955},{"type":"lay_tile","entity":"11","entity_type":"corporation","id":701,"created_at":1645158960,"hex":"E11","tile":"14-3","rotation":0},{"type":"lay_tile","entity":"11","entity_type":"corporation","id":702,"created_at":1645158967,"hex":"B14","tile":"L1-5","rotation":4},{"type":"pass","entity":"11","entity_type":"corporation","id":703,"created_at":1645158973},{"type":"pass","entity":"11","entity_type":"corporation","id":704,"created_at":1645158984},{"type":"pass","entity":"11","entity_type":"corporation","id":705,"created_at":1645158986},{"type":"lay_tile","entity":"15","entity_type":"corporation","id":706,"created_at":1645159012,"hex":"J10","tile":"611-1","rotation":1},{"type":"pass","entity":"15","entity_type":"corporation","id":707,"created_at":1645159017},{"type":"run_routes","entity":"15","entity_type":"corporation","id":708,"created_at":1645159027,"routes":[{"train":"R1-2","connections":[["J4","J6"],["J6","K7"],["K7","J8"],["J8","J10"],["J10","I11"],["I11","J12"],["J12","J14"],["J14","J16"],["J16","I17"],["I17","H16"],["H16","H14"],["H14","G13"],["G13","G11"],["G11","F10"],["F10","F12"],["F12","F14"],["F14","F16"],["F16","E15"],["E15","E13"],["E13","E11"],["E11","F10"],["F10","E9"],["E9","D10"],["D10","C11"],["C11","B10"],["B10","B12"],["B12","A13"]],"hexes":["J4","J6","K7","J8","J10","I11","J12","J14","J16","I17","H16","H14","G13","G11","F10","F12","F14","F16","E15","E13","E11","F10","E9","D10","C11","B10","B12","A13"],"revenue":370,"revenue_str":"J4-J6-K7-J8-J10-I11-J12-J14-J16-I17-H16-H14-G13-G11-F10-F12-F14-F16-E15-E13-E11-F10-E9-D10-C11-B10-B12-A13","nodes":[]}]},{"type":"lay_tile","entity":"18","entity_type":"corporation","id":709,"created_at":1645159050,"hex":"J26","tile":"611-2","rotation":1},{"type":"pass","entity":"18","entity_type":"corporation","id":710,"created_at":1645159055},{"type":"run_routes","entity":"18","entity_type":"corporation","id":711,"created_at":1645159061,"routes":[{"train":"R1-1","connections":[["E21","F22"],["F22","F24"],["F24","G25"],["G25","H24"],["H24","H22"],["H22","I23"],["I23","J24"],["J24","J26"],["J26","K27"]],"hexes":["E21","F22","F24","G25","H24","H22","I23","J24","J26","K27"],"revenue":260,"revenue_str":"E21-F22-F24-G25-H24-H22-I23-J24-J26-K27 (Schloss Belvedere,Karlskirche)","nodes":[]}]},{"type":"pass","entity":"18","entity_type":"corporation","id":712,"created_at":1645159063},{"type":"dividend","entity":"GWStStB","entity_type":"corporation","id":713,"created_at":1645159085,"kind":"variable","amount":1600},{"kind":"variable","type":"dividend","amount":400,"entity":"SJE","entity_type":"corporation","id":714,"user":10723,"created_at":1645159214,"skip":true},{"skip":true,"type":"undo","entity":"BBG","entity_type":"corporation","id":715,"user":10723,"created_at":1645159342},{"type":"dividend","entity":"SJE","entity_type":"corporation","id":716,"created_at":1645159358,"kind":"variable","amount":200},{"kind":"variable","type":"dividend","amount":610,"entity":"BBG","entity_type":"corporation","auto_actions":[{"type":"run_routes","entity":"W","routes":[{"hexes":["F24","G23","G21","G19","G17","H16","I15","I13","I11","I9","I7","I5","I3","I1"],"nodes":[],"train":"City-0","revenue":230,"connections":[["G23","F24"],["G21","G23"],["G19","G21"],["G17","G19"],["H16","G17"],["I15","H16"],["I13","I15"],["I11","I13"],["I9","I11"],["I7","I9"],["I5","I7"],["I3","I5"],["I1","I3"]],"revenue_str":"F24-G23-G21-G19-G17-H16-I15-I13-I11-I9-I7-I5-I3-I1"}],"created_at":1645159449,"entity_type":"corporation"},{"type":"run_routes","entity":"D","routes":[{"hexes":["A17","A19","B20","C21","D22","E23","F24"],"nodes":[],"train":"City-2","revenue":160,"connections":[["A19","A17"],["B20","A19"],["C21","B20"],["D22","C21"],["E23","D22"],["F24","E23"]],"revenue_str":"A17-A19-B20-C21-D22-E23-F24"}],"created_at":1645159449,"entity_type":"corporation"},{"type":"run_routes","entity":"G","routes":[{"hexes":["A17","B16","B14","C13","D12","E13","F12","G11","H12","I11"],"nodes":[],"train":"City-1","revenue":180,"connections":[["B16","A17"],["B14","B16"],["C13","B14"],["D12","C13"],["E13","D12"],["F12","E13"],["G11","F12"],["H12","G11"],["I11","H12"]],"revenue_str":"A17-B16-B14-C13-D12-E13-F12-G11-H12-I11"}],"created_at":1645159449,"entity_type":"corporation"}],"id":717,"user":343,"created_at":1645159449,"skip":true},{"skip":true,"type":"undo","entity":"GWStStB","entity_type":"corporation","id":718,"user":343,"created_at":1645159482},{"skip":true,"type":"undo","entity":"BBG","entity_type":"corporation","id":719,"user":343,"created_at":1645159492},{"skip":true,"type":"undo","entity":"SJE","entity_type":"corporation","id":720,"user":343,"created_at":1645159495},{"skip":true,"type":"redo","entity":"GWStStB","entity_type":"corporation","id":721,"user":343,"created_at":1645159499},{"skip":true,"type":"redo","entity":"SJE","entity_type":"corporation","id":722,"user":343,"created_at":1645159502},{"kind":"variable","type":"dividend","amount":210,"entity":"BBG","entity_type":"corporation","auto_actions":[{"type":"run_routes","entity":"W","routes":[{"hexes":["F24","G23","G21","G19","G17","H16","I15","I13","I11","I9","I7","I5","I3","I1"],"nodes":[],"train":"City-0","revenue":230,"connections":[["G23","F24"],["G21","G23"],["G19","G21"],["G17","G19"],["H16","G17"],["I15","H16"],["I13","I15"],["I11","I13"],["I9","I11"],["I7","I9"],["I5","I7"],["I3","I5"],["I1","I3"]],"revenue_str":"F24-G23-G21-G19-G17-H16-I15-I13-I11-I9-I7-I5-I3-I1"}],"created_at":1645159527,"entity_type":"corporation"},{"type":"run_routes","entity":"D","routes":[{"hexes":["A17","A19","B20","C21","D22","E23","F24"],"nodes":[],"train":"City-2","revenue":160,"connections":[["A19","A17"],["B20","A19"],["C21","B20"],["D22","C21"],["E23","D22"],["F24","E23"]],"revenue_str":"A17-A19-B20-C21-D22-E23-F24"}],"created_at":1645159527,"entity_type":"corporation"},{"type":"run_routes","entity":"G","routes":[{"hexes":["A17","B16","B14","C13","D12","E13","F12","G11","H12","I11"],"nodes":[],"train":"City-1","revenue":180,"connections":[["B16","A17"],["B14","B16"],["C13","B14"],["D12","C13"],["E13","D12"],["F12","E13"],["G11","F12"],["H12","G11"],["I11","H12"]],"revenue_str":"A17-B16-B14-C13-D12-E13-F12-G11-H12-I11"}],"created_at":1645159527,"entity_type":"corporation"}],"id":723,"user":343,"created_at":1645159526,"skip":true},{"type":"pass","entity":"GWStStB","entity_type":"corporation","id":724,"user":336,"created_at":1645159543,"skip":true},{"type":"reassign_trains","entity":"GWStStB","assignments":[{"train":"Pu1-0","corporation":"8"},{"train":"R1-2","corporation":"15"}],"entity_type":"corporation","id":725,"user":336,"created_at":1645159547,"skip":true},{"type":"buy_train","price":600,"train":"Pu1-2","entity":"SJE","variant":"Pu2","entity_type":"corporation","id":726,"user":10723,"created_at":1645159585,"skip":true},{"type":"reassign_trains","entity":"SJE","assignments":[{"train":"Pi1-0","corporation":"6"},{"train":"R1-1","corporation":"18"},{"train":"Pu1-2","corporation":"11"}],"entity_type":"corporation","id":727,"user":10723,"created_at":1645159596,"skip":true},{"type":"scrap_train","train":"R1-0","entity":"BBG","entity_type":"corporation","id":728,"user":343,"created_at":1645159617,"skip":true},{"type":"buy_train","price":400,"train":"Pi1-1","entity":"BBG","variant":"Pi3","entity_type":"corporation","id":729,"user":343,"created_at":1645159619,"skip":true},{"type":"buy_train","price":400,"train":"Pi1-2","entity":"BBG","variant":"Pi3","entity_type":"corporation","id":730,"user":343,"created_at":1645159621,"skip":true},{"type":"reassign_trains","entity":"BBG","assignments":[{"train":"Pu1-1","corporation":"1"},{"train":"Pi1-1","corporation":"3"},{"train":"Pi1-2","corporation":"7"}],"entity_type":"corporation","id":731,"user":343,"created_at":1645159628,"skip":true},{"skip":true,"type":"undo","entity":"GWStStB","entity_type":"corporation","id":732,"user":343,"created_at":1645159714},{"skip":true,"type":"undo","entity":"BBG","entity_type":"corporation","id":733,"user":343,"created_at":1645159719},{"skip":true,"type":"undo","entity":"BBG","entity_type":"corporation","id":734,"user":343,"created_at":1645159721},{"skip":true,"type":"undo","entity":"BBG","entity_type":"corporation","id":735,"user":343,"created_at":1645159723},{"skip":true,"type":"undo","entity":"BBG","entity_type":"corporation","id":736,"user":343,"created_at":1645159725},{"skip":true,"type":"undo","entity":"SJE","entity_type":"corporation","id":737,"user":343,"created_at":1645159728},{"skip":true,"type":"undo","entity":"SJE","entity_type":"corporation","id":738,"user":343,"created_at":1645159731},{"skip":true,"type":"undo","entity":"GWStStB","entity_type":"corporation","id":739,"user":343,"created_at":1645159735},{"skip":true,"type":"undo","entity":"GWStStB","entity_type":"corporation","id":740,"user":343,"created_at":1645159739},{"type":"dividend","entity":"BBG","entity_type":"corporation","id":741,"created_at":1645159769,"auto_actions":[{"type":"run_routes","entity":"W","entity_type":"corporation","created_at":1645159770,"routes":[{"train":"City-0","connections":[["G23","F24"],["G21","G23"],["G19","G21"],["G17","G19"],["H16","G17"],["I15","H16"],["I13","I15"],["I11","I13"],["I9","I11"],["I7","I9"],["I5","I7"],["I3","I5"],["I1","I3"]],"hexes":["F24","G23","G21","G19","G17","H16","I15","I13","I11","I9","I7","I5","I3","I1"],"revenue":230,"revenue_str":"F24-G23-G21-G19-G17-H16-I15-I13-I11-I9-I7-I5-I3-I1","nodes":[]}]},{"type":"run_routes","entity":"D","entity_type":"corporation","created_at":1645159770,"routes":[{"train":"City-2","connections":[["A19","A17"],["B20","A19"],["C21","B20"],["D22","C21"],["E23","D22"],["F24","E23"]],"hexes":["A17","A19","B20","C21","D22","E23","F24"],"revenue":160,"revenue_str":"A17-A19-B20-C21-D22-E23-F24","nodes":[]}]},{"type":"run_routes","entity":"G","entity_type":"corporation","created_at":1645159770,"routes":[{"train":"City-1","connections":[["B16","A17"],["B14","B16"],["C13","B14"],["D12","C13"],["E13","D12"],["F12","E13"],["G11","F12"],["H12","G11"],["I11","H12"]],"hexes":["A17","B16","B14","C13","D12","E13","F12","G11","H12","I11"],"revenue":180,"revenue_str":"A17-B16-B14-C13-D12-E13-F12-G11-H12-I11","nodes":[]}]}],"kind":"variable","amount":410},{"type":"pass","entity":"GWStStB","entity_type":"corporation","id":742,"created_at":1645159778},{"type":"reassign_trains","entity":"GWStStB","entity_type":"corporation","id":743,"created_at":1645159780,"assignments":[{"train":"Pu1-0","corporation":"8"},{"train":"R1-2","corporation":"15"}]},{"type":"buy_train","entity":"BBG","entity_type":"corporation","id":744,"created_at":1645159793,"train":"Pu1-2","price":600,"variant":"Pu2"},{"type":"reassign_trains","entity":"BBG","entity_type":"corporation","id":745,"created_at":1645159813,"assignments":[{"train":"Pu1-1","corporation":"1"},{"train":"R1-0","corporation":"7"},{"train":"Pu1-2","corporation":"3"}]},{"type":"buy_train","entity":"SJE","entity_type":"corporation","id":746,"created_at":1645159819,"train":"Pu1-3","price":600,"variant":"Pu2"},{"type":"reassign_trains","entity":"SJE","entity_type":"corporation","id":747,"created_at":1645159835,"assignments":[{"train":"Pi1-0","corporation":"11"},{"train":"R1-1","corporation":"18"},{"train":"Pu1-3","corporation":"6"}]},{"type":"pass","entity":"GWStStB","entity_type":"corporation","id":748,"created_at":1645159844},{"type":"pass","entity":"GWStStB","entity_type":"corporation","id":749,"created_at":1645159850},{"type":"reassign_trains","entity":"GWStStB","entity_type":"corporation","id":750,"created_at":1645159852,"assignments":[{"train":"Pu1-0","corporation":"8"},{"train":"R1-2","corporation":"15"}]},{"type":"buy_shares","entity":336,"entity_type":"player","id":751,"created_at":1645159944,"shares":["BBG_3"],"percent":10},{"type":"buy_shares","entity":10723,"entity_type":"player","id":752,"created_at":1645159956,"shares":["G_0"],"percent":10},{"type":"buy_shares","entity":343,"entity_type":"player","id":753,"created_at":1645159969,"shares":["SJE_3"],"percent":10},{"type":"buy_shares","entity":336,"entity_type":"player","id":754,"created_at":1645159980,"shares":["SJE_2"],"percent":10},{"type":"buy_shares","entity":10723,"entity_type":"player","id":755,"created_at":1645159992,"shares":["G_1"],"percent":10},{"type":"buy_shares","entity":343,"entity_type":"player","id":756,"created_at":1645159997,"shares":["SJE_4"],"percent":10},{"type":"sell_shares","entity":336,"entity_type":"player","id":757,"created_at":1645160054,"shares":["D_3"],"percent":10},{"type":"buy_shares","entity":336,"entity_type":"player","id":758,"created_at":1645160063,"shares":["SJE_5"],"percent":10},{"type":"program_buy_shares","entity":336,"entity_type":"player","id":759,"created_at":1645160156,"corporation":"G","until_condition":1,"from_market":false,"auto_pass_after":false},{"type":"buy_shares","entity":10723,"entity_type":"player","id":760,"created_at":1645160167,"shares":["G_2"],"percent":10},{"type":"buy_shares","entity":343,"entity_type":"player","id":761,"created_at":1645160176,"shares":["G_3"],"percent":10},{"type":"pass","entity":336,"entity_type":"player","id":762,"user":343,"created_at":1645160201},{"type":"buy_shares","entity":10723,"entity_type":"player","id":763,"created_at":1645160209,"shares":["G_4"],"percent":10},{"type":"buy_shares","entity":343,"entity_type":"player","id":764,"created_at":1645160222,"shares":["G_5"],"percent":10},{"type":"program_share_pass","entity":336,"indefinite":false,"entity_type":"player","auto_actions":[{"type":"pass","entity":336,"created_at":1645160226,"entity_type":"player"}],"unconditional":false,"id":765,"user":336,"created_at":1645160226,"skip":true},{"type":"buy_shares","entity":10723,"shares":["G_6"],"percent":10,"entity_type":"player","id":766,"user":10723,"created_at":1645160231,"skip":true},{"type":"buy_shares","entity":343,"shares":["D_3"],"percent":10,"entity_type":"player","auto_actions":[{"type":"pass","entity":336,"created_at":1645160239,"entity_type":"player"}],"id":767,"user":343,"created_at":1645160238,"skip":true},{"type":"buy_shares","entity":10723,"shares":["G_7"],"percent":10,"entity_type":"player","id":768,"user":10723,"created_at":1645160251,"skip":true},{"type":"program_share_pass","entity":343,"indefinite":false,"entity_type":"player","auto_actions":[{"type":"pass","entity":343,"created_at":1645160256,"entity_type":"player"},{"type":"pass","entity":336,"created_at":1645160256,"entity_type":"player"}],"unconditional":false,"id":769,"user":343,"created_at":1645160255,"skip":true},{"type":"program_share_pass","entity":10723,"indefinite":false,"entity_type":"player","auto_actions":[{"type":"pass","entity":10723,"created_at":1645160322,"entity_type":"player"}],"unconditional":false,"id":770,"user":10723,"created_at":1645160316,"skip":true},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":771,"user":336,"created_at":1645160337},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":772,"user":10723,"created_at":1645160338},{"type":"program_share_pass","entity":343,"indefinite":false,"entity_type":"player","auto_actions":[{"type":"pass","entity":343,"created_at":1645160363,"entity_type":"player"},{"type":"pass","entity":336,"created_at":1645160363,"entity_type":"player"}],"unconditional":false,"id":773,"user":343,"created_at":1645160363,"skip":true},{"type":"pass","entity":10723,"entity_type":"player","id":774,"user":10723,"created_at":1645160372,"skip":true},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":775,"user":336,"created_at":1645160377},{"skip":true,"type":"undo","entity":10723,"entity_type":"player","id":776,"user":336,"created_at":1645160379},{"skip":true,"type":"undo","entity":343,"entity_type":"player","id":777,"user":336,"created_at":1645160381},{"skip":true,"type":"undo","entity":10723,"entity_type":"player","id":778,"user":336,"created_at":1645160385},{"skip":true,"type":"undo","entity":343,"entity_type":"player","id":779,"user":336,"created_at":1645160388},{"skip":true,"type":"undo","entity":10723,"entity_type":"player","id":780,"user":336,"created_at":1645160390},{"type":"choose_ability","entity":"SD","entity_type":"company","id":781,"created_at":1645160401,"auto_actions":[{"type":"buy_shares","entity":336,"entity_type":"player","created_at":1645160400,"shares":["G_6"],"percent":10}],"choice":{"type":"sell"}},{"type":"buy_shares","entity":10723,"entity_type":"player","id":782,"created_at":1645160420,"shares":["G_7"],"percent":10},{"type":"buy_shares","entity":343,"entity_type":"player","id":783,"created_at":1645160428,"auto_actions":[{"type":"program_disable","entity":336,"entity_type":"player","created_at":1645160428,"reason":"1 share(s) bought in G, end condition met"}],"shares":["D_3"],"percent":10},{"type":"program_share_pass","entity":336,"entity_type":"player","id":784,"created_at":1645160433,"auto_actions":[{"type":"pass","entity":336,"entity_type":"player","created_at":1645160432}],"unconditional":false,"indefinite":false},{"type":"buy_shares","entity":10723,"entity_type":"player","id":785,"created_at":1645160437,"shares":["G_8"],"percent":10},{"type":"program_share_pass","entity":343,"entity_type":"player","id":786,"created_at":1645160445,"auto_actions":[{"type":"pass","entity":343,"entity_type":"player","created_at":1645160445},{"type":"pass","entity":336,"entity_type":"player","created_at":1645160445}],"unconditional":false,"indefinite":false},{"type":"pass","entity":10723,"entity_type":"player","id":787,"created_at":1645160448},{"type":"lay_tile","entity":"1","entity_type":"corporation","id":788,"created_at":1645160464,"hex":"D18","tile":"L18-0","rotation":0},{"type":"pass","entity":"1","entity_type":"corporation","id":789,"created_at":1645160511},{"type":"run_routes","entity":"1","entity_type":"corporation","id":790,"created_at":1645160530,"routes":[{"train":"Pu1-1","connections":[["E19","D18"],["D18","C17"],["C17","C15"],["C15","D14"],["D14","E15"],["E15","F16"],["F16","F14"],["F14","F12"],["F12","F10"],["F10","G11"],["G11","G13"],["G13","H14"],["H14","H16"],["H16","I17"],["I17","J16"]],"hexes":["E19","D18","C17","C15","D14","E15","F16","F14","F12","F10","G11","G13","H14","H16","I17","J16"],"revenue":260,"revenue_str":"E19-D18-C17-C15-D14-E15-F16-F14-F12-F10-G11-G13-H14-H16-I17-J16 (Hofburg)","nodes":[]}]},{"type":"place_token","entity":"3","entity_type":"corporation","id":791,"created_at":1645160579,"city":"L18-0-0","slot":1,"tokener":"3"},{"type":"lay_tile","entity":"3","entity_type":"corporation","id":792,"created_at":1645160664,"hex":"E15","tile":"611-3","rotation":1},{"type":"pass","entity":"3","entity_type":"corporation","id":793,"user":343,"created_at":1645160666,"skip":true},{"type":"run_routes","entity":"3","routes":[{"hexes":["E19","D18","E17","E15","F16","F14","F12","F10","G11","G13","H14","H16","I17","J16"],"nodes":[],"train":"Pu1-2","revenue":320,"connections":[["E19","D18"],["D18","E17"],["E17","E15"],["E15","F16"],["F16","F14"],["F14","F12"],["F12","F10"],["F10","G11"],["G11","G13"],["G13","H14"],["H14","H16"],["H16","I17"],["I17","J16"]],"revenue_str":"E19-D18-E17-E15-F16-F14-F12-F10-G11-G13-H14-H16-I17-J16 (Hofburg)"}],"entity_type":"corporation","id":794,"user":343,"created_at":1645160672,"skip":true},{"skip":true,"type":"undo","entity":"6","entity_type":"corporation","id":795,"user":343,"created_at":1645160702},{"skip":true,"type":"undo","entity":"3","entity_type":"corporation","id":796,"user":343,"created_at":1645160708},{"type":"pass","entity":"3","entity_type":"corporation","id":797,"created_at":1645160721},{"type":"run_routes","entity":"3","entity_type":"corporation","id":798,"created_at":1645160736,"routes":[{"train":"Pu1-2","connections":[["E19","D18"],["D18","E17"],["E17","E15"],["E15","F16"],["F16","F14"],["F14","F12"],["F12","F10"],["F10","G11"],["G11","G13"],["G13","H14"],["H14","H16"],["H16","I17"],["I17","J16"]],"hexes":["E19","D18","E17","E15","F16","F14","F12","F10","G11","G13","H14","H16","I17","J16"],"revenue":320,"revenue_str":"E19-D18-E17-E15-F16-F14-F12-F10-G11-G13-H14-H16-I17-J16 (Hofburg)","nodes":[]}]},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":799,"created_at":1645160763,"hex":"D24","tile":"57-1","rotation":2},{"type":"pass","entity":"6","entity_type":"corporation","id":800,"created_at":1645160778},{"type":"run_routes","entity":"6","entity_type":"corporation","id":801,"created_at":1645160792,"routes":[{"train":"Pu1-3","connections":[["E21","F22"],["F22","F24"],["F24","G25"],["G25","H24"],["H24","H22"],["H22","I23"],["I23","J24"],["J24","J26"],["J26","I27"],["I27","I29"],["I29","J28"],["J28","K27"]],"hexes":["E21","F22","F24","G25","H24","H22","I23","J24","J26","I27","I29","J28","K27"],"revenue":350,"revenue_str":"E21-F22-F24-G25-H24-H22-I23-J24-J26-I27-I29-J28-K27 (Schloss Belvedere,Karlskirche)","nodes":[]}]},{"type":"place_token","entity":"7","entity_type":"corporation","id":802,"created_at":1645160849,"city":"14-2-0","slot":0,"tokener":"7"},{"type":"lay_tile","entity":"7","entity_type":"corporation","id":803,"created_at":1645160883,"hex":"C15","tile":"14-4","rotation":0},{"type":"pass","entity":"7","entity_type":"corporation","id":804,"created_at":1645160886},{"type":"run_routes","entity":"7","entity_type":"corporation","id":805,"created_at":1645160911,"routes":[{"train":"R1-0","connections":[["J24","I23"],["I23","H22"],["H22","H24"],["H24","G25"],["G25","F24"],["F24","F22"],["F22","G21"],["G21","H20"],["H20","G19"],["G19","F18"],["F18","E17"],["E17","D18"],["D18","C17"],["C17","C15"],["C15","D14"],["D14","E15"],["E15","F16"],["F16","F14"],["F14","F12"],["F12","F10"],["F10","G11"],["G11","G13"],["G13","H14"],["H14","H16"],["H16","I17"]],"hexes":["J24","I23","H22","H24","G25","F24","F22","G21","H20","G19","F18","E17","D18","C17","C15","D14","E15","F16","F14","F12","F10","G11","G13","H14","H16","I17"],"revenue":330,"revenue_str":"J24-I23-H22-H24-G25-F24-F22-G21-H20-G19-F18-E17-D18-C17-C15-D14-E15-F16-F14-F12-F10-G11-G13-H14-H16-I17","nodes":[]}]},{"type":"lay_tile","entity":"8","entity_type":"corporation","id":806,"created_at":1645160920,"hex":"J10","tile":"455-0","rotation":0},{"type":"pass","entity":"8","entity_type":"corporation","id":807,"created_at":1645160922},{"type":"run_routes","entity":"8","entity_type":"corporation","id":808,"created_at":1645160928,"routes":[{"train":"Pu1-0","connections":[["J4","J6"],["J6","K7"],["K7","J8"],["J8","J10"],["J10","I11"],["I11","J12"],["J12","J14"],["J14","J16"],["J16","I17"],["I17","H16"],["H16","H14"],["H14","G13"],["G13","G11"],["G11","F10"],["F10","F12"],["F12","F14"],["F14","F16"],["F16","E15"],["E15","E13"],["E13","E11"],["E11","F10"],["F10","E9"],["E9","D10"],["D10","C11"],["C11","B10"],["B10","B12"],["B12","A13"]],"hexes":["J4","J6","K7","J8","J10","I11","J12","J14","J16","I17","H16","H14","G13","G11","F10","F12","F14","F16","E15","E13","E11","F10","E9","D10","C11","B10","B12","A13"],"revenue":400,"revenue_str":"J4-J6-K7-J8-J10-I11-J12-J14-J16-I17-H16-H14-G13-G11-F10-F12-F14-F16-E15-E13-E11-F10-E9-D10-C11-B10-B12-A13","nodes":[]}]},{"type":"place_token","entity":"11","entity_type":"corporation","id":809,"created_at":1645160943,"city":"14-3-0","slot":1,"tokener":"11"},{"type":"lay_tile","entity":"11","entity_type":"corporation","id":810,"created_at":1645160959,"hex":"B14","tile":"L8-1","rotation":5},{"type":"pass","entity":"11","entity_type":"corporation","id":811,"created_at":1645160967},{"type":"run_routes","entity":"11","entity_type":"corporation","id":812,"created_at":1645160983,"routes":[{"train":"Pi1-0","connections":[["I17","H16"],["H16","H14"],["H14","G13"],["G13","G11"],["G11","F10"],["F10","F12"],["F12","F14"],["F14","F16"],["F16","E15"],["E15","E13"],["E13","E11"],["E11","F10"],["F10","E9"],["E9","D10"],["D10","C11"],["C11","B10"],["B10","B12"],["B12","A13"],["A13","B14"]],"hexes":["I17","H16","H14","G13","G11","F10","F12","F14","F16","E15","E13","E11","F10","E9","D10","C11","B10","B12","A13","B14"],"revenue":260,"revenue_str":"I17-H16-H14-G13-G11-F10-F12-F14-F16-E15-E13-E11-F10-E9-D10-C11-B10-B12-A13-B14","nodes":[]}]},{"type":"lay_tile","entity":"15","entity_type":"corporation","id":813,"created_at":1645161030,"hex":"J16","tile":"455-1","rotation":0},{"type":"pass","entity":"15","entity_type":"corporation","id":814,"created_at":1645161033},{"type":"run_routes","entity":"15","entity_type":"corporation","id":815,"created_at":1645161045,"routes":[{"train":"R1-2","connections":[["J4","J6"],["J6","K7"],["K7","J8"],["J8","J10"],["J10","I11"],["I11","J12"],["J12","J14"],["J14","J16"],["J16","I17"],["I17","H16"],["H16","H14"],["H14","G13"],["G13","G11"],["G11","F10"],["F10","F12"],["F12","F14"],["F14","F16"],["F16","E15"],["E15","E13"],["E13","E11"],["E11","F10"],["F10","E9"],["E9","D10"],["D10","C11"],["C11","B10"],["B10","B12"],["B12","A13"],["A13","B14"]],"hexes":["J4","J6","K7","J8","J10","I11","J12","J14","J16","I17","H16","H14","G13","G11","F10","F12","F14","F16","E15","E13","E11","F10","E9","D10","C11","B10","B12","A13","B14"],"revenue":420,"revenue_str":"J4-J6-K7-J8-J10-I11-J12-J14-J16-I17-H16-H14-G13-G11-F10-F12-F14-F16-E15-E13-E11-F10-E9-D10-C11-B10-B12-A13-B14","nodes":[]}]},{"hex":"C23","tile":"4-4","type":"lay_tile","entity":"18","rotation":2,"entity_type":"corporation","id":816,"user":10723,"created_at":1645161066,"skip":true},{"type":"pass","entity":"18","entity_type":"corporation","id":817,"user":10723,"created_at":1645161096,"skip":true},{"skip":true,"type":"undo","entity":"18","entity_type":"corporation","id":818,"user":10723,"created_at":1645161136},{"skip":true,"type":"undo","entity":"18","entity_type":"corporation","id":819,"user":10723,"created_at":1645161143},{"hex":"H20","tile":"611-4","type":"lay_tile","entity":"18","rotation":5,"entity_type":"corporation","id":820,"user":10723,"created_at":1645161153,"skip":true},{"city":"611-4-0","slot":1,"type":"place_token","entity":"18","tokener":"18","entity_type":"corporation","id":821,"user":10723,"created_at":1645161156,"skip":true},{"type":"pass","entity":"18","entity_type":"corporation","id":822,"user":10723,"created_at":1645161179,"skip":true},{"skip":true,"type":"undo","entity":"18","entity_type":"corporation","id":823,"user":10723,"created_at":1645161199},{"skip":true,"type":"undo","entity":"18","entity_type":"corporation","id":824,"user":10723,"created_at":1645161201},{"skip":true,"type":"undo","entity":"18","entity_type":"corporation","id":825,"user":10723,"created_at":1645161204},{"type":"lay_tile","entity":"18","entity_type":"corporation","id":826,"created_at":1645161207,"hex":"F22","tile":"611-4","rotation":0},{"type":"place_token","entity":"18","entity_type":"corporation","id":827,"created_at":1645161208,"city":"611-4-0","slot":1,"tokener":"18"},{"type":"pass","entity":"18","entity_type":"corporation","id":828,"created_at":1645161213},{"type":"run_routes","entity":"18","entity_type":"corporation","id":829,"created_at":1645161218,"routes":[{"train":"R1-1","connections":[["E21","F22"],["F22","F24"],["F24","G25"],["G25","H24"],["H24","H22"],["H22","I23"],["I23","J24"],["J24","J26"],["J26","K27"]],"hexes":["E21","F22","F24","G25","H24","H22","I23","J24","J26","K27"],"revenue":340,"revenue_str":"E21-F22-F24-G25-H24-H22-I23-J24-J26-K27 (Schloss Belvedere,Karlskirche)","nodes":[]}]},{"type":"place_token","entity":"1","entity_type":"corporation","id":830,"created_at":1645161422,"city":"K9-0-0","slot":1,"tokener":"1"},{"type":"lay_tile","entity":"1","entity_type":"corporation","id":831,"created_at":1645161438,"hex":"C15","tile":"611-5","rotation":0},{"type":"pass","entity":"1","entity_type":"corporation","id":832,"created_at":1645161442},{"type":"run_routes","entity":"1","entity_type":"corporation","id":833,"created_at":1645161473,"routes":[{"train":"Pu1-1","connections":[["K9","K11","J10"],["J10","I11"],["I11","J12"],["J12","J14"],["J14","J16"],["J16","I17"],["I17","H16"],["H16","H14"],["H14","G13"],["G13","G11"],["G11","F10"],["F10","F12"],["F12","F14"],["F14","F16"],["F16","E15"],["E15","E13"],["E13","E11"],["E11","F10"],["F10","E9"],["E9","D10"],["D10","C11"],["C11","B10"],["B10","B12"],["B12","A13"],["A13","B14"],["B14","C15"],["C15","C17"],["C17","D18"],["D18","E19"]],"hexes":["K9","J10","I11","J12","J14","J16","I17","H16","H14","G13","G11","F10","F12","F14","F16","E15","E13","E11","F10","E9","D10","C11","B10","B12","A13","B14","C15","C17","D18","E19"],"revenue":430,"revenue_str":"K9-J10-I11-J12-J14-J16-I17-H16-H14-G13-G11-F10-F12-F14-F16-E15-E13-E11-F10-E9-D10-C11-B10-B12-A13-B14-C15-C17-D18-E19 (Hofburg)","nodes":[]}]},{"type":"lay_tile","entity":"3","entity_type":"corporation","id":834,"created_at":1645161509,"hex":"F14","tile":"14-0","rotation":0},{"type":"pass","entity":"3","entity_type":"corporation","id":835,"created_at":1645161515},{"type":"run_routes","entity":"3","entity_type":"corporation","id":836,"created_at":1645161537,"routes":[{"train":"Pu1-2","connections":[["E19","E17"],["E17","D18"],["D18","C17"],["C17","C15"],["C15","B14"],["B14","A13"],["A13","B12"],["B12","B10"],["B10","C11"],["C11","D10"],["D10","E9"],["E9","F10"],["F10","E11"],["E11","E13"],["E13","E15"],["E15","F16"],["F16","F14"],["F14","F12"],["F12","F10"],["F10","G11"],["G11","G13"],["G13","H14"],["H14","H16"],["H16","I17"],["I17","J16"],["J16","J14"],["J14","J12"],["J12","I11"],["I11","J10"],["J10","J8"],["J8","K7"],["K7","J6"],["J6","J4"]],"hexes":["E19","E17","D18","C17","C15","B14","A13","B12","B10","C11","D10","E9","F10","E11","E13","E15","F16","F14","F12","F10","G11","G13","H14","H16","I17","J16","J14","J12","I11","J10","J8","K7","J6","J4"],"revenue":470,"revenue_str":"E19-E17-D18-C17-C15-B14-A13-B12-B10-C11-D10-E9-F10-E11-E13-E15-F16-F14-F12-F10-G11-G13-H14-H16-I17-J16-J14-J12-I11-J10-J8-K7-J6-J4 (Hofburg)","nodes":[]}]},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":837,"created_at":1645161556,"hex":"J28","tile":"619-4","rotation":3},{"type":"pass","entity":"6","entity_type":"corporation","id":838,"created_at":1645161563},{"type":"run_routes","entity":"6","entity_type":"corporation","id":839,"created_at":1645161571,"routes":[{"train":"Pu1-3","connections":[["E21","F22"],["F22","F24"],["F24","G25"],["G25","H24"],["H24","H22"],["H22","I23"],["I23","J24"],["J24","J26"],["J26","I27"],["I27","I29"],["I29","J28"],["J28","K27"]],"hexes":["E21","F22","F24","G25","H24","H22","I23","J24","J26","I27","I29","J28","K27"],"revenue":360,"revenue_str":"E21-F22-F24-G25-H24-H22-I23-J24-J26-I27-I29-J28-K27 (Schloss Belvedere,Karlskirche)","nodes":[]}]},{"type":"lay_tile","entity":"7","entity_type":"corporation","id":840,"created_at":1645161609,"hex":"F14","tile":"611-6","rotation":0},{"type":"pass","entity":"7","entity_type":"corporation","id":841,"created_at":1645161613},{"type":"run_routes","entity":"7","entity_type":"corporation","id":842,"created_at":1645161646,"routes":[{"train":"R1-0","connections":[["J24","I23"],["I23","H22"],["H22","H24"],["H24","G25"],["G25","F24"],["F24","F22"],["F22","G21"],["G21","H20"],["H20","G19"],["G19","F18"],["F18","E17"],["E17","D18"],["D18","C17"],["C17","C15"],["C15","B14"],["B14","A13"],["A13","B12"],["B12","B10"],["B10","C11"],["C11","D10"],["D10","E9"],["E9","F10"],["F10","E11"],["E11","E13"],["E13","E15"],["E15","F16"],["F16","F14"],["F14","F12"],["F12","F10"],["F10","G11"],["G11","G13"],["G13","H14"],["H14","H16"],["H16","I17"],["I17","J16"],["J16","J14"],["J14","J12"],["J12","I11"],["I11","J10"],["J10","J8"],["J8","K7"],["K7","J6"]],"hexes":["J24","I23","H22","H24","G25","F24","F22","G21","H20","G19","F18","E17","D18","C17","C15","B14","A13","B12","B10","C11","D10","E9","F10","E11","E13","E15","F16","F14","F12","F10","G11","G13","H14","H16","I17","J16","J14","J12","I11","J10","J8","K7","J6"],"revenue":460,"revenue_str":"J24-I23-H22-H24-G25-F24-F22-G21-H20-G19-F18-E17-D18-C17-C15-B14-A13-B12-B10-C11-D10-E9-F10-E11-E13-E15-F16-F14-F12-F10-G11-G13-H14-H16-I17-J16-J14-J12-I11-J10-J8-K7-J6","nodes":[]}]},{"type":"lay_tile","entity":"8","entity_type":"corporation","id":843,"created_at":1645161660,"hex":"I9","tile":"L12-0","rotation":2},{"type":"pass","entity":"8","entity_type":"corporation","id":844,"created_at":1645161663},{"type":"run_routes","entity":"8","entity_type":"corporation","id":845,"created_at":1645161688,"routes":[{"train":"Pu1-0","connections":[["J4","J6"],["J6","K7"],["K7","J8"],["J8","J10"],["J10","I11"],["I11","J12"],["J12","J14"],["J14","J16"],["J16","I17"],["I17","H16"],["H16","H14"],["H14","G13"],["G13","G11"],["G11","F10"],["F10","F12"],["F12","F14"],["F14","F16"],["F16","E15"],["E15","D14"],["D14","C15"],["C15","B14"],["B14","A13"],["A13","B12"],["B12","B10"],["B10","C11"],["C11","D10"],["D10","E9"],["E9","F10"],["F10","E11"],["E11","E13"]],"hexes":["J4","J6","K7","J8","J10","I11","J12","J14","J16","I17","H16","H14","G13","G11","F10","F12","F14","F16","E15","D14","C15","B14","A13","B12","B10","C11","D10","E9","F10","E11","E13"],"revenue":430,"revenue_str":"J4-J6-K7-J8-J10-I11-J12-J14-J16-I17-H16-H14-G13-G11-F10-F12-F14-F16-E15-D14-C15-B14-A13-B12-B10-C11-D10-E9-F10-E11-E13","nodes":[]}]},{"type":"lay_tile","entity":"11","entity_type":"corporation","id":846,"created_at":1645161706,"hex":"B12","tile":"611-7","rotation":3},{"type":"pass","entity":"11","entity_type":"corporation","id":847,"created_at":1645161710},{"type":"run_routes","entity":"11","entity_type":"corporation","id":848,"created_at":1645161720,"routes":[{"train":"Pi1-0","connections":[["I17","H16"],["H16","H14"],["H14","G13"],["G13","G11"],["G11","F10"],["F10","F12"],["F12","F14"],["F14","F16"],["F16","E15"],["E15","E13"],["E13","E11"],["E11","F10"],["F10","E9"],["E9","D10"],["D10","C11"],["C11","B10"],["B10","B12"],["B12","A13"],["A13","B14"]],"hexes":["I17","H16","H14","G13","G11","F10","F12","F14","F16","E15","E13","E11","F10","E9","D10","C11","B10","B12","A13","B14"],"revenue":270,"revenue_str":"I17-H16-H14-G13-G11-F10-F12-F14-F16-E15-E13-E11-F10-E9-D10-C11-B10-B12-A13-B14","nodes":[]}]},{"type":"lay_tile","entity":"15","entity_type":"corporation","id":849,"created_at":1645161729,"hex":"I15","tile":"L13-0","rotation":3},{"type":"pass","entity":"15","entity_type":"corporation","id":850,"created_at":1645161733},{"type":"run_routes","entity":"15","entity_type":"corporation","id":851,"created_at":1645161763,"routes":[{"train":"R1-2","connections":[["J4","J6"],["J6","K7"],["K7","J8"],["J8","J10"],["J10","I11"],["I11","J12"],["J12","J14"],["J14","J16"],["J16","I17"],["I17","H16"],["H16","H14"],["H14","G13"],["G13","G11"],["G11","F10"],["F10","F12"],["F12","F14"],["F14","F16"],["F16","E15"],["E15","D14"],["D14","C15"],["C15","B14"],["B14","A13"],["A13","B12"],["B12","B10"],["B10","C11"],["C11","D10"],["D10","E9"],["E9","F10"],["F10","E11"],["E11","E13"]],"hexes":["J4","J6","K7","J8","J10","I11","J12","J14","J16","I17","H16","H14","G13","G11","F10","F12","F14","F16","E15","D14","C15","B14","A13","B12","B10","C11","D10","E9","F10","E11","E13"],"revenue":430,"revenue_str":"J4-J6-K7-J8-J10-I11-J12-J14-J16-I17-H16-H14-G13-G11-F10-F12-F14-F16-E15-D14-C15-B14-A13-B12-B10-C11-D10-E9-F10-E11-E13","nodes":[]}]},{"type":"lay_tile","entity":"18","entity_type":"corporation","id":852,"created_at":1645161792,"hex":"I21","tile":"611-8","rotation":4},{"type":"pass","entity":"18","entity_type":"corporation","id":853,"created_at":1645161796},{"type":"run_routes","entity":"18","entity_type":"corporation","id":854,"created_at":1645161848,"routes":[{"train":"R1-1","connections":[["E21","F22"],["F22","F24"],["F24","G25"],["G25","H24"],["H24","H22"],["H22","I23"],["I23","J24"],["J24","J26"],["J26","I27"],["I27","I29"],["I29","J28"],["J28","K27"]],"hexes":["E21","F22","F24","G25","H24","H22","I23","J24","J26","I27","I29","J28","K27"],"revenue":370,"revenue_str":"E21-F22-F24-G25-H24-H22-I23-J24-J26-I27-I29-J28-K27 (Schloss Belvedere,Karlskirche)","nodes":[]}]},{"hex":"F16","tile":"143-0","type":"lay_tile","entity":"1","rotation":1,"entity_type":"corporation","id":855,"user":343,"created_at":1645161921,"skip":true},{"skip":true,"type":"undo","entity":"1","entity_type":"corporation","id":856,"user":343,"created_at":1645161930},{"type":"lay_tile","entity":"1","entity_type":"corporation","id":857,"created_at":1645161958,"hex":"F18","tile":"15-1","rotation":2},{"type":"pass","entity":"1","entity_type":"corporation","id":858,"created_at":1645161965},{"type":"run_routes","entity":"1","entity_type":"corporation","id":859,"created_at":1645161985,"routes":[{"train":"Pu1-1","connections":[["K9","K11","J10"],["J10","I11"],["I11","J12"],["J12","J14"],["J14","J16"],["J16","I17"],["I17","H16"],["H16","H14"],["H14","G13"],["G13","G11"],["G11","F10"],["F10","F12"],["F12","F14"],["F14","F16"],["F16","E15"],["E15","E13"],["E13","E11"],["E11","F10"],["F10","E9"],["E9","D10"],["D10","C11"],["C11","B10"],["B10","B12"],["B12","A13"],["A13","B14"],["B14","C15"],["C15","C17"],["C17","D18"],["D18","E19"]],"hexes":["K9","J10","I11","J12","J14","J16","I17","H16","H14","G13","G11","F10","F12","F14","F16","E15","E13","E11","F10","E9","D10","C11","B10","B12","A13","B14","C15","C17","D18","E19"],"revenue":430,"revenue_str":"K9-J10-I11-J12-J14-J16-I17-H16-H14-G13-G11-F10-F12-F14-F16-E15-E13-E11-F10-E9-D10-C11-B10-B12-A13-B14-C15-C17-D18-E19 (Hofburg)","nodes":[]}]},{"type":"lay_tile","entity":"3","entity_type":"corporation","id":860,"created_at":1645162025,"hex":"F18","tile":"611-9","rotation":1},{"type":"pass","entity":"3","entity_type":"corporation","id":861,"created_at":1645162028},{"type":"run_routes","entity":"3","entity_type":"corporation","id":862,"created_at":1645162065,"routes":[{"train":"Pu1-2","connections":[["J26","J24"],["J24","I23"],["I23","H22"],["H22","H24"],["H24","G25"],["G25","F24"],["F24","F22"],["F22","G21"],["G21","H20"],["H20","G19"],["G19","F18"],["F18","E17"],["E17","D18"],["D18","C17"],["C17","C15"],["C15","B14"],["B14","A13"],["A13","B12"],["B12","B10"],["B10","C11"],["C11","D10"],["D10","E9"],["E9","F10"],["F10","E11"],["E11","E13"],["E13","E15"],["E15","F16"],["F16","F14"],["F14","F12"],["F12","F10"],["F10","G11"],["G11","G13"],["G13","H14"],["H14","H16"],["H16","I17"],["I17","J16"],["J16","J14"],["J14","J12"],["J12","I11"],["I11","J10"],["J10","J8"],["J8","K7"],["K7","J6"]],"hexes":["J26","J24","I23","H22","H24","G25","F24","F22","G21","H20","G19","F18","E17","D18","C17","C15","B14","A13","B12","B10","C11","D10","E9","F10","E11","E13","E15","F16","F14","F12","F10","G11","G13","H14","H16","I17","J16","J14","J12","I11","J10","J8","K7","J6"],"revenue":520,"revenue_str":"J26-J24-I23-H22-H24-G25-F24-F22-G21-H20-G19-F18-E17-D18-C17-C15-B14-A13-B12-B10-C11-D10-E9-F10-E11-E13-E15-F16-F14-F12-F10-G11-G13-H14-H16-I17-J16-J14-J12-I11-J10-J8-K7-J6","nodes":[]}]},{"type":"lay_tile","entity":"6","entity_type":"corporation","id":863,"created_at":1645162078,"hex":"J28","tile":"611-10","rotation":5},{"type":"pass","entity":"6","entity_type":"corporation","id":864,"created_at":1645162082},{"type":"run_routes","entity":"6","entity_type":"corporation","id":865,"created_at":1645162100,"routes":[{"train":"Pu1-3","connections":[["E21","F22"],["F22","F24"],["F24","G25"],["G25","H24"],["H24","H22"],["H22","I23"],["I23","J24"],["J24","J26"],["J26","I27"],["I27","I29"],["I29","J28"],["J28","K27"]],"hexes":["E21","F22","F24","G25","H24","H22","I23","J24","J26","I27","I29","J28","K27"],"revenue":370,"revenue_str":"E21-F22-F24-G25-H24-H22-I23-J24-J26-I27-I29-J28-K27 (Schloss Belvedere,Karlskirche)","nodes":[]}]},{"type":"lay_tile","entity":"7","entity_type":"corporation","id":866,"created_at":1645162113,"hex":"H20","tile":"611-1","rotation":5},{"type":"pass","entity":"7","entity_type":"corporation","id":867,"created_at":1645162116},{"type":"run_routes","entity":"7","entity_type":"corporation","id":868,"created_at":1645162155,"routes":[{"train":"R1-0","connections":[["J26","J24"],["J24","I23"],["I23","H22"],["H22","H24"],["H24","G25"],["G25","F24"],["F24","F22"],["F22","G21"],["G21","H20"],["H20","G19"],["G19","F18"],["F18","E17"],["E17","D18"],["D18","C17"],["C17","C15"],["C15","B14"],["B14","A13"],["A13","B12"],["B12","B10"],["B10","C11"],["C11","D10"],["D10","E9"],["E9","F10"],["F10","E11"],["E11","E13"],["E13","E15"],["E15","F16"],["F16","F14"],["F14","F12"],["F12","F10"],["F10","G11"],["G11","G13"],["G13","H14"],["H14","H16"],["H16","I17"],["I17","J16"],["J16","J14"],["J14","J12"],["J12","I11"],["I11","J10"],["J10","J8"],["J8","K7"],["K7","J6"]],"hexes":["J26","J24","I23","H22","H24","G25","F24","F22","G21","H20","G19","F18","E17","D18","C17","C15","B14","A13","B12","B10","C11","D10","E9","F10","E11","E13","E15","F16","F14","F12","F10","G11","G13","H14","H16","I17","J16","J14","J12","I11","J10","J8","K7","J6"],"revenue":490,"revenue_str":"J26-J24-I23-H22-H24-G25-F24-F22-G21-H20-G19-F18-E17-D18-C17-C15-B14-A13-B12-B10-C11-D10-E9-F10-E11-E13-E15-F16-F14-F12-F10-G11-G13-H14-H16-I17-J16-J14-J12-I11-J10-J8-K7-J6","nodes":[]}]},{"type":"lay_tile","entity":"8","entity_type":"corporation","id":869,"created_at":1645162164,"hex":"I9","tile":"L16-0","rotation":2},{"type":"pass","entity":"8","entity_type":"corporation","id":870,"created_at":1645162165},{"type":"run_routes","entity":"8","entity_type":"corporation","id":871,"created_at":1645162198,"routes":[{"train":"Pu1-0","connections":[["J4","J6"],["J6","K7"],["K7","J8"],["J8","J10"],["J10","I11"],["I11","J12"],["J12","J14"],["J14","J16"],["J16","I17"],["I17","H16"],["H16","H14"],["H14","G13"],["G13","G11"],["G11","F10"],["F10","F12"],["F12","F14"],["F14","F16"],["F16","E15"],["E15","D14"],["D14","C15"],["C15","B14"],["B14","A13"],["A13","B12"],["B12","B10"],["B10","C11"],["C11","D10"],["D10","E9"],["E9","F10"],["F10","E11"],["E11","E13"]],"hexes":["J4","J6","K7","J8","J10","I11","J12","J14","J16","I17","H16","H14","G13","G11","F10","F12","F14","F16","E15","D14","C15","B14","A13","B12","B10","C11","D10","E9","F10","E11","E13"],"revenue":430,"revenue_str":"J4-J6-K7-J8-J10-I11-J12-J14-J16-I17-H16-H14-G13-G11-F10-F12-F14-F16-E15-D14-C15-B14-A13-B12-B10-C11-D10-E9-F10-E11-E13","nodes":[]}]},{"type":"pass","entity":"11","entity_type":"corporation","id":872,"created_at":1645162208},{"type":"run_routes","entity":"11","entity_type":"corporation","id":873,"created_at":1645162216,"routes":[{"train":"Pi1-0","connections":[["I17","H16"],["H16","H14"],["H14","G13"],["G13","G11"],["G11","F10"],["F10","F12"],["F12","F14"],["F14","F16"],["F16","E15"],["E15","E13"],["E13","E11"],["E11","F10"],["F10","E9"],["E9","D10"],["D10","C11"],["C11","B10"],["B10","B12"],["B12","A13"],["A13","B14"]],"hexes":["I17","H16","H14","G13","G11","F10","F12","F14","F16","E15","E13","E11","F10","E9","D10","C11","B10","B12","A13","B14"],"revenue":270,"revenue_str":"I17-H16-H14-G13-G11-F10-F12-F14-F16-E15-E13-E11-F10-E9-D10-C11-B10-B12-A13-B14","nodes":[]}]},{"type":"lay_tile","entity":"15","entity_type":"corporation","id":874,"created_at":1645162257,"hex":"I15","tile":"L15-0","rotation":3},{"type":"pass","entity":"15","entity_type":"corporation","id":875,"created_at":1645162261},{"type":"run_routes","entity":"15","entity_type":"corporation","id":876,"created_at":1645162289,"routes":[{"train":"R1-2","connections":[["J4","J6"],["J6","K7"],["K7","J8"],["J8","J10"],["J10","I11"],["I11","J12"],["J12","J14"],["J14","J16"],["J16","I17"],["I17","H16"],["H16","H14"],["H14","G13"],["G13","G11"],["G11","F10"],["F10","F12"],["F12","F14"],["F14","F16"],["F16","E15"],["E15","D14"],["D14","C15"],["C15","B14"],["B14","A13"],["A13","B12"],["B12","B10"],["B10","C11"],["C11","D10"],["D10","E9"],["E9","F10"],["F10","E11"],["E11","E13"]],"hexes":["J4","J6","K7","J8","J10","I11","J12","J14","J16","I17","H16","H14","G13","G11","F10","F12","F14","F16","E15","D14","C15","B14","A13","B12","B10","C11","D10","E9","F10","E11","E13"],"revenue":430,"revenue_str":"J4-J6-K7-J8-J10-I11-J12-J14-J16-I17-H16-H14-G13-G11-F10-F12-F14-F16-E15-D14-C15-B14-A13-B12-B10-C11-D10-E9-F10-E11-E13","nodes":[]}]},{"type":"pass","entity":"18","entity_type":"corporation","id":877,"created_at":1645162304},{"type":"run_routes","entity":"18","entity_type":"corporation","id":878,"created_at":1645162316,"routes":[{"train":"R1-1","connections":[["E21","F22"],["F22","F24"],["F24","G25"],["G25","H24"],["H24","H22"],["H22","I23"],["I23","J24"],["J24","J26"],["J26","I27"],["I27","I29"],["I29","J28"],["J28","K27"]],"hexes":["E21","F22","F24","G25","H24","H22","I23","J24","J26","I27","I29","J28","K27"],"revenue":370,"revenue_str":"E21-F22-F24-G25-H24-H22-I23-J24-J26-I27-I29-J28-K27 (Schloss Belvedere,Karlskirche)","nodes":[]}]},{"type":"dividend","entity":"GWStStB","entity_type":"corporation","id":879,"created_at":1645162350,"kind":"variable","amount":2840},{"type":"dividend","entity":"BBG","entity_type":"corporation","id":880,"created_at":1645162357,"kind":"variable","amount":4610},{"type":"dividend","entity":"SJE","entity_type":"corporation","id":881,"created_at":1645162366,"auto_actions":[{"type":"run_routes","entity":"W","entity_type":"corporation","created_at":1645162371,"routes":[{"train":"City-0","connections":[["G23","F24"],["G21","G23"],["G19","G21"],["G17","G19"],["H16","G17"],["I15","H16"],["I13","I15"],["I11","I13"],["I9","I11"],["I7","I9"],["I5","I7"],["I3","I5"],["I1","I3"]],"hexes":["F24","G23","G21","G19","G17","H16","I15","I13","I11","I9","I7","I5","I3","I1"],"revenue":300,"revenue_str":"F24-G23-G21-G19-G17-H16-I15-I13-I11-I9-I7-I5-I3-I1","nodes":[]}]},{"type":"run_routes","entity":"D","entity_type":"corporation","created_at":1645162371,"routes":[{"train":"City-2","connections":[["A19","A17"],["B20","A19"],["C21","B20"],["D22","C21"],["E23","D22"],["F24","E23"]],"hexes":["A17","A19","B20","C21","D22","E23","F24"],"revenue":160,"revenue_str":"A17-A19-B20-C21-D22-E23-F24","nodes":[]}]},{"type":"run_routes","entity":"G","entity_type":"corporation","created_at":1645162371,"routes":[{"train":"City-1","connections":[["B16","A17"],["B14","B16"],["C13","B14"],["D12","C13"],["E13","D12"],["F12","E13"],["G11","F12"],["H12","G11"],["I11","H12"]],"hexes":["A17","B16","B14","C13","D12","E13","F12","G11","H12","I11"],"revenue":180,"revenue_str":"A17-B16-B14-C13-D12-E13-F12-G11-H12-I11","nodes":[]}]}],"kind":"variable","amount":3260}],"loaded":true,"created_at":1645138995,"updated_at":1645162366} \ No newline at end of file diff --git a/public/icons/1822_africa/coffee.svg b/public/icons/1822_africa/coffee.svg new file mode 100644 index 0000000000..25c198d309 --- /dev/null +++ b/public/icons/1822_africa/coffee.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/1822_africa/zebra.svg b/public/icons/1822_africa/zebra.svg new file mode 100644 index 0000000000..7326e8f7c5 --- /dev/null +++ b/public/icons/1822_africa/zebra.svg @@ -0,0 +1 @@ + diff --git a/public/logos/1822_africa/gold_mine.svg b/public/logos/1822_africa/gold_mine.svg new file mode 100644 index 0000000000..25c198d309 --- /dev/null +++ b/public/logos/1822_africa/gold_mine.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/logos/1847_ae/LFK.svg b/public/logos/1847_ae/LFK.svg new file mode 100644 index 0000000000..fdf8931981 --- /dev/null +++ b/public/logos/1847_ae/LFK.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/validate.rb b/validate.rb index 0ba31ac95b..a5d818ed42 100644 --- a/validate.rb +++ b/validate.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true # rubocop:disable all +require 'json' require_relative 'models' Dir['./models/**/*.rb'].sort.each { |file| require file } @@ -8,6 +9,44 @@ require './lib/engine' load 'migrate_game.rb' +# class to facilitate interacting with the results of validate_all() in an irb +# console +class Validate + attr_reader :filename + + def initialize(filename) + @filename = filename + end + + def write(filename) + @filename = filename + File.write(filename, JSON.pretty_generate(data)) + end + + def data + @data ||= JSON.parse(File.read(filename)) + end + + def ids + @ids ||= data.keys.map(&:to_i) + end + + def titles + @titles ||= data.map { |_id, g| g['title'] }.uniq.sort + end + + def errors + @errors ||= data.select { |_id, g| g['exception'] } + end + + def error_ids + @error_ids ||= errors.keys.map(&:to_i) + end + + def error_titles + @error_titles ||= errors.map { |_id, g| g['title'] }.uniq.sort + end +end $count = 0 $total = 0 @@ -73,7 +112,10 @@ def validate_all(*titles, game_ids: nil, strict: false, status: %w[active finish end puts "#{$count}/#{$total} avg #{$total_time / $total}" data['summary']={'failed':$count, 'total':$total, 'total_time':$total_time, 'avg_time':$total_time / $total} - File.write("validate.json", JSON.pretty_generate(data)) + + filename = "validate.json" + File.write(filename, JSON.pretty_generate(data)) + Validate.new(filename) end def validate_one(id)