public void SpawnSprites(int count, Vector2?position = null) { activeSprites.Clear(); if (prefabs.Count == 0) { return; } count = Math.Min(count, MaxSprites); for (int i = 0; i < count; i++) { Vector2 pos = Vector2.Zero; if (position == null) { var wayPoints = WayPoint.WayPointList.FindAll(wp => wp.Submarine == null); if (wayPoints.Any()) { WayPoint wp = wayPoints[Rand.Int(wayPoints.Count, Rand.RandSync.ClientOnly)]; pos = new Vector2(wp.Rect.X, wp.Rect.Y); pos += Rand.Vector(200.0f, Rand.RandSync.ClientOnly); } else { pos = Rand.Vector(2000.0f, Rand.RandSync.ClientOnly); } } else { pos = (Vector2)position; } var prefab = prefabs[Rand.Int(prefabs.Count, Rand.RandSync.ClientOnly)]; int amount = Rand.Range(prefab.SwarmMin, prefab.SwarmMax, Rand.RandSync.ClientOnly); List <BackgroundCreature> swarmMembers = new List <BackgroundCreature>(); for (int n = 0; n < amount; n++) { var newSprite = new BackgroundCreature(prefab, pos); activeSprites.Add(newSprite); swarmMembers.Add(newSprite); } if (amount > 0) { new Swarm(swarmMembers, prefab.SwarmRadius); } } }
public void SpawnCreatures(Level level, int count, Vector2?position = null) { creatures.Clear(); if (prefabs.Count == 0) { return; } count = Math.Min(count, MaxCreatures); List <BackgroundCreaturePrefab> availablePrefabs = new List <BackgroundCreaturePrefab>(prefabs); for (int i = 0; i < count; i++) { Vector2 pos = Vector2.Zero; if (position == null) { var wayPoints = WayPoint.WayPointList.FindAll(wp => wp.Submarine == null); if (wayPoints.Any()) { WayPoint wp = wayPoints[Rand.Int(wayPoints.Count, Rand.RandSync.ClientOnly)]; pos = new Vector2(wp.Rect.X, wp.Rect.Y); pos += Rand.Vector(200.0f, Rand.RandSync.ClientOnly); } else { pos = Rand.Vector(2000.0f, Rand.RandSync.ClientOnly); } } else { pos = (Vector2)position; } var prefab = ToolBox.SelectWeightedRandom(availablePrefabs, availablePrefabs.Select(p => p.GetCommonness(level.GenerationParams)).ToList(), Rand.RandSync.ClientOnly); if (prefab == null) { break; } int amount = Rand.Range(prefab.SwarmMin, prefab.SwarmMax, Rand.RandSync.ClientOnly); List <BackgroundCreature> swarmMembers = new List <BackgroundCreature>(); for (int n = 0; n < amount; n++) { var creature = new BackgroundCreature(prefab, pos + Rand.Vector(Rand.Range(0.0f, prefab.SwarmRadius, Rand.RandSync.ClientOnly), Rand.RandSync.ClientOnly)); creatures.Add(creature); swarmMembers.Add(creature); } if (amount > 1) { new Swarm(swarmMembers, prefab.SwarmRadius, prefab.SwarmCohesion); } if (creatures.Count(c => c.Prefab == prefab) > prefab.MaxCount) { availablePrefabs.Remove(prefab); if (availablePrefabs.Count <= 0) { break; } } } }