love_letter_application 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+