// CMT.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include #include #include #include #include #include "boost/filesystem/operations.hpp" #include #include #include #include "SDL_Extensions.h" #include "SDL_framerate.h" #include "CGameInfo.h" #include "mapHandler.h" #include "global.h" #include "CPreGame.h" #include "CCastleInterface.h" #include "CConsoleHandler.h" #include "CCursorHandler.h" #include "CGameState.h" #include "CCallback.h" #include "CPlayerInterface.h" #include "CAdvmapInterface.h" #include "hch/CBuildingHandler.h" #include "hch/CVideoHandler.h" #include "hch/CHeroHandler.h" #include "hch/CCreatureHandler.h" #include "hch/CSpellHandler.h" #include "hch/CMusicHandler.h" #include "hch/CLodHandler.h" #include "hch/CDefHandler.h" #include "hch/CAmbarCendamo.h" #include "hch/CGeneralTextHandler.h" #include "client/Graphics.h" #include "client/Client.h" #include "client/CConfigHandler.h" #include "lib/Connection.h" #include "lib/VCMI_Lib.h" #include #include "lib/NetPacks.h" #if __MINGW32__ #undef main #endif std::string NAME = NAME_VER + std::string(" (client)"); SDL_Surface * screen, * screen2; std::queue events; boost::mutex eventsM; TTF_Font * TNRB16, *TNR, *GEOR13, *GEORXX, *GEORM, *GEOR16; void processCommand(const std::string &message, CClient *&client); #ifndef __GNUC__ int _tmain(int argc, _TCHAR* argv[]) #else int main(int argc, char** argv) #endif { tlog0 << "Starting... " << std::endl; THC timeHandler tmh, total, pomtime; CClient *client = NULL; boost::thread *console = NULL; std::cout.flags(std::ios::unitbuf); logfile = new std::ofstream("VCMI_Client_log.txt"); ::console = new CConsoleHandler; *::console->cb = boost::bind(processCommand,_1,boost::ref(client)); console = new boost::thread(boost::bind(&CConsoleHandler::run,::console)); tlog0 <<"Creating console and logfile: "<initMusics(); //audio initialized cgi->mush = mush; tlog0<<"\tInitializing sound: "<spriteh = new CLodHandler(); cgi->spriteh->init("Data" PATHSEPARATOR "H3sprite.lod","Sprites"); BitmapHandler::bitmaph = cgi->bitmaph = new CLodHandler; cgi->bitmaph->init("Data" PATHSEPARATOR "H3bitmap.lod","Data"); tlog0<<"Loading .lod files: "<bitmaph,::console,logfile); CGI->setFromLib(); tlog0<<"Initializing VCMI_Lib: "<curh = new CCursorHandler; cgi->curh->initCursor(); cgi->curh->show(); tlog0<<"Screen handler: "<loadHeroAnim(); tlog0<<"\tMain graphics: "<mush = mush; StartInfo *options = new StartInfo(cpg->runLoop()); if(screen->w != conf.cc.resx || screen->h != conf.cc.resy) { SDL_QuitSubSystem(SDL_INIT_VIDEO); SDL_InitSubSystem(SDL_INIT_VIDEO); screen = SDL_SetVideoMode(conf.cc.resx,conf.cc.resy,conf.cc.bpp,SDL_SWSURFACE|SDL_DOUBLEBUF|(conf.cc.fullscreen?SDL_FULLSCREEN:0)); //initializing important global surface SDL_EnableUNICODE(1); SDL_WM_SetCaption(NAME.c_str(),""); //set window title SDL_ShowCursor(SDL_DISABLE); } CClient cl; if(options->mode == 0) //new game { tmh.getDif(); char portc[10]; SDL_itoa(conf.cc.port,portc,10); CClient::runServer(portc); tlog0<<"Preparing shared memory and starting server: "<mapname; boost::algorithm::erase_last(fname,".vlgm1"); cl.load(fname); client = &cl; boost::thread t(boost::bind(&CClient::run,&cl)); } SDL_Event *ev = NULL; while(1) //main SDL events loop { ev = new SDL_Event(); SDL_WaitEvent(ev); if((ev->type==SDL_QUIT) || (ev->type == SDL_KEYDOWN && ev->key.keysym.sym==SDLK_F4 && (ev->key.keysym.mod & KMOD_ALT))) { cl.close(); #ifndef __unix__ ::console->killConsole(console->native_handle()); #endif LOCPLINT->pim->lock(); SDL_Delay(750); tlog0 << "Ending...\n"; exit(EXIT_SUCCESS); } else if(ev->type == SDL_KEYDOWN && ev->key.keysym.sym==SDLK_F4) { LOCPLINT->pim->lock(); bool full = !(screen->flags&SDL_FULLSCREEN); SDL_QuitSubSystem(SDL_INIT_VIDEO); SDL_InitSubSystem(SDL_INIT_VIDEO); screen = SDL_SetVideoMode(conf.cc.resx,conf.cc.resy,conf.cc.bpp,SDL_SWSURFACE|SDL_DOUBLEBUF|(full?SDL_FULLSCREEN:0)); //initializing important global surface SDL_WM_SetCaption(NAME.c_str(),""); //set window title SDL_ShowCursor(SDL_DISABLE); LOCPLINT->curint->show(); if(LOCPLINT->curint != LOCPLINT->adventureInt) LOCPLINT->adventureInt->show(); if(LOCPLINT->curint == LOCPLINT->castleInt) LOCPLINT->castleInt->showAll(0,true); if(LOCPLINT->curint->subInt) LOCPLINT->curint->subInt->show(); LOCPLINT->pim->unlock(); } eventsM.lock(); events.push(ev); eventsM.unlock(); } } else { tlog1<<"Something was wrong: "<> cn; int3 src, dst; // int heronum;//TODO use me int3 dest; if(LOCPLINT && LOCPLINT->cingconsole) LOCPLINT->cingconsole->print(message); if(message==std::string("die, fool")) exit(EXIT_SUCCESS); else if(cn==std::string("activate")) { int what; readed >> what; switch (what) { case 0: LOCPLINT->curint->activate(); break; case 1: LOCPLINT->adventureInt->activate(); break; case 2: LOCPLINT->castleInt->activate(); break; } } else if(cn=="save") { std::string fname; readed >> fname; client->save(fname); } else if(cn=="load") { std::string fname; readed >> fname; client->load(fname); } else if(cn=="resolution") { std::map, config::GUIOptions >::iterator j; int i=1, hlp=1; tlog4 << "Available screen resolutions:\n"; for(j=conf.guiOptions.begin(); j!=conf.guiOptions.end(); j++) tlog4 << i++ <<". " << j->first.first << " x " << j->first.second << std::endl; tlog4 << "Type number from 1 to " << i-1 << " to set appropriate resolution or 0 to cancel.\n"; std::cin >> i; if(!i) return; else if(i < 0 || i > conf.guiOptions.size()) { tlog1 << "Invalid resolution ID! Not a number between 0 and " << conf.guiOptions.size() << ". No settings changed.\n"; } else { for(j=conf.guiOptions.begin(); j!=conf.guiOptions.end() && hlp++first.first; conf.cc.resy = j->first.second; tlog0 << "Screen resolution set to " << conf.cc.resx << " x " << conf.cc.resy <<". It will be aplied when the game starts.\n"; } } else if(message=="get txt") { boost::filesystem::create_directory("Extracted_txts"); tlog0<<"Command accepted. Opening .lod file...\t"; CLodHandler * txth = new CLodHandler; txth->init(std::string(DATA_DIR "Data" PATHSEPARATOR "H3bitmap.lod"),""); tlog0<<"done.\nScanning .lod file\n"; int curp=0; std::string pattern = ".TXT", pom; for(int i=0;ientries.size(); i++) { pom = txth->entries[i].nameStr; if(boost::algorithm::find_last(pom,pattern)) { txth->extractFile(std::string("Extracted_txts\\")+pom,pom); } if(i%8) continue; int p2 = ((float)i/(float)txth->entries.size())*(float)100; if(p2!=curp) { curp = p2; tlog0<<"\r"<serv && client->serv->connected) //send to server { PlayerMessage pm(LOCPLINT->playerID,message); *client->serv << ± } }