From d17521c8b9085a91d08fecfd0b51bbbf7b1dccac Mon Sep 17 00:00:00 2001 From: "milo24x7@gmail.com" Date: Sun, 7 Jul 2013 22:08:49 +0000 Subject: Updated open source license declaration and fixed some formatting issues. --- Stars45/StarServer.cpp | 1068 +++++++++++++++++++++++++----------------------- 1 file changed, 546 insertions(+), 522 deletions(-) (limited to 'Stars45/StarServer.cpp') diff --git a/Stars45/StarServer.cpp b/Stars45/StarServer.cpp index 0de6cd8..64014f5 100644 --- a/Stars45/StarServer.cpp +++ b/Stars45/StarServer.cpp @@ -1,523 +1,547 @@ -/* Project Starshatter 5.0 - Destroyer Studios LLC - Copyright © 1997-2007. All Rights Reserved. - - SUBSYSTEM: Stars - FILE: StarServer.cpp - AUTHOR: John DiCamillo - -*/ - -#include "MemDebug.h" - -#include "StarServer.h" -#include "Campaign.h" -#include "CombatRoster.h" -#include "Galaxy.h" -#include "Mission.h" -#include "Sim.h" -#include "SimEvent.h" -#include "Ship.h" -#include "Contact.h" -#include "QuantumDrive.h" -#include "Power.h" -#include "SystemDesign.h" -#include "WeaponDesign.h" -#include "Shot.h" -#include "Drive.h" -#include "Explosion.h" -#include "FlightDeck.h" -#include "RadioMessage.h" -#include "RadioTraffic.h" -#include "Random.h" -#include "ModConfig.h" - -#include "NetLayer.h" -#include "NetGame.h" -#include "NetHost.h" -#include "NetServer.h" -#include "HttpServer.h" -#include "HttpServletExec.h" -#include "NetAdminServer.h" -#include "NetLobbyServer.h" -#include "NetServerConfig.h" - -#include "Token.h" -#include "MachineInfo.h" -#include "Game.h" -#include "Keyboard.h" -#include "Mouse.h" -#include "EventDispatch.h" -#include "MultiController.h" -#include "DataLoader.h" -#include "ParseUtil.h" -#include "Resource.h" - -// +--------------------------------------------------------------------+ - -StarServer* StarServer::instance = 0; - -static Mission* current_mission = 0; -static double time_til_change = 0; -static bool exit_latch = true; - -extern const char* versionInfo; - -// +--------------------------------------------------------------------+ - -StarServer::StarServer() -: loader(0), time_mark(0), minutes(0), game_mode(MENU_MODE), -admin_server(0), lobby_server(0) -{ - if (!instance) - instance = this; - - app_name = "Starserver 5.0"; - title_text = "Starserver"; - palette_name = "alpha"; - - Game::server = true; - Game::show_mouse = true; - - DataLoader::Initialize(); - loader = DataLoader::GetLoader(); - int loadstat = loader->EnableDatafile("shatter.dat"); - - if (loadstat != DataLoader::DATAFILE_OK) { - const char* err_msg = loadstat == DataLoader::DATAFILE_INVALID ? - "The file 'shatter.dat' appears to have been damaged. Please re-install Starshatter." : - "Starshatter cannot open the file 'shatter.dat'. Please re-install Starshatter."; - - ::MessageBox(hwnd, err_msg, "Starshatter - Error", MB_OK); - ::Print(err_msg); - ::Print("\n\nFATAL ERROR: EXIT."); - exit(-1); - } - - if (loader->FindFile("start.dat")) - loader->EnableDatafile("start.dat"); - - // no images or sounds in server mode: - loader->EnableMedia(false); -} - -StarServer::~StarServer() -{ - delete admin_server; - delete lobby_server; - - admin_server = 0; - lobby_server = 0; - - // delete all the ships and stuff - // BEFORE getting rid of the system - // and weapons catalogs! - delete world; - world = 0; // don't let base class double delete the world - - Drive::Close(); - Explosion::Close(); - FlightDeck::Close(); - Campaign::Close(); - CombatRoster::Close(); - Galaxy::Close(); - RadioTraffic::Close(); - Ship::Close(); - WeaponDesign::Close(); - SystemDesign::Close(); - DataLoader::Close(); - NetServerConfig::Close(); - ModConfig::Close(); - - instance = 0; - - Game::server = false; -} - -// +--------------------------------------------------------------------+ - -bool -StarServer::Init(HINSTANCE hi, HINSTANCE hpi, LPSTR cmdline, int nCmdShow) -{ - if (loader) - loader->UseFileSystem(false); - - return Game::Init(hi, hpi, cmdline, nCmdShow); -} - -// +--------------------------------------------------------------------+ - -bool -StarServer::InitGame() -{ - if (!Game::InitGame()) - return false; - - RandomInit(); - ModConfig::Initialize(); - NetServerConfig::Initialize(); - SystemDesign::Initialize("sys.def"); - WeaponDesign::Initialize("wep.def"); - Ship::Initialize(); - Galaxy::Initialize(); - CombatRoster::Initialize(); - Campaign::Initialize(); - - Drive::Initialize(); - Explosion::Initialize(); - FlightDeck::Initialize(); - Ship::Initialize(); - Shot::Initialize(); - RadioTraffic::Initialize(); - - time_mark = Game::GameTime(); - minutes = 0; - - NetServerConfig* server_config = NetServerConfig::GetInstance(); - if (!server_config) - return false; - - ::Print("\n\n\nStarshatter Server Init\n"); - ::Print("-----------------------\n"); - ::Print("Server Name: %s\n", (const char*) server_config->Name()); - ::Print("Server Type: %d\n", server_config->GetGameType()); - - if (server_config->GetMission().length() > 0) - ::Print("Server Mission: %s\n", (const char*) server_config->GetMission()); - - ::Print("Lobby Server Port: %d\n", server_config->GetLobbyPort()); - ::Print("Admin Server Port: %d\n", server_config->GetAdminPort()); - ::Print("-----------------------\n"); - - NetLobbyServer* nls = new(__FILE__,__LINE__) NetLobbyServer; - NetAdminServer* nas = NetAdminServer::GetInstance(server_config->GetAdminPort()); - nas->SetServerName(server_config->Name()); - - lobby_server = nls; - admin_server = nas; - - return true; -} - -// +--------------------------------------------------------------------+ - -void -StarServer::SetGameMode(int m) -{ - if (game_mode == m) - return; - - if (m == LOAD_MODE) { - Print(" game_mode = LOAD_MODE\n"); - paused = true; - } - - else if (m == PLAY_MODE) { - Print(" game_mode = PLAY_MODE\n"); - - if (!world) { - CreateWorld(); - InstantiateMission(); - } - - // stand alone server should wait for players to connect - // before unpausing the simulation... - SetTimeCompression(1); - Pause(true); - } - - else if (m == MENU_MODE) { - Print(" game_mode = MENU_MODE\n"); - paused = true; - - Sim* sim = (Sim*) world; - - if (sim) - sim->UnloadMission(); - } - - game_mode = m; -} - -// +--------------------------------------------------------------------+ - -void -StarServer::SetNextMission(const char* script) -{ - if (lobby_server) - lobby_server->SetServerMission(script); -} - -// +--------------------------------------------------------------------+ - -void -StarServer::CreateWorld() -{ - RadioTraffic::Initialize(); - - // create world - if (!world) { - Sim* sim = new(__FILE__,__LINE__) Sim(0); - world = sim; - Print(" World Created.\n"); - } -} - -void -StarServer::InstantiateMission() -{ - Memory::Check(); - - current_mission = 0; - - if (Campaign::GetCampaign()) { - current_mission = Campaign::GetCampaign()->GetMission(); - } - - Sim* sim = (Sim*) world; - - if (sim) { - sim->UnloadMission(); - - if (current_mission) { - sim->LoadMission(current_mission); - sim->ExecMission(); - sim->SetTestMode(false); - - Print(" Mission Instantiated.\n"); - } - - else { - Print(" *** WARNING: StarServer::InstantiateMission() - no mission selected ***\n"); - } - } - - Memory::Check(); -} - -// +--------------------------------------------------------------------+ - -bool -StarServer::GameLoop() -{ - if (active && paused) { - UpdateWorld(); - GameState(); - } - - else if (!active) { - UpdateWorld(); - GameState(); - Sleep(10); - } - - Game::GameLoop(); - return false; // must return false to keep processing - // true tells the outer loop to sleep until a - // windows event is available -} - -// +--------------------------------------------------------------------+ - -void -StarServer::UpdateWorld() -{ - long new_time = real_time; - double delta = new_time - frame_time; - seconds = max_frame_length; - gui_seconds = delta * 0.001; - - if (frame_time == 0) - gui_seconds = 0; - - time_comp = 1; - - if (delta < max_frame_length * 1000) - seconds = delta * 0.001; - - frame_time = new_time; - - Galaxy* galaxy = Galaxy::GetInstance(); - if (galaxy) galaxy->ExecFrame(); - - Campaign* campaign = Campaign::GetCampaign(); - if (campaign) campaign->ExecFrame(); - - if (paused) { - if (world) - world->ExecFrame(0); - } - - else { - game_time += (DWORD) (seconds * 1000); - - Drive::StartFrame(); - - if (world) - world->ExecFrame(seconds); - } - - static DWORD refresh_time = 0; - if (RealTime() - refresh_time > 1000) { - refresh_time = RealTime(); - RedrawWindow(hwnd, 0, 0, RDW_ERASE|RDW_INVALIDATE); - } -} - -// +--------------------------------------------------------------------+ - -void -StarServer::GameState() -{ - if (lobby_server) { - lobby_server->ExecFrame(); - - if (lobby_server->GetStatus() == NetServerInfo::PERSISTENT) - paused = NetGame::NumPlayers() < 1; - } - - if (game_mode == MENU_MODE) { - Sleep(30); - } - - else if (game_mode == LOAD_MODE) { - CreateWorld(); - InstantiateMission(); - - SetGameMode(PLAY_MODE); - } - - else if (game_mode == PLAY_MODE) { - if (Game::GameTime() - time_mark > 60000) { - time_mark = Game::GameTime(); - minutes++; - if (minutes > 60) - Print(" TIME %2d:%02d:00\n", minutes/60, minutes%60); - else - Print(" TIME %2d:00\n", minutes); - } - - Sleep(10); - } - - Memory::Check(); -} - -// +--------------------------------------------------------------------+ - -bool -StarServer::OnPaint() -{ - PAINTSTRUCT paintstruct; - HDC hdc = BeginPaint(hwnd, &paintstruct); - - Text txt_title = title_text; - Text txt_mode; - Text txt_users = Game::GetText("server.no-users"); - char buf[256]; - - txt_title += " "; - txt_title += versionInfo; - - switch (game_mode) { - case LOAD_MODE: - case MENU_MODE: - txt_mode = Game::GetText("server.mode.lobby"); - - if (lobby_server) { - sprintf_s(buf, Game::GetText("server.users").data(), lobby_server->NumUsers()); - txt_users = buf; - } - break; - - case PLAY_MODE: - txt_mode = Game::GetText("server.mode.active"); - if (lobby_server) { - sprintf_s(buf, Game::GetText("server.users-and-players").data(), lobby_server->NumUsers(), NetGame::NumPlayers()); - } - else { - sprintf_s(buf, Game::GetText("server.players").data(), NetGame::NumPlayers()); - } - txt_users = buf; - break; - - default: - txt_mode = Game::GetText("server.mode.other"); - break; - } - - if (lobby_server && lobby_server->GetStatus() == NetServerInfo::PERSISTENT) - txt_mode += " " + Game::GetText("server.alt.persistent"); - - if (paused) - txt_mode += " " + Game::GetText("server.alt.paused"); - - TextOut(hdc, 4, 4, txt_title, txt_title.length()); - TextOut(hdc, 4, 22, txt_mode, txt_mode.length()); - TextOut(hdc, 4, 40, txt_users, txt_users.length()); - - Sim* sim = Sim::GetSim(); - if (sim && sim->GetMission()) { - Mission* mission = sim->GetMission(); - Text txt_msn = Game::GetText("server.mission"); - txt_msn += mission->Name(); - TextOut(hdc, 4, 58, txt_msn, txt_msn.length()); - } - - EndPaint(hwnd, &paintstruct); - return true; -} - -// +--------------------------------------------------------------------+ - -DWORD WINAPI StarServerShutdownProc(LPVOID link) -{ - StarServer* stars = (StarServer*) link; - - Sleep(3000); - - if (stars) { - stars->Exit(); - return 0; - } - - return (DWORD) E_POINTER; -} - -DWORD WINAPI StarServerRestartProc(LPVOID link) -{ - StarServer* stars = (StarServer*) link; - - Sleep(3000); - - if (stars) { - char cmdline[256]; - strcpy_s(cmdline, "stars -server"); - - STARTUPINFO s; - ZeroMemory(&s, sizeof(s)); - s.cb = sizeof(s); - - PROCESS_INFORMATION pi; - ZeroMemory(&pi, sizeof(pi)); - - CreateProcess("stars.exe", cmdline, 0, 0, 0, 0, 0, 0, &s, &pi); - stars->Exit(); - CloseHandle( pi.hProcess ); - CloseHandle( pi.hThread ); - return 0; - } - - return (DWORD) E_POINTER; -} - -void -StarServer::Shutdown(bool restart) -{ - DWORD thread_id = 0; - - if (restart) - CreateThread(0, 4096, StarServerRestartProc, (LPVOID) this, 0, &thread_id); - else - CreateThread(0, 4096, StarServerShutdownProc, (LPVOID) this, 0, &thread_id); +/* Starshatter OpenSource Distribution + Copyright (c) 1997-2004, Destroyer Studios LLC. + All Rights Reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name "Destroyer Studios" nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + SUBSYSTEM: Stars + FILE: StarServer.cpp + AUTHOR: John DiCamillo + +*/ + +#include "MemDebug.h" + +#include "StarServer.h" +#include "Campaign.h" +#include "CombatRoster.h" +#include "Galaxy.h" +#include "Mission.h" +#include "Sim.h" +#include "SimEvent.h" +#include "Ship.h" +#include "Contact.h" +#include "QuantumDrive.h" +#include "Power.h" +#include "SystemDesign.h" +#include "WeaponDesign.h" +#include "Shot.h" +#include "Drive.h" +#include "Explosion.h" +#include "FlightDeck.h" +#include "RadioMessage.h" +#include "RadioTraffic.h" +#include "Random.h" +#include "ModConfig.h" + +#include "NetLayer.h" +#include "NetGame.h" +#include "NetHost.h" +#include "NetServer.h" +#include "HttpServer.h" +#include "HttpServletExec.h" +#include "NetAdminServer.h" +#include "NetLobbyServer.h" +#include "NetServerConfig.h" + +#include "Token.h" +#include "MachineInfo.h" +#include "Game.h" +#include "Keyboard.h" +#include "Mouse.h" +#include "EventDispatch.h" +#include "MultiController.h" +#include "DataLoader.h" +#include "ParseUtil.h" +#include "Resource.h" + +// +--------------------------------------------------------------------+ + +StarServer* StarServer::instance = 0; + +static Mission* current_mission = 0; +static double time_til_change = 0; +static bool exit_latch = true; + +extern const char* versionInfo; + +// +--------------------------------------------------------------------+ + +StarServer::StarServer() +: loader(0), time_mark(0), minutes(0), game_mode(MENU_MODE), +admin_server(0), lobby_server(0) +{ + if (!instance) + instance = this; + + app_name = "Starserver 5.0"; + title_text = "Starserver"; + palette_name = "alpha"; + + Game::server = true; + Game::show_mouse = true; + + DataLoader::Initialize(); + loader = DataLoader::GetLoader(); + int loadstat = loader->EnableDatafile("shatter.dat"); + + if (loadstat != DataLoader::DATAFILE_OK) { + const char* err_msg = loadstat == DataLoader::DATAFILE_INVALID ? + "The file 'shatter.dat' appears to have been damaged. Please re-install Starshatter." : + "Starshatter cannot open the file 'shatter.dat'. Please re-install Starshatter."; + + ::MessageBox(hwnd, err_msg, "Starshatter - Error", MB_OK); + ::Print(err_msg); + ::Print("\n\nFATAL ERROR: EXIT."); + exit(-1); + } + + if (loader->FindFile("start.dat")) + loader->EnableDatafile("start.dat"); + + // no images or sounds in server mode: + loader->EnableMedia(false); +} + +StarServer::~StarServer() +{ + delete admin_server; + delete lobby_server; + + admin_server = 0; + lobby_server = 0; + + // delete all the ships and stuff + // BEFORE getting rid of the system + // and weapons catalogs! + delete world; + world = 0; // don't let base class double delete the world + + Drive::Close(); + Explosion::Close(); + FlightDeck::Close(); + Campaign::Close(); + CombatRoster::Close(); + Galaxy::Close(); + RadioTraffic::Close(); + Ship::Close(); + WeaponDesign::Close(); + SystemDesign::Close(); + DataLoader::Close(); + NetServerConfig::Close(); + ModConfig::Close(); + + instance = 0; + + Game::server = false; +} + +// +--------------------------------------------------------------------+ + +bool +StarServer::Init(HINSTANCE hi, HINSTANCE hpi, LPSTR cmdline, int nCmdShow) +{ + if (loader) + loader->UseFileSystem(false); + + return Game::Init(hi, hpi, cmdline, nCmdShow); +} + +// +--------------------------------------------------------------------+ + +bool +StarServer::InitGame() +{ + if (!Game::InitGame()) + return false; + + RandomInit(); + ModConfig::Initialize(); + NetServerConfig::Initialize(); + SystemDesign::Initialize("sys.def"); + WeaponDesign::Initialize("wep.def"); + Ship::Initialize(); + Galaxy::Initialize(); + CombatRoster::Initialize(); + Campaign::Initialize(); + + Drive::Initialize(); + Explosion::Initialize(); + FlightDeck::Initialize(); + Ship::Initialize(); + Shot::Initialize(); + RadioTraffic::Initialize(); + + time_mark = Game::GameTime(); + minutes = 0; + + NetServerConfig* server_config = NetServerConfig::GetInstance(); + if (!server_config) + return false; + + ::Print("\n\n\nStarshatter Server Init\n"); + ::Print("-----------------------\n"); + ::Print("Server Name: %s\n", (const char*) server_config->Name()); + ::Print("Server Type: %d\n", server_config->GetGameType()); + + if (server_config->GetMission().length() > 0) + ::Print("Server Mission: %s\n", (const char*) server_config->GetMission()); + + ::Print("Lobby Server Port: %d\n", server_config->GetLobbyPort()); + ::Print("Admin Server Port: %d\n", server_config->GetAdminPort()); + ::Print("-----------------------\n"); + + NetLobbyServer* nls = new(__FILE__,__LINE__) NetLobbyServer; + NetAdminServer* nas = NetAdminServer::GetInstance(server_config->GetAdminPort()); + nas->SetServerName(server_config->Name()); + + lobby_server = nls; + admin_server = nas; + + return true; +} + +// +--------------------------------------------------------------------+ + +void +StarServer::SetGameMode(int m) +{ + if (game_mode == m) + return; + + if (m == LOAD_MODE) { + Print(" game_mode = LOAD_MODE\n"); + paused = true; + } + + else if (m == PLAY_MODE) { + Print(" game_mode = PLAY_MODE\n"); + + if (!world) { + CreateWorld(); + InstantiateMission(); + } + + // stand alone server should wait for players to connect + // before unpausing the simulation... + SetTimeCompression(1); + Pause(true); + } + + else if (m == MENU_MODE) { + Print(" game_mode = MENU_MODE\n"); + paused = true; + + Sim* sim = (Sim*) world; + + if (sim) + sim->UnloadMission(); + } + + game_mode = m; +} + +// +--------------------------------------------------------------------+ + +void +StarServer::SetNextMission(const char* script) +{ + if (lobby_server) + lobby_server->SetServerMission(script); +} + +// +--------------------------------------------------------------------+ + +void +StarServer::CreateWorld() +{ + RadioTraffic::Initialize(); + + // create world + if (!world) { + Sim* sim = new(__FILE__,__LINE__) Sim(0); + world = sim; + Print(" World Created.\n"); + } +} + +void +StarServer::InstantiateMission() +{ + Memory::Check(); + + current_mission = 0; + + if (Campaign::GetCampaign()) { + current_mission = Campaign::GetCampaign()->GetMission(); + } + + Sim* sim = (Sim*) world; + + if (sim) { + sim->UnloadMission(); + + if (current_mission) { + sim->LoadMission(current_mission); + sim->ExecMission(); + sim->SetTestMode(false); + + Print(" Mission Instantiated.\n"); + } + + else { + Print(" *** WARNING: StarServer::InstantiateMission() - no mission selected ***\n"); + } + } + + Memory::Check(); +} + +// +--------------------------------------------------------------------+ + +bool +StarServer::GameLoop() +{ + if (active && paused) { + UpdateWorld(); + GameState(); + } + + else if (!active) { + UpdateWorld(); + GameState(); + Sleep(10); + } + + Game::GameLoop(); + return false; // must return false to keep processing + // true tells the outer loop to sleep until a + // windows event is available +} + +// +--------------------------------------------------------------------+ + +void +StarServer::UpdateWorld() +{ + long new_time = real_time; + double delta = new_time - frame_time; + seconds = max_frame_length; + gui_seconds = delta * 0.001; + + if (frame_time == 0) + gui_seconds = 0; + + time_comp = 1; + + if (delta < max_frame_length * 1000) + seconds = delta * 0.001; + + frame_time = new_time; + + Galaxy* galaxy = Galaxy::GetInstance(); + if (galaxy) galaxy->ExecFrame(); + + Campaign* campaign = Campaign::GetCampaign(); + if (campaign) campaign->ExecFrame(); + + if (paused) { + if (world) + world->ExecFrame(0); + } + + else { + game_time += (DWORD) (seconds * 1000); + + Drive::StartFrame(); + + if (world) + world->ExecFrame(seconds); + } + + static DWORD refresh_time = 0; + if (RealTime() - refresh_time > 1000) { + refresh_time = RealTime(); + RedrawWindow(hwnd, 0, 0, RDW_ERASE|RDW_INVALIDATE); + } +} + +// +--------------------------------------------------------------------+ + +void +StarServer::GameState() +{ + if (lobby_server) { + lobby_server->ExecFrame(); + + if (lobby_server->GetStatus() == NetServerInfo::PERSISTENT) + paused = NetGame::NumPlayers() < 1; + } + + if (game_mode == MENU_MODE) { + Sleep(30); + } + + else if (game_mode == LOAD_MODE) { + CreateWorld(); + InstantiateMission(); + + SetGameMode(PLAY_MODE); + } + + else if (game_mode == PLAY_MODE) { + if (Game::GameTime() - time_mark > 60000) { + time_mark = Game::GameTime(); + minutes++; + if (minutes > 60) + Print(" TIME %2d:%02d:00\n", minutes/60, minutes%60); + else + Print(" TIME %2d:00\n", minutes); + } + + Sleep(10); + } + + Memory::Check(); +} + +// +--------------------------------------------------------------------+ + +bool +StarServer::OnPaint() +{ + PAINTSTRUCT paintstruct; + HDC hdc = BeginPaint(hwnd, &paintstruct); + + Text txt_title = title_text; + Text txt_mode; + Text txt_users = Game::GetText("server.no-users"); + char buf[256]; + + txt_title += " "; + txt_title += versionInfo; + + switch (game_mode) { + case LOAD_MODE: + case MENU_MODE: + txt_mode = Game::GetText("server.mode.lobby"); + + if (lobby_server) { + sprintf_s(buf, Game::GetText("server.users").data(), lobby_server->NumUsers()); + txt_users = buf; + } + break; + + case PLAY_MODE: + txt_mode = Game::GetText("server.mode.active"); + if (lobby_server) { + sprintf_s(buf, Game::GetText("server.users-and-players").data(), lobby_server->NumUsers(), NetGame::NumPlayers()); + } + else { + sprintf_s(buf, Game::GetText("server.players").data(), NetGame::NumPlayers()); + } + txt_users = buf; + break; + + default: + txt_mode = Game::GetText("server.mode.other"); + break; + } + + if (lobby_server && lobby_server->GetStatus() == NetServerInfo::PERSISTENT) + txt_mode += " " + Game::GetText("server.alt.persistent"); + + if (paused) + txt_mode += " " + Game::GetText("server.alt.paused"); + + TextOut(hdc, 4, 4, txt_title, txt_title.length()); + TextOut(hdc, 4, 22, txt_mode, txt_mode.length()); + TextOut(hdc, 4, 40, txt_users, txt_users.length()); + + Sim* sim = Sim::GetSim(); + if (sim && sim->GetMission()) { + Mission* mission = sim->GetMission(); + Text txt_msn = Game::GetText("server.mission"); + txt_msn += mission->Name(); + TextOut(hdc, 4, 58, txt_msn, txt_msn.length()); + } + + EndPaint(hwnd, &paintstruct); + return true; +} + +// +--------------------------------------------------------------------+ + +DWORD WINAPI StarServerShutdownProc(LPVOID link) +{ + StarServer* stars = (StarServer*) link; + + Sleep(3000); + + if (stars) { + stars->Exit(); + return 0; + } + + return (DWORD) E_POINTER; +} + +DWORD WINAPI StarServerRestartProc(LPVOID link) +{ + StarServer* stars = (StarServer*) link; + + Sleep(3000); + + if (stars) { + char cmdline[256]; + strcpy_s(cmdline, "stars -server"); + + STARTUPINFO s; + ZeroMemory(&s, sizeof(s)); + s.cb = sizeof(s); + + PROCESS_INFORMATION pi; + ZeroMemory(&pi, sizeof(pi)); + + CreateProcess("stars.exe", cmdline, 0, 0, 0, 0, 0, 0, &s, &pi); + stars->Exit(); + CloseHandle( pi.hProcess ); + CloseHandle( pi.hThread ); + return 0; + } + + return (DWORD) E_POINTER; +} + +void +StarServer::Shutdown(bool restart) +{ + DWORD thread_id = 0; + + if (restart) + CreateThread(0, 4096, StarServerRestartProc, (LPVOID) this, 0, &thread_id); + else + CreateThread(0, 4096, StarServerShutdownProc, (LPVOID) this, 0, &thread_id); } \ No newline at end of file -- cgit v1.1