spy_alley_application 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (148) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +7 -0
  5. data/Gemfile +4 -0
  6. data/Gemfile.lock +92 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +39 -0
  9. data/Rakefile +6 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +8 -0
  12. data/lib/spy_alley_application.rb +6 -0
  13. data/lib/spy_alley_application/actions/buy_equipment.rb +31 -0
  14. data/lib/spy_alley_application/actions/choose_new_spy_identity.rb +26 -0
  15. data/lib/spy_alley_application/actions/choose_space_to_move.rb +21 -0
  16. data/lib/spy_alley_application/actions/confiscate_materials.rb +58 -0
  17. data/lib/spy_alley_application/actions/generate_new_game.rb +70 -0
  18. data/lib/spy_alley_application/actions/make_accusation.rb +40 -0
  19. data/lib/spy_alley_application/actions/pass.rb +21 -0
  20. data/lib/spy_alley_application/actions/roll_die.rb +25 -0
  21. data/lib/spy_alley_application/actions/use_move_card.rb +28 -0
  22. data/lib/spy_alley_application/execute_action.rb +20 -0
  23. data/lib/spy_alley_application/injection_container.rb +596 -0
  24. data/lib/spy_alley_application/models/acquisition_method/by_confiscation.rb +22 -0
  25. data/lib/spy_alley_application/models/acquisition_method/by_free_gift.rb +20 -0
  26. data/lib/spy_alley_application/models/acquisition_method/by_passing_start.rb +20 -0
  27. data/lib/spy_alley_application/models/acquisition_method/by_purchase.rb +21 -0
  28. data/lib/spy_alley_application/models/acquisition_method/by_selling_top_secret_information.rb +21 -0
  29. data/lib/spy_alley_application/models/board_spaces/black_market.rb +24 -0
  30. data/lib/spy_alley_application/models/board_spaces/border_crossing.rb +24 -0
  31. data/lib/spy_alley_application/models/board_spaces/buy_equipment.rb +26 -0
  32. data/lib/spy_alley_application/models/board_spaces/buy_password.rb +26 -0
  33. data/lib/spy_alley_application/models/board_spaces/confiscate_materials.rb +24 -0
  34. data/lib/spy_alley_application/models/board_spaces/draw_free_gift.rb +24 -0
  35. data/lib/spy_alley_application/models/board_spaces/draw_move_card.rb +24 -0
  36. data/lib/spy_alley_application/models/board_spaces/embassy.rb +26 -0
  37. data/lib/spy_alley_application/models/board_spaces/move_back.rb +25 -0
  38. data/lib/spy_alley_application/models/board_spaces/sold_top_secret_information.rb +27 -0
  39. data/lib/spy_alley_application/models/board_spaces/spy_alley_entrance.rb +38 -0
  40. data/lib/spy_alley_application/models/board_spaces/spy_eliminator.rb +24 -0
  41. data/lib/spy_alley_application/models/board_spaces/start.rb +36 -0
  42. data/lib/spy_alley_application/models/board_spaces/take_another_turn.rb +24 -0
  43. data/lib/spy_alley_application/models/equipment.rb +42 -0
  44. data/lib/spy_alley_application/models/game_board.rb +23 -0
  45. data/lib/spy_alley_application/models/game_board/black_market_option_state.rb +59 -0
  46. data/lib/spy_alley_application/models/game_board/buy_equipment_option_state.rb +52 -0
  47. data/lib/spy_alley_application/models/game_board/buy_password_option_state.rb +39 -0
  48. data/lib/spy_alley_application/models/game_board/confiscate_materials_option_state.rb +68 -0
  49. data/lib/spy_alley_application/models/game_board/eliminate_player.rb +91 -0
  50. data/lib/spy_alley_application/models/game_board/embassy_victory.rb +23 -0
  51. data/lib/spy_alley_application/models/game_board/equipment_bought.rb +42 -0
  52. data/lib/spy_alley_application/models/game_board/equipment_confiscated.rb +67 -0
  53. data/lib/spy_alley_application/models/game_board/free_gift_drawn.rb +39 -0
  54. data/lib/spy_alley_application/models/game_board/money_gained_or_lost.rb +22 -0
  55. data/lib/spy_alley_application/models/game_board/move_card_drawn.rb +31 -0
  56. data/lib/spy_alley_application/models/game_board/move_card_used.rb +30 -0
  57. data/lib/spy_alley_application/models/game_board/move_options.rb +23 -0
  58. data/lib/spy_alley_application/models/game_board/new_spy_identity_chosen.rb +37 -0
  59. data/lib/spy_alley_application/models/game_board/next_game_state.rb +70 -0
  60. data/lib/spy_alley_application/models/game_board/player_moved.rb +24 -0
  61. data/lib/spy_alley_application/models/game_board/spy_eliminator_options.rb +41 -0
  62. data/lib/spy_alley_application/models/game_state/buy_equipment.rb +26 -0
  63. data/lib/spy_alley_application/models/game_state/choose_new_spy_identity.rb +29 -0
  64. data/lib/spy_alley_application/models/game_state/confiscate_materials.rb +29 -0
  65. data/lib/spy_alley_application/models/game_state/game_over.rb +27 -0
  66. data/lib/spy_alley_application/models/game_state/move_option.rb +25 -0
  67. data/lib/spy_alley_application/models/game_state/spy_eliminator.rb +25 -0
  68. data/lib/spy_alley_application/models/game_state/start_of_turn.rb +23 -0
  69. data/lib/spy_alley_application/models/game_state/victory_reason/by_elimination.rb +22 -0
  70. data/lib/spy_alley_application/models/game_state/victory_reason/by_embassy.rb +22 -0
  71. data/lib/spy_alley_application/models/move_card.rb +26 -0
  72. data/lib/spy_alley_application/models/player.rb +37 -0
  73. data/lib/spy_alley_application/models/sell_top_secret_information.rb +24 -0
  74. data/lib/spy_alley_application/models/validator/buying_equipment.rb +35 -0
  75. data/lib/spy_alley_application/models/validator/choosing_new_spy_identity.rb +33 -0
  76. data/lib/spy_alley_application/models/validator/confiscating_materials.rb +50 -0
  77. data/lib/spy_alley_application/models/validator/making_accusation.rb +31 -0
  78. data/lib/spy_alley_application/models/validator/moving.rb +30 -0
  79. data/lib/spy_alley_application/models/validator/passing.rb +24 -0
  80. data/lib/spy_alley_application/models/validator/rolling_die.rb +29 -0
  81. data/lib/spy_alley_application/models/validator/using_move_card.rb +31 -0
  82. data/lib/spy_alley_application/models/wild_card.rb +25 -0
  83. data/lib/spy_alley_application/new_game.rb +18 -0
  84. data/lib/spy_alley_application/new_game/assign_seats.rb +21 -0
  85. data/lib/spy_alley_application/new_game/assign_spy_identities.rb +24 -0
  86. data/lib/spy_alley_application/results/nodes/buy_equipment_option_node.rb +23 -0
  87. data/lib/spy_alley_application/results/nodes/choose_new_spy_identity_option_node.rb +23 -0
  88. data/lib/spy_alley_application/results/nodes/confiscate_materials_option_node.rb +22 -0
  89. data/lib/spy_alley_application/results/nodes/die_rolled_node.rb +21 -0
  90. data/lib/spy_alley_application/results/nodes/eliminated_player_node.rb +22 -0
  91. data/lib/spy_alley_application/results/nodes/equipment_gained_node.rb +28 -0
  92. data/lib/spy_alley_application/results/nodes/game_over_node.rb +24 -0
  93. data/lib/spy_alley_application/results/nodes/make_accusation_option_node.rb +20 -0
  94. data/lib/spy_alley_application/results/nodes/money_gained_node.rb +25 -0
  95. data/lib/spy_alley_application/results/nodes/money_lost_node.rb +21 -0
  96. data/lib/spy_alley_application/results/nodes/move_back_node.rb +21 -0
  97. data/lib/spy_alley_application/results/nodes/move_card_drawn_node.rb +22 -0
  98. data/lib/spy_alley_application/results/nodes/move_card_used_node.rb +22 -0
  99. data/lib/spy_alley_application/results/nodes/move_option_node.rb +20 -0
  100. data/lib/spy_alley_application/results/nodes/new_spy_identity_chosen_node.rb +21 -0
  101. data/lib/spy_alley_application/results/nodes/next_player_node.rb +20 -0
  102. data/lib/spy_alley_application/results/nodes/pass_option_node.rb +16 -0
  103. data/lib/spy_alley_application/results/nodes/player_movement_node.rb +21 -0
  104. data/lib/spy_alley_application/results/nodes/player_passed_node.rb +19 -0
  105. data/lib/spy_alley_application/results/nodes/reached_embassy_with_all_equipment_node.rb +20 -0
  106. data/lib/spy_alley_application/results/nodes/result_game_board_node.rb +21 -0
  107. data/lib/spy_alley_application/results/nodes/roll_die_option_node.rb +16 -0
  108. data/lib/spy_alley_application/results/nodes/use_move_card_option_node.rb +20 -0
  109. data/lib/spy_alley_application/results/nodes/wild_card_gained_node.rb +27 -0
  110. data/lib/spy_alley_application/results/process_buy_equipment_options.rb +25 -0
  111. data/lib/spy_alley_application/results/process_eliminating_player.rb +36 -0
  112. data/lib/spy_alley_application/results/process_landing_on_space.rb +232 -0
  113. data/lib/spy_alley_application/results/process_move_options.rb +65 -0
  114. data/lib/spy_alley_application/results/process_next_turn_options.rb +87 -0
  115. data/lib/spy_alley_application/results/process_passing_spaces.rb +68 -0
  116. data/lib/spy_alley_application/results/process_proceeding_to_next_state.rb +23 -0
  117. data/lib/spy_alley_application/types/array_of_equipment.rb +7 -0
  118. data/lib/spy_alley_application/types/array_of_free_gifts.rb +7 -0
  119. data/lib/spy_alley_application/types/array_of_move_cards.rb +6 -0
  120. data/lib/spy_alley_application/types/array_of_players.rb +6 -0
  121. data/lib/spy_alley_application/types/board_space.rb +4 -0
  122. data/lib/spy_alley_application/types/coercible_integer_one_to_six.rb +9 -0
  123. data/lib/spy_alley_application/types/equipment.rb +32 -0
  124. data/lib/spy_alley_application/types/equipment_type.rb +9 -0
  125. data/lib/spy_alley_application/types/free_gift.rb +22 -0
  126. data/lib/spy_alley_application/types/game_board.rb +52 -0
  127. data/lib/spy_alley_application/types/game_state.rb +19 -0
  128. data/lib/spy_alley_application/types/move_card.rb +21 -0
  129. data/lib/spy_alley_application/types/nationality.rb +5 -0
  130. data/lib/spy_alley_application/types/player.rb +123 -0
  131. data/lib/spy_alley_application/types/validation_builder.rb +21 -0
  132. data/lib/spy_alley_application/types/validator/non_admin.rb +21 -0
  133. data/lib/spy_alley_application/types/wild_card.rb +14 -0
  134. data/lib/spy_alley_application/validator/builder.rb +119 -0
  135. data/lib/spy_alley_application/validator/buy_equipment.rb +39 -0
  136. data/lib/spy_alley_application/validator/choose_new_spy_identity.rb +24 -0
  137. data/lib/spy_alley_application/validator/confiscate_materials.rb +22 -0
  138. data/lib/spy_alley_application/validator/confiscate_materials/full_validator.rb +39 -0
  139. data/lib/spy_alley_application/validator/confiscate_materials/validate_target_player_id.rb +24 -0
  140. data/lib/spy_alley_application/validator/make_accusation.rb +24 -0
  141. data/lib/spy_alley_application/validator/move.rb +24 -0
  142. data/lib/spy_alley_application/validator/new_game.rb +35 -0
  143. data/lib/spy_alley_application/validator/new_game_builder.rb +32 -0
  144. data/lib/spy_alley_application/validator/no_options.rb +7 -0
  145. data/lib/spy_alley_application/validator/use_move_card.rb +23 -0
  146. data/lib/spy_alley_application/version.rb +3 -0
  147. data/spy_alley_application.gemspec +40 -0
  148. metadata +343 -0
