private void SpawnItemsRandomly(int levelIndex, MapGeneratorBSP mapGen) { //Item catalogue List<Item> meleeRelatedItems = new List<Item>(); meleeRelatedItems.Add(new Items.Vibroblade()); meleeRelatedItems.Add(new Items.Pistol()); meleeRelatedItems.Sort((x,y) => x.ItemCost().CompareTo(y.ItemCost())); List<Item> rangedRelatedItems = new List<Item>(); rangedRelatedItems.Add(new Items.Shotgun()); rangedRelatedItems.Add(new Items.Laser()); rangedRelatedItems.Add(new Items.Pistol()); rangedRelatedItems.Sort((x,y) => x.ItemCost().CompareTo(y.ItemCost())); List<Item> grenadeRelatedItems = new List<Item>(); grenadeRelatedItems.Add(new Items.SoundGrenade()); grenadeRelatedItems.Add(new Items.FragGrenade()); grenadeRelatedItems.Add(new Items.StunGrenade()); grenadeRelatedItems.Sort((x,y) => x.ItemCost().CompareTo(y.ItemCost())); List<Item> healingRelatedItems = new List<Item>(); healingRelatedItems.Add(new Items.NanoRepair()); healingRelatedItems.Add(new Items.TacticalOverlay()); healingRelatedItems.Add(new Items.StealthCloak()); healingRelatedItems.Sort((x,y) => x.ItemCost().CompareTo(y.ItemCost())); List<List<Item>> itemCatalogue = new List<List<Item>>(); itemCatalogue.Add(meleeRelatedItems); itemCatalogue.Add(rangedRelatedItems); itemCatalogue.Add(healingRelatedItems); //Grenades go in last to suck up any left-over budget itemCatalogue.Add(grenadeRelatedItems); //Calculate the budget we have to spend int itemBudget = 60 + (levelIndex - 5) * 10; //Divide between different types List<double> budgetRatios = new List<double>(); double meleeRelatedBudgetRatio = Game.Random.NextDouble(); budgetRatios.Add(meleeRelatedBudgetRatio); double firingRelatedBudgetRatio = 1 - meleeRelatedBudgetRatio; budgetRatios.Add(firingRelatedBudgetRatio); double grenadeRelatedBudgeRadio = Game.Random.NextDouble(); budgetRatios.Add(grenadeRelatedBudgeRadio); double healingRelatedBudgeRadio = Game.Random.NextDouble(); budgetRatios.Add(healingRelatedBudgeRadio); //Calculate budget split double totalRatio = 0.0; foreach(double d in budgetRatios) { totalRatio += d; } double ratioToTotalBudget = itemBudget / totalRatio; double remainder = 0.0; //To hold all the items to place List<Item> itemsToPlace = new List<Item>(); //Spend budget on each catalogue, depending upon ratio for (int i = 0; i < itemCatalogue.Count; i++) { double categoryBudget = budgetRatios[i] * ratioToTotalBudget + remainder; remainder = (double)SpendItemBudget((int)categoryBudget, itemCatalogue[i], itemsToPlace); } LogFile.Log.LogEntryDebug("SpawnItemsRandomly: level: " + levelIndex + " total budget: " + itemBudget + " remainder: " + remainder, LogDebugLevel.High); //Add any standard items //1 healing kit itemsToPlace.Add(new Items.NanoRepair()); //Actually add the items List<RoomCoords> allRooms = mapGen.GetAllRooms(); AddItemsEqualDistribution(itemsToPlace, levelIndex, mapGen); //Pistol at start location AddItemAtLocation(new Items.Pistol(), levelIndex, mapGen.GetPlayerStartLocation()); }
private void SpawnItemsLevel6(int levelIndex, MapGeneratorBSP mapGen) { List<RoomCoords> allRooms = mapGen.GetAllRooms(); //Pistol at start location AddItemAtLocation(new Items.Laser(), levelIndex, mapGen.GetPlayerStartLocation()); AddItemAtLocation(new Items.StealthCloak(), levelIndex, mapGen.GetPlayerStartLocation()); //Spawn some items List<Item> itemsToPlace = new List<Item>(); itemsToPlace.Add(new Items.TacticalOverlay()); itemsToPlace.Add(new Items.StealthCloak()); AddItemsEqualDistribution(itemsToPlace, levelIndex, mapGen); }
private void SpawnItemsLevel4(int levelIndex, MapGeneratorBSP mapGen) { List<RoomCoords> allRooms = mapGen.GetAllRooms(); //Pistol at start location AddItemAtLocation(new Items.Pistol(), levelIndex, mapGen.GetPlayerStartLocation()); //Spawn some items List<Item> itemsToPlace = new List<Item>(); itemsToPlace.Add(new Items.SoundGrenade()); itemsToPlace.Add(new Items.SoundGrenade()); itemsToPlace.Add(new Items.SoundGrenade()); itemsToPlace.Add(new Items.SoundGrenade()); itemsToPlace.Add(new Items.FragGrenade()); itemsToPlace.Add(new Items.FragGrenade()); itemsToPlace.Add(new Items.NanoRepair()); AddItemsEqualDistribution(itemsToPlace, levelIndex, mapGen); }
private void SpawnItemsLevel2(int levelIndex, MapGeneratorBSP mapGen) { List<RoomCoords> allRooms = mapGen.GetAllRooms(); //Spawn some items List<Item> itemsToPlace = new List<Item>(); //Tempt the player with the shotgun //AddItemCloseToLocation(new Items.Shotgun(), 0, mapGen.GetPlayerStartLocation()); AddItemAtLocation(new Items.Shotgun(), levelIndex, mapGen.GetPlayerStartLocation()); //Vibroblade is a better choice itemsToPlace.Add(new Items.Vibroblade()); //Another shotty itemsToPlace.Add(new Items.Shotgun()); AddItemsEqualDistribution(itemsToPlace, levelIndex, mapGen); }
private void SpawnItemsLevel1(int levelIndex, MapGeneratorBSP mapGen) { List<RoomCoords> allRooms = mapGen.GetAllRooms(); //Spawn some items List<Item> itemsToPlace = new List<Item>(); itemsToPlace.Add(new Items.Pistol()); AddItemsEqualDistribution(itemsToPlace, levelIndex, mapGen); }
private void SpawnCreaturesRandomly(int levelIndex, MapGeneratorBSP mapGen) { //Monster catalogue //Type of monster : typical group size //Melee monsters List<KeyValuePair<Monster, int>> meleeMonsters = new List<KeyValuePair<Monster, int>>(); meleeMonsters.Add(new KeyValuePair<Monster, int>(new Creatures.Swarmer(), 6)); meleeMonsters.Add(new KeyValuePair<Monster, int>(new Creatures.Juggernaut(), 1)); //Patrolling catalogue List<KeyValuePair<Monster, int>> patrolMonsters = new List<KeyValuePair<Monster, int>>(); patrolMonsters.Add(new KeyValuePair<Monster, int>(new Creatures.PatrolBot(), 3)); patrolMonsters.Add(new KeyValuePair<Monster, int>(new Creatures.PatrolBotArea(), 3)); //Rotating catalogue List<KeyValuePair<Monster, int>> staticMonsters = new List<KeyValuePair<Monster, int>>(); staticMonsters.Add(new KeyValuePair<Monster, int>(new Creatures.RotatingTurret(), 2)); staticMonsters.Add(new KeyValuePair<Monster, int>(new Creatures.CombatBot(), 3)); //Special monsters List<KeyValuePair<Monster, int>> specialMonsters = new List<KeyValuePair<Monster, int>>(); specialMonsters.Add(new KeyValuePair<Monster, int>(new Creatures.AlertBot(), 2)); specialMonsters.Add(new KeyValuePair<Monster, int>(new Creatures.RollingBomb(), 2)); List<List<KeyValuePair<Monster, int>>> monsterCatalogue = new List<List<KeyValuePair<Monster, int>>>(); monsterCatalogue.Add(meleeMonsters); monsterCatalogue.Add(patrolMonsters); monsterCatalogue.Add(staticMonsters); //Grenades go in last to suck up any left-over budget monsterCatalogue.Add(specialMonsters); //Calculate the budget we have to spend //An 10 cost item (pistol) is good for 30 - 40 points of monster //Item budget: 50 + (levelIndex - 5) * 10; int creatureBudget = (50 + (levelIndex - 5) * 10) * 3; //Divide between different types List<double> budgetRatios = new List<double>(); //Initialize budgetRatios.Add(Game.Random.NextDouble()); budgetRatios.Add(Game.Random.NextDouble()); budgetRatios.Add(Game.Random.NextDouble()); budgetRatios.Add(Game.Random.NextDouble()); //Try to spend 2/3 of our budget on one type //(+3 was too much at present) //exclude special budgetRatios[Game.Random.Next(budgetRatios.Count - 1)] += 1.5; //Calculate budget split double totalRatio = 0.0; foreach (double d in budgetRatios) { totalRatio += d; } double ratioToTotalBudget = creatureBudget / totalRatio; double remainder = 0.0; //To hold all the items to place List<Monster> monstersToPlaceEvenly = new List<Monster>(); List<MonsterFightAndRunAI> monstersToPlaceLinearPatrol = new List<MonsterFightAndRunAI>(); List<MonsterFightAndRunAI> monstersToPlaceSquarePatrol = new List<MonsterFightAndRunAI>(); //Spend budget on each catalogue, depending upon ratio for (int i = 0; i < monsterCatalogue.Count; i++) { double categoryBudget = budgetRatios[i] * ratioToTotalBudget + remainder; remainder = (double)SpendMonsterBudget((int)categoryBudget, monsterCatalogue[i], monstersToPlaceEvenly, monstersToPlaceLinearPatrol, monstersToPlaceSquarePatrol); } LogFile.Log.LogEntryDebug("SpawnCreaturesRandomly: level: " + levelIndex + " total budget: " + creatureBudget + " remainder: " + remainder, LogDebugLevel.High); //Actually add the monsters List<RoomCoords> allRooms = mapGen.GetAllRooms(); AddMonstersEqualDistribution(monstersToPlaceEvenly, levelIndex, mapGen); foreach (MonsterFightAndRunAI m in monstersToPlaceLinearPatrol) AddMonsterLinearPatrol(m, levelIndex, mapGen); foreach (MonsterFightAndRunAI m in monstersToPlaceSquarePatrol) AddMonsterSquarePatrol(m, levelIndex, mapGen); //This sets light level in the creatures SetLightLevelUniversal(levelIndex, levelIndex, 5); }