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,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-struct'
4
+
5
+ module LoveLetterApplication
6
+ module Results
7
+ module Nodes
8
+ class CardPlayedNode < Dry::Struct
9
+ attribute :player_id, ::Types::Strict::Integer
10
+ attribute :card_id, ::Types::Strict::Integer
11
+ end
12
+ end
13
+ end
14
+ end
15
+
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-struct'
4
+
5
+ module LoveLetterApplication
6
+ module Results
7
+ module Nodes
8
+ class CardViewedNode < Dry::Struct
9
+ attribute :player_id, ::Types::Strict::Integer
10
+ attribute :target_player_id, ::Types::Strict::Integer
11
+ attribute :card_id, ::Types::Strict::Integer
12
+
13
+ def accept(visitor, **args)
14
+ visitor = ::Types.Interface(:handle_card_viewed).call(visitor)
15
+ visitor.handle_card_viewed(self, **args)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-struct'
4
+
5
+ module LoveLetterApplication
6
+ module Results
7
+ module Nodes
8
+ class DiscardCardNode < Dry::Struct
9
+ attribute :player_id, ::Types::Strict::Integer
10
+ attribute :card_id, ::Types::Strict::Integer
11
+
12
+ def accept(visitor, **args)
13
+ visitor = ::Types.Interface(:handle_discard_card).call(visitor)
14
+ visitor.handle_discard_card(self, args)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-struct'
4
+
5
+ module LoveLetterApplication
6
+ module Results
7
+ module Nodes
8
+ class DrawnCardNode < Dry::Struct
9
+ attribute :player_id, ::Types::Strict::Integer
10
+ attribute :card_id, ::Types::Strict::Integer
11
+
12
+ def accept(visitor, **args)
13
+ visitor = ::Types.Interface(:handle_drawn_card).call(visitor)
14
+ visitor.handle_drawn_card(self, args)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-struct'
4
+
5
+ module LoveLetterApplication
6
+ module Results
7
+ module Nodes
8
+ class EliminatedPlayerNode < Dry::Struct
9
+ attribute :player_id, ::Types::Strict::Integer
10
+
11
+ def accept(visitor, **args)
12
+ visitor = ::Types.Interface(:handle_eliminated_player).call(visitor)
13
+ visitor.handle_eliminated_player(self, args)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-struct'
4
+
5
+ module LoveLetterApplication
6
+ module Results
7
+ module Nodes
8
+ class HandsSwitchedNode < Dry::Struct
9
+ attribute :player_id, ::Types::Strict::Integer
10
+ attribute :target_player_id, ::Types::Strict::Integer
11
+ attribute :card_id_given, ::Types::Strict::Integer
12
+ attribute :card_id_taken, ::Types::Strict::Integer
13
+
14
+ def accept(visitor, **args)
15
+ visitor = ::Types.Interface(:handle_hands_switched).call(visitor)
16
+ visitor.handle_hands_switched(self, args)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LoveLetterApplication
4
+ module Results
5
+ module Nodes
6
+ class KnightDrawnNode
7
+ def accept(visitor, **args)
8
+ visitor = ::Types.Interface(:handle_knight_drawn).call(visitor)
9
+ visitor.handle_knight_drawn(self, args)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-struct'
4
+
5
+ module LoveLetterApplication
6
+ module Results
7
+ module Nodes
8
+ class KnightVictoryNode < Dry::Struct
9
+ attribute :winning_player_id, ::Types::Strict::Integer
10
+ attribute :losing_player_id, ::Types::Strict::Integer
11
+
12
+ def accept(visitor, **args)
13
+ visitor = ::Types.Interface(:handle_knight_victory).call(visitor)
14
+ visitor.handle_knight_victory(self, args)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-initializer'
4
+
5
+ module LoveLetterApplication
6
+ module Results
7
+ module Nodes
8
+ class LogNode
9
+ extend Dry::Initializer
10
+ option :message, type: ::Types::Coercible::String
11
+
12
+ def accept(visitor, **args)
13
+ visitor = Types.Interface(:handle_log_message).call(visitor)
14
+ visitor.handle_log_message(self, args)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-struct'
4
+
5
+ module LoveLetterApplication
6
+ module Results
7
+ module Nodes
8
+ class NextPlayerNode < Dry::Struct
9
+ attribute :player_id, ::Types::Strict::Integer
10
+
11
+ def accept(visitor, **args)
12
+ visitor = ::Types.Interface(:handle_next_player).call(visitor)
13
+ visitor.handle_next_player(self, args)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-struct'
4
+
5
+ module LoveLetterApplication
6
+ module Results
7
+ module Nodes
8
+ class PlayCardWithNoOptionsNode < Dry::Struct
9
+ attribute :card_id, ::Types::Strict::Integer
10
+
11
+ def accept(visitor, **args)
12
+ visitor = ::Types.Interface(:handle_play_card_with_no_options).call(visitor)
13
+ visitor.handle_play_card_with_no_options(self, args)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-struct'
4
+
5
+ module LoveLetterApplication
6
+ module Results
7
+ module Nodes
8
+ class PlayCardWithPlayerIdAndCardIdOptionNode < Dry::Struct
9
+ attribute :card_id, ::Types::Strict::Integer
10
+ attribute :player_id_list, ::Types::ArrayOfStrictInteger
11
+ attribute :card_id_list, ::Types::ArrayOfStrictInteger
12
+
13
+ def accept(visitor, **args)
14
+ visitor = ::Types.Interface(:handle_play_card_with_player_id_option).call(visitor)
15
+ visitor.handle_play_card_with_player_id_option(self, args)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-struct'
4
+
5
+ module LoveLetterApplication
6
+ module Results
7
+ module Nodes
8
+ class PlayCardWithPlayerIdOptionNode < Dry::Struct
9
+ attribute :card_id, ::Types::Strict::Integer
10
+ attribute :player_id_list, ::Types::ArrayOfStrictInteger
11
+
12
+ def accept(visitor, **args)
13
+ visitor = ::Types.Interface(:handle_play_card_with_player_id_option).call(visitor)
14
+ visitor.handle_play_card_with_player_id_option(self, args)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-struct'
4
+
5
+ module LoveLetterApplication
6
+ module Results
7
+ module Nodes
8
+ class PlayerNotTargetableNode < Dry::Struct
9
+ attribute :player_id, ::Types::Strict::Integer
10
+ end
11
+ end
12
+ end
13
+ end
14
+
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-initializer'
4
+
5
+ module LoveLetterApplication
6
+ module Results
7
+ module Nodes
8
+ class PlayerVictoryNode
9
+ extend Dry::Initializer
10
+ option :player_id, type: ::Types::Array::of(::Types::Strict::Integer)
11
+
12
+ def accept(visitor, **args)
13
+ visitor = ::Types.Interface(:handle_player_victory).call(visitor)
14
+ visitor.handle_player_victory(self, **args)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-struct'
4
+
5
+ module LoveLetterApplication
6
+ module Results
7
+ module Nodes
8
+ class PlayersAndScoresNode
9
+ class PlayerScore < Dry::Struct
10
+ attribute :hand_card_value
11
+ attribute :played_cards_value
12
+ end
13
+
14
+ def initialize(players_and_scores:)
15
+ @players_and_scores = players_and_scores
16
+ .sort
17
+ .reverse
18
+ .map{|k, v| [k, get_inner_node_for(v)]}
19
+ .freeze
20
+ end
21
+
22
+ def players_and_scores
23
+ @players_and_scores
24
+ end
25
+
26
+ def accept(visitor, **args)
27
+ visitor = ::Types.Interface(:handle_players_and_scores).call(visitor)
28
+ visitor.handle_players_and_scores(self, args)
29
+ end
30
+
31
+ private
32
+ def get_inner_node_for(score)
33
+ hand_card_value = score / 100
34
+ played_cards_value = score % 100
35
+
36
+ PlayerScore::new(
37
+ hand_card_value: hand_card_value,
38
+ played_cards_value: played_cards_value)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-struct'
4
+
5
+ module LoveLetterApplication
6
+ module Results
7
+ module Nodes
8
+ class PrincessDiscardedNode < Dry::Struct
9
+ attribute :player_id, ::Types::Strict::Integer
10
+
11
+ def accept(visitor, **args)
12
+ visitor = ::Types.Interface(:handle_princess_discarded).call(visitor)
13
+ visitor.handle_princess_discarded(self, args)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-struct'
4
+
5
+ module LoveLetterApplication
6
+ module Results
7
+ module Nodes
8
+ class ResultGameBoardNode < Dry::Struct
9
+ attribute :game_board, LoveLetterApplication::Types::GameBoard
10
+
11
+ def accept(visitor, **args)
12
+ visitor = ::Types.Interface(:handle_result_game_board).call(visitor)
13
+ visitor.handle_result_game_board(self, args)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-initializer'
4
+
5
+ module LoveLetterApplication
6
+ module Results
7
+ class ProcessCorrectGuess
8
+ include Dry::Initializer.define -> do
9
+ option :log_correct_guess_node, type: ::Types.Interface(:accept), reader: :private
10
+ option :eliminate_player, type: ::Types::Callable, reader: :private
11
+ end
12
+
13
+ def call(target_player_id:, game_board:, change_orders:)
14
+ eliminate_player.(
15
+ target_player_id: target_player_id,
16
+ game_board: game_board,
17
+ change_orders: change_orders.push(log_correct_guess_node))
18
+ end
19
+ end
20
+ end
21
+ end
22
+
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry-initializer'
4
+
5
+ module LoveLetterApplication
6
+ module Results
7
+ class ProcessDrawAfterDiscard
8
+ include Dry::Initializer.define -> do
9
+ option :get_drawn_card_node, type: ::Types::Callable
10
+ option :discard_and_draw, ::Types::Callable
11
+ option :process_next_player_turn, ::Types::Callable
12
+ end
13
+
14
+ def call(target_player_id:, game_board:, change_orders:)
15
+ drawn_card_id = game_board.draw_pile.first&.id&.to_i || set_aside_card.id.to_i
16
+ game_board = discard_and_draw.(game_board: game_board, player_id: target_player_id)
17
+ process_next_player_turn.(
18
+ game_board: game_board,
19
+ change_orders: change_orders.push(get_drawn_card_node.(
20
+ player_id: target_player_id,
21
+ card_id: drawn_card_id)))
22
+ end
23
+ end
24
+ end
25
+ end
26
+