/// <summary> /// Initialises campaign and generates map and enemies for first mission /// </summary> public void Start() { //Setup map mission = DecideMission(Round); Map map = GenerateMap(); player.map = map; player.troop.Map = map; //Finish initialisation activeGame = new MainGameWindow(map, player, mission, trees, difficulty, Round); }
/// <summary> /// Initialises next mission in the campaign. Returns true if there is a next mission, false if the campaign is over /// </summary> public bool Next() { if (playedGames.Count + 1 == numberOfGames) { return(false); } if (activeGame is null) { throw new Exception(); } playedGames.Add(activeGame); mission = DecideMission(Round); //Setup map Map map = new Map(); Thread mapCreator; do { mapCreator = new Thread(() => map.SetupMap(0.1, World.World.random.Next(), 0)) { Priority = ThreadPriority.Highest }; mapCreator.Start(); } while (!mapCreator.Join(Map.creationTime) && !mission.MapValidity(map)); player.map = map; player.troop.Map = map; //Finish initialisation player.active = false; activeGame = new MainGameWindow(map, player, mission, trees, difficulty, Round); return(true); }
public static MissionResult GenerateRewardAndHeal(HumanPlayer player, MainGameWindow mainWindow, Mission.Mission mission, int healthRegen, double progression, string closeButtonText) { //Reset troop stats foreach (Weapon weapon in player.troop.weapons) { if (weapon.type != BaseAttackType.range) { weapon.SetAttacks(weapon.MaxAttacks()); } } player.mana.RawValue = player.mana.MaxValue().Value; player.troop.health.RawValue += healthRegen; player.troop.health.RawValue = player.troop.health.Value > player.troop.health.MaxValue().Value ? player.troop.health.MaxValue().Value : player.troop.health.Value; List <Armour> loot = new List <Armour>(); if (mission.lootDead) { //Generate loot from dead players List <Armour> lootableArmour = new List <Armour>(); foreach (var deadPlayer in mainWindow.killedPlayers) { lootableArmour.AddRange(deadPlayer.troop.armours); } lootableArmour = lootableArmour.OrderBy(a => World.World.random.Next()).ToList(); // I know it is not the most effiecent but that does not matter here int chosen = 0; foreach (var lootpiece in lootableArmour) { if (World.World.random.NextDouble() < 1d / (chosen + 1d)) { lootpiece.active = false; loot.Add(lootpiece); chosen++; } } } //Show world map MissionResult worldView = new MissionResult(player, progression, mission, loot, closeButtonText); return(worldView); }