Skip to content

Commit 4a0f65d

Browse files
committed
fix
1 parent e218380 commit 4a0f65d

File tree

11 files changed

+440
-131
lines changed

11 files changed

+440
-131
lines changed

sprint4/problems/leave_game/solution/data/config.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"name": "Map 1",
1313
"lootTypes": [
1414
{
15-
"name": "key",
15+
"name": "key",
1616
"file": "assets/key.obj",
1717
"type": "obj",
1818
"rotation": 90,

sprint4/problems/leave_game/solution/src/application.cpp

Lines changed: 61 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ namespace app {
3838
return Token{token};
3939
}
4040

41-
std::shared_ptr<Player::Player> PlayerTokens::FindPlayerByToken(const Token& token) const {
41+
std::shared_ptr<player::Player> PlayerTokens::FindPlayerByToken(const Token& token) const {
4242
auto player = token_to_player_.find(token);
4343
if (player != token_to_player_.end())
4444
return player->second;
@@ -66,7 +66,7 @@ namespace app {
6666
return pi;
6767
}
6868

69-
Application::PlayerInfo Application::ChangePlayerSession(std::shared_ptr<Player::Player> player,
69+
Application::PlayerInfo Application::ChangePlayerSession(std::shared_ptr<player::Player> player,
7070
std::shared_ptr<model::GameSession> session) {
7171
RemovePlayerFromSession(player);
7272

@@ -92,21 +92,34 @@ namespace app {
9292
return CreateNewPlayer(player_name, session);
9393
}
9494

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) {
96105
return player_tokens_.FindTokenByPlayer(player);
97106
}
98107

99-
Token Application::FindTokenByPlayer(std::shared_ptr<Player::Player> player) {
108+
Token Application::FindTokenByPlayer(std::shared_ptr<player::Player> player) {
100109
return players_.FindTokenByPlayer(player);
101110
}
102111

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+
}
108121

109-
void Application::RemovePlayerFromSession(std::shared_ptr<Player::Player> player) {
122+
void Application::RemovePlayerFromSession(std::shared_ptr<player::Player> player) {
110123
auto player_session = player->GetGameSession();
111124
player_session->RemoveDog(player->GetDogId());
112125
players_.Remove(player->GetDogId(), player_session->GetMapId());
@@ -127,17 +140,11 @@ namespace app {
127140
return pi;
128141
}
129142

130-
std::shared_ptr<Player::Player> Players::GetPlayerByToken(const Token& token) const {
143+
std::shared_ptr<player::Player> Players::GetPlayerByToken(const Token& token) const {
131144
return player_tokens_.FindPlayerByToken(token);
132145
}
133146

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) {
141148
Token token = GenerateToken();
142149
token_to_player_[token] = player;
143150

@@ -146,13 +153,24 @@ namespace app {
146153

147154
Token Players::Add(std::shared_ptr<model::Dog> dog,
148155
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);
150157
Token token = player_tokens_.AddPlayer(player);
151158
players_[{dog->GetId(), *(game_session->GetMapId())}] = player;
152159

153160
return token;
154161
}
155162

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+
156174
void Players::Remove(model::Dog::Id dog_id, model::Map::Id map_id) {
157175
auto it = players_.find({dog_id, *map_id});
158176
auto token = FindTokenByPlayer(it->second);
@@ -184,19 +202,20 @@ namespace app {
184202
}
185203

186204
const std::string Application::GetSerializedPlayersList(const Token& token) const {
187-
std::vector<std::string> names = GetPlayersList(token);
188205
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+
};
194214
}
195215

196216
return boost::json::serialize(players_json);
197217
}
198218

199-
200219
bool Application::HasPlayerToken(Token token) const {
201220
auto player = players_.GetPlayerByToken(app::Token{token});
202221

@@ -217,6 +236,16 @@ namespace app {
217236
player->MovePlayer(direction);
218237
}
219238

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+
220249
void Application::Tick(milliseconds delta_time) const {
221250
game_.GetEngine().Tick(delta_time);
222251

@@ -250,7 +279,8 @@ void SerializingListener::SaveStateToFile() {
250279
try {
251280
boost::archive::text_oarchive oa{ss};
252281
GameSer serialized_game = app_.SerializeGame();
253-
oa << serialized_game;
282+
auto players_ser = app_.SerializePlayers();
283+
oa << serialized_game << players_ser;
254284

255285
std::string temp_file = state_file_ + ".tmp";
256286
{
@@ -277,9 +307,12 @@ void SerializingListener::LoadStateFromFile() {
277307

278308
boost::archive::text_iarchive ia{ifs};
279309
GameSer serialized_game;
280-
ia >> serialized_game;
310+
app_serialization::PlayersSer players;
311+
ia >> serialized_game >> players;
281312

282313
app_.LoadGameFromFile(std::move(serialized_game.Restore()));
314+
// app_.FindGameSession(model::Map::Id map_id)
315+
app_.LoadPlayersFromFile(std::move(*players.Restore(app_.GetSessionService())));
283316

284317
std::cout << "Game state restored from " << state_file_ << std::endl;
285318
} catch (const std::exception& e) {

0 commit comments

Comments
 (0)