protected override List <int> GetTypes(BaseMapGenContext map, SpawnList <MobSpawn> specialMobs) { Dictionary <int, int> elementFrequency = new Dictionary <int, int>(); for (int ii = 0; ii < map.TeamSpawns.Count; ii++) { SpawnList <MobSpawn> mobSpawns = map.TeamSpawns.GetSpawn(ii).GetPossibleSpawns(); foreach (MobSpawn spawn in mobSpawns.EnumerateOutcomes()) { MonsterFeatureData featureIndex = DataManager.Instance.UniversalData.Get <MonsterFeatureData>(); FormFeatureSummary baseData = featureIndex.FeatureData[spawn.BaseForm.Species][Math.Max(0, spawn.BaseForm.Form)]; if (baseData.Element1 != 00) { MathUtils.AddToDictionary(elementFrequency, baseData.Element1, 1); } if (baseData.Element2 != 00) { MathUtils.AddToDictionary(elementFrequency, baseData.Element2, 1); } } } if (elementFrequency.Count == 0) { for (int ii = 0; ii < specialMobs.Count; ii++) { MobSpawn spawn = specialMobs.GetSpawn(ii); MonsterFeatureData featureIndex = DataManager.Instance.UniversalData.Get <MonsterFeatureData>(); FormFeatureSummary baseData = featureIndex.FeatureData[spawn.BaseForm.Species][Math.Max(0, spawn.BaseForm.Form)]; if (baseData.Element1 != 00) { MathUtils.AddToDictionary(elementFrequency, baseData.Element1, 1); } if (baseData.Element2 != 00) { MathUtils.AddToDictionary(elementFrequency, baseData.Element2, 1); } } } List <int> result = new List <int>(); if (elementFrequency.Count > 0) { //choose randomly from the top 3 types List <(int, int)> elements = new List <(int, int)>(); foreach (int key in elementFrequency.Keys) { elements.Add((key, elementFrequency[key]));
public static void TestFloor(Stopwatch watch, ZoneSegmentBase structure, ZoneGenContext zoneContext, Dictionary <int, int> generatedItems, Dictionary <int, int> generatedEnemies, List <TimeSpan> generationTimes) { TimeSpan before = watch.Elapsed; watch.Start(); IGenContext context = structure.GetMap(zoneContext); watch.Stop(); TimeSpan diff = watch.Elapsed - before; generationTimes.Add(diff); BaseMapGenContext mapContext = context as BaseMapGenContext; if (generatedItems != null) { foreach (MapItem mapItem in mapContext.Map.Items) { if (mapItem.IsMoney) { MathUtils.AddToDictionary <int>(generatedItems, -1, mapItem.Value); MathUtils.AddToDictionary <int>(generatedItems, 0, 1); } else { MathUtils.AddToDictionary <int>(generatedItems, mapItem.Value, 1); } } } if (generatedEnemies != null) { foreach (Team team in mapContext.Map.MapTeams) { foreach (Character character in team.Players) { MathUtils.AddToDictionary <int>(generatedEnemies, character.BaseForm.Species, 1); } } } }
public static void StressTestStructure(ZoneSegmentBase structure, int zoneIndex, int structureIndex, int amount) { ExampleDebug.Printing = -1; ulong zoneSeed = 0; int floor = 0; try { List <Dictionary <int, int> > generatedItems = new List <Dictionary <int, int> >(); List <Dictionary <int, int> > generatedEnemies = new List <Dictionary <int, int> >(); List <List <TimeSpan> > generationTimes = new List <List <TimeSpan> >(); for (int ii = 0; ii < structure.FloorCount; ii++) { generatedItems.Add(new Dictionary <int, int>()); generatedEnemies.Add(new Dictionary <int, int>()); generationTimes.Add(new List <TimeSpan>()); } Stopwatch watch = new Stopwatch(); for (int ii = 0; ii < amount; ii++) { zoneSeed = MathUtils.Rand.NextUInt64(); ReNoise totalNoise = new ReNoise(zoneSeed); ulong[] doubleSeed = totalNoise.GetTwoUInt64((ulong)structureIndex); INoise idNoise = new ReNoise(doubleSeed[1]); ZoneGenContext zoneContext = CreateZoneGenContextSegment(doubleSeed[0], zoneIndex, structureIndex, structure); foreach (int floorId in structure.GetFloorIDs()) { floor = floorId; zoneContext.CurrentID = floorId; zoneContext.Seed = idNoise.GetUInt64((ulong)floorId); TestFloor(watch, structure, zoneContext, generatedItems[floorId], generatedEnemies[floorId], generationTimes[floorId]); } } Dictionary <int, int> totalGeneratedItems = new Dictionary <int, int>(); Dictionary <int, int> totalGeneratedEnemies = new Dictionary <int, int>(); for (int ii = 0; ii < structure.FloorCount; ii++) { DiagManager.Instance.LogInfo("F" + ii + ":"); PrintContentAnalysis(generatedItems[ii], generatedEnemies[ii]); foreach (int key in generatedItems[ii].Keys) { MathUtils.AddToDictionary <int>(totalGeneratedItems, key, generatedItems[ii][key]); } foreach (int key in generatedEnemies[ii].Keys) { MathUtils.AddToDictionary <int>(totalGeneratedEnemies, key, generatedEnemies[ii][key]); } } DiagManager.Instance.LogInfo("Overall:"); PrintContentAnalysis(totalGeneratedItems, totalGeneratedEnemies); PrintTimeAnalysisTier2(generationTimes, "F"); } catch (Exception ex) { DiagManager.Instance.LogInfo("ERROR at F" + floor + " ZSeed:" + zoneSeed); PrintError(ex); } finally { ExampleDebug.Printing = 0; } }