Skip to content

Commit 47addd1

Browse files
committed
save
1 parent cbbff44 commit 47addd1

File tree

6 files changed

+67
-132
lines changed

6 files changed

+67
-132
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ namespace app {
267267
}
268268

269269
void Application::LoadGameFromFile(model::Game game) {
270-
game_.LoadGameData(std::move(game.GetCommonData()));
270+
game_.LoadGameData(std::move(game.GetCommonData()), game_.GetLootService().GetGeneratorConfig());
271271
game_.SetDefaultDogSpeed(game.GetDefaultDogSpeed());
272272
game_.SetDefaultTickTime(game.GetDefaultTickTime());
273273
}

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

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -252,16 +252,25 @@ namespace app_serialization {
252252
}
253253

254254
[[nodiscard]] std::shared_ptr<player::Player> Restore(const model::SessionService& session_manager) const {
255-
auto dog = std::make_shared<model::Dog>(dog_.Restore());
256-
257-
auto session = session_manager.FindGameSession(game_session_id_);
258-
if (!session) {
259-
throw std::runtime_error("GameSession not found for Player!");
260-
}
255+
auto session = session_manager.FindGameSession(game_session_id_);
256+
if (!session) {
257+
throw std::runtime_error("GameSession not found for Player!");
258+
}
261259

262-
return std::make_shared<player::Player>(dog, session);
260+
// Проверяем, есть ли уже такая собака
261+
auto existing_dog = session->GetDogById(dog_.Restore().GetId());
262+
if (existing_dog) {
263+
return std::make_shared<player::Player>(existing_dog, session);
263264
}
264265

266+
// Если собака отсутствует, создаём её
267+
auto dog = std::make_shared<model::Dog>(dog_.Restore());
268+
session->AddDog(dog);
269+
270+
return std::make_shared<player::Player>(dog, session);
271+
}
272+
273+
265274
private:
266275
serialization::DogSer dog_;
267276
model::GameSession::Id game_session_id_;

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

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -96,14 +96,13 @@ using namespace std::literals;
9696
// Удаляем офис из вектора, если не удалось вставить в unordered_map
9797
offices_.pop_back();
9898
throw;
99-
throw;
10099
}
101100
}
102101

103102
Dog::Dog(State state, std::string name)
104103
: state_(std::move(state))
105104
, name_(std::move(name)) {
106-
state_.id = general_id_++;
105+
general_id_++;
107106
}
108107

109108
Dog::Dog(std::string_view name) : name_(std::string(name)) {
@@ -221,9 +220,11 @@ using namespace std::literals;
221220
return id_;
222221
}
223222

224-
void GameSession::AddDog(std::shared_ptr<Dog> dog) {
223+
void GameSession::AddDog(std::shared_ptr<Dog> dog, bool is_deserialized) {
225224
if (dogs_.count(dog->GetId()) == 0) {
226-
dog->SetRandomPosition(GenerateRandomRoadPosition());
225+
if (!is_deserialized) {
226+
dog->SetRandomPosition(GenerateRandomRoadPosition());
227+
}
227228
dogs_.insert({dog->GetId(), dog});
228229
dogs_vector_.push_back(dog);
229230
}
@@ -382,7 +383,12 @@ using namespace std::literals;
382383
int loot_id = loots_[event.item_id].id;
383384
int loot_type = loots_[event.item_id].type;
384385
player->AddToBag(loot_id, loot_type);
385-
collected_loot_ids.insert(event.item_id);
386+
387+
// std::cerr << "[DEBUG] Player " << event.gatherer_id
388+
// << " collected loot ID: " << loots_[event.item_id].id
389+
// << " (Index: " << event.item_id << ")" << std::endl;
390+
391+
collected_loot_ids.insert(loots_[event.item_id].id);
386392
}
387393
}
388394

@@ -394,9 +400,11 @@ using namespace std::literals;
394400

