spy_alley_application 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/.rspec +3 -0
- data/.travis.yml +7 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +92 -0
- data/LICENSE.txt +21 -0
- data/README.md +39 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/spy_alley_application.rb +6 -0
- data/lib/spy_alley_application/actions/buy_equipment.rb +31 -0
- data/lib/spy_alley_application/actions/choose_new_spy_identity.rb +26 -0
- data/lib/spy_alley_application/actions/choose_space_to_move.rb +21 -0
- data/lib/spy_alley_application/actions/confiscate_materials.rb +58 -0
- data/lib/spy_alley_application/actions/generate_new_game.rb +70 -0
- data/lib/spy_alley_application/actions/make_accusation.rb +40 -0
- data/lib/spy_alley_application/actions/pass.rb +21 -0
- data/lib/spy_alley_application/actions/roll_die.rb +25 -0
- data/lib/spy_alley_application/actions/use_move_card.rb +28 -0
- data/lib/spy_alley_application/execute_action.rb +20 -0
- data/lib/spy_alley_application/injection_container.rb +596 -0
- data/lib/spy_alley_application/models/acquisition_method/by_confiscation.rb +22 -0
- data/lib/spy_alley_application/models/acquisition_method/by_free_gift.rb +20 -0
- data/lib/spy_alley_application/models/acquisition_method/by_passing_start.rb +20 -0
- data/lib/spy_alley_application/models/acquisition_method/by_purchase.rb +21 -0
- data/lib/spy_alley_application/models/acquisition_method/by_selling_top_secret_information.rb +21 -0
- data/lib/spy_alley_application/models/board_spaces/black_market.rb +24 -0
- data/lib/spy_alley_application/models/board_spaces/border_crossing.rb +24 -0
- data/lib/spy_alley_application/models/board_spaces/buy_equipment.rb +26 -0
- data/lib/spy_alley_application/models/board_spaces/buy_password.rb +26 -0
- data/lib/spy_alley_application/models/board_spaces/confiscate_materials.rb +24 -0
- data/lib/spy_alley_application/models/board_spaces/draw_free_gift.rb +24 -0
- data/lib/spy_alley_application/models/board_spaces/draw_move_card.rb +24 -0
- data/lib/spy_alley_application/models/board_spaces/embassy.rb +26 -0
- data/lib/spy_alley_application/models/board_spaces/move_back.rb +25 -0
- data/lib/spy_alley_application/models/board_spaces/sold_top_secret_information.rb +27 -0
- data/lib/spy_alley_application/models/board_spaces/spy_alley_entrance.rb +38 -0
- data/lib/spy_alley_application/models/board_spaces/spy_eliminator.rb +24 -0
- data/lib/spy_alley_application/models/board_spaces/start.rb +36 -0
- data/lib/spy_alley_application/models/board_spaces/take_another_turn.rb +24 -0
- data/lib/spy_alley_application/models/equipment.rb +42 -0
- data/lib/spy_alley_application/models/game_board.rb +23 -0
- data/lib/spy_alley_application/models/game_board/black_market_option_state.rb +59 -0
- data/lib/spy_alley_application/models/game_board/buy_equipment_option_state.rb +52 -0
- data/lib/spy_alley_application/models/game_board/buy_password_option_state.rb +39 -0
- data/lib/spy_alley_application/models/game_board/confiscate_materials_option_state.rb +68 -0
- data/lib/spy_alley_application/models/game_board/eliminate_player.rb +91 -0
- data/lib/spy_alley_application/models/game_board/embassy_victory.rb +23 -0
- data/lib/spy_alley_application/models/game_board/equipment_bought.rb +42 -0
- data/lib/spy_alley_application/models/game_board/equipment_confiscated.rb +67 -0
- data/lib/spy_alley_application/models/game_board/free_gift_drawn.rb +39 -0
- data/lib/spy_alley_application/models/game_board/money_gained_or_lost.rb +22 -0
- data/lib/spy_alley_application/models/game_board/move_card_drawn.rb +31 -0
- data/lib/spy_alley_application/models/game_board/move_card_used.rb +30 -0
- data/lib/spy_alley_application/models/game_board/move_options.rb +23 -0
- data/lib/spy_alley_application/models/game_board/new_spy_identity_chosen.rb +37 -0
- data/lib/spy_alley_application/models/game_board/next_game_state.rb +70 -0
- data/lib/spy_alley_application/models/game_board/player_moved.rb +24 -0
- data/lib/spy_alley_application/models/game_board/spy_eliminator_options.rb +41 -0
- data/lib/spy_alley_application/models/game_state/buy_equipment.rb +26 -0
- data/lib/spy_alley_application/models/game_state/choose_new_spy_identity.rb +29 -0
- data/lib/spy_alley_application/models/game_state/confiscate_materials.rb +29 -0
- data/lib/spy_alley_application/models/game_state/game_over.rb +27 -0
- data/lib/spy_alley_application/models/game_state/move_option.rb +25 -0
- data/lib/spy_alley_application/models/game_state/spy_eliminator.rb +25 -0
- data/lib/spy_alley_application/models/game_state/start_of_turn.rb +23 -0
- data/lib/spy_alley_application/models/game_state/victory_reason/by_elimination.rb +22 -0
- data/lib/spy_alley_application/models/game_state/victory_reason/by_embassy.rb +22 -0
- data/lib/spy_alley_application/models/move_card.rb +26 -0
- data/lib/spy_alley_application/models/player.rb +37 -0
- data/lib/spy_alley_application/models/sell_top_secret_information.rb +24 -0
- data/lib/spy_alley_application/models/validator/buying_equipment.rb +35 -0
- data/lib/spy_alley_application/models/validator/choosing_new_spy_identity.rb +33 -0
- data/lib/spy_alley_application/models/validator/confiscating_materials.rb +50 -0
- data/lib/spy_alley_application/models/validator/making_accusation.rb +31 -0
- data/lib/spy_alley_application/models/validator/moving.rb +30 -0
- data/lib/spy_alley_application/models/validator/passing.rb +24 -0
- data/lib/spy_alley_application/models/validator/rolling_die.rb +29 -0
- data/lib/spy_alley_application/models/validator/using_move_card.rb +31 -0
- data/lib/spy_alley_application/models/wild_card.rb +25 -0
- data/lib/spy_alley_application/new_game.rb +18 -0
- data/lib/spy_alley_application/new_game/assign_seats.rb +21 -0
- data/lib/spy_alley_application/new_game/assign_spy_identities.rb +24 -0
- data/lib/spy_alley_application/results/nodes/buy_equipment_option_node.rb +23 -0
- data/lib/spy_alley_application/results/nodes/choose_new_spy_identity_option_node.rb +23 -0
- data/lib/spy_alley_application/results/nodes/confiscate_materials_option_node.rb +22 -0
- data/lib/spy_alley_application/results/nodes/die_rolled_node.rb +21 -0
- data/lib/spy_alley_application/results/nodes/eliminated_player_node.rb +22 -0
- data/lib/spy_alley_application/results/nodes/equipment_gained_node.rb +28 -0
- data/lib/spy_alley_application/results/nodes/game_over_node.rb +24 -0
- data/lib/spy_alley_application/results/nodes/make_accusation_option_node.rb +20 -0
- data/lib/spy_alley_application/results/nodes/money_gained_node.rb +25 -0
- data/lib/spy_alley_application/results/nodes/money_lost_node.rb +21 -0
- data/lib/spy_alley_application/results/nodes/move_back_node.rb +21 -0
- data/lib/spy_alley_application/results/nodes/move_card_drawn_node.rb +22 -0
- data/lib/spy_alley_application/results/nodes/move_card_used_node.rb +22 -0
- data/lib/spy_alley_application/results/nodes/move_option_node.rb +20 -0
- data/lib/spy_alley_application/results/nodes/new_spy_identity_chosen_node.rb +21 -0
- data/lib/spy_alley_application/results/nodes/next_player_node.rb +20 -0
- data/lib/spy_alley_application/results/nodes/pass_option_node.rb +16 -0
- data/lib/spy_alley_application/results/nodes/player_movement_node.rb +21 -0
- data/lib/spy_alley_application/results/nodes/player_passed_node.rb +19 -0
- data/lib/spy_alley_application/results/nodes/reached_embassy_with_all_equipment_node.rb +20 -0
- data/lib/spy_alley_application/results/nodes/result_game_board_node.rb +21 -0
- data/lib/spy_alley_application/results/nodes/roll_die_option_node.rb +16 -0
- data/lib/spy_alley_application/results/nodes/use_move_card_option_node.rb +20 -0
- data/lib/spy_alley_application/results/nodes/wild_card_gained_node.rb +27 -0
- data/lib/spy_alley_application/results/process_buy_equipment_options.rb +25 -0
- data/lib/spy_alley_application/results/process_eliminating_player.rb +36 -0
- data/lib/spy_alley_application/results/process_landing_on_space.rb +232 -0
- data/lib/spy_alley_application/results/process_move_options.rb +65 -0
- data/lib/spy_alley_application/results/process_next_turn_options.rb +87 -0
- data/lib/spy_alley_application/results/process_passing_spaces.rb +68 -0
- data/lib/spy_alley_application/results/process_proceeding_to_next_state.rb +23 -0
- data/lib/spy_alley_application/types/array_of_equipment.rb +7 -0
- data/lib/spy_alley_application/types/array_of_free_gifts.rb +7 -0
- data/lib/spy_alley_application/types/array_of_move_cards.rb +6 -0
- data/lib/spy_alley_application/types/array_of_players.rb +6 -0
- data/lib/spy_alley_application/types/board_space.rb +4 -0
- data/lib/spy_alley_application/types/coercible_integer_one_to_six.rb +9 -0
- data/lib/spy_alley_application/types/equipment.rb +32 -0
- data/lib/spy_alley_application/types/equipment_type.rb +9 -0
- data/lib/spy_alley_application/types/free_gift.rb +22 -0
- data/lib/spy_alley_application/types/game_board.rb +52 -0
- data/lib/spy_alley_application/types/game_state.rb +19 -0
- data/lib/spy_alley_application/types/move_card.rb +21 -0
- data/lib/spy_alley_application/types/nationality.rb +5 -0
- data/lib/spy_alley_application/types/player.rb +123 -0
- data/lib/spy_alley_application/types/validation_builder.rb +21 -0
- data/lib/spy_alley_application/types/validator/non_admin.rb +21 -0
- data/lib/spy_alley_application/types/wild_card.rb +14 -0
- data/lib/spy_alley_application/validator/builder.rb +119 -0
- data/lib/spy_alley_application/validator/buy_equipment.rb +39 -0
- data/lib/spy_alley_application/validator/choose_new_spy_identity.rb +24 -0
- data/lib/spy_alley_application/validator/confiscate_materials.rb +22 -0
- data/lib/spy_alley_application/validator/confiscate_materials/full_validator.rb +39 -0
- data/lib/spy_alley_application/validator/confiscate_materials/validate_target_player_id.rb +24 -0
- data/lib/spy_alley_application/validator/make_accusation.rb +24 -0
- data/lib/spy_alley_application/validator/move.rb +24 -0
- data/lib/spy_alley_application/validator/new_game.rb +35 -0
- data/lib/spy_alley_application/validator/new_game_builder.rb +32 -0
- data/lib/spy_alley_application/validator/no_options.rb +7 -0
- data/lib/spy_alley_application/validator/use_move_card.rb +23 -0
- data/lib/spy_alley_application/version.rb +3 -0
- data/spy_alley_application.gemspec +40 -0
- metadata +343 -0
@@ -0,0 +1,123 @@
|
|
1
|
+
# frozen string_literal: true
|
2
|
+
|
3
|
+
require 'dry-initializer'
|
4
|
+
require 'spy_alley_application/models/player'
|
5
|
+
require 'spy_alley_application/models/board_spaces/black_market'
|
6
|
+
require 'spy_alley_application/models/board_spaces/border_crossing'
|
7
|
+
require 'spy_alley_application/models/board_spaces/buy_equipment'
|
8
|
+
require 'spy_alley_application/models/board_spaces/buy_password'
|
9
|
+
require 'spy_alley_application/models/board_spaces/confiscate_materials'
|
10
|
+
require 'spy_alley_application/models/board_spaces/draw_free_gift'
|
11
|
+
require 'spy_alley_application/models/board_spaces/draw_move_card'
|
12
|
+
require 'spy_alley_application/models/board_spaces/embassy'
|
13
|
+
require 'spy_alley_application/models/board_spaces/move_back'
|
14
|
+
require 'spy_alley_application/models/board_spaces/sold_top_secret_information'
|
15
|
+
require 'spy_alley_application/models/board_spaces/spy_alley_entrance'
|
16
|
+
require 'spy_alley_application/models/board_spaces/spy_eliminator'
|
17
|
+
require 'spy_alley_application/models/board_spaces/start'
|
18
|
+
require 'spy_alley_application/models/board_spaces/take_another_turn'
|
19
|
+
|
20
|
+
start_space = SpyAlleyApplication::Models::BoardSpaces::Start::new(id: 0) do |start_space|
|
21
|
+
junction_space = SpyAlleyApplication::Models::BoardSpaces::DrawMoveCard::new(id: 22,
|
22
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::BlackMarket::new(id: 23,
|
23
|
+
next_space: start_space))
|
24
|
+
|
25
|
+
spy_alley_entrance = SpyAlleyApplication::Models::BoardSpaces::SpyAlleyEntrance::new(id: 14,
|
26
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::SoldTopSecretInformation::new(id: 24,
|
27
|
+
in_spy_alley: true,
|
28
|
+
money_gained: 20,
|
29
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::SpyEliminator::new(id: 25,
|
30
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::Embassy::new(id: 26,
|
31
|
+
nationality: 'french',
|
32
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::Embassy::new(id: 27,
|
33
|
+
nationality: 'german',
|
34
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::ConfiscateMaterials::new(id: 28,
|
35
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::Embassy::new(id: 29,
|
36
|
+
nationality: 'spanish',
|
37
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::Embassy::new(id: 30,
|
38
|
+
nationality: 'italian',
|
39
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::Embassy::new(id: 31,
|
40
|
+
nationality: 'american',
|
41
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::Embassy::new(id: 32,
|
42
|
+
nationality: 'russian',
|
43
|
+
next_space: junction_space)))))))))) do |spy_alley_entrance|
|
44
|
+
SpyAlleyApplication::Models::BoardSpaces::BorderCrossing::new(id: 15,
|
45
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::MoveBack::new(id: 16,
|
46
|
+
move_back_space: spy_alley_entrance,
|
47
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::BuyPassword::new(id: 17,
|
48
|
+
nationality: 'german',
|
49
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::BuyEquipment::new(id: 18,
|
50
|
+
equipment_type: 'codebook',
|
51
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::DrawMoveCard::new(id: 19,
|
52
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::DrawFreeGift::new(id: 20,
|
53
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::BuyPassword::new(id: 21,
|
54
|
+
nationality: 'french',
|
55
|
+
next_space: junction_space)))))))
|
56
|
+
end
|
57
|
+
|
58
|
+
SpyAlleyApplication::Models::BoardSpaces::BuyPassword::new(id: 1, nationality: 'russian',
|
59
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::DrawMoveCard::new(id: 2,
|
60
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::BuyEquipment::new(id: 3,
|
61
|
+
equipment_type: 'disguise',
|
62
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::BuyPassword::new(id: 4,
|
63
|
+
nationality: 'american',
|
64
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::DrawMoveCard::new(id: 5,
|
65
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::TakeAnotherTurn::new(id: 6,
|
66
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::DrawFreeGift::new(id: 7,
|
67
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::SoldTopSecretInformation::new(id: 8,
|
68
|
+
in_spy_alley: false,
|
69
|
+
money_gained: 10,
|
70
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::BuyPassword::new(id: 9,
|
71
|
+
nationality: 'italian',
|
72
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::BuyEquipment::new(id: 10,
|
73
|
+
equipment_type: 'key',
|
74
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::BuyPassword::new(id: 11,
|
75
|
+
nationality: 'spanish',
|
76
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::DrawMoveCard::new(id: 12,
|
77
|
+
next_space: SpyAlleyApplication::Models::BoardSpaces::BlackMarket::new(id: 13,
|
78
|
+
next_space: spy_alley_entrance)))))))))))))
|
79
|
+
end
|
80
|
+
spaces = [start_space]
|
81
|
+
(0..13).to_a.each do |i|
|
82
|
+
spaces.push(spaces.last.next_space)
|
83
|
+
end
|
84
|
+
spaces.push(spaces.last.branch_space)
|
85
|
+
(15..22).to_a.each do |i|
|
86
|
+
spaces.push(spaces.last.next_space)
|
87
|
+
end
|
88
|
+
spaces.push(spaces[14].next_space)
|
89
|
+
(24..31).to_a.each do |i|
|
90
|
+
spaces.push(spaces.last.next_space)
|
91
|
+
end
|
92
|
+
|
93
|
+
loc_type = Dry::Struct(id: Types::Coercible::Integer)
|
94
|
+
|
95
|
+
i = Class::new do
|
96
|
+
include Dry::Initializer.define -> do
|
97
|
+
param :game_board_spaces, type: ::Types::Array::of(SpyAlleyApplication::Types::BoardSpace)
|
98
|
+
param :location_type, type: ::Types::Callable
|
99
|
+
end
|
100
|
+
|
101
|
+
def call(player)
|
102
|
+
player[:location] = game_board_spaces[location_type.(player[:location]).id]
|
103
|
+
player = player.map{|k, v| [k.eql?(:active?) ? :active : k, v]}.to_h
|
104
|
+
player = SpyAlleyApplication::Models::Player.(player)
|
105
|
+
all_equipment_distinct(player, player.equipment)
|
106
|
+
player
|
107
|
+
end
|
108
|
+
|
109
|
+
private
|
110
|
+
def all_equipment_distinct(player, equipment)
|
111
|
+
equipment_list = []
|
112
|
+
equipment.each do |equip|
|
113
|
+
equip_name = "#{equip.nationality} #{equip.type}"
|
114
|
+
if equipment_list.include?(equip_name)
|
115
|
+
raise Dry::Types::ConstraintError::new(
|
116
|
+
'All equipment for player is distinct', "player: #{player}, equipment: #{equipment}")
|
117
|
+
end
|
118
|
+
equipment_list.push equip_name
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end.new(spaces, loc_type)
|
122
|
+
SpyAlleyApplication::Types::Player = ::Types::Constructor(Class){|value| i.call(value)}
|
123
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen string_literal: true
|
2
|
+
|
3
|
+
require 'spy_alley_application/models/validator/buying_equipment'
|
4
|
+
require 'spy_alley_application/models/validator/choosing_new_spy_identity'
|
5
|
+
require 'spy_alley_application/models/validator/confiscating_materials'
|
6
|
+
require 'spy_alley_application/models/validator/making_accusation'
|
7
|
+
require 'spy_alley_application/models/validator/moving'
|
8
|
+
require 'spy_alley_application/models/validator/passing'
|
9
|
+
require 'spy_alley_application/models/validator/rolling_die'
|
10
|
+
require 'spy_alley_application/models/validator/using_move_card'
|
11
|
+
|
12
|
+
SpyAlleyApplication::Types::ValidationBuilder =
|
13
|
+
SpyAlleyApplication::Models::Validator::BuyingEquipment |
|
14
|
+
SpyAlleyApplication::Models::Validator::ChoosingNewSpyIdentity |
|
15
|
+
SpyAlleyApplication::Models::Validator::ConfiscatingMaterials |
|
16
|
+
SpyAlleyApplication::Models::Validator::MakingAccusation |
|
17
|
+
SpyAlleyApplication::Models::Validator::Moving |
|
18
|
+
SpyAlleyApplication::Models::Validator::Passing |
|
19
|
+
SpyAlleyApplication::Models::Validator::RollingDie |
|
20
|
+
SpyAlleyApplication::Models::Validator::UsingMoveCard
|
21
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spy_alley_application/types/validator/buy_equipment'
|
4
|
+
require 'spy_alley_application/types/validator/choose_new_spy_identity'
|
5
|
+
require 'spy_alley_application/types/validator/confiscate_materials'
|
6
|
+
require 'spy_alley_application/types/validator/make_accusation'
|
7
|
+
require 'spy_alley_application/types/validator/move'
|
8
|
+
require 'spy_alley-application/types/validator/pass'
|
9
|
+
require 'spy_alley_application/types/validator/roll_die'
|
10
|
+
require 'spy_alley_application/types/validator/use_move_card'
|
11
|
+
|
12
|
+
SpyAlleyApplication::Types::Validator::NonAdmin =
|
13
|
+
SpyAlleyApplication::Types::Validator::BuyEquipment |
|
14
|
+
SpyAlleyApplication::Types::Validator::ChooseNewSpyIdentity |
|
15
|
+
SpyAlleyApplicaiton::Types::Validator::ConfiscateMaterials |
|
16
|
+
SpyAlleyApplication::Types::Validator::MakeAccusation |
|
17
|
+
SpyAlleyApplication::Types::Validator::Move |
|
18
|
+
SpyAlleyApplication::Types::Validator::Pass |
|
19
|
+
SpyAlleyApplication::Types::Validator::RollDie |
|
20
|
+
SpyalleyApplication::Types::Validator::UseMoveCard
|
21
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen string_literal: true
|
2
|
+
|
3
|
+
require 'dry-types'
|
4
|
+
require 'spy_alley_application/models/wild_card'
|
5
|
+
|
6
|
+
wild_card_enum = Types::String.enum('wild card')
|
7
|
+
wild_card = SpyAlleyApplication::Models::WildCard::new
|
8
|
+
|
9
|
+
SpyAlleyApplication::Types::WildCard =
|
10
|
+
Types::Constructor(SpyAlleyApplication::Models::WildCard) do |value|
|
11
|
+
wild_card_enum.call(value)
|
12
|
+
wild_card
|
13
|
+
end
|
14
|
+
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# frozen string literal: true
|
2
|
+
|
3
|
+
require 'dry-initializer'
|
4
|
+
require 'spy_alley_application/types/validation_builder'
|
5
|
+
|
6
|
+
module SpyAlleyApplication
|
7
|
+
module Validator
|
8
|
+
class Builder
|
9
|
+
include Dry::Initializer.define -> do
|
10
|
+
option :process_next_turn_options, type: ::Types::Callable, reader: :private
|
11
|
+
option :change_orders_initializer, type: ::Types::Callable, reader: :private
|
12
|
+
option :wrap_result, type: ::Types::Hash
|
13
|
+
end
|
14
|
+
|
15
|
+
def call(game_board:, last_action_id:)
|
16
|
+
current_player = game_board.current_player
|
17
|
+
change_orders = change_orders_initializer.()
|
18
|
+
options = {}
|
19
|
+
change_orders = process_next_turn_options.(
|
20
|
+
game_board: game_board,
|
21
|
+
change_orders: change_orders)
|
22
|
+
|
23
|
+
change_orders.changes.each do |option_node|
|
24
|
+
options = option_node.accept(self, options: options)
|
25
|
+
end
|
26
|
+
|
27
|
+
next_player_id = options[:next_player_id]
|
28
|
+
options = options.reject{|k, v| k.eql?(:next_player_id)}
|
29
|
+
|
30
|
+
validate_player_action_and_user = GameValidator::Validator::Base::new(
|
31
|
+
legal_options: options.values.map{|o| o[:name]},
|
32
|
+
current_player_id: next_player_id,
|
33
|
+
last_action_id: last_action_id)
|
34
|
+
|
35
|
+
fv = {}
|
36
|
+
options.each do |k, v|
|
37
|
+
builder = SpyAlleyApplication::Types::ValidationBuilder.call(v)
|
38
|
+
fv[[v[:name], true]] = builder.build(admin?: true)
|
39
|
+
fv[[v[:name], false]] = builder.build(admin?: false)
|
40
|
+
end
|
41
|
+
|
42
|
+
GameValidator::Validator::new(
|
43
|
+
validate_player_action_and_user: validate_player_action_and_user,
|
44
|
+
full_validator_for: fv)
|
45
|
+
end
|
46
|
+
|
47
|
+
def handle_buy_equipment_option(option_node, options:)
|
48
|
+
options[:buy_equipment] = {
|
49
|
+
name: 'buy_equipment',
|
50
|
+
options: option_node.options,
|
51
|
+
limit: option_node.limit,
|
52
|
+
wrap_result: wrap_result[:buy_equipment]}
|
53
|
+
options
|
54
|
+
end
|
55
|
+
|
56
|
+
def handle_choose_new_spy_identity_option(option_node, options:)
|
57
|
+
options[:choose_new_spy_identity] = {
|
58
|
+
name: 'choose_new_spy_identity',
|
59
|
+
options: option_node.options,
|
60
|
+
wrap_result: wrap_result[:choose_new_spy_identity]}
|
61
|
+
options
|
62
|
+
end
|
63
|
+
|
64
|
+
def handle_confiscate_materials_option(option_node, options:)
|
65
|
+
options[:confiscate_materials] ||= {
|
66
|
+
name: 'confiscate_materials',
|
67
|
+
wrap_result: wrap_result[:confiscate_materials]}
|
68
|
+
options[:confiscate_materials][:target_player] = {
|
69
|
+
target_player_id: option_node.target_player_id,
|
70
|
+
targetable_equipment: option_node.targetable_equipment}
|
71
|
+
options
|
72
|
+
end
|
73
|
+
|
74
|
+
def handle_make_accusation_option(option_node, options:)
|
75
|
+
options[:make_accusation] = {
|
76
|
+
name: 'make_accusation',
|
77
|
+
player_id_list: option_node.player_id_list,
|
78
|
+
wrap_result: wrap_result[:make_accusation]}
|
79
|
+
options
|
80
|
+
end
|
81
|
+
|
82
|
+
def handle_move_option(option_node, options:)
|
83
|
+
options[:move] = {
|
84
|
+
name: 'move',
|
85
|
+
options: option_node.options,
|
86
|
+
wrap_result: wrap_result[:move]}
|
87
|
+
options
|
88
|
+
end
|
89
|
+
|
90
|
+
def handle_next_player(option_node, options:)
|
91
|
+
options[:next_player_id] = option_node.player_id
|
92
|
+
options
|
93
|
+
end
|
94
|
+
|
95
|
+
def handle_pass_option(option_node, options:)
|
96
|
+
options[:pass] = {
|
97
|
+
name: 'pass',
|
98
|
+
wrap_result: wrap_result[:pass]}
|
99
|
+
options
|
100
|
+
end
|
101
|
+
|
102
|
+
def handle_roll_die_option(option_node, options:)
|
103
|
+
options[:roll_die] = {
|
104
|
+
name: 'roll_die',
|
105
|
+
wrap_result: wrap_result[:roll_die]}
|
106
|
+
options
|
107
|
+
end
|
108
|
+
|
109
|
+
def handle_use_move_card(option_node, options:)
|
110
|
+
options[:use_move_card] = {
|
111
|
+
name: 'use_move_card',
|
112
|
+
card_list: option_node.card_list,
|
113
|
+
wrap_result: wrap_result[:use_move_card]}
|
114
|
+
options
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen string literal: true
|
2
|
+
|
3
|
+
require 'dry-validation'
|
4
|
+
require 'spy_alley_application/types/array_of_equipment'
|
5
|
+
require 'spy_alley_application/types/coercible_integer_one_to_six'
|
6
|
+
|
7
|
+
module SpyAlleyApplication
|
8
|
+
module Validator
|
9
|
+
class BuyEquipment < Dry::Validation::Contract
|
10
|
+
t = SpyAlleyApplication::Types
|
11
|
+
@@equipment_regex =
|
12
|
+
/\A(#{t::Nationality.values.join('|')}) (#{t::EquipmentType.values.join('|')})\z/
|
13
|
+
|
14
|
+
option :options, type: SpyAlleyApplication::Types::ArrayOfEquipment
|
15
|
+
option :limit, type: SpyAlleyApplication::Types::CoercibleIntegerOneToSix
|
16
|
+
|
17
|
+
params do
|
18
|
+
required(:equipment_to_buy)
|
19
|
+
.filled(::Types::Array::of(::Types::String.constrained(format: @@equipment_regex)))
|
20
|
+
end
|
21
|
+
|
22
|
+
rule(:equipment_to_buy) do
|
23
|
+
opts = options.map(&:to_s)
|
24
|
+
if !values[:equipment_to_buy].all?{|e| opts.include?(e)}
|
25
|
+
key.failure({text: "non allowable equipment is included", status: 422})
|
26
|
+
end
|
27
|
+
|
28
|
+
if !values[:equipment_to_buy].uniq.size.eql?(values[:equipment_to_buy].size)
|
29
|
+
key.failure({text: 'all equipment bought must be distinct', status: 400})
|
30
|
+
end
|
31
|
+
|
32
|
+
if values[:equipment_to_buy].size > limit
|
33
|
+
key.failure({text: "buying too many items, limit is #{limit}", status: 400})
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen string literal: true
|
2
|
+
|
3
|
+
require 'dry-validation'
|
4
|
+
require 'spy_alley_application/types/nationality'
|
5
|
+
|
6
|
+
module SpyAlleyApplication
|
7
|
+
module Validator
|
8
|
+
class ChooseNewSpyIdentity < Dry::Validation::Contract
|
9
|
+
option :options, type: ::Types::Array::of(SpyAlleyApplication::Types::Nationality)
|
10
|
+
.constrained(size: 2)
|
11
|
+
|
12
|
+
params do
|
13
|
+
required(:nationality).filled(SpyAlleyApplication::Types::Nationality)
|
14
|
+
end
|
15
|
+
|
16
|
+
rule(:nationality) do
|
17
|
+
if !options.include?(values[:nationality])
|
18
|
+
key.failure({text: "'#{values[:nationality]}' not allowable", status: 422})
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen string literal: true
|
2
|
+
|
3
|
+
require 'dry-initializer'
|
4
|
+
|
5
|
+
module SpyAlleyApplication
|
6
|
+
module Validator
|
7
|
+
class ConfiscateMaterials
|
8
|
+
include Dry::Initializer.define -> do
|
9
|
+
option :validate_target_player_id, type: ::Types::Callable
|
10
|
+
option :full_validator_for, type: ::Types::Hash
|
11
|
+
end
|
12
|
+
|
13
|
+
def call(action_hash)
|
14
|
+
result = validate_target_player_id.(action_hash)
|
15
|
+
return result if result.failure?
|
16
|
+
validate = full_validator_for[result[:target_player_id]]
|
17
|
+
validate.(action_hash)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen string literal: true
|
2
|
+
|
3
|
+
require 'dry-validation'
|
4
|
+
require 'spy_alley_application/types/array_of_equipment'
|
5
|
+
|
6
|
+
module SpyAlleyApplication
|
7
|
+
module Validator
|
8
|
+
class ConfiscateMaterials
|
9
|
+
class FullValidator < Dry::Validation::Contract
|
10
|
+
t = SpyAlleyApplication::Types
|
11
|
+
@@equipment_regex =
|
12
|
+
/\A(#{t::Nationality.values.join('|')}) (#{t::EquipmentType.values.join('|')})\z/
|
13
|
+
|
14
|
+
option :target_player_id, type: ::Types::Coercible::Integer
|
15
|
+
option :targetable_equipment, type: SpyAlleyApplication::Types::ArrayOfEquipment
|
16
|
+
|
17
|
+
params do
|
18
|
+
required(:target_player_id).filled(::Types::Coercible::Integer)
|
19
|
+
required(:equipment_to_confiscate)
|
20
|
+
.filled(::Types::String.constrained(format: @@equipment_regex))
|
21
|
+
end
|
22
|
+
|
23
|
+
rule(:target_player_id) do
|
24
|
+
if !target_player_id.eql?(values[:target_player_id])
|
25
|
+
key.failure({text: "'#{values[:target_player_id]}' not allowable", status: 422})
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
rule(:equipment_to_confiscate) do
|
30
|
+
opts = targetable_equipment.map(&:to_s)
|
31
|
+
if !opts.include?(values[:equipment_to_confiscate])
|
32
|
+
key.failure({text: "'#{values[:equipment_to_confiscate]}' not allowable", status: 422})
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'dry-initializer'
|
2
|
+
require 'spy_alley_application/types/nationality'
|
3
|
+
require 'spy_alley_application/validator/make_accusation'
|
4
|
+
|
5
|
+
module SpyAlleyApplication
|
6
|
+
module Validator
|
7
|
+
class ConfiscateMaterials
|
8
|
+
class ValidateTargetPlayerId < Dry::Validation::Contract
|
9
|
+
option :target_player_id_list, type: ::Types::ArrayOfStrictInteger
|
10
|
+
|
11
|
+
params do
|
12
|
+
required(:target_player_id).filled(::Types::Coercible::Integer)
|
13
|
+
end
|
14
|
+
|
15
|
+
rule(:target_player_id) do
|
16
|
+
if !target_player_id_list.include?(values[:target_player_id])
|
17
|
+
key.failure({text: "'#{values[:target_player_id]}' not allowable", status: 422})
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|