(svn r106) New network core (by sign_de)

Features:
* network core is dynamicly loaded when needed (-n isn't needed anymore) 
  for easy switching between single and multiplayer. But commandline 
  shortcuts are still enabled:
   -n = autodetect network server
   -n [ip] = connect to the server
* udp now uses 2 different ports
  - you can run 1 server and serveral clients on one pc
  - the clients udp-socket gets unloaded when the
    network game starts
  - the servers udp-sockets remains online to allow the
    network gui to detect itself
* new gameinfo structure
  this struct is available for every online/lan game
* dynamic NetworkGameList
This commit is contained in:
dominik
2004-08-22 10:23:37 +00:00
parent b2340212c3
commit 0bd907e88d
9 changed files with 691 additions and 278 deletions

57
ttd.c
View File

@@ -484,6 +484,7 @@ int ttd_main(int argc, char* argv[])
uint startdate = -1;
_ignore_wrong_grf = false;
musicdriver[0] = sounddriver[0] = videodriver[0] = 0;
_networking_override=false;
_game_mode = GM_MENU;
_switch_mode = SM_MENU;
@@ -496,6 +497,7 @@ int ttd_main(int argc, char* argv[])
case 'v': ttd_strlcpy(videodriver, mgo.opt, sizeof(videodriver)); break;
case 'n': {
network = 1;
_networking_override=true;
if (mgo.opt) {
network_conn = mgo.opt;
network++;
@@ -551,14 +553,17 @@ int ttd_main(int argc, char* argv[])
if (resolution[0]) { _cur_resolution[0] = resolution[0]; _cur_resolution[1] = resolution[1]; }
if (startdate != -1) _patches.starting_date = startdate;
// initialize network-core
NetworkCoreInit();
// enumerate language files
InitializeLanguagePacks();
// initialize screenshot formats
InitializeScreenshotFormats();
// initialize airport state machines
InitializeAirports();
// initialize airport state machines
InitializeAirports();
// Sample catalogue
DEBUG(misc, 1) ("Loading sound effects...");
@@ -583,25 +588,21 @@ int ttd_main(int argc, char* argv[])
if (_opt_mod_ptr->diff_level == 9)
SetDifficultyLevel(0, _opt_mod_ptr);
if (network) {
_networking = true;
NetworkInitialize(network_conn);
if (network==1) {
DEBUG(misc, 1) ("Listening on port %d\n", _network_port);
NetworkListen(_network_port);
_networking_server = true;
} else {
DEBUG(misc, 1) ("Connecting to %s %d\n", network_conn, _network_port);
NetworkConnect(network_conn, _network_port);
if ((network) && (_network_available)) {
NetworkLobbyInit();
if (network_conn!=NULL) {
NetworkCoreConnectGame(network_conn,_network_server_port);
} else {
NetworkCoreConnectGame("auto",_network_server_port);
}
}
}
while (_video_driver->main_loop() == ML_SWITCHDRIVER) {}
if (network) {
NetworkShutdown();
}
if (_network_available) {
// shutdown network-core
NetworkCoreShutdown();
}
_video_driver->stop();
_music_driver->stop();
@@ -609,8 +610,8 @@ int ttd_main(int argc, char* argv[])
SaveToConfig();
// uninitialize airport state machines
UnInitializeAirports();
// uninitialize airport state machines
UnInitializeAirports();
return 0;
}
@@ -774,14 +775,14 @@ static void SwitchMode(int new_mode)
break;
case SM_NEWGAME:
if (_networking) { NetworkStartSync(); } // UGLY HACK HACK HACK
if (_networking) { NetworkStartSync(true); } // UGLY HACK HACK HACK
MakeNewGame();
break;
normal_load:
case SM_LOAD: { // Load game
if (_networking) { NetworkStartSync(); } // UGLY HACK HACK HACK
if (_networking) { NetworkStartSync(true); } // UGLY HACK HACK HACK
_error_message = INVALID_STRING_ID;
if (!SafeSaveOrLoad(_file_to_saveload.name, _file_to_saveload.mode, GM_NORMAL)) {
@@ -820,6 +821,10 @@ normal_load:
case SM_MENU: // Switch to game menu
if ((_networking) && (!_networking_override)) NetworkCoreDisconnect();
_networking_override=false;
LoadIntroGame();
break;
@@ -951,10 +956,8 @@ void GameLoop()
_timer_counter+=8;
CursorTick();
if (_networking) {
NetworkReceive();
NetworkProcessCommands(); // to check if we got any new commands belonging to the current frame before we increase it.
}
// incomming packets
NetworkCoreLoop(true);
if (_networking_sync) {
// make sure client's time is synched to the server by running frames quickly up to where the server is.
@@ -983,8 +986,8 @@ void GameLoop()
MouseLoop();
// send outgoing packets.
if (_networking)
NetworkSend();
NetworkCoreLoop(false);
if (_game_mode != GM_MENU)
MusicLoop();