Пример #1
0
 public static StaticItem Instantiate(HuedTile tile, int influence, int serial)
 {
     if (m_InstancePool.Count > 0)
     {
         StaticItem item = (StaticItem)m_InstancePool.Dequeue();
         item.m_RealID        = (short)((tile.ID & 0x3fff) | 0x4000);
         item.m_ID            = (short)tile.ID;
         item.m_ID            = (short)(item.m_ID & 0x3fff);
         item.m_ID            = (short)(item.m_ID + 0x4000);
         item.m_Z             = (sbyte)tile.Z;
         item.m_Hue           = Hues.GetItemHue(item.m_ID, tile.Hue);
         item.m_Height        = Map.GetHeight(item.m_ID);
         item.m_SortInfluence = influence;
         item.Serial          = serial;
         item.m_LastImage     = null;
         item.m_LastImageHue  = null;
         item.m_LastImageID   = 0;
         item.m_vAlpha        = 0;
         item.m_bAlpha        = false;
         item.m_bDraw         = false;
         item.m_bInit         = false;
         return(item);
     }
     return(new StaticItem(tile, influence, serial));
 }
Пример #2
0
 private StaticItem(HuedTile tile, int influence, int serial)
 {
     this.m_ID = (short) tile.ID;
     this.m_Z = (sbyte) tile.Z;
     this.m_RealID = (short) ((tile.ID & 0x3fff) | 0x4000);
     this.m_ID = (short) (this.m_ID & 0x3fff);
     this.m_ID = (short) (this.m_ID + 0x4000);
     this.m_Hue = Hues.GetItemHue(this.m_ID, tile.Hue);
     this.m_Height = Map.GetHeight(this.m_ID);
     this.m_SortInfluence = influence;
     this.Serial = serial;
     this.m_vPool = VertexConstructor.Create();
 }
Пример #3
0
 private StaticItem(HuedTile tile, int influence, int serial)
 {
     this.m_ID            = (short)tile.ID;
     this.m_Z             = (sbyte)tile.Z;
     this.m_RealID        = (short)((tile.ID & 0x3fff) | 0x4000);
     this.m_ID            = (short)(this.m_ID & 0x3fff);
     this.m_ID            = (short)(this.m_ID + 0x4000);
     this.m_Hue           = Hues.GetItemHue(this.m_ID, tile.Hue);
     this.m_Height        = Map.GetHeight(this.m_ID);
     this.m_SortInfluence = influence;
     this.Serial          = serial;
     this.m_vPool         = VertexConstructor.Create();
 }
Пример #4
0
 public HuedTile[] ToArray()
 {
     if (this.m_Count == 0)
     {
         return(m_Empty);
     }
     HuedTile[] tileArray = new HuedTile[this.m_Count];
     for (int i = 0; i < this.m_Count; i++)
     {
         tileArray[i] = this.m_Tiles[i];
     }
     this.m_Count = 0;
     return(tileArray);
 }
Пример #5
0
 public HuedTile[] ToArray()
 {
     if (this.m_Count == 0)
     {
         return m_Empty;
     }
     HuedTile[] tileArray = new HuedTile[this.m_Count];
     for (int i = 0; i < this.m_Count; i++)
     {
         tileArray[i] = this.m_Tiles[i];
     }
     this.m_Count = 0;
     return tileArray;
 }
Пример #6
0
        private unsafe HuedTile[][][] ReadStaticBlock(int x, int y)
        {
            BinaryReader staticLookupReader;
            FileStream   staticData;
            int          num = 0;

            int[][] staticBlockRefs = this.m_Patch.StaticBlockRefs;
            if ((staticBlockRefs != null) && (staticBlockRefs[x] != null))
            {
                num = staticBlockRefs[x][y];
            }
            if (num < 0)
            {
                staticLookupReader = this.m_Patch.StaticLookupReader;
                staticData         = this.m_Patch.StaticData;
                if ((staticLookupReader == null) || (staticData == null))
                {
                    return(this.m_EmptyStaticBlock);
                }
                staticLookupReader.BaseStream.Seek((long)(12 * ~num), SeekOrigin.Begin);
            }
            else
            {
                staticLookupReader = this.m_IndexReader;
                staticData         = this.m_Statics;
                if ((staticLookupReader == null) || (staticData == null))
                {
                    return(this.m_EmptyStaticBlock);
                }
                staticLookupReader.BaseStream.Seek((long)(((x * this.m_BlockHeight) + y) * 12), SeekOrigin.Begin);
            }
            int num2  = staticLookupReader.ReadInt32();
            int bytes = staticLookupReader.ReadInt32();

            if ((num2 < 0) || (bytes <= 0))
            {
                return(this.m_EmptyStaticBlock);
            }
            int num4 = bytes / 7;

            staticData.Seek((long)num2, SeekOrigin.Begin);
            StaticTile[] tileArray = new StaticTile[num4];
            fixed(StaticTile *tileRef = tileArray)
            {
                Engine.NativeRead(staticData, (void *)tileRef, bytes);
                if (m_Lists == null)
                {
                    m_Lists = new TileList[8][];
                    for (int j = 0; j < 8; j++)
                    {
                        m_Lists[j] = new TileList[8];
                        for (int k = 0; k < 8; k++)
                        {
                            m_Lists[j][k] = new TileList();
                        }
                    }
                }
                TileList[][] lists    = m_Lists;
                StaticTile * tilePtr  = tileRef;
                StaticTile * tilePtr2 = tileRef + num4;

                while (tilePtr < tilePtr2)
                {
                    lists[tilePtr->m_X & 7][tilePtr->m_Y & 7].Add((short)((tilePtr->m_ID & 0x3fff) + 0x4000), tilePtr->m_Hue, tilePtr->m_Z);
                    tilePtr++;
                }
                HuedTile[][][] tileArray2 = new HuedTile[8][][];
                for (int i = 0; i < 8; i++)
                {
                    tileArray2[i] = new HuedTile[8][];
                    for (int m = 0; m < 8; m++)
                    {
                        tileArray2[i][m] = lists[i][m].ToArray();
                    }
                }
                return(tileArray2);
            }
        }