395401
void GameSession::RemoveCollectedLoot(const std::unordered_set<size_t>& collected_loot_ids) {
396402
std::vector<LostObject> new_loots;
397-
for (size_t i = 0; i < loots_.size(); ++i) {
398-
if (!collected_loot_ids.count(i)) {
399-
new_loots.push_back(loots_[i]);
403+
for (const auto& loot : loots_) {
404+
if (!collected_loot_ids.count(loot.id)) {
405+
new_loots.push_back(loot);
406+
} else {
407+
std::cerr << "[DEBUG] Removing loot ID: " << loot.id << std::endl;
400408
}
401409
}
402410
loots_ = std::move(new_loots);
@@ -564,8 +572,8 @@ using namespace std::literals;
564572
while (loots_.size() < dogs_.size() && count > 0) {
565573
loots_.push_back(
566574
LostObject{.id = lost_object_id_++,
567-
.type = static_cast<uint64_t>(rand() % loot_types_count),
568-
.position = GenerateRandomRoadPosition()}
575+
.type = static_cast<uint64_t>(rand() % loot_types_count),
576+
.position = GenerateRandomRoadPosition()}
569577
);
570578
--count;
571579
}
@@ -602,6 +610,8 @@ using namespace std::literals;
602610
}
603611

604612
void LootService::ConfigureLootGenerator(double period, double probability) {
613+
loot_config_.period = period;
614+
loot_config_.probability = probability;
605615
auto period_in_ms =
606616
std::chrono::milliseconds(static_cast<int>(loot_config_.period * 1000));
607617
loot_gen_ = loot_gen::LootGenerator(period_in_ms, probability);
@@ -634,11 +644,11 @@ using namespace std::literals;
634644
}
635645

636646
void LootService::GenerateLoot(double delta_time) {
637-
unsigned dogs_count = /* session->GetDogs().size() */ 5;
638647
std::chrono::milliseconds interval =
639648
std::chrono::milliseconds(static_cast<int>(delta_time));
640649

641650
for (const auto& session : common_data_->sessions_) {
651+
unsigned dogs_count = session->GetDogs().size();
642652
unsigned loot_count = session->GetLootCount();
643653
int loot_types_count =
644654
common_data_->mapId_to_lootTypes_[session->GetMapId()]->size();

sprint4/problems/leave_game/solution/src/model.h

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,17 +318,29 @@ namespace model {
318318

319319
int GetLootValue(int loot_type) const;
320320

321+
std::shared_ptr<Dog> GetDogById(model::Dog::Id id) {
322+
if (dogs_.count(id)) {
323+
return dogs_[id];
324+
}
325+
326+
return nullptr;
327+
}
328+
321329
uint64_t GetLootCount();
322330
void GenerateLoot(int count, int loot_types_count);
323331

324332
Pos GenerateRandomRoadPosition();
325333

334+
void LootRecovery(LostObjects loot) {
335+
loots_ = std::move(loot);
336+
}
337+
326338
std::vector<collision_detector::Gatherer>
327339
GetGatherers(double delta_time) const;
328340
std::vector<collision_detector::Item>
329341
GetItems() const;
330342

331-
void AddDog(std::shared_ptr<Dog> dog);
343+
void AddDog(std::shared_ptr<Dog> dog, bool is_deserialized = false);
332344

333345
bool HasDog(Dog::Id id);
334346

@@ -476,6 +488,8 @@ namespace model {
476488

477489
void ConfigureLootGenerator(double period, double probability);
478490

491+
loot_gen::LootGeneratorConfig GetGeneratorConfig() const { return loot_config_; }
492+
479493
const CommonData::MapLootTypes& GetLootTypes() {
480494
return common_data_->mapId_to_lootTypes_;
481495
}
@@ -514,18 +528,20 @@ namespace model {
514528
, engine_(session_service_, loot_service_) {
515529
}
516530

531+
loot_gen::LootGeneratorConfig GetGeneratorConfig() const { return loot_service_->GetGeneratorConfig(); }
517532
double GetDefaultDogSpeed() const;
518533
double GetDefaultTickTime() const { return default_tick_time_; }
519534
CommonData& GetCommonData() const { return *common_data_; }
520535

521536
void SetDefaultTickTime(double delta_time);
522537
void SetDefaultDogSpeed(double default_speed);
523538

524-
void LoadGameData(CommonData data) {
539+
void LoadGameData(CommonData data, loot_gen::LootGeneratorConfig config) {
525540
common_data_ = std::make_shared<CommonData>(std::move(data));
526541
map_service_ = MapService(common_data_);
527542
session_service_ = std::make_shared<SessionService>((common_data_));
528543
loot_service_ = std::make_shared<LootService>(common_data_);
544+
loot_service_->ConfigureLootGenerator(config.period, config.probability);
529545
engine_ = GameEngine(session_service_, loot_service_);
530546
}
531547

sprint4/problems/leave_game/solution/src/model_serialization.h

Lines changed: 8 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22

3+
#include "loot_generator.h"
34
#include "model.h"
45
#include "player.h"
56
// #include "application.h"
@@ -310,10 +311,12 @@ namespace serialization {
310311

311312
model::GameSession session(data.maps_[map_index], lootId_to_value_);
312313

314+
session.LootRecovery(std::move(lost_objects_));
315+
313316
for (const auto& dog_ser_ptr : dogs_vector_) {
314317
auto dog = std::make_shared<model::Dog>(dog_ser_ptr->Restore());
315318
dog->SetDefaultDogSpeed(session.GetMapDefaultSpeed());
316-
session.AddDog(dog);
319+
session.AddDog(dog, true);
317320
}
318321

319322
return session;
@@ -420,7 +423,8 @@ namespace serialization {
420423
explicit GameSer(const model::Game& game)
421424
: serialized_data_(game.GetCommonData())
422425
, default_dog_speed_(game.GetDefaultDogSpeed())
423-
, default_tick_time_(game.GetDefaultTickTime()) {
426+
, default_tick_time_(game.GetDefaultTickTime())
427+
, config(game.GetGeneratorConfig()) {
424428
}
425429

426430
template <typename Archive>
@@ -433,7 +437,7 @@ namespace serialization {
433437
[[nodiscard]] model::Game Restore() const {
434438
model::Game game;
435439

436-
game.LoadGameData(std::move(serialized_data_.Restore()));
440+
game.LoadGameData(std::move(serialized_data_.Restore()), config);
437441
game.SetDefaultDogSpeed(default_dog_speed_);
438442
game.SetDefaultTickTime(default_tick_time_);
439443

@@ -445,109 +449,7 @@ namespace serialization {
445449

446450
double default_dog_speed_ = 1.0;
447451
double default_tick_time_ = 0;
452+
loot_gen::LootGeneratorConfig config;
448453
};
449454

450455
} // namespace serialization
451-
452-
// namespace app_serialization {
453-
// class PlayerSer {
454-
// public:
455-
// PlayerSer() = default;
456-
457-
// PlayerSer(const player::Player& player)
458-
// : dog_(serialization::DogSer(*player.GetDog()))
459-
// , game_session_id_(player.GetGameSession()->GetSessionId()) { // Сохраняем только ID сессии
460-
// }
461-
462-
// template <typename Archive>
463-
// void serialize(Archive& ar, [[maybe_unused]] const unsigned version) {
464-
// ar & dog_;
465-
// ar & game_session_id_;
466-
// }
467-
468-
// [[nodiscard]] std::shared_ptr<player::Player> Restore(model::CommonData& data) const {
469-
// auto dog = std::make_shared<model::Dog>(dog_.Restore());
470-
471-
// // Ищем сессию по ID
472-
// auto session_it = data.game_sessions_id_to_index_.find(game_session_id_);
473-
// if (session_it == data.game_sessions_id_to_index_.end()) {
474-
// throw std::runtime_error("GameSession not found for Player!");
475-
// }
476-
477-
// std::shared_ptr<model::GameSession> session = data.sessions_[session_it->second];
478-
479-
// return std::make_shared<player::Player>(dog, session);
480-
// }
481-
482-
// private:
483-
// serialization::DogSer dog_;
484-
// model::GameSession::Id game_session_id_;
485-
// };
486-
487-
// class PlayerTokensSer {
488-
// public:
489-
// PlayerTokensSer() = default;
490-
491-
// explicit PlayerTokensSer(const app::PlayerTokens& player_tokens) {
492-
// for (const auto& [token, player] : player_tokens.GetTokenMap()) {
493-
// tokens_.emplace_back(token, player->GetDogId());
494-
// }
495-
// }
496-
497-
// template <typename Archive>
498-
// void serialize(Archive& ar, [[maybe_unused]] const unsigned version) {
499-
// ar & tokens_;
500-
// }
501-
502-
// [[nodiscard]] std::unordered_map<app::Token, std::shared_ptr<player::Player>, util::TaggedHasher<app::Token>>
503-
// Restore(const app::Players& players) const {
504-
// std::unordered_map<app::Token, std::shared_ptr<player::Player>, util::TaggedHasher<app::Token>> restored_tokens;
505-
506-
// for (const auto& [token, dog_id] : tokens_) {
507-
// auto player = players.FindPlayerByDogId(model::Dog::Id(dog_id));
508-
// if (player) {
509-
// restored_tokens[token] = player;
510-
// }
511-
// }
512-
513-
// return restored_tokens;
514-
// }
515-
516-
// private:
517-
// std::vector<std::pair<app::Token, uint64_t>> tokens_;
518-
// };
519-
520-
// class PlayersSer {
521-
// public:
522-
// PlayersSer() = default;
523-
524-
// explicit PlayersSer(const app::Players& players) {
525-
// for (const auto& [dog_id, player] : players.GetPlayers()) {
526-
// players_.emplace_back(*player);
527-
// dog_ids_.push_back(dog_id);
528-
// }
529-
// }
530-
531-
// template <typename Archive>
532-
// void serialize(Archive& ar, [[maybe_unused]] const unsigned version) {
533-
// ar & players_;
534-
// ar & dog_ids_;
535-
// }
536-
537-
// [[nodiscard]] app::Players&& Restore(model::CommonData& data) const {
538-
// app::Players players;
539-
// for (size_t i = 0; i < players_.size(); ++i) {
540-
// auto player = players_[i].Restore(data);
541-
// model::Dog::Id dog_id = model::Dog::Id(dog_ids_[i]);
542-
// players.Add(player->GetDog(), player->GetGameSession());
543-
// }
544-
545-
// return std::move(players);
546-
// }
547-
548-
// private:
549-
// std::vector<PlayerSer> players_;
550-
// std::vector<uint64_t> dog_ids_;
551-
// };
552-
// }
553-
Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
22 serialization::archive 19 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 4 map3 5 Map 3 3 0 0 9 0 0 0 0 0 2 2 2 16 12 7 12 0 20 0 20 14 14 16 14 14 8 7 8 14 2 7 20 7 12 0 20 0 20 14 8 14 2 16 14 16 0 0 5 0 0 0 0 0 4 2 0 0 6 3 14 2 4 3 4 9 2 5 9 9 4 3 14 9 4 3 0 0 1 0 0 0 0 0 2 o1 8 14 0 0 1 -1 3.00000000000000000e+00 0 0 2 13 0 0 0 1 30 0 10 0 0 0 0 0 0 2 1 0 1 23 1 0
2-
0 3 Dog 0 0 0 0 1.39791884675845299e+01 1.62408010691067339e+01 0 0 0.00000000000000000e+00 0.00000000000000000e+00 0 30 0 0 0 0 0 3.00000000000000000e+00 23
3-
1 4 Dog5 1.42586802635381567e+01 1.37719257690703714e+01 0.00000000000000000e+00 0.00000000000000000e+00 2 0 1 0 0 3.00000000000000000e+00 0 0 1 13 0 0 0 0 0 0 0 3 13 0 0 0 4 map1 0 0 2 0 107 {"name":"key","file":"assets/key.obj","type":"obj","rotation":90,"color":"#338844","scale":3E-2,"value":10} 112 {"name":"wallet","file":"assets/wallet.obj","type":"obj","rotation":0,"color":"#883344","scale":1E-2,"value":30} 4 town 2 0 107 {"name":"key","file":"assets/key.obj","type":"obj","rotation":90,"color":"#338844","scale":3E-2,"value":10} 107 {"name":"key","file":"assets/key.obj","type":"obj","rotation":90,"color":"#338844","scale":3E-2,"value":10} 4 map3 2 0 107 {"name":"key","file":"assets/key.obj","type":"obj","rotation":90,"color":"#338844","scale":3E-2,"value":10} 112 {"name":"wallet","file":"assets/wallet.obj","type":"obj","rotation":0,"color":"#883344","scale":1E-2,"value":30} 0 0 1 13 0 0 0 4 map3 0 0 0 3 0 4 map1 5 Map 1 3 4 0 0 0 40 0 40 0 40 30 40 30 0 30 0 0 0 30 1 0 5 5 30 20 1 0 2 o0 40 30 5 0 4.00000000000000000e+00 4 town 4 Town 3 22 0 0 0 40 0 40 0 40 30 40 30 0 30 0 15 40 15 20 0 20 30 0 22 17 22 17 18 17 27 10 22 10 30 0 10 10 10 10 10 10 5 10 5 20 5 20 30 20 40 20 40 10 40 20 40 30 40 30 0 30 10 20 25 25 25 30 25 30 30 20 20 25 20 30 15 30 20 35 20 40 20 40 25 35 25 30 30 30 35 20 0 2 2 6 6 12 7 6 6 22 2 6 11 32 2 6 11 22 16 4 3 33 16 4 3 34 21 4 3 22 21 4 3 22 26 5 3 34 26 5 3 28 21 4 3 2 16 5 5 9 16 6 3 12 24 3 4 2 24 6 4 12 1 7 2 11 34 4 4 22 31 6 2 22 35 6 4 17 41 7 4 1 0 2 o0 40 30 5 0 3.00000000000000000e+00 4 map3 5 Map 3 3 9 0 2 2 2 16 12 7 12 0 20 0 20 14 14 16 14 14 8 7 8 14 2 7 20 7 12 0 20 0 20 14 8 14 2 16 14 16 5 0 4 2 6 3 14 2 4 3 4 9 2 5 9 9 4 3 14 9 4 3 1 0 2 o1 8 14 1 -1 3.00000000000000000e+00 3 13 0 4 map3 2 4 town 1 4 map1 0 3.00000000000000000e+00 1.00000000000000000e+01 0 0 0 0 2 0 0 0
4-
2 3 Dog 1.44170412189628578e+01 1.39410907069293817e+01 -3.00000000000000000e+00 0.00000000000000000e+00 2 30 3 0 0 3.00000000000000000e+00 0
5-
3 4 Dog5 7.75992984175232081e+00 1.13827659963986640e+01 0.00000000000000000e+00 0.00000000000000000e+00 2 0 2 0 0 3.00000000000000000e+00 0 2 0 2 0 3 0 2 0 3 2
1+
22 serialization::archive 19 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 4 map3 5 Map 3 3 0 0 9 0 0 0 0 0 2 2 2 16 12 7 12 0 20 0 20 14 14 16 14 14 8 7 8 14 2 7 20 7 12 0 20 0 20 14 8 14 2 16 14 16 0 0 5 0 0 0 0 0 4 2 0 0 6 3 14 2 4 3 4 9 2 5 9 9 4 3 14 9 4 3 0 0 1 0 0 0 0 0 2 o1 8 14 0 0 1 -1 3.00000000000000000e+00 0 0 2 13 0 0 0 1 30 0 10 0 0 1 0 0 0 5 1 0 0 2.02079585744990844e+01 8.56505581570221275e-01 0 0 1 1 0 1 25 1 0
2+
0 3 Dog 0 0 9.81999999999996476e+00 1.37809999999998816e+01 0 0 0.00000000000000000e+00 0.00000000000000000e+00 3 130 0 0 0 0 0 3.00000000000000000e+00 0 0 1 13 0 0 0 0 0 0 0 3 13 0 0 0 4 map1 0 0 2 0 107 {"name":"key","file":"assets/key.obj","type":"obj","rotation":90,"color":"#338844","scale":3E-2,"value":10} 112 {"name":"wallet","file":"assets/wallet.obj","type":"obj","rotation":0,"color":"#883344","scale":1E-2,"value":30} 4 town 2 0 107 {"name":"key","file":"assets/key.obj","type":"obj","rotation":90,"color":"#338844","scale":3E-2,"value":10} 107 {"name":"key","file":"assets/key.obj","type":"obj","rotation":90,"color":"#338844","scale":3E-2,"value":10} 4 map3 2 0 107 {"name":"key","file":"assets/key.obj","type":"obj","rotation":90,"color":"#338844","scale":3E-2,"value":10} 112 {"name":"wallet","file":"assets/wallet.obj","type":"obj","rotation":0,"color":"#883344","scale":1E-2,"value":30} 0 0 1 13 0 0 0 4 map3 0 0 0 3 0 4 map1 5 Map 1 3 4 0 0 0 40 0 40 0 40 30 40 30 0 30 0 0 0 30 1 0 5 5 30 20 1 0 2 o0 40 30 5 0 4.00000000000000000e+00 4 town 4 Town 3 22 0 0 0 40 0 40 0 40 30 40 30 0 30 0 15 40 15 20 0 20 30 0 22 17 22 17 18 17 27 10 22 10 30 0 10 10 10 10 10 10 5 10 5 20 5 20 30 20 40 20 40 10 40 20 40 30 40 30 0 30 10 20 25 25 25 30 25 30 30 20 20 25 20 30 15 30 20 35 20 40 20 40 25 35 25 30 30 30 35 20 0 2 2 6 6 12 7 6 6 22 2 6 11 32 2 6 11 22 16 4 3 33 16 4 3 34 21 4 3 22 21 4 3 22 26 5 3 34 26 5 3 28 21 4 3 2 16 5 5 9 16 6 3 12 24 3 4 2 24 6 4 12 1 7 2 11 34 4 4 22 31 6 2 22 35 6 4 17 41 7 4 1 0 2 o0 40 30 5 0 3.00000000000000000e+00 4 map3 5 Map 3 3 9 0 2 2 2 16 12 7 12 0 20 0 20 14 14 16 14 14 8 7 8 14 2 7 20 7 12 0 20 0 20 14 8 14 2 16 14 16 5 0 4 2 6 3 14 2 4 3 4 9 2 5 9 9 4 3 14 9 4 3 1 0 2 o1 8 14 1 -1 3.00000000000000000e+00 3 13 0 4 map3 2 4 town 1 4 map1 0 3.00000000000000000e+00 1.00000000000000000e+01 0 0 0 0 1 0 0 0
3+
1 3 Dog 9.81999999999996476e+00 1.37809999999998816e+01 0.00000000000000000e+00 0.00000000000000000e+00 3 130 0 0 0 3.00000000000000000e+00 0 1 0 1 0 1 0 0

0 commit comments

Comments
 (0)