private int HandleSpawn(ObjectDesc desc, WmapTerrain terrain, int w, int h) { Entity entity; var ret = 0; var pt = new IntPoint(); if (desc.Spawn != null) { var num = (int)GetNormal(rand, desc.Spawn.Mean, desc.Spawn.StdDev); if (num > desc.Spawn.Max) { num = desc.Spawn.Max; } else if (num < desc.Spawn.Min) { num = desc.Spawn.Min; } do { pt.X = rand.Next(0, w); pt.Y = rand.Next(0, h); } while (world.Map[pt.X, pt.Y].Terrain != terrain || !world.IsPassable(pt.X, pt.Y) || world.AnyPlayerNearby(pt.X, pt.Y)); for (var k = 0; k < num; k++) { entity = Entity.Resolve(desc.ObjectType); entity.Move( pt.X + (float)(rand.NextDouble() * 2 - 1) * 5, pt.Y + (float)(rand.NextDouble() * 2 - 1) * 5); (entity as Enemy).Terrain = terrain; if (entity.GetNearestEntity(10, true) == null) { world.EnterWorld(entity); } ret++; } } else { do { pt.X = rand.Next(0, w); pt.Y = rand.Next(0, h); } while (world.Map[pt.X, pt.Y].Terrain != terrain || !world.IsPassable(pt.X, pt.Y) || world.AnyPlayerNearby(pt.X, pt.Y)); entity = Entity.Resolve(desc.ObjectType); entity.Move(pt.X, pt.Y); (entity as Enemy).Terrain = terrain; world.EnterWorld(entity); ret++; } return(ret); }