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,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
+