public void balanceSpawning() { int numBugs = AllPossibleHomesByBug.Keys.Count; double sumRarity = BugCatchingMod.AllBugs.Where(bug => AllPossibleHomesByBug.ContainsKey(bug.Id)).Aggregate(0.0, (acc, bug) => acc + (1f - bug.Rarity)); int nTotalBugs = (int)Math.Floor(numBugs * sumRarity); Log.info($"location has ({nTotalBugs}) total bugs with a sumRarity of ({sumRarity})"); foreach (KeyValuePair <string, List <Vector2> > kvp in AllPossibleHomesByBug) { CritterEntry critterEntry = CritterEntry.critters[kvp.Key]; List <Vector2> possibleSpawnLocations = new List <Vector2>(); possibleSpawnLocations = kvp.Value; int nCritterSpawned = (int)Math.Ceiling(critterEntry.BugModel.Rarity * nTotalBugs); Log.info($"({nCritterSpawned}) {critterEntry.BugModel.Name} will spawn"); if (possibleSpawnLocations.Count > 0) { for (int i = 0; i <= nCritterSpawned; i++) { Vector2 tile = possibleSpawnLocations.PopRandom(); Log.info($"Adding {critterEntry.BugModel.Name} at location {tile}"); CritterLocation critterLocation = new CritterLocation(critterEntry) { tilePosition = tile }; registerCritterHome(critterLocation); } } else { Log.error($"{critterEntry.BugModel.Name} lacks Suitable Housing"); } } }
public CritterLocation getCritterHome(string layerName, Vector2 tile) { CritterLocation locationEntry = new CritterLocation(); locationEntry = CritterHomes.Find(c => c.layerName == layerName && c.tilePosition == tile); return(locationEntry); }
public void addDisturbableHome(CritterLocation critterLocationEntry) { if (critterLocationEntry.CritterEntry.Classification == "Digger") { Location.setTileProperty((int)critterLocationEntry.tilePosition.X, (int)critterLocationEntry.tilePosition.Y, "Back", "Diggable", "T"); } else if (critterLocationEntry.CritterEntry.Behavior.DisturbableHome) { this.Location.Map.addTouchAction(critterLocationEntry.tilePosition, "disturbBug", ""); } }
public bool DisturbBug(string action, GameLocation location, Vector2 tile, string layerName) { Log.debug($"{action} | {location} | {tile} | {layerName}"); bool flag = false; CritterLocations CritterLocator = AllCritterLocations.Where(l => l.Location == Game1.currentLocation).Single(); CritterLocation critterLocation = CritterLocator.getCritterHome(layerName, tile); if (critterLocation != null) { CritterLocator.activateCritter(critterLocation); flag = true; } return(flag); }
public void activateCritter(CritterLocation critterLocationEntry) { if (critterLocationEntry == null) { Log.error("cannot activate; null critterLocationEntry"); return; } CritterEntry critterEntry = CritterEntry.critters.Find(ce => ce.Value == critterLocationEntry.CritterEntry).Value; if (critterEntry == null) { Log.error("cannot activate; null critterEntry"); return; } Location.addCritter(critterEntry.makeCritter(critterLocationEntry.tilePosition)); CritterHomes.Remove(critterLocationEntry); }
public void registerCritterHome(CritterLocation critterLocation) { Log.info($"Registering critterLocation {Location} {critterLocation.layerName} {critterLocation.tilePosition} {critterLocation.CritterEntry}"); CritterHomes.AddOrReplace(critterLocation); }