fixed problem where restarting a network game...

...after already playing one doesn't work properly
This commit is contained in:
Dave White 2003-10-12 09:23:59 +00:00
parent 608d14311b
commit 3a7d0ad85f
6 changed files with 65 additions and 19 deletions

View File

@ -57,6 +57,9 @@ connection_acceptor::connection_acceptor(config& players)
positions_[*i] = 0; positions_[*i] = 0;
} }
} }
//if we have any connected players when we are created, send them the data
network::send_data(players_);
} }
int connection_acceptor::do_action() int connection_acceptor::do_action()
@ -157,8 +160,7 @@ int connection_acceptor::do_action()
<< "\n"; << "\n";
} }
} else { } else {
std::cerr << "tried to take unknown side: " << side_taken std::cerr << "tried to take unknown side: " << side_taken << "\n";
<< "\n";
} }
return CONNECTIONS_PART_FILLED; return CONNECTIONS_PART_FILLED;
@ -211,9 +213,11 @@ bool accept_network_connections(display& disp, config& players)
} }
void play_multiplayer(display& disp, game_data& units_data, config& cfg, void play_multiplayer(display& disp, game_data& units_data, config cfg,
game_state& state) game_state& state, bool server)
{ {
log_scope("play multiplayer");
std::vector<std::string> options; std::vector<std::string> options;
std::vector<config*>& levels = cfg.children["multiplayer"]; std::vector<config*>& levels = cfg.children["multiplayer"];
for(std::vector<config*>::iterator i = levels.begin(); i!=levels.end();++i){ for(std::vector<config*>::iterator i = levels.begin(); i!=levels.end();++i){
@ -325,7 +329,7 @@ void play_multiplayer(display& disp, game_data& units_data, config& cfg,
} }
const network::manager net_manager; const network::manager net_manager;
const network::server_manager server_man; const network::server_manager server_man(15000,server);
const bool network_state = accept_network_connections(disp,level); const bool network_state = accept_network_connections(disp,level);
if(network_state == false) if(network_state == false)

View File

@ -23,6 +23,6 @@ void play_multiplayer_client(display& disp, game_data& units_data,
config& cfg, game_state& state); config& cfg, game_state& state);
void play_multiplayer(display& disp, game_data& units_data, void play_multiplayer(display& disp, game_data& units_data,
config& cfg, game_state& state); config cfg, game_state& state, bool server=true);
#endif #endif

View File

@ -1,4 +1,5 @@
#include "language.hpp" #include "language.hpp"
#include "log.hpp"
#include "multiplayer.hpp" #include "multiplayer.hpp"
#include "multiplayer_client.hpp" #include "multiplayer_client.hpp"
#include "playlevel.hpp" #include "playlevel.hpp"
@ -51,7 +52,19 @@ GAME_LIST_RESULT manage_game_list(display& disp, const config* gamelist)
if(res == gamelist_manager::UPDATED_GAMELIST) { if(res == gamelist_manager::UPDATED_GAMELIST) {
gamelist = manager.get_gamelist(); gamelist = manager.get_gamelist();
} else if(res == 0) { } else if(res == 0) {
return CREATE_GAME; std::string name;
const int res = gui::show_dialog(disp,NULL,"","Name your game:",
gui::OK_CANCEL,NULL,NULL,"Name:",&name);
if(res == 0) {
config response;
config create_game;
create_game["name"] = name;
response.children["create_game"].push_back(
new config(create_game));
network::send_data(response);
return CREATE_GAME;
}
} else if(size_t(res) == options.size()-1) { } else if(size_t(res) == options.size()-1) {
return QUIT_GAME; return QUIT_GAME;
} else if(res > 0 && size_t(res) < options.size()) { } else if(res > 0 && size_t(res) < options.size()) {
@ -77,6 +90,8 @@ GAME_LIST_RESULT manage_game_list(display& disp, const config* gamelist)
void play_multiplayer_client(display& disp, game_data& units_data, config& cfg, void play_multiplayer_client(display& disp, game_data& units_data, config& cfg,
game_state& state) game_state& state)
{ {
log_scope("playing multiplayer client");
const network::manager net_manager; const network::manager net_manager;
std::string host; std::string host;
@ -103,13 +118,17 @@ void play_multiplayer_client(display& disp, game_data& units_data, config& cfg,
if(gamelist != NULL) { if(gamelist != NULL) {
const GAME_LIST_RESULT res = manage_game_list(disp,gamelist); const GAME_LIST_RESULT res = manage_game_list(disp,gamelist);
switch(res) { switch(res) {
case QUIT_GAME: case QUIT_GAME: {
return; return;
case CREATE_GAME: }
play_multiplayer(disp,units_data,cfg,state); case CREATE_GAME: {
std::cerr << "playing multiplayer...\n";
play_multiplayer(disp,units_data,cfg,state,false);
return; return;
case JOIN_GAME: }
case JOIN_GAME: {
break; break;
}
} }
for(;;) { for(;;) {

View File

@ -21,8 +21,14 @@ TCPsocket server_socket;
namespace network { namespace network {
manager::manager() manager::manager() : free_(true)
{ {
//if the network is already being managed
if(socket_set) {
free_ = false;
return;
}
if(SDLNet_Init() == -1) { if(SDLNet_Init() == -1) {
throw error(SDL_GetError()); throw error(SDL_GetError());
} }
@ -34,20 +40,23 @@ manager::~manager()
{ {
disconnect(); disconnect();
SDLNet_FreeSocketSet(socket_set); SDLNet_FreeSocketSet(socket_set);
socket_set = 0;
SDLNet_Quit(); SDLNet_Quit();
} }
server_manager::server_manager(int port, bool create_server) server_manager::server_manager(int port, bool create_server)
: free_(false)
{ {
if(create_server) { if(create_server && !server_socket) {
server_socket = connect("",port); server_socket = connect("",port);
std::cerr << "server socket initialized: " << server_socket << "\n"; std::cerr << "server socket initialized: " << server_socket << "\n";
free_ = true;
} }
} }
server_manager::~server_manager() server_manager::~server_manager()
{ {
if(server_socket) { if(free_) {
SDLNet_TCP_Close(server_socket); SDLNet_TCP_Close(server_socket);
server_socket = 0; server_socket = 0;
} }
@ -89,7 +98,9 @@ connection connect(const std::string& host, int port)
connection accept_connection() connection accept_connection()
{ {
assert(server_socket); if(!server_socket)
return 0;
const connection sock = SDLNet_TCP_Accept(server_socket); const connection sock = SDLNet_TCP_Accept(server_socket);
if(sock) { if(sock) {
const int res = SDLNet_TCP_AddSocket(socket_set,sock); const int res = SDLNet_TCP_AddSocket(socket_set,sock);
@ -124,6 +135,11 @@ void disconnect(connection s)
sockets.erase(i); sockets.erase(i);
SDLNet_TCP_DelSocket(socket_set,s); SDLNet_TCP_DelSocket(socket_set,s);
SDLNet_TCP_Close(s); SDLNet_TCP_Close(s);
} else {
std::cerr << "Could not find socket to close: " << (int)s << "\n";
if(sockets.size() == 1) {
std::cerr << "valid socket: " << (int)*sockets.begin() << "\n";
}
} }
} }
@ -164,6 +180,7 @@ connection receive_data(config& cfg, connection connection_num, int timeout)
} }
if(buffer == "") { if(buffer == "") {
std::cerr << "error receiving data: " << (int)*i << "\n";
throw error("error receiving data",*i); throw error("error receiving data",*i);
} }
@ -195,7 +212,7 @@ connection receive_data(config& cfg, connection connection_num, int timeout)
return 0; return 0;
} }
void send_data(config& cfg, connection connection_num) void send_data(const config& cfg, connection connection_num)
{ {
log_scope("sending data"); log_scope("sending data");
if(!connection_num) { if(!connection_num) {

View File

@ -12,11 +12,17 @@ namespace network {
struct manager { struct manager {
manager(); manager();
~manager(); ~manager();
private:
bool free_;
}; };
struct server_manager { struct server_manager {
server_manager(int port=15000, bool create_server=true); server_manager(int port=15000, bool create_server=true);
~server_manager(); ~server_manager();
private:
bool free_;
}; };
typedef TCPsocket connection; typedef TCPsocket connection;
@ -29,11 +35,12 @@ void disconnect(connection connection_num=0);
connection receive_data(config& cfg, connection connection_num=0, int tout=0); connection receive_data(config& cfg, connection connection_num=0, int tout=0);
void send_data(config& cfg, connection connection_num=0); void send_data(const config& cfg, connection connection_num=0);
struct error struct error
{ {
error(const std::string& msg, connection sock=0) : message(msg) {} error(const std::string& msg, connection sock=0)
: message(msg), socket(sock) {}
std::string message; std::string message;
connection socket; connection socket;

View File

@ -344,7 +344,6 @@ void show_preferences_dialog(display& disp)
bool redraw_all = true; bool redraw_all = true;
for(;;) { for(;;) {
log_scope("looping");
int mousex, mousey; int mousex, mousey;
const int mouse_flags = SDL_GetMouseState(&mousex,&mousey); const int mouse_flags = SDL_GetMouseState(&mousex,&mousey);