private static void Process(Map map, Rectangle2D[] regions) { m_ShopTable = new Hashtable(); m_ShopList = new ArrayList(); World.Broadcast(0x35, true, "Generating vendor spawns for {0}, please wait.", map); for (int i = 0; i < regions.Length; ++i) { for (int x = 0; x < map.Width; ++x) { for (int y = 0; y < map.Height; ++y) { CheckPoint(map, regions[i].X + x, regions[i].Y + y); } } } for (int i = 0; i < m_ShopList.Count; ++i) { ShopInfo si = (ShopInfo)m_ShopList[i]; int xTotal = 0; int yTotal = 0; bool hasSpawner = false; for (int j = 0; !hasSpawner && j < si.m_Floor.Count; ++j) { Point2D fp = (Point2D)si.m_Floor[j]; xTotal += fp.X; yTotal += fp.Y; IPooledEnumerable eable = map.GetItemsInRange(new Point3D(fp.X, fp.Y, 0), 0); foreach (Item item in eable) { if (item is Spawner) { hasSpawner = true; break; } } eable.Free(); if (hasSpawner) { break; } } if (hasSpawner) { continue; } int xAvg = xTotal / si.m_Floor.Count; int yAvg = yTotal / si.m_Floor.Count; ArrayList names = new ArrayList(); ShopFlags flags = si.m_Flags; if ((flags & ShopFlags.Armor) != 0) { names.Add("armorer"); } if ((flags & ShopFlags.MetalWeapon) != 0) { names.Add("weaponsmith"); } if ((flags & ShopFlags.ArcheryWeapon) != 0) { names.Add("bowyer"); } if ((flags & ShopFlags.Scroll) != 0) { names.Add("mage"); } if ((flags & ShopFlags.Spellbook) != 0) { names.Add("mage"); } if ((flags & ShopFlags.Bread) != 0) { names.Add("baker"); } if ((flags & ShopFlags.Jewel) != 0) { names.Add("jeweler"); } if ((flags & ShopFlags.Potion) != 0) { names.Add("herbalist"); names.Add("alchemist"); names.Add("mage"); } if ((flags & ShopFlags.Reagent) != 0) { names.Add("mage"); names.Add("herbalist"); } if ((flags & ShopFlags.Clothes) != 0) { names.Add("tailor"); names.Add("weaver"); } for (int j = 0; j < names.Count; ++j) { Point2D cp = Point2D.Zero; int dist = 100000; int tz; for (int k = 0; k < si.m_Floor.Count; ++k) { Point2D fp = (Point2D)si.m_Floor[k]; int rx = fp.X - xAvg; int ry = fp.Y - yAvg; int fd = (int)Math.Sqrt(rx * rx + ry * ry); if (fd > 0 && fd < 5) { fd -= Utility.Random(10); } if (fd < dist && GetFloorZ(map, fp.X, fp.Y, out tz)) { dist = fd; cp = fp; } } if (cp == Point2D.Zero) { continue; } int z; if (!GetFloorZ(map, cp.X, cp.Y, out z)) { continue; } new Spawner(1, 1, 1, 0, 4, (string)names[j]).MoveToWorld(new Point3D(cp.X, cp.Y, z), map); } } World.Broadcast(0x35, true, "Generation complete. {0} spawners generated.", m_ShopList.Count); }