/********************************************************************** * ReadClassFromFile * * Read in a class description (protos and configs) from a file. Update * the class structure record. **********************************************************************/ void ReadClassFromFile(FILE *File, UNICHAR_ID unichar_id) { CLASS_TYPE Class; Class = &TrainingData[unichar_id]; ReadProtos(File, Class); ReadConfigs(File, Class); }
int main(int argc, char **argv) { Settings & conf = Settings::Get(); int test = 0; DEBUG(DBG_ALL, DBG_INFO, "Free Heroes II, " + conf.GetVersion()); conf.SetProgramPath(argv[0]); InitHomeDir(); ReadConfigs(); #ifdef WITH_EDITOR if(RunEditor(argv[0])) conf.SetEditor(); #endif // getopt { int opt; while((opt = getopt(argc, argv, "hest:d:")) != -1) switch(opt) { #ifdef WITH_EDITOR case 'e': conf.SetEditor(); break; #endif #ifndef BUILD_RELEASE case 't': test = String::ToInt(optarg); break; case 'd': conf.SetDebug(optarg ? String::ToInt(optarg) : 0); break; #endif #ifdef WITH_NET case 's': return Network::RunDedicatedServer(); #endif case '?': case 'h': return PrintHelp(argv[0]); default: break; } } if(conf.SelectVideoDriver().size()) SetVideoDriver(conf.SelectVideoDriver()); // random init Rand::Init(); if(conf.Music()) SetTimidityEnvPath(conf); u32 subsystem = INIT_VIDEO | INIT_TIMER; if(conf.Sound() || conf.Music()) subsystem |= INIT_AUDIO; #ifdef WITH_AUDIOCD if(conf.MusicCD()) subsystem |= INIT_CDROM | INIT_AUDIO; #endif #ifdef WITH_NET Network::SetProtocolVersion(static_cast<u16>(MAJOR_VERSION << 8) | MINOR_VERSION); #endif if(SDL::Init(subsystem)) #ifndef ANDROID try #endif { std::atexit(SDL::Quit); if(conf.Unicode()) SetLangEnvPath(conf); if(Mixer::isValid()) { Mixer::SetChannels(8); Mixer::Volume(-1, Mixer::MaxVolume() * conf.SoundVolume() / 10); Music::Volume(Mixer::MaxVolume() * conf.MusicVolume() / 10); if(conf.Music()) { Music::SetFadeIn(3000); } } else if(conf.Sound() || conf.Music()) { conf.ResetSound(); conf.ResetMusic(); } if(0 == conf.VideoMode().w || 0 == conf.VideoMode().h) conf.SetAutoVideoMode(); Display::SetVideoMode(conf.VideoMode().w, conf.VideoMode().h, conf.DisplayFlags()); Display::HideCursor(); Display::SetCaption(GetCaption()); //Ensure the mouse position is updated to prevent bad initial values. LocalEvent::Get().GetMouseCursor(); #ifdef WITH_ZLIB ZSurface zicons; if(zicons.Load(_ptr_08067830.width, _ptr_08067830.height, _ptr_08067830.bpp, _ptr_08067830.pitch, _ptr_08067830.rmask, _ptr_08067830.gmask, _ptr_08067830.bmask, _ptr_08067830.amask, _ptr_08067830.zdata, sizeof(_ptr_08067830.zdata))) Display::SetIcons(zicons); #endif AGG::Cache & cache = AGG::Cache::Get(); DEBUG(DBG_GAME, DBG_INFO, conf.String()); DEBUG(DBG_GAME|DBG_ENGINE, DBG_INFO, Display::GetInfo()); // read data dir if(! cache.ReadDataDir()) { DEBUG(DBG_GAME, DBG_WARN, "data files not found"); ShowAGGError(); return EXIT_FAILURE; } // load palette cache.LoadPAL(); // load font cache.LoadFNT(); #ifdef WITH_ZLIB LoadZLogo(); #endif // init cursor Cursor::Get().SetThemes(Cursor::POINTER); AGG::ICNRegistryEnable(true); // init game data Game::Init(); // goto main menu #ifdef WITH_EDITOR Game::menu_t rs = (test ? Game::TESTING : (conf.Editor() ? Game::EDITMAINMENU : Game::MAINMENU)); #else Game::menu_t rs = (test ? Game::TESTING : Game::MAINMENU); #endif while(rs != Game::QUITGAME) { switch(rs) { #ifdef WITH_EDITOR case Game::EDITMAINMENU: rs = Game::Editor::MainMenu(); break; case Game::EDITNEWMAP: rs = Game::Editor::NewMaps(); break; case Game::EDITLOADMAP: rs = Game::Editor::LoadMaps(); break; case Game::EDITSTART: rs = Game::Editor::StartGame(); break; #endif case Game::MAINMENU: rs = Game::MainMenu(); break; case Game::NEWGAME: rs = Game::NewGame(); break; case Game::LOADGAME: rs = Game::LoadGame(); break; case Game::HIGHSCORES: rs = Game::HighScores(); break; case Game::CREDITS: rs = Game::Credits(); break; case Game::NEWSTANDARD: rs = Game::NewStandard(); break; case Game::NEWCAMPAIN: rs = Game::NewCampain(); break; case Game::NEWMULTI: rs = Game::NewMulti(); break; case Game::NEWHOTSEAT: rs = Game::NewHotSeat(); break; case Game::NEWNETWORK: rs = Game::NewNetwork(); break; case Game::NEWBATTLEONLY: rs = Game::NewBattleOnly(); break; case Game::LOADSTANDARD: rs = Game::LoadStandard(); break; case Game::LOADCAMPAIN: rs = Game::LoadCampain(); break; case Game::LOADMULTI: rs = Game::LoadMulti(); break; case Game::SCENARIOINFO: rs = Game::ScenarioInfo(); break; case Game::SELECTSCENARIO: rs = Game::SelectScenario(); break; case Game::STARTGAME: rs = Game::StartGame(); break; case Game::TESTING: rs = Game::Testing(test); break; default: break; } } } #ifndef ANDROID catch(Error::Exception) { AGG::Cache::Get().Dump(); #ifdef WITH_NET if(conf.GameType(Game::TYPE_NETWORK)) FH2LocalClient::Get().Logout("internal error"); #endif VERBOSE(std::endl << conf.String()); } #endif return EXIT_SUCCESS; }