Пример #7
0
        private static unsafe void Load(int x, int y, int w, int h, int world, Texture tex)
        {
            if (m_Colors == null)
            {
                LoadColors();
            }
            if ((m_StrongReferences == null) || (m_StrongReferences.Length != (w * h)))
            {
                m_StrongReferences = new MapBlock[w * h];
            }
            if ((m_Guarded == null) || (m_Guarded.Length != ((w * h) * 0x40)))
            {
                m_Guarded = new BitArray((w * h) * 0x40);
            }
            else
            {
                m_Guarded.SetAll(false);
            }
            Region[] guardedRegions = Region.GuardedRegions;
            int      num            = x * 8;
            int      num2           = y * 8;
            int      num3           = w * 8;
            int      num4           = h * 8;

            for (int i = 0; i < guardedRegions.Length; i++)
            {
                Region      region = guardedRegions[i];
                RegionWorld world2 = region.World;
                bool        flag   = false;
                switch (world2)
                {
                case RegionWorld.Britannia:
                    flag = (world == 0) || (world == 1);
                    break;

                case RegionWorld.Felucca:
                    flag = world == 0;
                    break;

                case RegionWorld.Trammel:
                    flag = world == 1;
                    break;

                case RegionWorld.Ilshenar:
                    flag = world == 2;
                    break;

                case RegionWorld.Malas:
                    flag = world == 3;
                    break;

                case RegionWorld.Tokuno:
                    flag = world == 4;
                    break;
                }
                if (flag)
                {
                    int num6 = region.X - num;
                    int num7 = region.Y - num2;
                    if (((num6 < num3) && (num7 < num4)) && ((num6 > -region.Width) && (num7 > -region.Height)))
                    {
                        int num8 = num6 + region.Width;
                        int num9 = num7 + region.Height;
                        if (num6 < 0)
                        {
                            num6 = 0;
                        }
                        if (num7 < 0)
                        {
                            num7 = 0;
                        }
                        for (int j = num6; (j < num8) && (j < num3); j++)
                        {
                            for (int k = num7; (k < num9) && (k < num4); k++)
                            {
                                m_Guarded[(k * num3) + j] = true;
                            }
                        }
                    }
                }
            }
            TileMatrix matrix = Map.GetMatrix(world);
            LockData   data   = tex.Lock(LockFlags.WriteOnly);
            int        num12  = data.Pitch >> 1;

            fixed(short *numRef = m_Colors)
            {
                for (int m = 0; m < w; m++)
                {
                    short *numPtr = (short *)(data.pvSrc + ((m << 3) * 2));
                    for (int num14 = 0; num14 < h; num14++)
                    {
                        MapBlock block = matrix.GetBlock(x + m, y + num14);
                        m_StrongReferences[(num14 * w) + m] = block;
                        HuedTile[][][] tileArray  = (block == null) ? matrix.EmptyStaticBlock : block.m_StaticTiles;
                        Tile[]         tileArray2 = (block == null) ? matrix.InvalidLandBlock : block.m_LandTiles;
                        int            index      = 0;
                        for (int num16 = 0; index < 8; num16 += 8)
                        {
                            for (int num17 = 0; num17 < 8; num17++)
                            {
                                int num18 = -255;
                                int num19 = -255;
                                int num20 = 0;
                                int hue   = 0;
                                for (int num24 = 0; num24 < tileArray[num17][index].Length; num24++)
                                {
                                    HuedTile tile = tileArray[num17][index][num24];
                                    int      iD   = tile.ID;
                                    switch (iD)
                                    {
                                    case 0x4001:
                                    case 0x5796:
                                    case 0x61a4:
                                    case 0x6198:
                                    case 0x61bc:
                                    case 0x6199:
                                        break;

                                    default:
                                    {
                                        int z     = tile.Z;
                                        int num23 = z + Map.GetHeight(iD);
                                        if ((num23 > num18) || ((z > num19) && (num23 >= num18)))
                                        {
                                            num18 = num23;
                                            num19 = z;
                                            num20 = iD;
                                            hue   = tile.Hue;
                                        }
                                        break;
                                    }
                                    }
                                }
                                if ((tileArray2[num16 + num17].Z > num18) && (tileArray2[num16 + num17].ID != 2))
                                {
                                    num20 = tileArray2[num16 + num17].ID;
                                    hue   = 0;
                                }
                                int num26 = ((((num14 << 3) + index) * num3) + (m << 3)) + num17;
                                if (m_Guarded[num26] && ((((num26 >= 1) && !m_Guarded[num26 - 1]) || ((num26 >= num3) && !m_Guarded[num26 - num3])) || (((num26 < (m_Guarded.Length - 1)) && !m_Guarded[num26 + 1]) || ((num26 < (m_Guarded.Length - num3)) && !m_Guarded[num26 + num3]))))
                                {
                                    numPtr[num17] = -31776;
                                }
                                else if (hue == 0)
                                {
                                    numPtr[num17] = numRef[num20];
                                }
                                else
                                {
                                    numPtr[num17] = (short)Hues.Load((hue & 0x3fff) | 0x8000).Pixel((ushort)numRef[num20]);
                                }
                            }
                            numPtr += num12;
                            index++;
                        }
                    }
                }
                ArrayList items = Engine.Multis.Items;

                for (int n = 0; n < items.Count; n++)
                {
                    Item item = (Item)items[n];
                    if (item.InWorld && item.Visible)
                    {
                        CustomMultiEntry customMulti = CustomMultiLoader.GetCustomMulti(item.Serial, item.Revision);
                        Multi            multi       = null;
                        if (customMulti != null)
                        {
                            multi = customMulti.Multi;
                        }
                        if (multi == null)
                        {
                            multi = item.Multi;
                        }
                        if (multi != null)
                        {
                            short[][] radar = multi.Radar;
                            if (radar != null)
                            {
                                int num28;
                                int num29;
                                int num30;
                                int num31;
                                multi.GetBounds(out num28, out num29, out num30, out num31);
                                int num32 = 0;
                                for (int num33 = (item.Y - (y << 3)) + num29; num32 < radar.Length; num33++)
                                {
                                    if ((num33 >= 0) && (num33 < (h << 3)))
                                    {
                                        short * numPtr2   = (short *)(data.pvSrc + ((num33 * num12) * 2));
                                        short[] numArray2 = radar[num32];
                                        int     num34     = 0;
                                        for (int num35 = (item.X - (x << 3)) + num28; num34 < numArray2.Length; num35++)
                                        {
                                            if (((num35 >= 0) && (num35 < (w << 3))) && (numArray2[num34] != 0))
                                            {
                                                numPtr2[num35] = numRef[numArray2[num34]];
                                            }
                                            num34++;
                                        }
                                    }
                                    num32++;
                                }
                            }
                        }
                    }
                }
            }

            tex.Unlock();
        }
