int main(int argc, char **argv) { char filename[255]; std::vector<xyLoc> thePath; std::vector<bool> mapData; int width, height; bool pre = false; bool run = false; /* if (argc != 4) { printf("Invalid Arguments\nUsage %s <flag> <map> <scenario>\n", argv[0]); printf("Flags:\n"); printf("\t-full : Preprocess map and run scenario\n"); printf("\t-pre : Preprocess map\n"); printf("\t-run : Run scenario without preprocessing\n"); exit(0); } if (strcmp(argv[1], "-full") == 0) { pre = run = true; } else if (strcmp(argv[1], "-pre") == 0) { pre = true; } else if (strcmp(argv[1], "-run") == 0) { run = true; } else { printf("Invalid Arguments\nUsage %s <flag> <map> <scenario>\n", argv[0]); printf("Flags:\n"); printf("\t-full : Preprocess map and run scenario\n"); printf("\t-pre : Preprocess map\n"); printf("\t-run : Run scenario without preprocessing\n"); exit(0); } LoadMap(argv[2], mapData, width, height); sprintf(filename, "%s-%s.txt", GetName(), argv[2]); */ // Testing area LoadMap("ca_cave.map", mapData, width, height); sprintf(filename, "%s-%s.txt", GetName(), "TEST"); pre = run = true; if (pre) { PreprocessMap(mapData, width, height, filename); } if (!run) { return 0; } void *reference = PrepareForSearch(mapData, width, height, filename); //ScenarioLoader scen(argv[3]); ScenarioLoader scen("ca_cave.map.scen"); Timer t; std::vector<stats> experimentStats; for (int x = 0; x < scen.GetNumExperiments(); x++) { printf("%d of %d\n", x+1, scen.GetNumExperiments()); thePath.resize(0); experimentStats.resize(x+1); bool done; xyLoc s, g; s.x = scen.GetNthExperiment(x).GetStartX(); s.y = scen.GetNthExperiment(x).GetStartY(); g.x = scen.GetNthExperiment(x).GetGoalX(); g.y = scen.GetNthExperiment(x).GetGoalY(); SetFirstSearch(true); InitializeSearch(); do { t.StartTimer(); done = GetPath(reference, s, g, thePath); t.EndTimer(); experimentStats[x].times.push_back(t.GetElapsedTime()); experimentStats[x].lengths.push_back(thePath.size()); for (unsigned int t = experimentStats[x].path.size(); t < thePath.size(); t++) experimentStats[x].path.push_back(thePath[t]); } while (done == false); } for (unsigned int x = 0; x < experimentStats.size(); x++) { printf("%s\ttotal-time\t%f\tmax-time-step\t%f\ttime-20-moves\t%f\ttotal-len\t%f\tsubopt\t%f\t", argv[3], experimentStats[x].GetTotalTime(), experimentStats[x].GetMaxTimestep(), experimentStats[x].Get20MoveTime(), experimentStats[x].GetPathLength(), experimentStats[x].GetPathLength()/scen.GetNthExperiment(x).GetDistance()); if (experimentStats[x].path.size() == 0 || (experimentStats[x].ValidatePath(width, height, mapData) && scen.GetNthExperiment(x).GetStartX() == experimentStats[x].path[0].x && scen.GetNthExperiment(x).GetStartY() == experimentStats[x].path[0].y && scen.GetNthExperiment(x).GetGoalX() == experimentStats[x].path.back().x && scen.GetNthExperiment(x).GetGoalY() == experimentStats[x].path.back().y)) { printf("valid\n"); } else { printf("invalid\n"); } } /* // Testing section... //131 233 163 50 xyLoc s, g; s.x = 95; s.y = 146; g.x = 92; g.y = 189; InitializeSearch(); Timer t; t.StartTimer(); bool done = false; while (!done) { done = GetPath(reference, s, g, thePath); } t.EndTimer(); printf("(%d,%d)->(%d,%d)\n",s.x,s.y,g.x,g.y); printf("time: %fs\n",t.GetElapsedTime()); write_map(mapData, width, height, s, g, thePath); stats st; st.path = thePath; bool k = (st.ValidatePath(width, height, mapData) && s.x == thePath[0].x && s.y == thePath[0].y && g.x == thePath.back().x && g.y == thePath.back().y ); if (k) printf("valid\n"); else printf("invalid\n"); return 0;*/ }
/** ** CreateGame. ** ** Load map, graphics, sounds, etc ** ** @param filename map filename ** @param map map loaded ** ** @todo FIXME: use in this function InitModules / LoadModules!!! */ void CreateGame(const char *filename, CMap *map) { int i; if (SaveGameLoading) { SaveGameLoading = 0; // Load game, already created game with Init/LoadModules CommandLog(NULL, NoUnitP, FlushCommands, -1, -1, NoUnitP, NULL, -1); return; } InitVisionTable(); // build vision table for fog of war InitPlayers(); if (Map.Info.Filename.empty() && filename) { char path[PATH_MAX]; Assert(filename); LibraryFileName(filename, path, sizeof(path)); if(strcasestr(filename, ".smp")) { LuaLoadFile(path); } } for (i = 0; i < PlayerMax; ++i) { int playertype = Map.Info.PlayerType[i]; // Network games only: if (GameSettings.Presets[i].Type != SettingsPresetMapDefault) { playertype = GameSettings.Presets[i].Type; } CreatePlayer(playertype); } if (filename) { if (CurrentMapPath != filename) { strcpy_s(CurrentMapPath, sizeof(CurrentMapPath), filename); } // // Load the map. // InitUnitTypes(1); LoadMap(filename, map); // HARDCODING FOG OF WAR TRUE. It doesn't currently use preferences on a game restart - Should be changed map->NoFogOfWar = true; Map.Reveal(); } GameCycle = 0; FastForwardCycle = 0; SyncHash = 0; InitSyncRand(); if (IsNetworkGame()) { // Prepare network play DebugPrint("Client setup: Calling InitNetwork2\n"); InitNetwork2(); } else { if (LocalPlayerName && strcmp(LocalPlayerName, "Anonymous")) { ThisPlayer->SetName(LocalPlayerName); } } CallbackMusicOn(); #if 0 GamePaused = true; #endif if (FlagRevealMap) { Map.Reveal(); } // // Setup game types // // FIXME: implement more game types if (GameSettings.GameType != SettingsGameTypeMapDefault) { switch (GameSettings.GameType) { case SettingsGameTypeMelee: break; case SettingsGameTypeFreeForAll: GameTypeFreeForAll(); break; case SettingsGameTypeTopVsBottom: GameTypeTopVsBottom(); break; case SettingsGameTypeLeftVsRight: GameTypeLeftVsRight(); break; case SettingsGameTypeManVsMachine: GameTypeManVsMachine(); break; case SettingsGameTypeManTeamVsMachine: GameTypeManTeamVsMachine(); // Future game type ideas #if 0 case SettingsGameTypeOneOnOne: break; case SettingsGameTypeCaptureTheFlag: break; case SettingsGameTypeGreed: break; case SettingsGameTypeSlaughter: break; case SettingsGameTypeSuddenDeath: break; case SettingsGameTypeTeamMelee: break; case SettingsGameTypeTeamCaptureTheFlag: break; #endif } } // // Graphic part // SetPlayersPalette(); InitIcons(); LoadIcons(); LoadCursors(PlayerRaces.Name[ThisPlayer->Race]); UnitUnderCursor = NoUnitP; InitMissileTypes(); #ifndef DYNAMIC_LOAD LoadMissileSprites(); #endif InitConstructions(); LoadConstructions(); LoadUnitTypes(); LoadDecorations(); InitSelections(); InitUserInterface(); UI.Load(); UI.Minimap.Create(); Map.Init(); PreprocessMap(); // // Sound part // LoadUnitSounds(); MapUnitSounds(); if (SoundEnabled()) { InitSoundClient(); } // // Spells // InitSpells(); // // Init units' groups // InitGroups(); // // Init players? // DebugPlayers(); PlayersInitAi(); // // Upgrades // InitUpgrades(); // // Dependencies // InitDependencies(); // // Buttons (botpanel) // InitButtons(); // // Triggers // InitTriggers(); SetDefaultTextColors(UI.NormalFontColor, UI.ReverseFontColor); #if 0 if (!UI.SelectedViewport) { UI.SelectedViewport = UI.Viewports; } #endif UI.SelectedViewport->Center( ThisPlayer->StartX, ThisPlayer->StartY, TileSizeX / 2, TileSizeY / 2); // // Various hacks wich must be done after the map is loaded. // // FIXME: must be done after map is loaded InitAStar(); // // FIXME: The palette is loaded after the units are created. // FIXME: This loops fixes the colors of the units. // for (i = 0; i < NumUnits; ++i) { // I don't really think that there can be any rescued // units at this point. if (Units[i]->RescuedFrom) { Units[i]->Colors = &Units[i]->RescuedFrom->UnitColors; } else { Units[i]->Colors = &Units[i]->Player->UnitColors; } } GameResult = GameNoResult; CommandLog(NULL, NoUnitP, FlushCommands, -1, -1, NoUnitP, NULL, -1); Video.ClearScreen(); }