diff --git a/lib/engine/game/g_18_uruguay/game.rb b/lib/engine/game/g_18_uruguay/game.rb index 6aba749b00..90f8a4ff63 100644 --- a/lib/engine/game/g_18_uruguay/game.rb +++ b/lib/engine/game/g_18_uruguay/game.rb @@ -267,6 +267,7 @@ def operating_round(round_num) G18Uruguay::Step::TakeLoanBuyCompany, Engine::Step::HomeToken, Engine::Step::Track, + G18Uruguay::Step::DestinationToken, G18Uruguay::Step::Token, Engine::Step::Route, Engine::Step::Dividend, @@ -403,6 +404,13 @@ def or_round_finished def final_operating_round? @final_turn == @turn end + + # Second capatilization + def second_capitalization!(corporation) + amount = corporation.par_price.price * 5 + @bank.spend(amount, corporation) + @log << "#{corporation.name} connected to destination receives #{format_currency(amount)}" + end end end end diff --git a/lib/engine/game/g_18_uruguay/step/destination_bonus.rb b/lib/engine/game/g_18_uruguay/step/destination_bonus.rb new file mode 100644 index 0000000000..4946220557 --- /dev/null +++ b/lib/engine/game/g_18_uruguay/step/destination_bonus.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +module Engine + module Game + module G18Uruguay + module Step + class DestinationToken < Engine::Step::Base + ACTIONS = %w[destination_connection pass].freeze + + def description + 'Place the Destination Bonus' + end + + def pass_description + 'Skip (Destination Bonus)' + end + + def actions(_entity) + self.class::ACTIONS + end + + def auto_actions(entity) + corporations = @round.entities.select { |c| destination_node_check?(c) } + return [Engine::Action::Pass.new(entity)] if corporations.empty? + + [Engine::Action::DestinationConnection.new(entity, corporations: corporations)] + end + + def destination_node_check?(corporation) + return if corporation.destination_coordinates.nil? + + ability = @game.abilities(corporation, :destination_bonus) + return if ability.nil? + + destination_hex = @game.hex_by_id(corporation.destination_coordinates) + home_node = corporation.tokens.first.city + destination_hex.tile.nodes.first&.walk(corporation: corporation) do |path, _, _| + return true if path.nodes.include?(home_node) + end + false + end + + def check_and_apply_destination_bonus(corporation) + apply_destination_bonus(corporation) if destination_node_check?(corporation) + end + + def apply_destination_bonus(corporation) + ability = @game.abilities(corporation, :destination_bonus) + @game.second_capitalization!(corporation) unless ability.nil? + ability&.use! + end + + def process_destination_connection(action) + action.corporations.each { |corporation| check_and_apply_destination_bonus(corporation) } + + pass! + end + end + end + end + end +end