public Map GenerateMap(MapBiome mapBiome = null) { if (mapBiome is null) { mapBiome = new GrasslandMapBiome(); } Map map = new Map() { mapBiome = mapBiome }; Thread mapCreator = new Thread(() => map.SetupMap(mapBiome.DefaultParameters().PerlinDiff, World.World.random.Next(), mapBiome.DefaultParameters().HeightDiff + mission.heightDiff, mapBiome)); mapCreator.Start(); mapCreator.Priority = ThreadPriority.Highest; bool validMap = false; bool finished = mapCreator.Join(Map.creationTime); int counter = 20; while (!(finished && validMap)) { int seed = World.World.random.Next(); mapCreator = new Thread(() => map.SetupMap(mapBiome.DefaultParameters().PerlinDiff, World.World.random.Next(), mapBiome.DefaultParameters().HeightDiff + mission.heightDiff, mapBiome)); mapCreator.Start(); mapCreator.Priority = ThreadPriority.Highest; finished = mapCreator.Join(Map.creationTime); validMap = mission.MapValidity(map); counter--; if (counter == 0) { throw new Exception("Can not find valid map!"); } } return(map); }
private void RunMission(int difficulty, Mission.Mission selected, StartMission action = null) { World.Instance.campaign.mission = selected; MapBiome biome = new GrasslandMapBiome(); if (mapBiomes.ContainsKey(World.Instance.worldMap[player.WorldPosition.X, player.WorldPosition.Y].type)) { biome = mapBiomes[World.Instance.worldMap[player.WorldPosition.X, player.WorldPosition.Y].type]; } Map map = World.Instance.campaign.GenerateMap(biome); player.map = map; player.troop.Map = map; MainGameWindow mainGame = new MainGameWindow(map, player, selected, World.Instance.trees, difficulty, World.WORLD_DIFFICULTY); biome.ManipulateMission(mainGame, selected); mainGame.RenderMap(true, true, true); controller.Stop(); mainGame.ShowDialog(); if (action != null) { action.MissionEnded(mainGame.giveReward); } if (mainGame.dead) { //as player is dead campaign is over Close(); return; } if (mainGame.giveReward) { //Now give reward MissionResult r = CampaignController.GenerateRewardAndHeal(player, mainGame, selected, player.vitality.Value, (player.level / 25d).Cut(0, 1), "Close"); r.ShowDialog(); } if (running) { controller.Start(); } World.Instance.missionsCompleted++; World.Instance.actors.RemoveAll(p => (p is MissionWorldPlayer wp) && wp.WorldPosition == player.WorldPosition); World.Instance.GenerateNewMission(); Render(); }