@@ -0,0 +1,40 @@
1
+ # frozen string literal: true
2
+
3
+ require 'dry-initializer'
4
+
5
+ module SpyAlleyApplication
6
+ module Actions
7
+ class MakeAccusation
8
+ include Dry::Initializer.define -> do
9
+ option :process_eliminating_player, type: ::Types::Callable, reader: :private
10
+ option :process_proceeding_to_next_state, type: ::Types::Callable, reader: :private
11
+ end
12
+
13
+ def call(game_board:, change_orders:, target_player_id:, nationality:)
14
+ player = game_board.current_player
15
+ target_player = game_board.players.find{|p| p.id.eql?(target_player_id)}
16
+ at_risk_accusation = game_board.game_state.accept(self)
17
+ execute_if_guess_incorrect =
18
+ at_risk_accusation ? process_eliminating_player : process_proceeding_to_next_state
19
+ if target_player.spy_identity.eql?(nationality)
20
+ process_eliminating_player.(
21
+ game_board: game_board,
22
+ change_orders: change_orders,
23
+ eliminating_player: player,
24
+ eliminated_player: target_player)
25
+ else
26
+ execute_if_incorrect.(
27
+ game_board: game_board,
28
+ change_orders: change_orders,
29
+ target_player_id: target_player_id,
30
+ eliminating_player: target_player,
31
+ eliminated_player: player)
32
+ end
33
+ end
34
+
35
+ def handle_spy_eliminator(*args);false;end
36
+ def handle_start_of_turn(*args);true;end
37
+ end
38
+ end
39
+ end
40
+
@@ -0,0 +1,21 @@
1
+ # frozen string literal: true
2
+
3
+ require 'dry-initializer'
4
+
5
+ module SpyAlleyApplication
6
+ module Actions
7
+ class Pass
8
+ include Dry::Initializer.define -> do
9
+ option :get_player_passed_node, type: ::Types::Callable, reader: :private
10
+ option :process_proceeding_to_next_state, type: ::Types::Callable, reader: :private
11
+ end
12
+
13
+ def call(game_board:, change_orders:)
14
+ process_proceeding_to_next_state.(
15
+ game_board: game_board,
16
+ change_orders: change_orders.push(get_player_passed_node.()))
17
+ end
18
+ end
19
+ end
20
+ end
21
+
@@ -0,0 +1,25 @@
1
+ # frozen string literal: true
2
+
3
+ require 'dry-initializer'
4
+
5
+ module SpyAlleyApplication
6
+ module Actions
7
+ class RollDie
8
+ include Dry::Initializer.define -> do
9
+ option :execute_die_roll, type: ::Types::Callable, reader: :private
10
+ option :get_die_rolled_node, type: ::Types::Callable, reader: :private
11
+ option :process_passing_spaces, type: ::Types::Callable, reader: :private
12
+ end
13
+
14
+ def call(game_board:, change_orders:, number_rolled: nil)
15
+ number_rolled ||= execute_die_roll.()
16
+ process_passing_spaces.(
17
+ game_board: game_board,
18
+ change_orders: change_orders.push(get_die_rolled_node.(number_rolled: number_rolled)),
19
+ board_space: game_board.current_player.location,
20
+ spaces_remaining: number_rolled)
21
+ end
22
+ end
23
+ end
24
+ end
25
+
@@ -0,0 +1,28 @@
1
+ # frozen string literal: true
2
+
3
+ require 'dry-initializer'
4
+
5
+ module SpyAlleyApplication
6
+ module Actions
7
+ class UseMoveCard
8
+ include Dry::Initializer.define -> do
9
+ option :get_move_card_used_node, type: ::Types::Callable, reader: :private
10
+ option :move_card_used, type: ::Types::Callable, reader: :private
11
+ option :process_passing_spaces, type: ::Types::Callable, reader: :private
12
+ end
13
+
14
+ def call(game_board:, change_orders:, card_to_use:)
15
+ change_orders = change_orders.push(get_move_card_used_node.(
16
+ player_id: game_board.current_player.id,
17
+ card: card_to_use))
18
+ game_board = move_card_used.(game_board: game_board, move_card_used: card_to_use)
19
+ process_passing_spaces.(
20
+ game_board: game_board,
21
+ change_orders: change_orders,
22
+ board_space: game_board.current_player.location,
23
+ spaces_remaining: card_to_use)
24
+ end
25
+ end
26
+ end
27
+ end
28
+
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-auto_inject'
4
+ require 'spy_alley_application/injection_container'
5
+ require 'spy_alley_application/types/game_board'
6
+
7
+ module SpyAlleyApplication
8
+ class ExecuteAction
9
+ include Dry::AutoInject(SpyAlleyApplication::InjectionContainer)[
10
+ :change_orders_initializer, :build_validator]
11
+
12
+ def call(action_hash:, game_board:, user:, last_action_id:)
13
+ game_board = SpyAlleyApplication::Types::GameBoard.call(game_board.to_h)
14
+ validate = build_validator.(game_board: game_board, last_action_id: last_action_id)
15
+ execute_action = validate.(action_hash: action_hash, user: user)
16
+ execute_action.(game_board: game_board, change_orders: change_orders_initializer.())
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,596 @@
1
+ # frozen string literal: true
2
+
3
+ require 'change_orders'
4
+ require 'dry-auto_inject'
5
+ require 'dry-container'
6
+ require 'game_validator'
7
+ require 'spy_alley_application/actions/buy_equipment'
8
+ require 'spy_alley_application/actions/choose_new_spy_identity'
9
+ require 'spy_alley_application/actions/choose_space_to_move'
10
+ require 'spy_alley_application/actions/confiscate_materials'
11
+ require 'spy_alley_application/actions/generate_new_game'
12
+ require 'spy_alley_application/actions/make_accusation'
13
+ require 'spy_alley_application/actions/pass'
14
+ require 'spy_alley_application/actions/roll_die'
15
+ require 'spy_alley_application/actions/use_move_card'
16
+ require 'spy_alley_application/models/game_board/black_market_option_state'
17
+ require 'spy_alley_application/models/game_board/buy_equipment_option_state'
18
+ require 'spy_alley_application/models/game_board/buy_password_option_state'
19
+ require 'spy_alley_application/models/game_board/confiscate_materials_option_state'
20
+ require 'spy_alley_application/models/game_board/eliminate_player'
21
+ require 'spy_alley_application/models/game_board/embassy_victory'
22
+ require 'spy_alley_application/models/game_board/equipment_bought'
23
+ require 'spy_alley_application/models/game_board/equipment_confiscated'
24
+ require 'spy_alley_application/models/game_board/free_gift_drawn'
25
+ require 'spy_alley_application/models/game_board/money_gained_or_lost'
26
+ require 'spy_alley_application/models/game_board/move_card_drawn'
27
+ require 'spy_alley_application/models/game_board/move_card_used'
28
+ require 'spy_alley_application/models/game_board/move_options'
29
+ require 'spy_alley_application/models/game_board/new_spy_identity_chosen'
30
+ require 'spy_alley_application/models/game_board/next_game_state'
31
+ require 'spy_alley_application/models/game_board/player_moved'
32
+ require 'spy_alley_application/models/game_board/spy_eliminator_options'
33
+ require 'spy_alley_application/new_game/assign_seats'
34
+ require 'spy_alley_application/new_game/assign_spy_identities'
35
+ require 'spy_alley_application/results/nodes/buy_equipment_option_node'
36
+ require 'spy_alley_application/results/nodes/choose_new_spy_identity_option_node'
37
+ require 'spy_alley_application/results/nodes/confiscate_materials_option_node'
38
+ require 'spy_alley_application/results/nodes/die_rolled_node'
39
+ require 'spy_alley_application/results/nodes/eliminated_player_node'
40
+ require 'spy_alley_application/results/nodes/equipment_gained_node'
41
+ require 'spy_alley_application/results/nodes/game_over_node'
42
+ require 'spy_alley_application/results/nodes/make_accusation_option_node'
43
+ require 'spy_alley_application/results/nodes/money_gained_node'
44
+ require 'spy_alley_application/results/nodes/money_lost_node'
45
+ require 'spy_alley_application/results/nodes/move_back_node'
46
+ require 'spy_alley_application/results/nodes/move_card_drawn_node'
47
+ require 'spy_alley_application/results/nodes/move_card_used_node'
48
+ require 'spy_alley_application/results/nodes/move_option_node'
49
+ require 'spy_alley_application/results/nodes/new_spy_identity_chosen_node'
50
+ require 'spy_alley_application/results/nodes/next_player_node'
51
+ require 'spy_alley_application/results/nodes/pass_option_node'
52
+ require 'spy_alley_application/results/nodes/player_movement_node'
53
+ require 'spy_alley_application/results/nodes/player_passed_node'
54
+ require 'spy_alley_application/results/nodes/result_game_board_node'
55
+ require 'spy_alley_application/results/nodes/roll_die_option_node'
56
+ require 'spy_alley_application/results/nodes/use_move_card_option_node'
57
+ require 'spy_alley_application/results/nodes/wild_card_gained_node'
58
+ require 'spy_alley_application/results/process_buy_equipment_options'
59
+ require 'spy_alley_application/results/process_eliminating_player'
60
+ require 'spy_alley_application/results/process_move_options'
61
+ require 'spy_alley_application/results/process_landing_on_space'
62
+ require 'spy_alley_application/results/process_next_turn_options'
63
+ require 'spy_alley_application/results/process_passing_spaces'
64
+ require 'spy_alley_application/results/process_proceeding_to_next_state'
65
+ require 'spy_alley_application/validator/builder'
66
+ require 'spy_alley_application/validator/new_game'
67
+ require 'spy_alley_application/validator/new_game_builder'
68
+
69
+ module SpyAlleyApplication
70
+ class InjectionContainer
71
+ extend Dry::Container::Mixin
72
+ register :change_orders_initializer do
73
+ new_change_orders = ChangeOrders::Container::new
74
+ ->{new_change_orders}
75
+ end
76
+
77
+ namespace :actions do
78
+ register :buy_equipment do
79
+ equipment_bought = SpyAlleyApplication::InjectionContainer
80
+ .resolve('game_board_effects.equipment_bought')
81
+ get_equipment_gained_node = SpyAlleyApplication::InjectionContainer
82
+ .resolve('results.get.equipment_gained_node')
83
+ process_proceeding_to_next_state = SpyAlleyApplication::InjectionContainer
84
+ .resolve('results.process_proceeding_to_next_state')
85
+ SpyAlleyApplication::Actions::BuyEquipment::new(
86
+ equipment_bought: equipment_bought,
87
+ get_equipment_gained_node: get_equipment_gained_node,
88
+ process_proceeding_to_next_state: process_proceeding_to_next_state).method(:call)
89
+ end
90
+
91
+ register :choose_new_spy_identity do
92
+ get_new_spy_identity_chosen_node = SpyAlleyApplication::InjectionContainer
93
+ .resolve('results.get.new_spy_identity_chosen_node')
94
+ get_result_game_board_node = SpyAlleyApplication::InjectionContainer
95
+ .resolve('results.get.result_game_board_node')
96
+ new_spy_identity_chosen = SpyAlleyApplication::InjectionContainer
97
+ .resolve('game_board_effects.new_spy_identity_chosen')
98
+ process_proceeding_to_next_state = SpyAlleyApplication::InjectionContainer
99
+ .resolve('results.process_proceeding_to_next_state')
100
+ SpyAlleyApplication::Actions::ChooseNewSpyIdentity::new(
101
+ get_new_spy_identity_chosen_node: get_new_spy_identity_chosen_node,
102
+ get_result_game_board_node: get_result_game_board_node,
103
+ new_spy_identity_chosen: new_spy_identity_chosen,
104
+ process_proceeding_to_next_state: process_proceeding_to_next_state).method(:call)
105
+ end
106
+
107
+ register :choose_space_to_move do
108
+ process_landing_on_space = SpyAlleyApplication::InjectionContainer
109
+ .resolve('results.process_landing_on_space')
110
+ SpyAlleyApplication::Actions::ChooseSpaceToMove::new(
111
+ process_landing_on_space: process_landing_on_space).method(:call)
112
+ end
113
+
114
+ register :confiscate_materials do
115
+ equipment_confiscated = SpyAlleyApplication::InjectionContainer
116
+ .resolve('game_board_effects.equipment_confiscated')
117
+ get_equipment_gained_node = SpyAlleyApplication::InjectionContainer
118
+ .resolve('results.get.equipment_gained_node')
119
+ get_wild_card_gained_node = SpyAlleyApplication::InjectionContainer
120
+ .resolve('results.get.wild_card_gained_node')
121
+ process_proceeding_to_next_state = SpyAlleyApplication::InjectionContainer
122
+ .resolve('results.process_proceeding_to_next_state')
123
+ SpyAlleyApplication::Actions::ConfiscateMaterials::new(
124
+ equipment_confiscated: equipment_confiscated,
125
+ get_equipment_gained_node: get_equipment_gained_node,
126
+ get_wild_card_gained_node: get_wild_card_gained_node,
127
+ process_proceeding_to_next_state: process_proceeding_to_next_state)
128
+ end
129
+
130
+ register :generate_new_game do
131
+ get_result_game_board_node = SpyAlleyApplication::InjectionContainer
132
+ .resolve('results.get.result_game_board_node')
133
+ process_next_turn_options = SpyAlleyApplication::InjectionContainer
134
+ .resolve('results.process_next_turn_options')
135
+ SpyAlleyApplication::Actions::GenerateNewGame::new(
136
+ get_result_game_board_node: get_result_game_board_node,
137
+ process_next_turn_options: process_next_turn_options).method(:call)
138
+ end
139
+
140
+ register :make_accusation do
141
+ process_eliminating_player = SpyAlleyApplication::InjectionContainer
142
+ .resolve('results.process_eliminating_player')
143
+ process_proceeding_to_next_state = SpyAlleyApplication::InjectionContainer
144
+ .resolve('results.process_proceeding_to_next_state')
145
+ SpyAlleyApplication::Actions::MakeAccusation::new(
146
+ process_eliminating_player: process_eliminating_player,
147
+ process_proceeding_to_next_state: process_proceeding_to_next_state).method(:call)
148
+ end
149
+
150
+ register :pass do
151
+ get_player_passed_node = SpyAlleyApplication::InjectionContainer
152
+ .resolve('results.get.player_passed_node')
153
+ process_proceeding_to_next_state = SpyAlleyApplication::InjectionContainer
154
+ .resolve('results.process_proceeding_to_next_state')
155
+ SpyAlleyApplication::Actions::Pass::new(
156
+ get_player_passed_node: get_player_passed_node,
157
+ process_proceeding_to_next_state: process_proceeding_to_next_state).method(:call)
158
+ end
159
+
160
+ register :roll_die do
161
+ execute_die_roll = SpyAlleyApplication::InjectionContainer
162
+ .resolve('results.execute_die_roll')
163
+ get_die_rolled_node = SpyAlleyApplication::InjectionContainer
164
+ .resolve('results.get.die_rolled_node')
165
+ process_passing_spaces = SpyAlleyApplication::InjectionContainer
166
+ .resolve('results.process_passing_spaces')
167
+ SpyAlleyApplication::Actions::RollDie::new(
168
+ execute_die_roll: execute_die_roll,
169
+ get_die_rolled_node: get_die_rolled_node,
170
+ process_passing_spaces: process_passing_spaces).method(:call)
171
+ end
172
+
173
+ register :use_move_card do
174
+ get_move_card_used_node = SpyAlleyApplication::InjectionContainer
175
+ .resolve('results.get.move_card_used_node')
176
+ move_card_used = SpyAlleyApplication::InjectionContainer
177
+ .resolve('game_board_effects.move_card_used')
178
+ process_passing_spaces =
179
+ SpyAlleyApplication::InjectionContainer.resolve('results.process_passing_spaces')
180
+ SpyAlleyApplication::Actions::UseMoveCard::new(
181
+ get_move_card_used_node: get_move_card_used_node,
182
+ move_card_used: move_card_used,
183
+ process_passing_spaces: process_passing_spaces).method(:call)
184
+ end
185
+ end
186
+
187
+ namespace :game_board_effects do
188
+ register :black_market_option_state do
189
+ SpyAlleyApplication::Models::GameBoard::BlackMarketOptionState::new(
190
+ next_game_state: resolve(:next_game_state)).method(:call)
191
+ end
192
+
193
+ register :buy_equipment_option_state do
194
+ SpyAlleyApplication::Models::GameBoard::BuyEquipmentOptionState::new(
195
+ next_game_state: resolve(:next_game_state)).method(:call)
196
+ end
197
+
198
+ register :buy_password_option_state do
199
+ SpyAlleyApplication::Models::GameBoard::BuyPasswordOptionState::new(
200
+ next_game_state: resolve(:next_game_state)).method(:call)
201
+ end
202
+
203
+ register :confiscate_materials_option_state do
204
+ SpyAlleyApplication::Models::GameBoard::ConfiscateMaterialsOptionState::new(
205
+ next_game_state: resolve(:next_game_state)).method(:call)
206
+ end
207
+
208
+ register :eliminate_player do
209
+ SpyAlleyApplication::Models::GameBoard::EliminatePlayer::new.method(:call)
210
+ end
211
+
212
+ register :equipment_bought do
213
+ SpyAlleyApplication::Models::GameBoard::EquipmentBought::new.method(:call)
214
+ end
215
+
216
+ register :equipment_confiscated do
217
+ SpyAlleyApplication::Models::GameBoard::EquipmentConfiscated::new.method(:call)
218
+ end
219
+
220
+ register :embassy_victory do
221
+ SpyAlleyApplication::Models::GameBoard::EmbassyVictory::new.method(:call)
222
+ end
223
+
224
+ register :free_gift_drawn do
225
+ SpyAlleyApplication::Models::GameBoard::FreeGiftDrawn::new.method(:call)
226
+ end
227
+
228
+ register :money_gained_or_lost do
229
+ SpyAlleyApplication::Models::GameBoard::MoneyGainedOrLost::new.method(:call)
230
+ end
231
+
232
+ register :move_card_drawn do
233
+ SpyAlleyApplication::Models::GameBoard::MoveCardDrawn::new.method(:call)
234
+ end
235
+
236
+ register :move_card_used do
237
+ SpyAlleyApplication::Models::GameBoard::MoveCardUsed::new.method(:call)
238
+ end
239
+
240
+ register :move_options do
241
+ SpyAlleyApplication::Models::GameBoard::MoveOptions::new.method(:call)
242
+ end
243
+
244
+ register :new_spy_identity_chosen do
245
+ SpyAlleyApplication::Models::GameBoard::NewSpyIdentityChosen::new.method(:call)
246
+ end
247
+
248
+ register :next_game_state do
249
+ SpyAlleyApplication::Models::GameBoard::NextGameState::new.method(:call)
250
+ end
251
+
252
+ register :player_moved do
253
+ SpyAlleyApplication::Models::GameBoard::PlayerMoved::new.method(:call)
254
+ end
255
+
256
+ register :spy_eliminator_options do
257
+ SpyAlleyApplication::Models::GameBoard::SpyEliminatorOptions::new(
258
+ next_game_state: resolve(:next_game_state)).method(:call)
259
+ end
260
+ end
261
+
262
+ namespace :new_game do
263
+ register :assign_seats do
264
+ SpyAlleyApplication::NewGame::AssignSeats::new
265
+ end
266
+
267
+ register :assign_spy_identities do
268
+ SpyAlleyApplication::NewGame::AssignSpyIdentities::new
269
+ end
270
+
271
+ register :validate_new_game do
272
+ SpyAlleyApplication::Validator::NewGame::new
273
+ end
274
+ end
275
+
276
+ namespace :results do
277
+ register :execute_die_roll do
278
+ ->{rand(6) + 1}
279
+ end
280
+
281
+ namespace :get do
282
+ register :buy_equipment_option_node do
283
+ ->(options:, limit:) do
284
+ SpyAlleyApplication::Results::Nodes::BuyEquipmentOptionNode::new(
285
+ options: options,
286
+ limit: limit)
287
+ end
288
+ end
289
+
290
+ register :choose_new_spy_identity_option_node do
291
+ ->(options:) do
292
+ SpyAlleyApplication::Results::Nodes::ChooseNewSpyIdentityOptionNode::new(
293
+ options: options)
294
+ end
295
+ end
296
+
297
+ register :confiscate_materials_option_node do
298
+ ->(target_player_id:, targetable_equipment:) do
299
+ SpyAlleyApplication::Results::Nodes::ConfiscateMaterialsOptionNode::new(
300
+ target_player_id: target_player_id,
301
+ targetable_equipment: targetable_equipment)
302
+ end
303
+ end
304
+
305
+ register :die_rolled_node do
306
+ ->(number_rolled:) do
307
+ SpyAlleyApplication::Results::Nodes::DieRolledNode::new(
308
+ number_rolled: number_rolled)
309
+ end
310
+ end
311
+
312
+ register :eliminated_player_node do
313
+ ->(eliminating_player:, eliminated_player:) do
314
+ SpyAlleyApplication::Results::Nodes::EliminatedPlayerNode::new(
315
+ eliminating_player: eliminating_player,
316
+ eliminated_player: eliminated_player)
317
+ end
318
+ end
319
+
320
+ register :equipment_gained_node do
321
+ ->(player_id:, equipment:, reason:) do
322
+ SpyAlleyApplication::Results::Nodes::EquipmentGainedNode::new(
323
+ player_id: player_id,
324
+ equipment: equipment,
325
+ reason: reason)
326
+ end
327
+ end
328
+
329
+ register :game_over_node do
330
+ ->(winning_player_id:, reason:) do
331
+ SpyAlleyApplication::Results::Nodes::GameOverNode::new(
332
+ winning_player_id: winning_player_id, reason: reason)
333
+ end
334
+ end
335
+
336
+ register :make_accusation_option_node do
337
+ ->(player_id_list:) do
338
+ SpyAlleyApplication::Results::Nodes::MakeAccusationOptionNode::new(
339
+ player_id_list: player_id_list)
340
+ end
341
+ end
342
+
343
+ register :money_gained_node do
344
+ ->(player_id:, money_gained:, reason:) do
345
+ SpyAlleyApplication::Results::Nodes::MoneyGainedNode::new(
346
+ player_id: player_id,
347
+ money_gained: money_gained,
348
+ reason: reason)
349
+ end
350
+ end
351
+
352
+ register :money_lost_node do
353
+ ->(player_id:, money_lost:, reason:) do
354
+ SpyAlleyApplication::Results::Nodes::MoneyLostNode::new(
355
+ player_id: player_id,
356
+ money_gained: money_gained,
357
+ reason: reason)
358
+ end
359
+ end
360
+
361
+ register :move_back_node do
362
+ ->(player_id:, player_moved:) do
363
+ SpyAlleyApplication::Results::Nodes::MoveBackNode::new(
364
+ player_id: player_id,
365
+ player_moved: player_moved)
366
+ end
367
+ end
368
+
369
+ register :move_card_drawn_node do
370
+ ->(player_id:, card:) do
371
+ SpyAlleyApplication::Results::Nodes::MoveCardDrawnNode::new(
372
+ player_id: player_id,
373
+ card: card)
374
+ end
375
+ end
376
+
377
+ register :move_card_used_node do
378
+ ->(player_id:, card:) do
379
+ SpyAlleyApplication::Results::Nodes::MoveCardUsedNode::new(
380
+ player_id: player_id,
381
+ card: card)
382
+ end
383
+ end
384
+
385
+ register :move_option_node do
386
+ ->(options:) do
387
+ SpyAlleyApplication::Results::Nodes::MoveOptionNode::new(
388
+ options: options)
389
+ end
390
+ end
391
+
392
+ register :new_spy_identity_chosen_node do
393
+ ->(nationality:) do
394
+ SpyAlleyApplication::Results::Nodes::NewSpyIdentityChosenNode::new(
395
+ nationality: nationality)
396
+ end
397
+ end
398
+
399
+ register :next_player_node do
400
+ ->(player_id:) do
401
+ SpyAlleyApplication::Results::Nodes::NextPlayerNode::new(player_id: player_id)
402
+ end
403
+ end
404
+
405
+ register :pass_option_node do
406
+ pass_option_node = SpyAlleyApplication::Results::Nodes::PassOptionNode::new
407
+ ->{pass_option_node}
408
+ end
409
+
410
+ register :player_movement_node do
411
+ ->(player_id:, space_id:) do
412
+ SpyAlleyApplication::Results::Nodes::PlayerMovementNode::new(
413
+ player_id: player_id,
414
+ space_id: space_id)
415
+ end
416
+ end
417
+
418
+ register :player_passed_node do
419
+ player_passed_node = SpyAlleyApplication::Results::Nodes::PlayerPassedNode::new
420
+ ->{player_passed_node}
421
+ end
422
+
423
+ register :result_game_board_node do
424
+ ->(game_board:) do
425
+ SpyAlleyApplication::Results::Nodes::ResultGameBoardNode::new(game_board: game_board)
426
+ end
427
+ end
428
+
429
+ register :roll_die_option_node do
430
+ roll_die = SpyAlleyApplication::Results::Nodes::RollDieOptionNode::new
431
+ ->{roll_die}
432
+ end
433
+
434
+ register :use_move_card_option_node do
435
+ ->(card_list:) do
436
+ SpyAlleyApplication::Results::Nodes::UseMoveCardOptionNode::new(card_list: card_list)
437
+ end
438
+ end
439
+
440
+ register :wild_card_gained_node do
441
+ ->(player_id:, number_gained:, reason:) do
442
+ SpyAlleyApplication::Results::Nodes::WildCardGainedNode::new(
443
+ player_id: player_id,
444
+ number_gained: number_gained,
445
+ reason: reason)
446
+ end
447
+ end
448
+ end
449
+
450
+ register :process_buy_equipment_options do
451
+ SpyAlleyApplication::Results::ProcessBuyEquipmentOptions::new(
452
+ get_buy_equipment_option_node: resolve('get.buy_equipment_option_node'),
453
+ get_next_player_node: resolve('get.next_player_node'),
454
+ get_pass_option_node: resolve('get.pass_option_node')).method(:call)
455
+ end
456
+
457
+ register :process_eliminating_player do
458
+ eliminate_player = SpyAlleyApplication::InjectionContainer
459
+ .resolve('game_board_effects.eliminate_player')
460
+ SpyAlleyApplication::Results::ProcessEliminatingPlayer::new(
461
+ get_eliminated_player_node: resolve('get.eliminated_player_node'),
462
+ get_game_over_node: resolve('get.game_over_node'),
463
+ get_result_game_board_node: resolve('get.result_game_board_node'),
464
+ eliminate_player: eliminate_player,
465
+ process_next_turn_options: resolve(:process_next_turn_options)).method(:call)
466
+ end
467
+
468
+ register :process_landing_on_space do
469
+ black_market_option_state = SpyAlleyApplication::InjectionContainer
470
+ .resolve('game_board_effects.black_market_option_state')
471
+ buy_equipment_option_state = SpyAlleyApplication::InjectionContainer
472
+ .resolve('game_board_effects.buy_equipment_option_state')
473
+ buy_password_option_state = SpyAlleyApplication::InjectionContainer
474
+ .resolve('game_board_effects.buy_password_option_state')
475
+ confiscate_materials_option_state = SpyAlleyApplication::InjectionContainer
476
+ .resolve('game_board_effects.confiscate_materials_option_state')
477
+ embassy_victory = SpyAlleyApplication::InjectionContainer
478
+ .resolve('game_board_effects.embassy_victory')
479
+ free_gift_drawn = SpyAlleyApplication::InjectionContainer
480
+ .resolve('game_board_effects.free_gift_drawn')
481
+ money_gained_or_lost = SpyAlleyApplication::InjectionContainer
482
+ .resolve('game_board_effects.money_gained_or_lost')
483
+ move_card_drawn = SpyAlleyApplication::InjectionContainer
484
+ .resolve('game_board_effects.move_card_drawn')
485
+ next_game_state = SpyAlleyApplication::InjectionContainer
486
+ .resolve('game_board_effects.next_game_state')
487
+ player_moved = SpyAlleyApplication::InjectionContainer
488
+ .resolve('game_board_effects.player_moved')
489
+ spy_eliminator_options = SpyAlleyApplication::InjectionContainer
490
+ .resolve('game_board_effects.spy_eliminator_options')
491
+ SpyAlleyApplication::Results::ProcessLandingOnSpace::new(
492
+ black_market_option_state: black_market_option_state,
493
+ buy_equipment_option_state: buy_equipment_option_state,
494
+ buy_password_option_state: buy_password_option_state,
495
+ confiscate_materials_option_state: confiscate_materials_option_state,
496
+ embassy_victory: embassy_victory,
497
+ free_gift_drawn: free_gift_drawn,
498
+ get_equipment_gained_node: resolve('get.equipment_gained_node'),
499
+ get_game_over_node: resolve('get.game_over_node'),
500
+ get_money_gained_node: resolve('get.money_gained_node'),
501
+ get_money_lost_node: resolve('get.money_lost_node'),
502
+ get_move_card_drawn_node: resolve('get.move_card_drawn_node'),
503
+ get_player_movement_node: resolve('get.player_movement_node'),
504
+ get_result_game_board_node: resolve('get.result_game_board_node'),
505
+ get_wild_card_gained_node: resolve('get.wild_card_gained_node'),
506
+ money_gained_or_lost: money_gained_or_lost,
507
+ move_card_drawn: move_card_drawn,
508
+ next_game_state: next_game_state,
509
+ player_moved: player_moved,
510
+ process_next_turn_options: resolve(:process_next_turn_options),
511
+ process_proceeding_to_next_state: resolve(:process_proceeding_to_next_state),
512
+ spy_eliminator_options: spy_eliminator_options).method(:call)
513
+ end
514
+
515
+ register :process_move_options do
516
+ move_options = SpyAlleyApplication::InjectionContainer
517
+ .resolve('game_board_effects.move_options')
518
+ SpyAlleyApplication::Results::ProcessMoveOptions::new(
519
+ move_options: move_options,
520
+ process_landing_on_space: resolve(:process_landing_on_space),
521
+ process_next_turn_options: resolve(:process_next_turn_options)).method(:call)
522
+ end
523
+
524
+ register :process_next_turn_options do
525
+ choose_new_spy_identity_option_node = resolve('get.choose_new_spy_identity_option_node')
526
+ SpyAlleyApplication::Results::ProcessNextTurnOptions::new(
527
+ get_buy_equipment_option_node: resolve('get.buy_equipment_option_node'),
528
+ get_choose_new_spy_identity_option_node: choose_new_spy_identity_option_node,
529
+ get_confiscate_materials_option_node: resolve('get.confiscate_materials_option_node'),
530
+ get_make_accusation_option_node: resolve('get.make_accusation_option_node'),
531
+ get_next_player_node: resolve('get.next_player_node'),
532
+ get_move_option_node: resolve('get.move_option_node'),
533
+ get_pass_option_node: resolve('get.pass_option_node'),
534
+ get_roll_die_option_node: resolve('get.roll_die_option_node'),
535
+ get_use_move_card_option_node: resolve('get.use_move_card_option_node')).method(:call)
536
+ end
537
+
538
+ register :process_passing_spaces do
539
+ money_gained_or_lost = SpyAlleyApplication::InjectionContainer
540
+ .resolve('game_board_effects.money_gained_or_lost')
541
+ SpyAlleyApplication::Results::ProcessPassingSpaces::new(
542
+ get_money_gained_node: resolve('get.money_gained_node'),
543
+ money_gained_or_lost: money_gained_or_lost,
544
+ process_landing_on_space: resolve(:process_landing_on_space),
545
+ process_move_options: resolve(:process_move_options)).method(:call)
546
+ end
547
+
548
+ register :process_proceeding_to_next_state do
549
+ next_game_state = SpyAlleyApplication::InjectionContainer
550
+ .resolve('game_board_effects.next_game_state')
551
+ SpyAlleyApplication::Results::ProcessProceedingToNextState::new(
552
+ get_result_game_board_node: resolve('get.result_game_board_node'),
553
+ next_game_state: next_game_state,
554
+ process_next_turn_options: resolve(:process_next_turn_options)).method(:call)
555
+ end
556
+ end
557
+
558
+ register :build_new_game_validator do
559
+ SpyAlleyApplication::Validator::NewGameBuilder::new(
560
+ assign_seats: resolve('new_game.assign_seats'),
561
+ assign_spy_identities: resolve('new_game.assign_spy_identities'),
562
+ generate_new_game: resolve('actions.generate_new_game'),
563
+ validate_new_game: resolve('new_game.validate_new_game'))
564
+ end
565
+
566
+ register :build_validator do
567
+ SpyAlleyApplication::Validator::Builder::new(
568
+ process_next_turn_options: resolve('results.process_next_turn_options'),
569
+ change_orders_initializer: resolve(:change_orders_initializer),
570
+ wrap_result: resolve(:wrap_result))
571
+ end
572
+
573
+ register :wrap_result do
574
+ dc = SpyAlleyApplication::InjectionContainer
575
+ wrap_result = ->(execute) do
576
+ ->(successful_result) do
577
+ GameValidator::Validator::Result::new(
578
+ result: successful_result,
579
+ execute: execute)
580
+ end
581
+ end
582
+
583
+ {
584
+ buy_equipment: wrap_result.(dc.resolve('actions.buy_equipment')),
585
+ choose_new_spy_identity: wrap_result.(dc.resolve('actions.choose_new_spy_identity')),
586
+ confiscate_materials: wrap_result.(dc.resolve('actions.confiscate_materials')),
587
+ make_accusation: wrap_result.(dc.resolve('actions.make_accusation')),
588
+ move: wrap_result.(dc.resolve('actions.choose_space_to_move')),
589
+ pass: wrap_result.(dc.resolve('actions.pass')),
590
+ roll_die: wrap_result.(dc.resolve('actions.roll_die')),
591
+ use_move_card: wrap_result.(dc.resolve('actions.use_move_card'))
592
+ }
593
+ end
594
+ end
595
+ end
596
+