love_letter_application 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +7 -0
  5. data/Gemfile +5 -0
  6. data/Gemfile.lock +91 -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/love_letter_application.rb +7 -0
  13. data/lib/love_letter_application/action_creator.rb +16 -0
  14. data/lib/love_letter_application/actions/clown.rb +45 -0
  15. data/lib/love_letter_application/actions/general.rb +29 -0
  16. data/lib/love_letter_application/actions/knight.rb +31 -0
  17. data/lib/love_letter_application/actions/marquess.rb +28 -0
  18. data/lib/love_letter_application/actions/play_card.rb +33 -0
  19. data/lib/love_letter_application/actions/priestess.rb +36 -0
  20. data/lib/love_letter_application/actions/princess.rb +32 -0
  21. data/lib/love_letter_application/actions/soldier.rb +47 -0
  22. data/lib/love_letter_application/actions/wizard.rb +31 -0
  23. data/lib/love_letter_application/execute_action.rb +21 -0
  24. data/lib/love_letter_application/love_letter_imports.rb +641 -0
  25. data/lib/love_letter_application/models/card.rb +23 -0
  26. data/lib/love_letter_application/models/effects/discard_and_draw.rb +51 -0
  27. data/lib/love_letter_application/models/effects/eliminate_player.rb +43 -0
  28. data/lib/love_letter_application/models/effects/make_player_not_targetable.rb +44 -0
  29. data/lib/love_letter_application/models/effects/next_player_draw_card.rb +45 -0
  30. data/lib/love_letter_application/models/effects/play_card.rb +48 -0
  31. data/lib/love_letter_application/models/effects/round_complete.rb +29 -0
  32. data/lib/love_letter_application/models/effects/switch_hands.rb +50 -0
  33. data/lib/love_letter_application/models/game_board.rb +28 -0
  34. data/lib/love_letter_application/models/player.rb +36 -0
  35. data/lib/love_letter_application/results/eliminate_player.rb +43 -0
  36. data/lib/love_letter_application/results/nodes/card_played_node.rb +15 -0
  37. data/lib/love_letter_application/results/nodes/card_viewed_node.rb +21 -0
  38. data/lib/love_letter_application/results/nodes/discard_card_node.rb +20 -0
  39. data/lib/love_letter_application/results/nodes/drawn_card_node.rb +20 -0
  40. data/lib/love_letter_application/results/nodes/eliminated_player_node.rb +19 -0
  41. data/lib/love_letter_application/results/nodes/hands_switched_node.rb +22 -0
  42. data/lib/love_letter_application/results/nodes/knight_drawn_node.rb +15 -0
  43. data/lib/love_letter_application/results/nodes/knight_victory_node.rb +20 -0
  44. data/lib/love_letter_application/results/nodes/log_node.rb +20 -0
  45. data/lib/love_letter_application/results/nodes/next_player_node.rb +19 -0
  46. data/lib/love_letter_application/results/nodes/play_card_with_no_args_option_node.rb +19 -0
  47. data/lib/love_letter_application/results/nodes/play_card_with_player_id_and_card_id_option_node.rb +21 -0
  48. data/lib/love_letter_application/results/nodes/play_card_with_player_id_option_node.rb +20 -0
  49. data/lib/love_letter_application/results/nodes/player_not_targetable_node.rb +14 -0
  50. data/lib/love_letter_application/results/nodes/player_victory_node.rb +20 -0
  51. data/lib/love_letter_application/results/nodes/players_and_scores_node.rb +44 -0
  52. data/lib/love_letter_application/results/nodes/princess_discarded_node.rb +19 -0
  53. data/lib/love_letter_application/results/nodes/result_game_board_node.rb +19 -0
  54. data/lib/love_letter_application/results/process_correct_guess.rb +22 -0
  55. data/lib/love_letter_application/results/process_draw_after_discard.rb +26 -0
  56. data/lib/love_letter_application/results/process_incorrect_guess.rb +20 -0
  57. data/lib/love_letter_application/results/process_knight_showdown.rb +50 -0
  58. data/lib/love_letter_application/results/process_next_player_turn.rb +57 -0
  59. data/lib/love_letter_application/results/process_next_turn_options.rb +53 -0
  60. data/lib/love_letter_application/results/process_princess_discarded.rb +23 -0
  61. data/lib/love_letter_application/results/process_resolve_wizard.rb +36 -0
  62. data/lib/love_letter_application/results/process_round_complete_by_depleted_deck.rb +50 -0
  63. data/lib/love_letter_application/results/process_round_complete_by_elimination.rb +26 -0
  64. data/lib/love_letter_application/results/process_switch_hands.rb +51 -0
  65. data/lib/love_letter_application/results/yield_to_block.rb +12 -0
  66. data/lib/love_letter_application/types/card.rb +20 -0
  67. data/lib/love_letter_application/types/game_board.rb +59 -0
  68. data/lib/love_letter_application/types/player.rb +25 -0
  69. data/lib/love_letter_application/validator/base.rb +19 -0
  70. data/lib/love_letter_application/validator/builder.rb +50 -0
  71. data/lib/love_letter_application/validator/get_legal_card_ids.rb +23 -0
  72. data/lib/love_letter_application/validator/get_legal_card_ids/marquess.rb +18 -0
  73. data/lib/love_letter_application/validator/play_card.rb +21 -0
  74. data/lib/love_letter_application/validator/play_card/builder.rb +23 -0
  75. data/lib/love_letter_application/validator/play_card/no_options.rb +19 -0
  76. data/lib/love_letter_application/validator/play_card/select_target_player.rb +30 -0
  77. data/lib/love_letter_application/validator/play_card/select_target_player/builder.rb +44 -0
  78. data/lib/love_letter_application/validator/play_card/soldier.rb +39 -0
  79. data/lib/love_letter_application/validator/play_card/soldier/builder.rb +49 -0
  80. data/lib/love_letter_application/validator/validate_card_id.rb +23 -0
  81. data/lib/love_letter_application/version.rb +3 -0
  82. data/love_letter_application.gemspec +43 -0
  83. metadata +278 -0
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-initializer'
4
+
5
+ module LoveLetterApplication
6
+ module Actions
7
+ class Princess
8
+ include Dry::Initializer.define -> do
9
+ option :play_card, type: ::Types::Callable
10
+ option :get_card_played_node, type: ::Types::Callable
11
+ option :get_princess_discarded_node, type: ::Types::Callable
12
+ option :eliminate_player, type: ::Types::Callable
13
+ end
14
+
15
+ def call(game_board:, change_orders:)
16
+ game_board = play_card.(game_board: game_board, card_id: Princess::id)
17
+ eliminate_player.(
18
+ target_player_id: game_board.current_player_id.to_i,
19
+ game_board: game_board,
20
+ change_orders: change_orders
21
+ .push(get_card_played_node(
22
+ player_id: game_board.current_player_id.to_i,
23
+ card_id: Princess::id)
24
+ .push(get_princess_discarded_node.(
25
+ player_id: game_board.current_player_id.to_i))))
26
+ end
27
+
28
+ def self.id;8;end
29
+ end
30
+ end
31
+ end
32
+
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-initializer'
4
+
5
+ module LoveLetterApplication
6
+ module Actions
7
+ class Soldier
8
+ include Dry::Initializer.define -> do
9
+ option :play_card, type: ::Types::Callable
10
+ option :get_card_played_node, type: ::Types::Callable
11
+ option :process_correct_guess, type: ::Types::Callable
12
+ option :process_incorrect_guess, type: ::Types::Callable
13
+ end
14
+
15
+ def call(target_player_id:, target_card_id:, game_board:, change_orders:)
16
+ game_board = play_card.call(
17
+ game_board: game_board,
18
+ card_id: Soldier::id)
19
+ change_orders = change_orders.push(get_card_played_node.(
20
+ player_id: game_board.current_player_id.to_i,
21
+ card_id: Soldier::id))
22
+ if guess_is_correct?(target_player_id, target_card_id, game_board)
23
+ process_correct_guess.(
24
+ target_player_id: target_player_id,
25
+ game_board: game_board,
26
+ change_orders: change_orders)
27
+ else
28
+ process_incorrect_guess.(
29
+ game_board: game_board,
30
+ change_orders: change_orders)
31
+ end
32
+ end
33
+
34
+ def self.id;1;end
35
+
36
+ private
37
+ def guess_is_correct?(target_player_id, target_card_id, game_board)
38
+ game_board
39
+ .players
40
+ .find{|player| player.id.to_i.eql?(target_player_id)}
41
+ .hand
42
+ .any?{|card| card.id.to_i.eql?(target_card_id)}
43
+ end
44
+ end
45
+ end
46
+ end
47
+
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-initializer'
4
+
5
+ module LoveLetterApplication
6
+ module Actions
7
+ class Wizard
8
+ include Dry::Initializer.define -> do
9
+ option :play_card, type: ::Types::Callable
10
+ option :get_card_played_node, type: ::Types::Callable
11
+ option :process_resolve_wizard, type: ::Types::Callable
12
+ end
13
+
14
+ def call(target_player_id:, game_board:, change_orders:)
15
+ game_board = play_card.(
16
+ game_board: game_board,
17
+ card_id: Wizard::id)
18
+ change_orders = change_orders.push(get_card_played_node.(
19
+ player_id: game_board.current_player_id.to_i,
20
+ card_id: Wizard::id))
21
+ process_resolve_wizard.(
22
+ target_player_id: target_player_id.to_i,
23
+ game_board: game_board,
24
+ change_orders: change_orders)
25
+ end
26
+
27
+ def self.id;5;end
28
+ end
29
+ end
30
+ end
31
+
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'love_letter_application/love_letter_imports'
4
+
5
+ module LoveLetterApplication
6
+ class ExecuteAction
7
+ include LoveLetterApplication::LoveLetterImports[
8
+ new_change_orders: 'love_letter_application.change_orders_initializer',
9
+ game_board_type: 'love_letter_application.types.game_board',
10
+ build_validator: 'love_letter_application.build_validator']
11
+
12
+ def call(action_hash:, game_board:, user:, last_action_id:)
13
+ game_board_type.call(game_board)
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
+ change_orders = new_change_orders.()
17
+ execute_action.(game_board: game_board, change_orders: change_orders)
18
+ end
19
+ end
20
+ end
21
+
@@ -0,0 +1,641 @@
1
+ #frozen string_literal: true
2
+
3
+ require 'change_orders'
4
+ require 'dry-auto_inject'
5
+ require 'dry-container'
6
+ require 'love_letter_application/actions/soldier'
7
+ require 'love_letter_application/actions/clown'
8
+ require 'love_letter_application/actions/knight'
9
+ require 'love_letter_application/actions/priestess'
10
+ require 'love_letter_application/actions/wizard'
11
+ require 'love_letter_application/actions/general'
12
+ require 'love_letter_application/actions/marquess'
13
+ require 'love_letter_application/actions/princess'
14
+ require 'love_letter_application/models/card'
15
+ require 'love_letter_application/models/effects/discard_and_draw'
16
+ require 'love_letter_application/models/effects/eliminate_player'
17
+ require 'love_letter_application/models/effects/make_player_not_targetable'
18
+ require 'love_letter_application/models/effects/next_player_draw_card'
19
+ require 'love_letter_application/models/effects/play_card'
20
+ require 'love_letter_application/models/effects/round_complete'
21
+ require 'love_letter_application/models/effects/switch_hands'
22
+ require 'love_letter_application/results/eliminate_player'
23
+ require 'love_letter_application/results/process_correct_guess'
24
+ require 'love_letter_application/results/process_draw_after_discard'
25
+ require 'love_letter_application/results/process_incorrect_guess'
26
+ require 'love_letter_application/results/process_knight_showdown'
27
+ require 'love_letter_application/results/process_next_player_turn'
28
+ require 'love_letter_application/results/process_next_turn_options'
29
+ require 'love_letter_application/results/process_princess_discarded'
30
+ require 'love_letter_application/results/process_resolve_wizard'
31
+ require 'love_letter_application/results/process_round_complete_by_depleted_deck'
32
+ require 'love_letter_application/results/process_round_complete_by_elimination'
33
+ require 'love_letter_application/results/process_switch_hands'
34
+ require 'love_letter_application/results/yield_to_block'
35
+ require 'love_letter_application/results/nodes/card_played_node'
36
+ require 'love_letter_application/results/nodes/card_viewed_node'
37
+ require 'love_letter_application/results/nodes/discard_card_node'
38
+ require 'love_letter_application/results/nodes/drawn_card_node'
39
+ require 'love_letter_application/results/nodes/eliminated_player_node'
40
+ require 'love_letter_application/results/nodes/hands_switched_node'
41
+ require 'love_letter_application/results/nodes/knight_drawn_node'
42
+ require 'love_letter_application/results/nodes/knight_victory_node'
43
+ require 'love_letter_application/results/nodes/log_node'
44
+ require 'love_letter_application/results/nodes/next_player_node'
45
+ require 'love_letter_application/results/nodes/play_card_with_no_args_option_node'
46
+ require 'love_letter_application/results/nodes/play_card_with_player_id_and_card_id_option_node'
47
+ require 'love_letter_application/results/nodes/play_card_with_player_id_option_node'
48
+ require 'love_letter_application/results/nodes/player_not_targetable_node'
49
+ require 'love_letter_application/results/nodes/princess_discarded_node'
50
+ require 'love_letter_application/results/nodes/result_game_board_node'
51
+ require 'love_letter_application/types/game_board'
52
+ require 'love_letter_application/validator/builder'
53
+ require 'love_letter_application/validator/get_legal_card_ids'
54
+ require 'love_letter_application/validator/get_legal_card_ids/marquess'
55
+ require 'love_letter_application/validator/play_card/builder'
56
+ require 'love_letter_application/validator/play_card/no_options'
57
+ require 'love_letter_application/validator/play_card/soldier/builder'
58
+ require 'love_letter_application/validator/play_card/select_target_player/builder'
59
+ require 'love_letter_application/validator/validate_card_id'
60
+
61
+ module LoveLetterApplication
62
+ class DependencyContainer
63
+ extend Dry::Container::Mixin
64
+ namespace :love_letter_application do
65
+ namespace :types do
66
+ register :game_board do
67
+ LoveLetterApplication::Types::GameBoard
68
+ end
69
+ end
70
+
71
+ namespace :validator_builders do
72
+ namespace :raw do
73
+ no_options = LoveLetterApplication::Validator::PlayCard::NoOptions::new
74
+
75
+ register :all do
76
+ [ ->(**args, &block){},
77
+ resolve(:soldier),
78
+ resolve(:clown),
79
+ resolve(:knight),
80
+ resolve(:priestess),
81
+ resolve(:wizard),
82
+ resolve(:general),
83
+ resolve(:marquess),
84
+ resolve(:princess)
85
+ ]
86
+ end
87
+
88
+ register :validate_card_combo_for do
89
+ all_options_available = ->(card_list:){card_list.map{|card| card.id.to_i}}
90
+ [ all_options_available,
91
+ all_options_available, #card_id = 1
92
+ all_options_available, #card_id = 2
93
+ all_options_available, #card_id = 3
94
+ all_options_available, #card_id = 4
95
+ all_options_available, #card_id = 5
96
+ all_options_available, #card_id = 6
97
+ LoveLetterApplication::Validator::GetLegalCardIds::Marquess::new.method(:call),#id=7
98
+ all_options_available #card_id = 8
99
+ ]
100
+ end
101
+
102
+ register :get_legal_card_ids do
103
+ LoveLetterApplication::Validator::GetLegalCardIds::new(
104
+ validate_card_combo_for: resolve(:validate_card_combo_for)).method(:call)
105
+ end
106
+
107
+ register :soldier do
108
+ LoveLetterApplication::Validator::PlayCard::Soldier::Builder::new(
109
+ no_options_validator: no_options).method(:call)
110
+ end
111
+
112
+ register :clown do
113
+ LoveLetterApplication::Validator::PlayCard::SelectTargetPlayer::Builder::new(
114
+ target_self?: false,
115
+ no_options_validator: no_options).method(:call)
116
+ end
117
+
118
+ register :knight do
119
+ resolve(:clown)
120
+ end
121
+
122
+ register :priestess do
123
+ ->(model){no_options}
124
+ end
125
+
126
+ register :wizard do
127
+ LoveLetterApplication::Validator::PlayCard::SelectTargetPlayer::Builder::new(
128
+ target_self?: true,
129
+ no_options_validator: no_options).method(:call)
130
+ end
131
+
132
+ register :general do
133
+ resolve(:clown)
134
+ end
135
+
136
+ register :marquess do
137
+ resolve(:priestess)
138
+ end
139
+
140
+ register :princess do
141
+ resolve(:priestess)
142
+ end
143
+ end
144
+
145
+ register :all do
146
+ [ ->(**args){},
147
+ resolve(:soldier),
148
+ resolve(:clown),
149
+ resolve(:knight),
150
+ resolve(:priestess),
151
+ resolve(:wizard),
152
+ resolve(:general),
153
+ resolve(:marquess),
154
+ resolve(:princess)]
155
+ end
156
+
157
+ register :soldier do
158
+ soldier_action = LoveLetterApplication::DependencyContainer
159
+ .resolve('love_letter_application.actions.soldier')
160
+ LoveLetterApplication::Validator::PlayCard::Builder::new(
161
+ build_raw_validator: resolve('raw.soldier'),
162
+ wrap_result: ->(successful_result){GameValidator::Validator::Result::new(
163
+ result: successful_result,
164
+ execute: soldier_action)}).method(:call)
165
+ end
166
+
167
+ register :clown do
168
+ clown_action = LoveLetterApplication::DependencyContainer
169
+ .resolve('love_letter_application.actions.clown')
170
+ LoveLetterApplication::Validator::PlayCard::Builder::new(
171
+ build_raw_validator: resolve('raw.clown'),
172
+ wrap_result: ->(successful_result){GameValidator::Validator::Result::new(
173
+ result: successful_result,
174
+ execute: clown_action)}).method(:call)
175
+ end
176
+
177
+ register :knight do
178
+ knight_action = LoveLetterApplication::DependencyContainer
179
+ .resolve('love_letter_application.actions.knight')
180
+ LoveLetterApplication::Validator::PlayCard::Builder::new(
181
+ build_raw_validator: resolve('raw.knight'),
182
+ wrap_result: ->(successful_result){GameValidator::Validator::Result::new(
183
+ result: successful_result,
184
+ execute: knight_action)}).method(:call)
185
+ end
186
+
187
+ register :priestess do
188
+ priestess_action = LoveLetterApplication::DependencyContainer
189
+ .resolve('love_letter_application.actions.priestess')
190
+ LoveLetterApplication::Validator::PlayCard::Builder::new(
191
+ build_raw_validator: resolve('raw.priestess'),
192
+ wrap_result: ->(successful_result){GameValidator::Validator::Result::new(
193
+ result: successful_result,
194
+ execute: priestess_action)}).method(:call)
195
+ end
196
+
197
+ register :wizard do
198
+ wizard_action = LoveLetterApplication::DependencyContainer
199
+ .resolve('love_letter_application.actions.wizard')
200
+ LoveLetterApplication::Validator::PlayCard::Builder::new(
201
+ build_raw_validator: resolve('raw.wizard'),
202
+ wrap_result: ->(successful_result){GameValidator::Validator::Result::new(
203
+ result: successful_result,
204
+ execute: wizard_action)}).method(:call)
205
+ end
206
+
207
+ register :general do
208
+ general_action = LoveLetterApplication::DependencyContainer
209
+ .resolve('love_letter_application.actions.general')
210
+ LoveLetterApplication::Validator::PlayCard::Builder::new(
211
+ build_raw_validator: resolve('raw.general'),
212
+ wrap_result: ->(successful_result){GameValidator::Validator::Result::new(
213
+ result: successful_result,
214
+ execute: general_action)}).method(:call)
215
+ end
216
+
217
+ register :marquess do
218
+ marquess_action = LoveLetterApplication::DependencyContainer
219
+ .resolve('love_letter_application.actions.marquess')
220
+ LoveLetterApplication::Validator::PlayCard::Builder::new(
221
+ build_raw_validator: resolve('raw.marquess'),
222
+ wrap_result: ->(successful_result){GameValidator::Validator::Result::new(
223
+ result: successful_result,
224
+ execute: marquess_action)}).method(:call)
225
+ end
226
+
227
+ register :princess do
228
+ princess_action = LoveLetterApplication::DependencyContainer
229
+ .resolve('love_letter_application.actions.princess')
230
+ LoveLetterApplication::Validator::PlayCard::Builder::new(
231
+ build_raw_validator: resolve('raw.princess'),
232
+ wrap_result: ->(successful_result){GameValidator::Validator::Result::new(
233
+ result: successful_result,
234
+ execute: princess_action)}).method(:call)
235
+ end
236
+ end
237
+
238
+ register :change_orders_initializer do
239
+ new_change_orders = ChangeOrders::Container::new
240
+ ->{new_change_orders}
241
+ end
242
+
243
+ namespace :model_effects do
244
+ register :discard_and_draw do
245
+ LoveLetterApplication::Models::Effects::DiscardAndDraw::new(
246
+ null_card: LoveLetterApplication::Models::Card::new(
247
+ id: -1,
248
+ rank: -1,
249
+ targetable?: false)).method(:call)
250
+ end
251
+
252
+ register :eliminate_player_from_game_board do
253
+ LoveLetterApplication::Models::Effects::EliminatePlayer::new.method(:call)
254
+ end
255
+
256
+ register :make_player_not_targetable do
257
+ LoveLetterApplication::Models::Effects::MakePlayerNotTargetable::new.method(:call)
258
+ end
259
+
260
+ register :next_player_draw_card do
261
+ LoveLetterApplication::Models::Effects::NextPlayerDrawCard::new.method(:call)
262
+ end
263
+
264
+ register :play_card do
265
+ LoveLetterApplication::Models::Effects::PlayCard::new.method(:call)
266
+ end
267
+
268
+ register :round_complete do
269
+ LoveLetterApplication::Models::Effects::RoundComplete::new.method(:call)
270
+ end
271
+
272
+ register :switch_hands do
273
+ LoveLetterApplication::Models::Effects::SwitchHands::new.method(:call)
274
+ end
275
+ end
276
+
277
+ namespace :results do
278
+ register :eliminate_player do
279
+ eliminate_player_from_game_board = LoveLetterApplication::DependencyContainer
280
+ .resolve('love_letter_application.model_effects.eliminate_player_from_game_board')
281
+ LoveLetterApplication::Results::EliminatePlayer::new(
282
+ process_round_complete_by_elimination: resolve(:process_round_complete_by_elimination),
283
+ get_next_player_turn: resolve(:get_next_player_node),
284
+ eliminate_player_from_game_board: eliminate_player_from_game_board,
285
+ process_next_player_turn: resolve(:process_next_player_turn),
286
+ get_eliminated_player_node: resolve(:get_eliminated_player_node)).method(:call)
287
+ end
288
+
289
+ register :get_card_played_node do
290
+ ->(player_id:, card_id:) do
291
+ LoveLetterApplication::Results::Nodes::CardPlayedNode::new(
292
+ player_id: player_id,
293
+ card_id: card_id)
294
+ end
295
+ end
296
+
297
+ register :get_card_viewed_node do
298
+ ->(player_id:, target_player_id:, card_id:) do
299
+ LoveLetterApplication::Results::Nodes::CardViewedNode::new(
300
+ player_id: player_id,
301
+ target_player_id: target_player_id,
302
+ card_id: card_id)
303
+ end
304
+ end
305
+
306
+ register :get_discard_card_node do
307
+ ->(player_id:, card_id:) do
308
+ LoveLetterApplication::Results::Nodes::DiscardCardNode::new(
309
+ player_id: player_id,
310
+ card_id: card_id)
311
+ end
312
+ end
313
+
314
+ register :get_drawn_card_node do
315
+ ->(player_id:, card_id:) do
316
+ LoveLetterApplication::Results::Nodes::DrawnCardNode::new(
317
+ player_id: player_id,
318
+ card_id: card_id)
319
+ end
320
+ end
321
+
322
+ register :get_eliminated_player_node do
323
+ ->(player_id:) do
324
+ LoveLetterApplication::Results::Nodes::EliminatedPlayerNode::new(player_id: player_id)
325
+ end
326
+ end
327
+
328
+ register :get_hands_switched_node do
329
+ ->(player_id:, target_player_id:, card_id_given:, card_id_taken:) do
330
+ LoveLetterApplication::Results::Nodes::HandsSwitchedNode::new(
331
+ player_id: player_id,
332
+ target_player_id: target_player_id,
333
+ card_id_given: card_id_given,
334
+ card_id_taken: card_id_taken)
335
+ end
336
+ end
337
+
338
+ register :get_knight_victory_node do
339
+ ->(winning_player_id:, losing_player_id:) do
340
+ LoveLetterApplication::Results::Nodes::KnightVictoryNode::new(
341
+ winning_player_id: winning_player_id,
342
+ losing_player_id: losing_player_id)
343
+ end
344
+ end
345
+
346
+ register :get_next_player_node do
347
+ ->(player_id:) do
348
+ LoveLetterApplication::Results::Nodes::NextPlayerNode::new(player_id: player_id)
349
+ end
350
+ end
351
+
352
+ register :get_play_card_with_no_options_node do
353
+ ->(card_id:) do
354
+ LoveLetterApplication::Results::Nodes::PlayCardWithNoOptionsNode::new(card_id: card_id)
355
+ end
356
+ end
357
+
358
+ register :get_play_card_with_player_id_and_card_id_option_node do
359
+ ->(card_id:, player_id_list:, card_id_list:) do
360
+ LoveLetterApplication::Results::Nodes::PlayCardWithPlayerIdAndCardIdOptionNode::new(
361
+ card_id: card_id,
362
+ player_id_list: player_id_list,
363
+ card_id_list: card_id_list)
364
+ end
365
+ end
366
+
367
+ register :get_play_card_with_player_id_option_node do
368
+ ->(card_id:, player_id_list:) do
369
+ LoveLetterApplication::Results::Nodes::PlayCardWithPlayerIdOptionNode::new(
370
+ card_id: card_id,
371
+ player_id_list: player_id_list)
372
+ end
373
+ end
374
+
375
+ register :get_players_and_scores_node do
376
+ ->(players_and_scores:) do
377
+ LoveLetterApplication::Results::Nodes::PlayersAndScores::new(
378
+ players_and_scores: players_and_scores)
379
+ end
380
+ end
381
+
382
+ register :get_player_not_targetable_node do
383
+ ->(player_id:) do
384
+ LoveLetterApplication::Results::Nodes::PlayerNotTargetableNode::new(
385
+ player_id: player_id)
386
+ end
387
+ end
388
+
389
+ register :get_player_victory_node do
390
+ ->(player_id:) do
391
+ LoveLetterApplication::Results::Nodes::LogNode::new(
392
+ message: "Player with id #{player_id} is the winner")
393
+ end
394
+ end
395
+
396
+ register :get_princess_discarded_node do
397
+ ->(player_id:) do
398
+ LoveLetterApplication::Results::Nodes::PrincessDiscardedNode::new(
399
+ player_id: player_id)
400
+ end
401
+ end
402
+
403
+ register :get_result_game_board_node do
404
+ ->(game_board:) do
405
+ LoveLetterApplication::Results::Nodes::ResultGameBoardNode::new(game_board: game_board)
406
+ end
407
+ end
408
+
409
+ register :knight_drawn_node do
410
+ LoveLetterApplication::Results::Nodes::KnightDrawnNode::new
411
+ end
412
+
413
+ register :process_correct_guess do
414
+ LoveLetterApplication::Results::ProcessCorrectGuess::new(
415
+ log_correct_guess_node: LoveLetterApplication::Results::Nodes::LogNode::new(
416
+ message: 'The guess is correct'),
417
+ eliminate_player: resolve(:eliminate_player)).method(:call)
418
+ end
419
+
420
+ register :process_discard_passive_result do
421
+ no_action = ::Types::Callable.call(LoveLetterApplication::Results::YieldToBlock::new)
422
+ [ no_action,
423
+ no_action, #card_id = 1
424
+ no_action, #card_id = 2
425
+ no_action, #card_id = 3
426
+ no_action, #card_id = 4
427
+ no_action, #card_id = 5
428
+ no_action, #card_id = 6
429
+ no_action, #card_id = 7
430
+ resolve(:process_princess_discarded)] #card_id = 8
431
+ end
432
+
433
+ register :process_draw_after_discard do
434
+ discard_and_draw = LoveLetterApplication::DependencyContainer
435
+ .resolve('love_letter_application.model_effects.discard_and_draw')
436
+ LoveLetterApplication::Results::ProcessDrawAfterDiscard::new(
437
+ get_drawn_card_node: resolve(:get_drawn_card_node),
438
+ discard_and_draw: discard_and_draw,
439
+ process_next_player_turn: resolve(:process_next_player_turn)).method(:call)
440
+ end
441
+
442
+ register :process_incorrect_guess do
443
+ LoveLetterApplication::Results::ProcessIncorrectGuess::new(
444
+ log_incorrect_guess_node: LoveLetterApplication::Results::Nodes::LogNode::new(
445
+ message: 'The guess is incorrect'),
446
+ process_next_player_turn: resolve(:process_next_player_turn)).method(:call)
447
+ end
448
+
449
+ register :process_knight_showdown do
450
+ LoveLetterApplication::Results::ProcessKnightShowdown::new(
451
+ knight_drawn_node: resolve(:knight_drawn_node),
452
+ get_knight_victory_node: resolve(:get_knight_victory_node),
453
+ eliminate_player: resolve(:eliminate_player),
454
+ process_next_player_turn: resolve(:process_next_player_turn)).method(:call)
455
+ end
456
+
457
+ register :process_next_player_turn do
458
+ next_player_draw_card = LoveLetterApplication::DependencyContainer
459
+ .resolve('love_letter_application.model_effects.next_player_draw_card')
460
+ LoveLetterApplication::Results::ProcessNextPlayerTurn::new(
461
+ process_round_complete_by_depleted_deck: resolve(:process_round_complete_by_depleted_deck),
462
+ get_next_player_node: resolve(:get_next_player_node),
463
+ get_drawn_card_node: resolve(:get_drawn_card_node),
464
+ next_player_draw_card: next_player_draw_card,
465
+ get_result_game_board_node: resolve(:get_result_game_board_node),
466
+ process_next_turn_options: resolve(:process_next_turn_options)).method(:call)
467
+ end
468
+
469
+ register :process_next_turn_options do
470
+ all_card_validator_builders = LoveLetterApplication::DependencyContainer
471
+ .resolve('love_letter_application.validator_builders.raw.all')
472
+ get_legal_card_ids = LoveLetterApplication::DependencyContainer
473
+ .resolve('love_letter_application.validator_builders.raw.get_legal_card_ids')
474
+ player_id_option = resolve(:get_play_card_with_player_id_option_node)
475
+ player_card_id_option = resolve(:get_play_card_with_player_id_and_card_id_option_node)
476
+
477
+ LoveLetterApplication::Results::ProcessNextTurnOptions::new(
478
+ get_legal_card_ids: get_legal_card_ids,
479
+ all_card_validator_builders: all_card_validator_builders,
480
+ get_play_card_with_no_options_node: resolve(:get_play_card_with_no_options_node),
481
+ get_play_card_with_player_id_option_node: player_id_option,
482
+ get_play_card_with_player_id_and_card_id_option_node: player_card_id_option)
483
+ .method(:call)
484
+ end
485
+
486
+ register :process_princess_discarded do
487
+ LoveLetterApplication::Results::ProcessPrincessDiscarded::new(
488
+ get_princess_discarded_node: resolve(:get_princess_discarded_node),
489
+ eliminate_player: resolve(:eliminate_player)).method(:call)
490
+ end
491
+
492
+ register :process_resolve_wizard do
493
+ LoveLetterApplication::Results::ProcessResolveWizard::new(
494
+ get_discard_card_node: resolve(:get_discard_card_node),
495
+ process_discard_passive_result: resolve(:process_discard_passive_result),
496
+ process_draw_after_discard: resolve(:process_draw_after_discard)).method(:call)
497
+ end
498
+
499
+ register :process_round_complete_by_depleted_deck do
500
+ round_complete = LoveLetterApplication::DependencyContainer
501
+ .resolve('love_letter_application.model_effects.round_complete')
502
+ LoveLetterApplication::Results::ProcessRoundCompleteByDepletedDeck::new(
503
+ log_deck_depleted_node: LoveLetterApplication::Results::Nodes::LogNode::new(
504
+ message: 'Round is complete. There are no more cards in the draw pile.'),
505
+ get_players_and_scores_node: resolve(:get_players_and_scores_node),
506
+ get_player_victory_node: resolve(:get_player_victory_node),
507
+ round_complete: round_complete,
508
+ get_result_game_board_node: resolve(:get_result_game_board_node)).method(:call)
509
+ end
510
+
511
+ register :process_round_complete_by_elimination do
512
+ round_complete = LoveLetterApplication::DependencyContainer
513
+ .resolve('love_letter_application.model_effects.round_complete')
514
+ LoveLetterApplication::Results::ProcessRoundCompleteByElimination::new(
515
+ log_all_opponents_eliminated_node: LoveLetterApplication::Results::Nodes::LogNode::new(
516
+ message: 'Round is complete. Only one player remains.'),
517
+ get_player_victory_node: resolve(:get_player_victory_node),
518
+ round_complete: round_complete,
519
+ get_result_game_board_node: resolve(:get_result_game_board_node)).method(:call)
520
+ end
521
+
522
+ register :process_switch_hands do
523
+ switch_hands = LoveLetterApplication::DependencyContainer
524
+ .resolve('love_letter_application.model_effects.switch_hands')
525
+ LoveLetterApplication::Results::ProcessSwitchHands::new(
526
+ get_hands_switched_node: resolve(:get_hands_switched_node),
527
+ switch_hands: switch_hands,
528
+ process_next_player_turn: resolve(:process_next_player_turn)).method(:call)
529
+ end
530
+ end
531
+
532
+ namespace :actions do
533
+ register :get_card_played_node do
534
+ LoveLetterApplication::DependencyContainer
535
+ .resolve('love_letter_application.results.get_card_played_node')
536
+ end
537
+
538
+ register :play_card do
539
+ LoveLetterApplication::DependencyContainer
540
+ .resolve('love_letter_application.model_effects.play_card')
541
+ end
542
+
543
+ register :soldier do
544
+ process_correct_guess = LoveLetterApplication::DependencyContainer
545
+ .resolve('love_letter_application.results.process_correct_guess')
546
+ process_incorrect_guess = LoveLetterApplication::DependencyContainer
547
+ .resolve('love_letter_application.results.process_incorrect_guess')
548
+ LoveLetterApplication::Actions::Soldier::new(
549
+ play_card: resolve(:play_card),
550
+ get_card_played_node: resolve(:get_card_played_node),
551
+ process_correct_guess: process_correct_guess,
552
+ process_incorrect_guess: process_incorrect_guess).method(:call)
553
+ end
554
+
555
+ register :clown do
556
+ get_card_viewed_node = LoveLetterApplication::DependencyContainer
557
+ .resolve('love_letter_application.results.get_card_viewed_node')
558
+ process_next_player_turn = LoveLetterApplication::DependencyContainer
559
+ .resolve('love_letter_application.results.process_next_player_turn')
560
+ LoveLetterApplication::Actions::Clown::new(
561
+ play_card: resolve(:play_card),
562
+ get_card_played_node: resolve(:get_card_played_node),
563
+ get_card_viewed_node: get_card_viewed_node,
564
+ process_next_player_turn: process_next_player_turn).method(:call)
565
+ end
566
+
567
+ register :knight do
568
+ process_knight_showdown = LoveLetterApplication::DependencyContainer
569
+ .resolve('love_letter_application.results.process_knight_showdown')
570
+ LoveLetterApplication::Actions::Knight::new(
571
+ play_card: resolve(:play_card),
572
+ get_card_played_node: resolve(:get_card_played_node),
573
+ process_knight_showdown: process_knight_showdown).method(:call)
574
+ end
575
+
576
+ register :priestess do
577
+ make_player_not_targetable = LoveLetterApplication::DependencyContainer
578
+ .resolve('love_letter_application.model_effects.make_player_not_targetable')
579
+ get_player_not_targetable_node = LoveLetterApplication::DependencyContainer
580
+ .resolve('love_letter_application.results.get_player_not_targetable_node')
581
+ process_next_player_turn = LoveLetterApplication::DependencyContainer
582
+ .resolve('love_letter_application.results.process_next_player_turn')
583
+ LoveLetterApplication::Actions::Priestess::new(
584
+ play_card: resolve(:play_card),
585
+ get_card_played_node: resolve(:get_card_played_node),
586
+ make_player_not_targetable: make_player_not_targetable,
587
+ get_player_not_targetable_node: get_player_not_targetable_node,
588
+ process_next_player_turn: process_next_player_turn).method(:call)
589
+ end
590
+
591
+ register :wizard do
592
+ process_resolve_wizard = LoveLetterApplication::DependencyContainer
593
+ .resolve('love_letter_application.results.process_resolve_wizard')
594
+ LoveLetterApplication::Actions::Wizard::new(
595
+ play_card: resolve(:play_card),
596
+ get_card_played_node: resolve(:get_card_played_node),
597
+ process_resolve_wizard: process_resolve_wizard).method(:call)
598
+ end
599
+
600
+ register :general do
601
+ process_switch_hands = LoveLetterApplication::DependencyContainer
602
+ .resolve('love_letter_application.results.process_switch_hands')
603
+ LoveLetterApplication::Actions::General::new(
604
+ play_card: resolve(:play_card),
605
+ get_card_played_node: resolve(:get_card_played_node),
606
+ process_switch_hands: process_switch_hands).method(:call)
607
+ end
608
+
609
+ register :marquess do
610
+ process_next_player_turn = LoveLetterApplication::DependencyContainer
611
+ .resolve('love_letter_application.results.process_next_player_turn')
612
+ LoveLetterApplication::Actions::Marquess::new(
613
+ play_card: resolve(:play_card),
614
+ get_card_played_node: resolve(:get_card_played_node),
615
+ process_next_player_turn: process_next_player_turn).method(:call)
616
+ end
617
+
618
+ register :princess do
619
+ get_princess_discarded_node = LoveLetterApplication::DependencyContainer
620
+ .resolve('love_letter_application.results.get_princess_discarded_node')
621
+ eliminate_player = LoveLetterApplication::DependencyContainer
622
+ .resolve('love_letter_application.results.eliminate_player')
623
+ LoveLetterApplication::Actions::Princess::new(
624
+ play_card: resolve(:play_card),
625
+ get_card_played_node: resolve(:get_card_played_node),
626
+ get_princess_discarded_node: get_princess_discarded_node,
627
+ eliminate_player: eliminate_player).method(:call)
628
+ end
629
+ end
630
+
631
+ register :build_validator do
632
+ LoveLetterApplication::Validator::Builder::new(
633
+ all_card_validator_builders: resolve('validator_builders.all'),
634
+ get_legal_card_ids: resolve('validator_builders.raw.get_legal_card_ids'))
635
+ end
636
+ end
637
+ end
638
+ end
639
+
640
+ LoveLetterApplication::LoveLetterImports = Dry::AutoInject(LoveLetterApplication::DependencyContainer)
641
+