software_challenge_client 21.0.1 → 22.0.2
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.
- checksums.yaml +4 -4
- data/Dockerfile +1 -1
- data/RELEASES.md +12 -0
- data/bin/console +0 -0
- data/bin/setup +0 -0
- data/develop.sh +0 -0
- data/example/main.rb +0 -0
- data/example/start.bat +0 -0
- data/generate-authors.sh +0 -0
- data/lib/software_challenge_client.rb +3 -6
- data/lib/software_challenge_client/board.rb +11 -61
- data/lib/software_challenge_client/color.rb +13 -3
- data/lib/software_challenge_client/field.rb +30 -11
- data/lib/software_challenge_client/game_rule_logic.rb +55 -255
- data/lib/software_challenge_client/game_state.rb +18 -73
- data/lib/software_challenge_client/move.rb +41 -0
- data/lib/software_challenge_client/piece.rb +53 -35
- data/lib/software_challenge_client/piece_type.rb +16 -0
- data/lib/software_challenge_client/player.rb +12 -6
- data/lib/software_challenge_client/protocol.rb +49 -112
- data/lib/software_challenge_client/runner.rb +1 -1
- data/lib/software_challenge_client/team.rb +25 -0
- data/lib/software_challenge_client/util/constants.rb +2 -3
- data/lib/software_challenge_client/version.rb +1 -1
- data/lib/update_client_module.sh +0 -0
- data/push_image_production.sh +12 -0
- data/release.sh +0 -0
- metadata +7 -10
- data/lib/software_challenge_client/coordinate_set.rb +0 -92
- data/lib/software_challenge_client/piece_shape.rb +0 -109
- data/lib/software_challenge_client/player_type.rb +0 -14
- data/lib/software_challenge_client/rotation.rb +0 -22
- data/lib/software_challenge_client/set_move.rb +0 -24
- data/lib/software_challenge_client/skip_move.rb +0 -13
@@ -4,6 +4,7 @@ require_relative './util/constants'
|
|
4
4
|
require_relative 'player'
|
5
5
|
require_relative 'board'
|
6
6
|
require_relative 'condition'
|
7
|
+
require_relative 'color'
|
7
8
|
|
8
9
|
# Ein Spielzustand. Wird vom Server an die Computerspieler übermittelt und
|
9
10
|
# enthält alles, was der Computerspieler wissen muss, um einen Zug zu machen.
|
@@ -14,53 +15,32 @@ class GameState
|
|
14
15
|
# @!attribute [rw] turn
|
15
16
|
# @return [Integer] Aktuelle Zugnummer (von 0 beginnend)
|
16
17
|
attr_accessor :turn
|
18
|
+
|
17
19
|
# @!attribute [rw] round
|
18
20
|
# @return [Integer] Aktuelle Rundennummer (von 1 beginnend)
|
19
21
|
attr_accessor :round
|
20
22
|
|
21
|
-
# @!attribute [rw] startColor
|
22
|
-
# @return [Color] Die Farbe, die zuerst legen darf
|
23
|
-
attr_accessor :start_color
|
24
|
-
# @!attribute [rw] current_color_index
|
25
|
-
# @return [Color] Der jetzige Index in der Zug Reihenfolge der Farben.
|
26
|
-
attr_accessor :current_color_index
|
27
|
-
# @!attribute [rw] ordered_colors
|
28
|
-
# @return [Array<Color>] Ein Array aller Farben die ziehen können in
|
29
|
-
# der Reihenfolge in der sie drankommen
|
30
|
-
attr_accessor :ordered_colors
|
31
|
-
|
32
|
-
# @!attribute [r] undeployed_blue_pieces
|
33
|
-
# @return [Array<PieceShape>] Die blauen, nicht gesetzten Spielsteine
|
34
|
-
attr_accessor :undeployed_blue_pieces
|
35
|
-
|
36
|
-
# @!attribute [r] undeployed_yellow_pieces
|
37
|
-
# @return [Array<PieceShape>] Die gelben, nicht gesetzten Spielsteine
|
38
|
-
attr_accessor :undeployed_yellow_pieces
|
39
|
-
|
40
|
-
# @!attribute [r] undeployed_red_pieces
|
41
|
-
# @return [Array<PieceShape>] Die roten, nicht gesetzten Spielsteine
|
42
|
-
attr_accessor :undeployed_red_pieces
|
43
|
-
|
44
|
-
# @!attribute [r] undeployed_green_pieces
|
45
|
-
# @return [Array<PieceShape>] Die grünen, nicht gesetzten Spielsteine
|
46
|
-
attr_accessor :undeployed_green_pieces
|
47
|
-
|
48
23
|
# @!attribute [r] player_one
|
49
24
|
# @return [Player] Der erste Spieler
|
50
25
|
attr_reader :player_one
|
26
|
+
|
51
27
|
# @!attribute [r] player_two
|
52
28
|
# @return [Player] Der zweite Spieler
|
53
29
|
attr_reader :player_two
|
30
|
+
|
31
|
+
# @!attribute [rw] start_team
|
32
|
+
# @return [Team] Der Spieler der zuerst zieht
|
33
|
+
attr_accessor :start_team
|
34
|
+
|
54
35
|
# @!attribute [rw] board
|
55
36
|
# @return [Board] Das aktuelle Spielbrett
|
56
37
|
attr_accessor :board
|
57
|
-
|
58
|
-
# @return [PieceShape] Der Stein, der im ersten Zug von allen Farben gelegt werden muss
|
59
|
-
attr_accessor :start_piece
|
38
|
+
|
60
39
|
# @!attribute [rw] last_move
|
61
40
|
# @return [Move] Der zuletzt gemachte Zug (ist nil vor dem ersten Zug, also
|
62
41
|
# bei turn == 0)
|
63
42
|
attr_accessor :last_move
|
43
|
+
|
64
44
|
# @!attribute [rw] condition
|
65
45
|
# @return [Condition] Gewinner und Gewinngrund, falls das Spiel bereits
|
66
46
|
# entschieden ist, sonst nil.
|
@@ -73,67 +53,37 @@ class GameState
|
|
73
53
|
|
74
54
|
# Erstellt einen neuen leeren Spielstand.
|
75
55
|
def initialize
|
76
|
-
@current_color = Color::RED
|
77
|
-
@start_color = Color::RED
|
78
56
|
@board = Board.new
|
79
57
|
@turn = 0
|
80
|
-
@undeployed_blue_pieces = PieceShape.to_a
|
81
|
-
@undeployed_yellow_pieces = PieceShape.to_a
|
82
|
-
@undeployed_red_pieces = PieceShape.to_a
|
83
|
-
@undeployed_green_pieces = PieceShape.to_a
|
84
|
-
@start_piece = GameRuleLogic.get_random_pentomino
|
85
58
|
end
|
86
59
|
|
87
60
|
# Fügt einen Spieler zum Spielzustand hinzu.
|
88
61
|
#
|
89
62
|
# @param player [Player] Der hinzuzufügende Spieler.
|
90
63
|
def add_player(player)
|
91
|
-
|
64
|
+
case player.color
|
65
|
+
when Color::RED
|
92
66
|
@player_one = player
|
93
|
-
|
67
|
+
when Color::BLUE
|
94
68
|
@player_two = player
|
95
69
|
end
|
96
70
|
end
|
97
71
|
|
98
72
|
# @return [Player] Spieler, der gerade an der Reihe ist.
|
99
73
|
def current_player
|
100
|
-
turn
|
74
|
+
turn.even? ? player_one : player_two
|
101
75
|
end
|
102
76
|
|
103
77
|
# @return [Player] Spieler, der gerade nicht an der Reihe ist.
|
104
78
|
def other_player
|
105
|
-
turn
|
79
|
+
turn.even? ? player_two : player_one
|
106
80
|
end
|
107
81
|
|
108
|
-
# @return [
|
109
|
-
def
|
82
|
+
# @return [Team] Typ des Spielers, der gerade nicht an der Reihe ist.
|
83
|
+
def other_team
|
110
84
|
other_player.type
|
111
85
|
end
|
112
86
|
|
113
|
-
# @return [Color] Farbe, der gerade an der Reihe ist.
|
114
|
-
def current_color
|
115
|
-
ordered_colors[current_color_index]
|
116
|
-
end
|
117
|
-
|
118
|
-
# @return [Array<PieceShape>] Array aller Shapes, der gegebenen Farbe, die noch nicht gelegt wurden
|
119
|
-
def undeployed_pieces(color)
|
120
|
-
case color
|
121
|
-
when Color::RED
|
122
|
-
undeployed_red_pieces
|
123
|
-
when Color::BLUE
|
124
|
-
undeployed_blue_pieces
|
125
|
-
when Color::YELLOW
|
126
|
-
undeployed_yellow_pieces
|
127
|
-
when Color::GREEN
|
128
|
-
undeployed_green_pieces
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
# @return [Array<PieceShape>] Array aller Shapes, der gegebenen Farbe, die schon gelegt wurden
|
133
|
-
def deployed_pieces(color)
|
134
|
-
board.deployed_pieces(color)
|
135
|
-
end
|
136
|
-
|
137
87
|
# @return [Bool] Ob diese gamestate in der ersten Runde ist
|
138
88
|
def is_first_move?
|
139
89
|
round == 1
|
@@ -153,11 +103,6 @@ class GameState
|
|
153
103
|
!condition.nil?
|
154
104
|
end
|
155
105
|
|
156
|
-
# Entfernt die jetzige Farbe aus der Farbrotation
|
157
|
-
def remove_active_color
|
158
|
-
ordered_colors.delete current_color
|
159
|
-
end
|
160
|
-
|
161
106
|
# @return [Player] Der Spieler, der das Spiel gewonnen hat, falls dies schon
|
162
107
|
# entschieden ist. Sonst false.
|
163
108
|
def winner
|
@@ -207,6 +152,6 @@ class GameState
|
|
207
152
|
|
208
153
|
# @return [Array<Field>] Alle Felder mit Blöcken des Spielers, der gerade an der Reihe ist.
|
209
154
|
def own_fields
|
210
|
-
board.fields_of_color(
|
155
|
+
board.fields_of_color(current_player.color)
|
211
156
|
end
|
212
157
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'has_hints'
|
4
|
+
|
5
|
+
# Ein Move repräsentiert eine Bewegung eines Steins auf dem Spielbrett
|
6
|
+
class Move
|
7
|
+
include HasHints
|
8
|
+
|
9
|
+
# @!attribute [r] Koordinaten von dem der Spielstein in diesem Zug wegbewegt wird
|
10
|
+
# @return [Coordinates]
|
11
|
+
attr_reader :from
|
12
|
+
|
13
|
+
# @!attribute [r] Koordinaten zu denen der Spielstein in diesem Zug hinbewegt wird
|
14
|
+
# @return [Coordinates]
|
15
|
+
attr_reader :to
|
16
|
+
|
17
|
+
# Erstellt ein neuen Zug.
|
18
|
+
def initialize(from, to)
|
19
|
+
@from = from
|
20
|
+
@to = to
|
21
|
+
@hints = []
|
22
|
+
end
|
23
|
+
|
24
|
+
def piece(gamestate)
|
25
|
+
gamestate.board.field_at(from).piece
|
26
|
+
end
|
27
|
+
|
28
|
+
def piece_t(gamestate)
|
29
|
+
gamestate.board.field_at(to).piece
|
30
|
+
end
|
31
|
+
|
32
|
+
def ==(other)
|
33
|
+
from == other.from &&
|
34
|
+
to == other.to
|
35
|
+
end
|
36
|
+
|
37
|
+
# @return [String] Gibt die String-Repräsentation zurück
|
38
|
+
def to_s
|
39
|
+
"Move(#{from}->#{to})"
|
40
|
+
end
|
41
|
+
end
|
@@ -2,59 +2,77 @@
|
|
2
2
|
|
3
3
|
# Ein Spielstein mit Ausrichtung, Koordinaten und Farbe
|
4
4
|
class Piece
|
5
|
-
# @!attribute [
|
5
|
+
# @!attribute [rw] Color
|
6
6
|
# @return [Color]
|
7
|
-
|
7
|
+
attr_accessor :color
|
8
8
|
|
9
|
-
# @!attribute [r]
|
10
|
-
# @return [
|
11
|
-
attr_reader :
|
9
|
+
# @!attribute [r] Typ des Spielsteins
|
10
|
+
# @return [PieceType]
|
11
|
+
attr_reader :type
|
12
12
|
|
13
|
-
# @!attribute [
|
14
|
-
# @return [Rotation]
|
15
|
-
attr_reader :rotation
|
16
|
-
|
17
|
-
# @!attribute [r] Ob der Stein an der Y-Achse gespiegelt ist
|
18
|
-
# @return [Boolean]
|
19
|
-
attr_reader :is_flipped
|
20
|
-
|
21
|
-
# @!attribute [r] Koordinaten
|
13
|
+
# @!attribute [rw] Koordinaten
|
22
14
|
# @return [Coordinates]
|
23
|
-
|
15
|
+
attr_accessor :position
|
24
16
|
|
25
|
-
|
17
|
+
# @!attribute [rw] tower_height
|
18
|
+
# @return [Integer] Die Anzahl Spielsteine übereinander inklusive des obersten
|
19
|
+
attr_accessor :height
|
26
20
|
|
27
|
-
# Erstellt einen neuen
|
28
|
-
def initialize(color,
|
21
|
+
# Erstellt einen neuen Spielstein.
|
22
|
+
def initialize(color, type, position = Coordinates.origin, height = 0)
|
29
23
|
@color = color
|
30
|
-
@
|
31
|
-
@rotation = rotation
|
32
|
-
@is_flipped = is_flipped
|
24
|
+
@type = type
|
33
25
|
@position = position
|
26
|
+
@height = height
|
27
|
+
end
|
28
|
+
|
29
|
+
# Berechnet die Koordinaten zu denen sich dieser Spielstein bewegen könnte.
|
30
|
+
#
|
31
|
+
# @return [Array<Coordinates>] Die Zielkoordinaten
|
32
|
+
def target_coords
|
33
|
+
xdir = 0
|
34
|
+
if color == Color::RED
|
35
|
+
xdir = 1
|
36
|
+
else
|
37
|
+
xdir = -1
|
38
|
+
end
|
39
|
+
|
40
|
+
case type
|
41
|
+
when PieceType::Herzmuschel
|
42
|
+
coords = [Coordinates.new(xdir,-1), Coordinates.new(xdir,1)]
|
43
|
+
when PieceType::Moewe
|
44
|
+
coords = [Coordinates.new(1,0), Coordinates.new(-1,0), Coordinates.new(0,1),
|
45
|
+
Coordinates.new(0,-1)]
|
46
|
+
when PieceType::Seestern
|
47
|
+
coords = [Coordinates.new(xdir,0), Coordinates.new(1,1), Coordinates.new(-1,1),
|
48
|
+
Coordinates.new(1,-1), Coordinates.new(-1,-1)]
|
49
|
+
when PieceType::Robbe
|
50
|
+
coords = [Coordinates.new(-1,2), Coordinates.new(1,2), Coordinates.new(-2,1),
|
51
|
+
Coordinates.new(2,1), Coordinates.new(-1,-2), Coordinates.new(1,-2),
|
52
|
+
Coordinates.new(-2,-1), Coordinates.new(2,-1)]
|
53
|
+
end
|
34
54
|
|
35
|
-
|
55
|
+
coords.map{ |x| x + position }.to_a
|
36
56
|
end
|
37
57
|
|
38
58
|
def ==(other)
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
position == other.position
|
59
|
+
!other.nil? &&
|
60
|
+
color == other.color &&
|
61
|
+
position == other.position &&
|
62
|
+
type == other.type
|
44
63
|
end
|
45
64
|
|
65
|
+
# @return [String] Gibt die String-Repräsentation zurück
|
46
66
|
def to_s
|
47
|
-
"#{color.key} #{
|
67
|
+
"#{color.key} #{type.key} at #{position}"
|
48
68
|
end
|
49
69
|
|
50
|
-
|
51
|
-
|
70
|
+
# @return [String] Gibt eine Kurzfassung der String-Repräsentation zurück
|
71
|
+
def to_ss
|
72
|
+
"#{color.key.to_s[0]}#{type.key.to_s[0]}"
|
52
73
|
end
|
53
74
|
|
54
|
-
|
55
|
-
|
56
|
-
kind.transform(@rotation, @is_flipped).transform do |it|
|
57
|
-
Coordinates.new(it.x + @position.x, it.y + @position.y)
|
58
|
-
end.coordinates
|
75
|
+
def inspect
|
76
|
+
to_s
|
59
77
|
end
|
60
78
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'typesafe_enum'
|
4
|
+
|
5
|
+
# Die Spielsteintypen. Herzmuschel, Möwe, Seestern und Robbe
|
6
|
+
class PieceType < TypesafeEnum::Base
|
7
|
+
new :Herzmuschel, 'C'
|
8
|
+
new :Moewe, 'G'
|
9
|
+
new :Seestern, 'S'
|
10
|
+
new :Robbe, 'R'
|
11
|
+
|
12
|
+
# @return [String] Gibt den color namen zurück
|
13
|
+
def to_s
|
14
|
+
self.key.to_s
|
15
|
+
end
|
16
|
+
end
|
@@ -7,16 +7,22 @@ class Player
|
|
7
7
|
# @return [String] der Name des Spielers, hat keine Auswirkungen auf das Spiel
|
8
8
|
attr_reader :name
|
9
9
|
|
10
|
-
# @!attribute [r]
|
11
|
-
# @return [
|
12
|
-
attr_reader :
|
10
|
+
# @!attribute [r] color
|
11
|
+
# @return [Color] erster (Color::RED) oder zweiter (Color::BLUE) Spieler
|
12
|
+
attr_reader :color
|
13
|
+
|
14
|
+
# @!attribute [rw] amber
|
15
|
+
# @return [Integer] Anzahl Bernsteine die dieser Spieler gesammelt hat
|
16
|
+
attr_accessor :amber
|
13
17
|
|
14
18
|
# Konstruktor
|
15
|
-
# @param type [
|
19
|
+
# @param type [Color] Rot oder blau
|
16
20
|
# @param name [String] Name
|
17
|
-
|
18
|
-
|
21
|
+
# @param amber [Integer] Menge des Bernsteins die der Spieler hat
|
22
|
+
def initialize(color, name, amber = 0)
|
23
|
+
@color = color
|
19
24
|
@name = name
|
25
|
+
@amber = amber
|
20
26
|
end
|
21
27
|
|
22
28
|
def ==(other)
|
@@ -2,8 +2,8 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
require 'socket'
|
4
4
|
require_relative 'board'
|
5
|
-
require_relative '
|
6
|
-
require_relative '
|
5
|
+
require_relative 'move'
|
6
|
+
require_relative 'piece_type'
|
7
7
|
require_relative 'player'
|
8
8
|
require_relative 'network'
|
9
9
|
require_relative 'client_interface'
|
@@ -61,33 +61,24 @@ class Protocol
|
|
61
61
|
case name
|
62
62
|
when 'board'
|
63
63
|
logger.debug @gamestate.board.to_s
|
64
|
-
when '
|
65
|
-
|
66
|
-
|
64
|
+
when 'startTeam'
|
65
|
+
@gamestate.add_player(Player.new(Color::RED, "ONE", 0))
|
66
|
+
@gamestate.add_player(Player.new(Color::BLUE, "TWO", 0))
|
67
|
+
if @context[:last_text] == "ONE"
|
68
|
+
@gamestate.start_team = @gamestate.player_one
|
69
|
+
else
|
70
|
+
@gamestate.start_team = @gamestate.player_two
|
67
71
|
end
|
68
|
-
when '
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
@gamestate.undeployed_yellow_pieces << shape
|
78
|
-
when :red_shapes
|
79
|
-
shape = PieceShape.to_a.find {|s| s.key == @context[:last_text].to_sym }
|
80
|
-
@gamestate.undeployed_red_pieces << shape
|
81
|
-
when :green_shapes
|
82
|
-
shape = PieceShape.to_a.find {|s| s.key == @context[:last_text].to_sym }
|
83
|
-
@gamestate.undeployed_green_pieces << shape
|
72
|
+
when 'team'
|
73
|
+
@context[:team] = @context[:last_text]
|
74
|
+
when 'int'
|
75
|
+
if @context[:team] == "ONE"
|
76
|
+
logger.info 'Got player one amber'
|
77
|
+
@gamestate.player_one.amber = @context[:last_text].to_i
|
78
|
+
else
|
79
|
+
logger.info 'Got player two amber'
|
80
|
+
@gamestate.player_two.amber = @context[:last_text].to_i
|
84
81
|
end
|
85
|
-
when 'yellowShapes'
|
86
|
-
|
87
|
-
when 'redShapes'
|
88
|
-
|
89
|
-
when 'greenShapes'
|
90
|
-
|
91
82
|
end
|
92
83
|
end
|
93
84
|
|
@@ -105,7 +96,7 @@ class Protocol
|
|
105
96
|
when 'data'
|
106
97
|
logger.debug "data(class) : #{attrs['class']}"
|
107
98
|
@context[:data_class] = attrs['class']
|
108
|
-
if attrs['class'] == '
|
99
|
+
if attrs['class'] == 'moveRequest'
|
109
100
|
@client.gamestate = gamestate
|
110
101
|
move = @client.move_requested
|
111
102
|
sendString(move_to_xml(move))
|
@@ -122,79 +113,32 @@ class Protocol
|
|
122
113
|
when 'state'
|
123
114
|
logger.debug 'new gamestate'
|
124
115
|
@gamestate = GameState.new
|
125
|
-
@gamestate.current_color_index = attrs['currentColorIndex'].to_i
|
126
116
|
@gamestate.turn = attrs['turn'].to_i
|
127
|
-
@gamestate.round =
|
128
|
-
@gamestate.start_piece = PieceShape.to_a.find {|s| s.key == attrs['startPiece'].to_sym }
|
117
|
+
@gamestate.round = @gamestate.turn / 2
|
129
118
|
logger.debug "Round: #{@gamestate.round}, Turn: #{@gamestate.turn}"
|
130
|
-
when 'first'
|
131
|
-
logger.debug 'new first player'
|
132
|
-
player = Player.new(PlayerType::ONE, attrs['displayName'])
|
133
|
-
@gamestate.add_player(player)
|
134
|
-
@context[:player] = player
|
135
|
-
@context[:color] = :one
|
136
|
-
when 'second'
|
137
|
-
logger.debug 'new second player'
|
138
|
-
player = Player.new(PlayerType::TWO, attrs['displayName'])
|
139
|
-
@gamestate.add_player(player)
|
140
|
-
@context[:player] = player
|
141
|
-
@context[:color] = :two
|
142
|
-
when 'orderedColors'
|
143
|
-
@context[:color] = :ordered_colors
|
144
|
-
@gamestate.ordered_colors = []
|
145
119
|
when 'board'
|
146
120
|
logger.debug 'new board'
|
147
121
|
@gamestate.board = Board.new()
|
148
|
-
when '
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
@gamestate.board.add_field(field)
|
154
|
-
@context[:piece_target] = :field
|
155
|
-
@context[:field] = field
|
156
|
-
when 'blueShapes'
|
157
|
-
@context[:piece_target] = :blue_shapes
|
158
|
-
@gamestate.undeployed_blue_pieces = []
|
159
|
-
when 'yellowShapes'
|
160
|
-
@context[:piece_target] = :yellow_shapes
|
161
|
-
@gamestate.undeployed_yellow_pieces = []
|
162
|
-
when 'redShapes'
|
163
|
-
@context[:piece_target] = :red_shapes
|
164
|
-
@gamestate.undeployed_red_pieces = []
|
165
|
-
when 'greenShapes'
|
166
|
-
@context[:piece_target] = :green_shapes
|
167
|
-
@gamestate.undeployed_green_pieces = []
|
122
|
+
when 'pieces'
|
123
|
+
@context[:entry] = :pieces
|
124
|
+
when 'coordinates'
|
125
|
+
@context[:x] = attrs['x'].to_i
|
126
|
+
@context[:y] = attrs['y'].to_i
|
168
127
|
when 'piece'
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
when :last_move
|
184
|
-
@context[:last_move_piece] = piece
|
185
|
-
else
|
186
|
-
raise "unknown piece target #{@context[:piece_target]}"
|
187
|
-
end
|
188
|
-
when 'lastMove'
|
189
|
-
type = attrs['class']
|
190
|
-
if type == 'skipmove'
|
191
|
-
@gamestate.last_move = SkipMove.new
|
192
|
-
else
|
193
|
-
@context[:last_move_type] = type
|
194
|
-
@context[:piece_target] = :last_move
|
195
|
-
end
|
196
|
-
when 'startColor'
|
197
|
-
@gamestate.start_color = Color::BLUE
|
128
|
+
x = @context[:x]
|
129
|
+
y = @context[:y]
|
130
|
+
team = Team.find_by_key(attrs['team'].to_sym)
|
131
|
+
type = PieceType.find_by_key(attrs['type'].to_sym)
|
132
|
+
count = attrs['count'].to_i
|
133
|
+
field = Field.new(x, y, Piece.new(team.to_c, type, Coordinates.new(x, y), count))
|
134
|
+
@gamestate.board.add_field(field)
|
135
|
+
when 'from'
|
136
|
+
@context[:from] = Coordinates.new(attrs['x'].to_i, attrs['y'].to_i)
|
137
|
+
when 'to'
|
138
|
+
from = @context[:from]
|
139
|
+
@gamestate.last_move = Move.new(Coordinates.new(from.x, from.y), Coordinates.new(attrs['x'].to_i, attrs['y'].to_i))
|
140
|
+
when 'ambers'
|
141
|
+
@context[:entry] = :ambers
|
198
142
|
when 'winner'
|
199
143
|
# TODO
|
200
144
|
# winning_player = parsePlayer(attrs)
|
@@ -238,28 +182,21 @@ class Protocol
|
|
238
182
|
# @param move [Move] The move to convert to XML.
|
239
183
|
def move_to_xml(move)
|
240
184
|
builder = Builder::XmlMarkup.new(indent: 2)
|
185
|
+
|
186
|
+
if move.nil?
|
187
|
+
raise 'nil moves are not sendable!'
|
188
|
+
end
|
189
|
+
|
241
190
|
# Converting every the move here instead of requiring the Move
|
242
191
|
# class interface to supply a method which returns the XML
|
243
192
|
# because XML-generation should be decoupled from internal data
|
244
193
|
# structures.
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
piece.position(x: move.piece.position.x, y: move.piece.position.y)
|
250
|
-
end
|
251
|
-
move.hints.each do |hint|
|
252
|
-
data.hint(content: hint.content)
|
253
|
-
end
|
254
|
-
end
|
255
|
-
when SkipMove
|
256
|
-
builder.data(class: 'sc.plugin2021.SkipMove') do |data|
|
257
|
-
data.color(@gamestate.current_color.key.to_s)
|
258
|
-
move.hints.each do |hint|
|
259
|
-
data.hint(content: hint.content)
|
260
|
-
end
|
261
|
-
end
|
194
|
+
|
195
|
+
builder.data(class: 'move') do |d|
|
196
|
+
d.from(x: move.from.x, y: move.from.y)
|
197
|
+
d.to(x: move.to.x, y: move.to.y)
|
262
198
|
end
|
199
|
+
|
263
200
|
builder.target!
|
264
201
|
end
|
265
202
|
end
|