1 #include "server_response_containers.h"
2
3 #include "server_game.h"
4
5 #include <google/protobuf/descriptor.h>
6
GameEventStorageItem(const::google::protobuf::Message & _event,int _playerId,EventRecipients _recipients)7 GameEventStorageItem::GameEventStorageItem(const ::google::protobuf::Message &_event,
8 int _playerId,
9 EventRecipients _recipients)
10 : event(new GameEvent), recipients(_recipients)
11 {
12 event->GetReflection()->MutableMessage(event, _event.GetDescriptor()->FindExtensionByName("ext"))->CopyFrom(_event);
13 event->set_player_id(_playerId);
14 }
15
~GameEventStorageItem()16 GameEventStorageItem::~GameEventStorageItem()
17 {
18 delete event;
19 }
20
GameEventStorage()21 GameEventStorage::GameEventStorage() : gameEventContext(0), privatePlayerId(0)
22 {
23 }
24
~GameEventStorage()25 GameEventStorage::~GameEventStorage()
26 {
27 delete gameEventContext;
28 for (int i = 0; i < gameEventList.size(); ++i)
29 delete gameEventList[i];
30 }
31
setGameEventContext(const::google::protobuf::Message & _gameEventContext)32 void GameEventStorage::setGameEventContext(const ::google::protobuf::Message &_gameEventContext)
33 {
34 delete gameEventContext;
35 gameEventContext = new GameEventContext;
36 gameEventContext->GetReflection()
37 ->MutableMessage(gameEventContext, _gameEventContext.GetDescriptor()->FindExtensionByName("ext"))
38 ->CopyFrom(_gameEventContext);
39 }
40
enqueueGameEvent(const::google::protobuf::Message & event,int playerId,GameEventStorageItem::EventRecipients recipients,int _privatePlayerId)41 void GameEventStorage::enqueueGameEvent(const ::google::protobuf::Message &event,
42 int playerId,
43 GameEventStorageItem::EventRecipients recipients,
44 int _privatePlayerId)
45 {
46 gameEventList.append(new GameEventStorageItem(event, playerId, recipients));
47 if (_privatePlayerId != -1)
48 privatePlayerId = _privatePlayerId;
49 }
50
sendToGame(Server_Game * game)51 void GameEventStorage::sendToGame(Server_Game *game)
52 {
53 if (gameEventList.isEmpty())
54 return;
55
56 GameEventContainer *contPrivate = new GameEventContainer;
57 GameEventContainer *contOthers = new GameEventContainer;
58 if (forcedByJudge != -1) {
59 contPrivate->set_forced_by_judge(forcedByJudge);
60 contOthers->set_forced_by_judge(forcedByJudge);
61 }
62 for (int i = 0; i < gameEventList.size(); ++i) {
63 const GameEvent &event = gameEventList[i]->getGameEvent();
64 const GameEventStorageItem::EventRecipients recipients = gameEventList[i]->getRecipients();
65 if (recipients.testFlag(GameEventStorageItem::SendToPrivate))
66 contPrivate->add_event_list()->CopyFrom(event);
67 if (recipients.testFlag(GameEventStorageItem::SendToOthers))
68 contOthers->add_event_list()->CopyFrom(event);
69 }
70 if (gameEventContext) {
71 contPrivate->mutable_context()->CopyFrom(*gameEventContext);
72 contOthers->mutable_context()->CopyFrom(*gameEventContext);
73 }
74 game->sendGameEventContainer(contPrivate, GameEventStorageItem::SendToPrivate, privatePlayerId);
75 game->sendGameEventContainer(contOthers, GameEventStorageItem::SendToOthers, privatePlayerId);
76 }
77
ResponseContainer(int _cmdId)78 ResponseContainer::ResponseContainer(int _cmdId) : cmdId(_cmdId), responseExtension(0)
79 {
80 }
81
~ResponseContainer()82 ResponseContainer::~ResponseContainer()
83 {
84 delete responseExtension;
85 for (int i = 0; i < preResponseQueue.size(); ++i)
86 delete preResponseQueue[i].second;
87 for (int i = 0; i < postResponseQueue.size(); ++i)
88 delete postResponseQueue[i].second;
89 }
90