49
75
GameServer::~GameServer()
77
//say goodbye to all participants
78
for (std::list<Participant *>::iterator i = participants.begin(),
79
end = participants.end(); i != end; ++i)
80
network_server->send((*i)->conn, MESSAGE_TYPE_SERVER_DISCONNECT, "bye");
51
82
for (std::list<Participant *>::iterator i = participants.begin(),
52
83
end = participants.end(); i != end; ++i)
56
void GameServer::start()
85
players_seated_locally.clear();
88
bool GameServer::isListening()
90
if (network_server.get() != NULL)
91
return network_server->isListening();
96
void GameServer::start(GameScenario *game_scenario, int port, std::string nick)
98
setGameScenario(game_scenario);
101
if (network_server.get() != NULL && network_server->isListening())
58
103
network_server.reset(new NetworkServer());
59
network_server->got_message.connect(
60
sigc::mem_fun(this, &GameServer::onGotMessage));
61
network_server->connection_lost.connect(
62
sigc::mem_fun(this, &GameServer::onConnectionLost));
104
network_server->got_message.connect
105
(sigc::mem_fun(this, &GameServer::onGotMessage));
106
network_server->connection_lost.connect
107
(sigc::mem_fun(this, &GameServer::onConnectionLost));
108
network_server->connection_made.connect
109
(sigc::mem_fun(this, &GameServer::onConnectionMade));
65
111
network_server->startListening(port);
113
listenForLocalEvents(Playerlist::getInstance()->getNeutral());
116
void GameServer::checkRoundOver()
118
bool all_finished = true;
119
for (std::list<Participant *>::iterator i = participants.begin(),
120
end = participants.end(); i != end; ++i)
122
if ((*i)->round_finished == false)
124
all_finished = false;
131
printf ("hooray! we're all done the round.\n");
132
for (std::list<Participant *>::iterator i = participants.begin(),
133
end = participants.end(); i != end; ++i)
134
(*i)->round_finished = false;
136
//now we can send the start round message, and begin the round ourselves.
137
for (std::list<Participant *>::iterator i = participants.begin(),
138
end = participants.end(); i != end; ++i)
139
network_server->send((*i)->conn, MESSAGE_TYPE_ROUND_START, "");
145
void GameServer::gotRoundOver(void *conn)
147
Participant *part = findParticipantByConn(conn);
150
//mark the participant as finished for this round
151
part->round_finished = true;
152
//are all participants finished?
158
void GameServer::gotChat(void *conn, std::string message)
160
Participant *part = findParticipantByConn(conn);
163
gotChatMessage(part->nickname, message);
164
for (std::list<Participant *>::iterator i = participants.begin(),
165
end = participants.end(); i != end; ++i)
167
//if ((*i)->conn != part->conn)
168
//network_server->send((*i)->conn, MESSAGE_TYPE_CHATTED,
169
//part->nickname + ":" + message);
171
network_server->send((*i)->conn, MESSAGE_TYPE_CHATTED,
71
178
void GameServer::onGotMessage(void *conn, MessageType type, std::string payload)
73
180
std::cerr << "got message of type " << type << std::endl;
83
190
case MESSAGE_TYPE_SENDING_ACTIONS:
84
gotActions(conn, payload);
191
gotRemoteActions(conn, payload);
87
case MESSAGE_TYPE_JOIN:
91
194
case MESSAGE_TYPE_SENDING_MAP:
92
195
// should never occur
95
198
case MESSAGE_TYPE_SENDING_HISTORY:
96
gotHistory(conn, payload);
199
gotRemoteHistory(conn, payload);
202
case MESSAGE_TYPE_PARTICIPANT_CONNECT:
206
case MESSAGE_TYPE_REQUEST_SEAT_MANIFEST:
208
sendChatRoster(conn);
211
case MESSAGE_TYPE_P1_SIT:
212
sit(conn, Playerlist::getInstance()->getPlayer(0), payload);
215
case MESSAGE_TYPE_P2_SIT:
216
sit(conn, Playerlist::getInstance()->getPlayer(1), payload);
219
case MESSAGE_TYPE_P3_SIT:
220
sit(conn, Playerlist::getInstance()->getPlayer(2), payload);
223
case MESSAGE_TYPE_P4_SIT:
224
sit(conn, Playerlist::getInstance()->getPlayer(3), payload);
227
case MESSAGE_TYPE_P5_SIT:
228
sit(conn, Playerlist::getInstance()->getPlayer(4), payload);
231
case MESSAGE_TYPE_P6_SIT:
232
sit(conn, Playerlist::getInstance()->getPlayer(5), payload);
235
case MESSAGE_TYPE_P7_SIT:
236
sit(conn, Playerlist::getInstance()->getPlayer(6), payload);
239
case MESSAGE_TYPE_P8_SIT:
240
sit(conn, Playerlist::getInstance()->getPlayer(7), payload);
243
case MESSAGE_TYPE_P1_STAND:
244
stand(conn, Playerlist::getInstance()->getPlayer(0), payload);
247
case MESSAGE_TYPE_P2_STAND:
248
stand(conn, Playerlist::getInstance()->getPlayer(1), payload);
251
case MESSAGE_TYPE_P3_STAND:
252
stand(conn, Playerlist::getInstance()->getPlayer(2), payload);
255
case MESSAGE_TYPE_P4_STAND:
256
stand(conn, Playerlist::getInstance()->getPlayer(3), payload);
259
case MESSAGE_TYPE_P5_STAND:
260
stand(conn, Playerlist::getInstance()->getPlayer(4), payload);
263
case MESSAGE_TYPE_P6_STAND:
264
stand(conn, Playerlist::getInstance()->getPlayer(5), payload);
267
case MESSAGE_TYPE_P7_STAND:
268
stand(conn, Playerlist::getInstance()->getPlayer(6), payload);
271
case MESSAGE_TYPE_P8_STAND:
272
stand(conn, Playerlist::getInstance()->getPlayer(7), payload);
275
case MESSAGE_TYPE_PARTICIPANT_DISCONNECT:
279
case MESSAGE_TYPE_PARTICIPANT_CONNECTED:
282
case MESSAGE_TYPE_CHAT:
283
gotChat(conn, payload);
286
case MESSAGE_TYPE_ROUND_OVER:
291
case MESSAGE_TYPE_PARTICIPANT_DISCONNECTED:
294
case MESSAGE_TYPE_P1_SAT_DOWN:
295
case MESSAGE_TYPE_P2_SAT_DOWN:
296
case MESSAGE_TYPE_P3_SAT_DOWN:
297
case MESSAGE_TYPE_P4_SAT_DOWN:
298
case MESSAGE_TYPE_P5_SAT_DOWN:
299
case MESSAGE_TYPE_P6_SAT_DOWN:
300
case MESSAGE_TYPE_P7_SAT_DOWN:
301
case MESSAGE_TYPE_P8_SAT_DOWN:
302
case MESSAGE_TYPE_P1_STOOD_UP:
303
case MESSAGE_TYPE_P2_STOOD_UP:
304
case MESSAGE_TYPE_P3_STOOD_UP:
305
case MESSAGE_TYPE_P4_STOOD_UP:
306
case MESSAGE_TYPE_P5_STOOD_UP:
307
case MESSAGE_TYPE_P6_STOOD_UP:
308
case MESSAGE_TYPE_P7_STOOD_UP:
309
case MESSAGE_TYPE_P8_STOOD_UP:
310
case MESSAGE_TYPE_SERVER_DISCONNECT:
311
case MESSAGE_TYPE_CHATTED:
312
case MESSAGE_TYPE_TURN_ORDER:
313
case MESSAGE_TYPE_KILL_PLAYER:
314
case MESSAGE_TYPE_ROUND_START:
320
void GameServer::onConnectionMade(void *conn)
322
remote_participant_connected.emit();
102
325
void GameServer::onConnectionLost(void *conn)
104
327
std::cerr << "connection lost" << std::endl;
106
329
Participant *part = findParticipantByConn(conn);
108
participants.remove(part);
332
std::list<Uint32> players_to_stand = part->players;
335
participants.remove(part);
336
for (std::list<Uint32>::iterator it = players_to_stand.begin();
337
it != players_to_stand.end(); it++)
338
notifyStand(Playerlist::getInstance()->getPlayer(*it), d_nickname);
339
remote_participant_disconnected.emit();
112
344
Participant *GameServer::findParticipantByConn(void *conn)
114
346
for (std::list<Participant *>::iterator i = participants.begin(),
115
end = participants.end(); i != end; ++i)
347
end = participants.end(); i != end; ++i)
116
348
if ((*i)->conn == conn)
122
void GameServer::listenForActions()
124
Playerlist *pl = Playerlist::getInstance();
125
for (Playerlist::iterator i = pl->begin(); i != pl->end(); ++i)
126
(*i)->acting.connect(sigc::mem_fun(this, &GameServer::onActionDone));
129
void GameServer::listenForHistories()
131
Playerlist *pl = Playerlist::getInstance();
132
for (Playerlist::iterator i = pl->begin(); i != pl->end(); ++i)
133
(*i)->history_written.connect(sigc::mem_fun(this, &GameServer::onHistoryDone));
136
354
void GameServer::onActionDone(NetworkAction *action)
138
356
std::string desc = action->toString();
139
357
std::cerr << "Game Server got " << desc <<"\n";
359
if (action->getAction()->getType() == Action::END_TURN)
360
local_player_moved(action->getOwner());
361
if (action->getAction()->getType() == Action::INIT_TURN)
362
local_player_starts_move(action->getOwner());
141
364
for (std::list<Participant *>::iterator i = participants.begin(),
142
end = participants.end(); i != end; ++i) {
143
(*i)->actions.push_back(action);
145
(*i)->actions.clear();
365
end = participants.end(); i != end; ++i)
367
(*i)->actions.push_back(action);
369
clearNetworkActionlist((*i)->actions);
151
374
void GameServer::onHistoryDone(NetworkHistory *history)
153
376
std::string desc = history->toString();
154
377
std::cerr << "Game Server got " << desc <<"\n";
156
for (std::list<Participant *>::iterator i = participants.begin(),
157
end = participants.end(); i != end; ++i) {
158
(*i)->histories.push_back(history);
160
(*i)->histories.clear();
166
void GameServer::join(void *conn)
379
if (history->getHistory()->getType() == History::PLAYER_VANQUISHED)
380
local_player_died(history->getOwner());
382
for (std::list<Participant *>::iterator i = participants.begin(),
383
end = participants.end(); i != end; ++i)
385
(*i)->histories.push_back(history);
387
clearNetworkHistorylist((*i)->histories);
391
void GameServer::notifyJoin(std::string nickname)
393
remote_participant_joins.emit(nickname);
394
for (std::list<Participant *>::iterator i = participants.begin(),
395
end = participants.end(); i != end; ++i)
397
network_server->send((*i)->conn, MESSAGE_TYPE_PARTICIPANT_CONNECTED,
399
//network_server->send((*i)->conn, MESSAGE_TYPE_CHATTED,
400
//nickname + " connected.");
402
gotChatMessage("[server]", nickname + " connected.");
405
void GameServer::notifyDepart(void *conn, std::string nickname)
407
remote_participant_departs.emit(nickname);
408
for (std::list<Participant *>::iterator i = participants.begin(),
409
end = participants.end(); i != end; ++i)
411
if ((*i)->conn == conn)
413
network_server->send((*i)->conn, MESSAGE_TYPE_PARTICIPANT_DISCONNECTED,
415
network_server->send((*i)->conn, MESSAGE_TYPE_CHATTED,
416
nickname + " disconnected.");
418
gotChatMessage("", nickname + " disconnected.");
421
void GameServer::notifySit(Player *player, std::string nickname)
425
player_sits.emit(player, nickname);
427
switch (player->getId())
429
case 0: type = MESSAGE_TYPE_P1_SAT_DOWN; break;
430
case 1: type = MESSAGE_TYPE_P2_SAT_DOWN; break;
431
case 2: type = MESSAGE_TYPE_P3_SAT_DOWN; break;
432
case 3: type = MESSAGE_TYPE_P4_SAT_DOWN; break;
433
case 4: type = MESSAGE_TYPE_P5_SAT_DOWN; break;
434
case 5: type = MESSAGE_TYPE_P6_SAT_DOWN; break;
435
case 6: type = MESSAGE_TYPE_P7_SAT_DOWN; break;
436
case 7: type = MESSAGE_TYPE_P8_SAT_DOWN; break;
441
for (std::list<Participant *>::iterator i = participants.begin(),
442
end = participants.end(); i != end; ++i)
444
network_server->send((*i)->conn, type, nickname);
445
network_server->send((*i)->conn, MESSAGE_TYPE_CHATTED,
446
nickname + " assumes control of " +
447
player->getName() +".");
449
gotChatMessage("", nickname + " assumes control of " +
450
player->getName() +".");
453
void GameServer::join(void *conn, std::string nickname)
455
bool new_participant = false;
168
456
std::cout << "JOIN: " << conn << std::endl;
170
458
Participant *part = findParticipantByConn(conn);
172
460
part = new Participant;
173
461
part->conn = conn;
462
part->nickname = nickname;
175
463
participants.push_back(part);
464
new_participant = true;
181
void GameServer::gotActions(void *conn, const std::string &payload)
185
void GameServer::gotHistory(void *conn, const std::string &payload)
471
notifyJoin(nickname);
474
void GameServer::depart(void *conn)
476
std::cout << "DEPART: " << conn << std::endl;
478
Participant *part = findParticipantByConn(conn);
480
notifyDepart(conn, part->nickname);
481
//we don't delete the participant, it gets deleted when it disconnects.
482
//see onConnectionLost
485
bool GameServer::player_already_sitting(Player *p)
487
//check if the player p is already sitting down as a participant.
488
for (std::list<Participant *>::iterator i = participants.begin(),
489
end = participants.end(); i != end; ++i)
491
for (std::list<Uint32>::iterator j = (*i)->players.begin();
492
j != (*i)->players.end(); j++)
494
if (p->getId() == *j)
501
void GameServer::sit(void *conn, Player *player, std::string nickname)
503
std::cout << "SIT: " << conn << " " << player << std::endl;
505
if (!player || !conn)
507
Participant *part = findParticipantByConn(conn);
511
//fixme: is another player already sitting here?
512
if (player_already_sitting(player) == true)
515
add_to_player_list(part->players, player->getId());
518
dynamic_cast<NetworkPlayer*>(player)->setConnected(true);
520
notifySit(player, nickname);
523
void GameServer::notifyStand(Player *player, std::string nickname)
527
player_stands.emit(player, nickname);
529
switch (player->getId())
531
case 0: type = MESSAGE_TYPE_P1_STOOD_UP; break;
532
case 1: type = MESSAGE_TYPE_P2_STOOD_UP; break;
533
case 2: type = MESSAGE_TYPE_P3_STOOD_UP; break;
534
case 3: type = MESSAGE_TYPE_P4_STOOD_UP; break;
535
case 4: type = MESSAGE_TYPE_P5_STOOD_UP; break;
536
case 5: type = MESSAGE_TYPE_P6_STOOD_UP; break;
537
case 6: type = MESSAGE_TYPE_P7_STOOD_UP; break;
538
case 7: type = MESSAGE_TYPE_P8_STOOD_UP; break;
543
for (std::list<Participant *>::iterator i = participants.begin(),
544
end = participants.end(); i != end; ++i)
546
network_server->send((*i)->conn, type, nickname);
547
network_server->send((*i)->conn, MESSAGE_TYPE_CHATTED,
548
nickname + " relinquishes control of " +
549
player->getName() +".");
551
gotChatMessage("", nickname + " relinquishes control of " +
552
player->getName() +".");
556
GameServer::add_to_player_list(std::list<Uint32> &list, Uint32 id)
559
for (std::list<Uint32>::iterator i = list.begin(); i != list.end(); i++)
573
GameServer::remove_from_player_list(std::list<Uint32> &list, Uint32 id)
575
//remove player id from part.
576
for (std::list<Uint32>::iterator i = list.begin();
577
i != list.end(); i++)
588
void GameServer::stand(void *conn, Player *player, std::string nickname)
590
std::cout << "STAND: " << conn << " " << player << std::endl;
591
if (!player || !conn)
594
Participant *part = findParticipantByConn(conn);
598
//remove player id from part.
599
bool found = remove_from_player_list (part->players, player->getId());
602
//okay somebody's trying to boot another player.
605
if (player && player->getType() == Player::NETWORKED)
606
dynamic_cast<NetworkPlayer*>(player)->setConnected(false);
607
notifyStand(player, nickname);
610
void GameServer::gotRemoteActions(void *conn, const std::string &payload)
613
for (std::list<Participant *>::iterator i = participants.begin(),
614
end = participants.end(); i != end; ++i)
615
if ((*i)->conn != conn)
616
network_server->send((*i)->conn, MESSAGE_TYPE_SENDING_ACTIONS, payload);
619
void GameServer::gotRemoteHistory(void *conn, const std::string &payload)
621
gotHistories(payload);
622
for (std::list<Participant *>::iterator i = participants.begin(),
623
end = participants.end(); i != end; ++i)
624
if ((*i)->conn != conn)
625
network_server->send((*i)->conn, MESSAGE_TYPE_SENDING_HISTORY, payload);
189
628
void GameServer::sendMap(Participant *part)
191
630
Playerlist *pl = Playerlist::getInstance();
193
632
// first hack the players so the player type we serialize is right
194
std::vector<Uint32> player_types;
195
for (Playerlist::iterator i = pl->begin(); i != pl->end(); ++i) {
196
player_types.push_back((*i)->getType());
197
(*i)->setType(Player::NETWORKED);
633
std::vector<Player*> players;
634
for (Playerlist::iterator i = pl->begin(); i != pl->end(); ++i)
636
bool connected = false;
637
players.push_back(*i);
638
if ((*i)->getType() == Player::AI_FAST ||
639
(*i)->getType() == Player::AI_SMART ||
640
(*i)->getType() == Player::AI_DUMMY)
642
NetworkPlayer *new_p = new NetworkPlayer(**i);
643
new_p->setConnected(connected);
202
649
std::ostringstream os;
203
650
XML_Helper helper(&os);
204
Game::getScenario()->saveWithHelper(helper);
651
d_game_scenario->saveWithHelper(helper);
205
652
std::cerr << "sending map" << std::endl;
206
653
network_server->send(part->conn, MESSAGE_TYPE_SENDING_MAP, os.str());
209
655
// unhack the players
210
std::vector<Uint32>::iterator j = player_types.begin();
211
for (Playerlist::iterator i = pl->begin(); i != pl->end(); ++i, ++j) {
212
(*i)->setType(Player::Type(*j));
656
std::vector<Player*>::iterator j = players.begin();
657
for (Playerlist::iterator i = pl->begin(); i != pl->end(); ++i, ++j)
216
664
void GameServer::sendActions(Participant *part)
221
669
helper.begin("1");
222
670
helper.openTag("actions");
224
672
for (std::list<NetworkAction *>::iterator i = part->actions.begin(),
225
end = part->actions.end(); i != end; ++i)
673
end = part->actions.end(); i != end; ++i)
226
674
(**i).save(&helper);
228
676
helper.closeTag();
230
678
std::cerr << "sending actions" << std::endl;
231
679
network_server->send(part->conn, MESSAGE_TYPE_SENDING_ACTIONS, os.str());
234
void GameServer::sendHistory(Participant *part)
682
void GameServer::sendHistories(Participant *part)
236
684
std::ostringstream os;
237
685
XML_Helper helper(&os);
239
687
helper.begin("1");
240
688
helper.openTag("histories");
242
690
for (std::list<NetworkHistory *>::iterator i = part->histories.begin(),
243
end = part->histories.end(); i != end; ++i)
691
end = part->histories.end(); i != end; ++i)
244
692
(**i).save(&helper);
246
694
helper.closeTag();
248
696
std::cerr << "sending histories" << std::endl;
249
697
network_server->send(part->conn, MESSAGE_TYPE_SENDING_HISTORY, os.str());
700
bool GameServer::dumpActionsAndHistories(XML_Helper *helper, Player *player)
702
Participant *part = NULL;
703
for (std::list<Participant *>::iterator i = participants.begin(),
704
end = participants.end(); i != end; ++i)
707
for (std::list<Uint32>::iterator it = (*i)->players.begin();
708
it != (*i)->players.end(); it++)
710
if (*it == player->getId())
725
for (std::list<NetworkHistory *>::iterator i = part->histories.begin(),
726
end = part->histories.end(); i != end; ++i)
728
for (std::list<NetworkAction *>::iterator i = part->actions.begin(),
729
end = part->actions.end(); i != end; ++i)
734
bool GameServer::dumpActionsAndHistories(XML_Helper *helper)
736
Player *player = Playerlist::getActiveplayer();
737
return dumpActionsAndHistories(helper, player);
740
void GameServer::sit_down (Player *player)
744
if (player->getType() == Player::NETWORKED)
746
//alright, we want to sit down as this player
747
//convert the network player to a human player
748
dynamic_cast<NetworkPlayer*>(player)->setConnected(true);
749
RealPlayer *new_p = new RealPlayer (*player);
750
Playerlist::getInstance()->swap(player, new_p);
751
stopListeningForLocalEvents(player);
752
listenForLocalEvents(new_p);
754
add_to_player_list (players_seated_locally, new_p->getId());
755
notifySit(new_p, d_nickname);
757
else if (player->getType() == Player::HUMAN)
763
stopListeningForLocalEvents(player);
764
listenForLocalEvents(player);
765
add_to_player_list (players_seated_locally, player->getId());
766
notifySit(player, d_nickname);
770
void GameServer::stand_up (Player *player)
774
if (player->getType() == Player::HUMAN)
776
//alright, we want to stand up as this player
777
//convert the player from a human player back to a network player
779
NetworkPlayer *new_p = new NetworkPlayer(*player);
780
Playerlist::getInstance()->swap(player, new_p);
781
stopListeningForLocalEvents(player);
783
new_p->setConnected(false);
784
notifyStand(new_p, d_nickname);
785
remove_from_player_list (players_seated_locally, new_p->getId());
787
else if (player->getType() == Player::NETWORKED)
793
stopListeningForLocalEvents(player);
794
remove_from_player_list (players_seated_locally, player->getId());
795
notifyStand(player, d_nickname);
799
void GameServer::chat (std::string message)
801
notifyChat(d_nickname + ":" + message);
804
void GameServer::notifyChat(std::string message)
806
gotChatMessage(d_nickname, message);
807
for (std::list<Participant *>::iterator i = participants.begin(),
808
end = participants.end(); i != end; ++i)
809
network_server->send((*i)->conn, MESSAGE_TYPE_CHATTED, message);
812
void GameServer::sendSeats(void *conn)
814
Participant *part = findParticipantByConn(conn);
817
//send seatedness info for remote participants
819
for (std::list<Participant *>::iterator i = participants.begin(),
820
end = participants.end(); i != end; ++i)
822
if ((*i)->conn == part->conn)
825
for (std::list<Uint32>::iterator j = (*i)->players.begin();
826
j != (*i)->players.end(); j++)
828
Player *player = Playerlist::getInstance()->getPlayer(*j);
830
switch (player->getId())
832
case 0: type = MESSAGE_TYPE_P1_SAT_DOWN; break;
833
case 1: type = MESSAGE_TYPE_P2_SAT_DOWN; break;
834
case 2: type = MESSAGE_TYPE_P3_SAT_DOWN; break;
835
case 3: type = MESSAGE_TYPE_P4_SAT_DOWN; break;
836
case 4: type = MESSAGE_TYPE_P5_SAT_DOWN; break;
837
case 5: type = MESSAGE_TYPE_P6_SAT_DOWN; break;
838
case 6: type = MESSAGE_TYPE_P7_SAT_DOWN; break;
839
case 7: type = MESSAGE_TYPE_P8_SAT_DOWN; break;
843
network_server->send(part->conn, type, (*i)->nickname);
846
//send out seatedness info for local server
847
for (std::list<Uint32>::iterator j = players_seated_locally.begin();
848
j != players_seated_locally.end(); j++)
850
Player *player = Playerlist::getInstance()->getPlayer(*j);
852
switch (player->getId())
854
case 0: type = MESSAGE_TYPE_P1_SAT_DOWN; break;
855
case 1: type = MESSAGE_TYPE_P2_SAT_DOWN; break;
856
case 2: type = MESSAGE_TYPE_P3_SAT_DOWN; break;
857
case 3: type = MESSAGE_TYPE_P4_SAT_DOWN; break;
858
case 4: type = MESSAGE_TYPE_P5_SAT_DOWN; break;
859
case 5: type = MESSAGE_TYPE_P6_SAT_DOWN; break;
860
case 6: type = MESSAGE_TYPE_P7_SAT_DOWN; break;
861
case 7: type = MESSAGE_TYPE_P8_SAT_DOWN; break;
865
network_server->send(part->conn, type, d_nickname);
869
void GameServer::sendChatRoster(void *conn)
871
Participant *part = findParticipantByConn(conn);
874
for (std::list<Participant *>::iterator i = participants.begin(),
875
end = participants.end(); i != end; ++i)
877
if ((*i)->conn == part->conn)
879
network_server->send(part->conn, MESSAGE_TYPE_PARTICIPANT_CONNECTED,
882
network_server->send(part->conn, MESSAGE_TYPE_PARTICIPANT_CONNECTED,
886
void GameServer::sendKillPlayer(Player *p)
888
std::stringstream player;
889
player << p->getId();
890
for (std::list<Participant *>::iterator i = participants.begin(),
891
end = participants.end(); i != end; ++i)
892
network_server->send((*i)->conn, MESSAGE_TYPE_KILL_PLAYER, player.str());
894
remote_player_died.emit(p);
897
void GameServer::sendTurnOrder()
899
std::stringstream players;
900
Playerlist *pl = Playerlist::getInstance();
901
for (Playerlist::iterator it = pl->begin(); it != pl->end(); it++)
902
players << (*it)->getId() << " ";
903
for (std::list<Participant *>::iterator i = participants.begin(),
904
end = participants.end(); i != end; ++i)
905
network_server->send((*i)->conn, MESSAGE_TYPE_TURN_ORDER, players.str());
906
playerlist_reorder_received.emit();