@@ -38,7 +38,7 @@ namespace app {
38
38
return Token{token};
39
39
}
40
40
41
- std::shared_ptr<Player ::Player> PlayerTokens::FindPlayerByToken (const Token& token) const {
41
+ std::shared_ptr<player ::Player> PlayerTokens::FindPlayerByToken (const Token& token) const {
42
42
auto player = token_to_player_.find (token);
43
43
if (player != token_to_player_.end ())
44
44
return player->second ;
@@ -66,7 +66,7 @@ namespace app {
66
66
return pi;
67
67
}
68
68
69
- Application::PlayerInfo Application::ChangePlayerSession (std::shared_ptr<Player ::Player> player,
69
+ Application::PlayerInfo Application::ChangePlayerSession (std::shared_ptr<player ::Player> player,
70
70
std::shared_ptr<model::GameSession> session) {
71
71
RemovePlayerFromSession (player);
72
72
@@ -92,21 +92,34 @@ namespace app {
92
92
return CreateNewPlayer (player_name, session);
93
93
}
94
94
95
- Token Players::FindTokenByPlayer (std::shared_ptr<Player::Player> player) {
95
+ Players::PlayerNameToPlayerId Players::GetPlayerNamesToId () const {
96
+ PlayerNameToPlayerId data;
97
+ for (const auto & [pair, player] : players_) {
98
+ data[player->GetDogName ()] = player->GetDogId ();
99
+ }
100
+
101
+ return data;
102
+ }
103
+
104
+ Token Players::FindTokenByPlayer (std::shared_ptr<player::Player> player) {
96
105
return player_tokens_.FindTokenByPlayer (player);
97
106
}
98
107
99
- Token Application::FindTokenByPlayer (std::shared_ptr<Player ::Player> player) {
108
+ Token Application::FindTokenByPlayer (std::shared_ptr<player ::Player> player) {
100
109
return players_.FindTokenByPlayer (player);
101
110
}
102
111
103
- /* std::shared_ptr<Player::Player>
104
- Application::FindExistingPlayer(model::Dog::Id dog_id,
105
- model::Map::Id map_id) {
106
- return players_.FindByDogAndMapId(dog_id, map_id);
107
- } */
112
+ Token PlayerTokens::FindTokenByPlayer (std::shared_ptr<player::Player> player) const {
113
+ for (const auto & [token, stored_player] : token_to_player_) {
114
+ if (stored_player->GetDogName () == player->GetDogName ()) {
115
+ return token;
116
+ }
117
+ }
118
+
119
+ return {};
120
+ }
108
121
109
- void Application::RemovePlayerFromSession (std::shared_ptr<Player ::Player> player) {
122
+ void Application::RemovePlayerFromSession (std::shared_ptr<player ::Player> player) {
110
123
auto player_session = player->GetGameSession ();
111
124
player_session->RemoveDog (player->GetDogId ());
112
125
players_.Remove (player->GetDogId (), player_session->GetMapId ());
@@ -127,17 +140,11 @@ namespace app {
127
140
return pi;
128
141
}
129
142
130
- std::shared_ptr<Player ::Player> Players::GetPlayerByToken (const Token& token) const {
143
+ std::shared_ptr<player ::Player> Players::GetPlayerByToken (const Token& token) const {
131
144
return player_tokens_.FindPlayerByToken (token);
132
145
}
133
146
134
- /* std::shared_ptr<Player::Player> Players::FindByDogAndMapId(model::Dog::Id dog_id,
135
- model::Map::Id map_id) {
136
- auto it = players_.find({dog_id, *map_id});
137
- return it != players_.end() ? it->second : nullptr;
138
- } */
139
-
140
- Token PlayerTokens::AddPlayer (std::shared_ptr<Player::Player> player) {
147
+ Token PlayerTokens::AddPlayer (std::shared_ptr<player::Player> player) {
141
148
Token token = GenerateToken ();
142
149
token_to_player_[token] = player;
143
150
@@ -146,13 +153,24 @@ namespace app {
146
153
147
154
Token Players::Add (std::shared_ptr<model::Dog> dog,
148
155
std::shared_ptr<model::GameSession> game_session) {
149
- std::shared_ptr<Player ::Player> player = std::make_shared<Player ::Player>(dog, game_session);
156
+ std::shared_ptr<player ::Player> player = std::make_shared<player ::Player>(dog, game_session);
150
157
Token token = player_tokens_.AddPlayer (player);
151
158
players_[{dog->GetId (), *(game_session->GetMapId ())}] = player;
152
159
153
160
return token;
154
161
}
155
162
163
+ std::optional<Token> Players::FindPlayerByName (const std::string& name) const {
164
+ std::optional<Token> result;
165
+ for (const auto & [personal_data, player] : players_) {
166
+ if (player->GetDogName () == name) {
167
+ result.emplace (player_tokens_.FindTokenByPlayer (player));
168
+ }
169
+ }
170
+
171
+ return result;
172
+ }
173
+
156
174
void Players::Remove (model::Dog::Id dog_id, model::Map::Id map_id) {
157
175
auto it = players_.find ({dog_id, *map_id});
158
176
auto token = FindTokenByPlayer (it->second );
@@ -184,19 +202,20 @@ namespace app {
184
202
}
185
203
186
204
const std::string Application::GetSerializedPlayersList (const Token& token) const {
187
- std::vector<std::string> names = GetPlayersList (token);
188
205
boost::json::object players_json;
189
-
190
- int index = 0 ;
191
- for (const auto & player_name : names) {
192
- players_json[std::to_string (index)] = boost::json::object{{" name" , player_name}};
193
- index++;
206
+
207
+ auto player = players_.GetPlayerByToken (token);
208
+ if (!player) return boost::json::serialize (players_json); // Если игрока нет, возвращаем пустой JSON
209
+
210
+ for (const auto & [dog_name, dog_id] : players_.GetPlayerNamesToId ()) {
211
+ players_json[std::to_string (dog_id)] = boost::json::object{
212
+ {" name" , dog_name}
213
+ };
194
214
}
195
215
196
216
return boost::json::serialize (players_json);
197
217
}
198
218
199
-
200
219
bool Application::HasPlayerToken (Token token) const {
201
220
auto player = players_.GetPlayerByToken (app::Token{token});
202
221
@@ -217,6 +236,16 @@ namespace app {
217
236
player->MovePlayer (direction);
218
237
}
219
238
239
+ void Application::LoadGameFromFile (model::Game game) {
240
+ game_.LoadGameData (std::move (game.GetCommonData ()));
241
+ game_.SetDefaultDogSpeed (game.GetDefaultDogSpeed ());
242
+ game_.SetDefaultTickTime (game.GetDefaultTickTime ());
243
+ }
244
+
245
+ void Application::LoadGameFromFilie () {
246
+ listener_->LoadStateFromFile ();
247
+ }
248
+
220
249
void Application::Tick (milliseconds delta_time) const {
221
250
game_.GetEngine ().Tick (delta_time);
222
251
@@ -250,7 +279,8 @@ void SerializingListener::SaveStateToFile() {
250
279
try {
251
280
boost::archive::text_oarchive oa{ss};
252
281
GameSer serialized_game = app_.SerializeGame ();
253
- oa << serialized_game;
282
+ auto players_ser = app_.SerializePlayers ();
283
+ oa << serialized_game << players_ser;
254
284
255
285
std::string temp_file = state_file_ + " .tmp" ;
256
286
{
@@ -277,9 +307,12 @@ void SerializingListener::LoadStateFromFile() {
277
307
278
308
boost::archive::text_iarchive ia{ifs};
279
309
GameSer serialized_game;
280
- ia >> serialized_game;
310
+ app_serialization::PlayersSer players;
311
+ ia >> serialized_game >> players;
281
312
282
313
app_.LoadGameFromFile (std::move (serialized_game.Restore ()));
314
+ // app_.FindGameSession(model::Map::Id map_id)
315
+ app_.LoadPlayersFromFile (std::move (*players.Restore (app_.GetSessionService ())));
283
316
284
317
std::cout << " Game state restored from " << state_file_ << std::endl;
285
318
} catch (const std::exception& e) {
0 commit comments