Esempio n. 1
0
        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);
        }