Пример #8
0
 public static StaticItem Instantiate(HuedTile tile, int influence, int serial)
 {
     if (m_InstancePool.Count > 0)
     {
         StaticItem item = (StaticItem) m_InstancePool.Dequeue();
         item.m_RealID = (short) ((tile.ID & 0x3fff) | 0x4000);
         item.m_ID = (short) tile.ID;
         item.m_ID = (short) (item.m_ID & 0x3fff);
         item.m_ID = (short) (item.m_ID + 0x4000);
         item.m_Z = (sbyte) tile.Z;
         item.m_Hue = Hues.GetItemHue(item.m_ID, tile.Hue);
         item.m_Height = Map.GetHeight(item.m_ID);
         item.m_SortInfluence = influence;
         item.Serial = serial;
         item.m_LastImage = null;
         item.m_LastImageHue = null;
         item.m_LastImageID = 0;
         item.m_vAlpha = 0;
         item.m_bAlpha = false;
         item.m_bDraw = false;
         item.m_bInit = false;
         return item;
     }
     return new StaticItem(tile, influence, serial);
 }
Пример #9
0
 public MapBlock(Tile[] landTiles, HuedTile[][][] staticTiles)
 {
     this.m_LandTiles = landTiles;
     this.m_StaticTiles = staticTiles;
 }