// 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_ttf.h" #include "SDL_mixer.h" #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 "CPathfinder.h" #include "CGameState.h" #include "CCallback.h" #include "CPlayerInterface.h" #include "CLuaHandler.h" #include "CAdvmapInterface.h" #include "hch/CBuildingHandler.h" #include "hch/CVideoHandler.h" #include "hch/CAbilityHandler.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 "lib/Connection.h" #include "lib/Interprocess.h" #include "lib/VCMI_Lib.h" std::string NAME = NAME_VER + std::string(" (client)"); DLL_EXPORT void initDLL(CLodHandler *b); SDL_Surface * screen, * screen2; extern SDL_Surface * CSDL_Ext::std32bppSurface; std::queue events; boost::mutex eventsM; TTF_Font * TNRB16, *TNR, *GEOR13, *GEORXX, *GEORM, *GEOR16; namespace intpr = boost::interprocess; void processCommand(const std::string &message); #ifndef __GNUC__ int _tmain(int argc, _TCHAR* argv[]) #else int main(int argc, char** argv) #endif { boost::thread *console = NULL; if(argc>2) { std::cout << "Special mode without new support for console!" << std::endl; } else { logfile = new std::ofstream("VCMI_Client_log.txt"); ::console = new CConsoleHandler; *::console->cb = &processCommand; console = new boost::thread(boost::bind(&CConsoleHandler::run,::console)); } tlog0 << "\tConsole and logifle ready!" << std::endl; int port; if(argc > 1) { #ifdef _MSC_VER port = _tstoi(argv[1]); #else port = _ttoi(argv[1]); #endif } else { port = 3030; tlog0 << "Port " << port << " will be used." << std::endl; } std::cout.flags(ios::unitbuf); tlog0 << NAME << std::endl; srand ( time(NULL) ); CPG=NULL; atexit(SDL_Quit); CGameInfo * cgi = CGI = new CGameInfo; //contains all global informations about game (texts, lodHandlers, map handler itp.) //CLuaHandler luatest; //luatest.test(); //CBIKHandler cb; //cb.open("CSECRET.BIK"); tlog0 << "Starting... " << std::endl; THC timeHandler tmh, total, pomtime; if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_AUDIO)==0) { screen = SDL_SetVideoMode(800,600,24,SDL_SWSURFACE|SDL_DOUBLEBUF/*|SDL_FULLSCREEN*/); //initializing important global surface tlog0 <<"\tInitializing screen: "<initMusics(); //audio initialized cgi->mush = mush; THC 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"); THC tlog0<<"Loading .lod files: "<bitmaph,::console,logfile); CGI->arth = VLC->arth; CGI->creh = VLC->creh; CGI->townh = VLC->townh; CGI->heroh = VLC->heroh; CGI->objh = VLC->objh; CGI->spellh = VLC->spellh; CGI->dobjinfo = VLC->dobjinfo; CGI->buildh = VLC->buildh; tlog0<<"Initializing VCMI_Lib: "<curh->initCursor(); //cgi->curh->showGraphicCursor(); pomtime.getDif(); cgi->curh = new CCursorHandler; cgi->curh->initCursor(); //cgi->screenh = new CScreenHandler; //cgi->screenh->initScreen(); tlog0<<"\tScreen handler: "<loadAbilities(); cgi->abilh = abilh; tlog0<<"\tAbility handler: "< animacje; for(std::vector::iterator i = cgi->heroh->heroClasses.begin();i!=cgi->heroh->heroClasses.end();i++) animacje.push_back(&((*i)->*(&CHeroClass::moveAnim))); graphics->loadHeroAnim(animacje); tlog0<<"\tHero animations: "<generaltexth = new CGeneralTextHandler; cgi->generaltexth->load(); tlog0<<"Preparing more handlers: "<mush = mush; StartInfo *options = new StartInfo(cpg->runLoop()); tmh.getDif(); ////////////////////////SERVER STARTING///////////////////////////////////////////////// char portc[10]; SDL_itoa(port,portc,10); intpr::shared_memory_object smo(intpr::open_or_create,"vcmi_memory",intpr::read_write); smo.truncate(sizeof(ServerReady)); intpr::mapped_region mr(smo,intpr::read_write); ServerReady *sr = new(mr.get_address())ServerReady(); std::string comm = std::string(SERVER_NAME) + " " + portc + " > server_log.txt"; boost::thread servthr(boost::bind(system,comm.c_str())); //runs server executable; //TODO: will it work on non-windows platforms? tlog0<<"Preparing shared memory and starting server: "<pathf = new CPathfinder(); tlog0<<"\tPathfinder: "< slock(sr->mutex); while(!sr->ready) { sr->cond.wait(slock); } } intpr::shared_memory_object::remove("vcmi_memory"); tlog0 << tmh.getDif()<killConsole(console->native_handle()); #endif SDL_Delay(750); tlog0 << "Ending...\n"; exit(0); } eventsM.lock(); events.push(ev); eventsM.unlock(); } } else { tlog1<<"Something was wrong: "<> cn; int3 src, dst; int heronum; int3 dest; if(message==std::string("die, fool")) exit(0); 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(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"),"data"); tlog0<<"done.\nScanning .lod file\n"; int curp=0; std::string pattern = ".TXT"; for(int i=0;ientries.size(); i++) { std::string 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"<