Exemple #1
0
 /// <summary>
 /// Runescape Font. Doesn't work!
 /// </summary>
 public RSFont(bool flag, string fontName, ArchiveParser titleArchive)
 {
     glyphPixels = new List<byte[]>();
     glyphWidth = new int[256];
     glyphHeight = new int[256];
     horizontalKerning = new int[256];
     verticalKerning = new int[256];
     charEffectiveWidth = new int[256];
     random = new Random();
     isStrikethrough = false;
     byte[] data = titleArchive.getFile(fontName + ".dat");
     byte[] index = titleArchive.getFile("index.dat");
     dataReader = new BigEndianBinaryReader(new MemoryStream(data));
     indexReader = new BigEndianBinaryReader(new MemoryStream(index));
     int pos = dataReader.ReadInt16() + 4;
     int k = indexReader.ReadByte();
     if (k > 0)
         pos += 3 * (k - 1);
     indexReader.BaseStream.Position = pos;
     for (int l = 0; l < 256; l++)
     {
         horizontalKerning[l] = indexReader.ReadChar();
         verticalKerning[l] = indexReader.ReadChar();
         int width = glyphWidth[l] = indexReader.ReadInt16();
         int height = glyphWidth[l] = indexReader.ReadInt16();
         int k1 = indexReader.ReadByte();
         int l1 = width * height;
         glyphPixels.Add(new byte[l1]);
         if (k1 == 0)
             for (int i = 0; i < l1; i++)
                 glyphPixels[l][i] = dataReader.ReadByte();
         else
             if (k1 == 1)
                 for (int j = 0; j < width; j++)
                     for (int l2 = 0; l2 < height; l2++)
                         glyphPixels[l][j + l2 * width] = dataReader.ReadByte();
         if (height > charHeight && l < 128)
             charHeight = height;
         horizontalKerning[l] = 1;
         charEffectiveWidth[l] = width + 2;
         int k2 = 0;
         for (int i = height / 7; i < height; i++)
             k2 += glyphPixels[l][i * width];
         if (k2 <= height / 7)
         {
             charEffectiveWidth[l]--;
             horizontalKerning[l] = 0;
         }
         k2 = 0;
         for (int j = height / 7; j < height; j++)
             k2 += glyphPixels[l][(width - 1) + j * width];
         if (k2 <= height / 7)
             charEffectiveWidth[l]--;
     }
     if (flag)
         charEffectiveWidth[32] = charEffectiveWidth[73];
     else
         charEffectiveWidth[32] = charEffectiveWidth[105];
 }
 //Parses flo.dat from config.jag
 //Yup it's fixed
 public static FloorConfig[] ParseFloorConfig(byte[] floorData)
 {
     int floorCount;
     FloorConfig[] floors;
     BigEndianBinaryReader floorReader = new BigEndianBinaryReader(new MemoryStream(floorData));
     floorCount = floorReader.ReadUInt16();
     floors = new FloorConfig[floorCount];
     bool finishFloor = false;
     for (int i = 0; i < floorCount; i++)
     {
         floors[i] = new FloorConfig();
         finishFloor = false;
         do
         {
             int type = floorReader.ReadByte();
             switch (type)
             {
                 case 0:
                     finishFloor = true;
                     break;
                 case 1:
                     floors[i].actualColor = toRGB(floorReader.ReadUInt24());
                     break;
                 case 2:
                     floors[i].texture = floorReader.ReadByte();
                     break;
                 case 3:
                     floors[i].unknown = true;
                     break;
                 case 5:
                     floors[i].occlude = false;
                     break;
                 case 6:
                     floors[i].floorName = floorReader.ReadString().TrimEnd('\n');
                     break;
                 case 7:
                     floors[i].mapColor = toRGB(floorReader.ReadUInt24());
                     break;
                 default:
                     Logger.Log("Unrecognized floor type: " + type, LogType.Error);
                     break;
             }
         } while (!finishFloor);
         Logger.Log(floors[i].ToString(), LogType.Success);
     }
     return floors;
 }
 public ImageGroup(byte[] index, byte[] data, bool unpack)
 {
     indexReader = new BigEndianBinaryReader(new MemoryStream(index));
     dataReader = new BigEndianBinaryReader(new MemoryStream(data));
     indexReader.BaseStream.Position = dataReader.ReadUInt16();
     indexOffset = (int)indexReader.BaseStream.Position;
     maxWidth = indexReader.ReadUInt16();
     maxHeight = indexReader.ReadUInt16();
     colorCount = indexReader.ReadByte();
     colorMap = new int[colorCount];
     for (int x = 0; x < colorCount - 1; x++)
     {
         colorMap[x + 1] = indexReader.ReadUInt24();
         if (colorMap[x + 1] == 0)
             colorMap[x + 1] = 1;
     }
     if(unpack)
         unpackImages();
 }
 public static ItemConfig[] ParseItemConfig(byte[] data, byte[] index)
 {
     BigEndianBinaryReader dataReader = new BigEndianBinaryReader(new MemoryStream(data));
     BigEndianBinaryReader indexReader = new BigEndianBinaryReader(new MemoryStream(index));
     int totalItems = indexReader.ReadUInt16();
     int[] streamIndices = new int[totalItems];
     ItemConfig[] itemConfig = new ItemConfig[totalItems];
     int i = 2;
     for (int j = 0; j < totalItems; j++)
     {
         streamIndices[j] = i;
         i += indexReader.ReadUInt16();
     }
     for (int x = 0; x < totalItems; x++)
     {
         dataReader.BaseStream.Position = streamIndices[x];
         ItemConfig item = new ItemConfig();
         do
         {
             int opCode = dataReader.ReadByte();
             if (opCode == 0)
                 break;
             if (opCode == 1)
                 item.modelID = dataReader.ReadUInt16();
             else if (opCode == 2)
                 item.name = dataReader.ReadString().TrimEnd('\n');
             else if (opCode == 3)
                 item.description = dataReader.ReadString().TrimEnd('\n');
             else if (opCode == 4)
                 item.modelInvZoom = dataReader.ReadUInt16();
             else if (opCode == 5)
                 item.modelInvRotationY = dataReader.ReadUInt16();
             else if (opCode == 6)
                 item.modelInvRotationX = dataReader.ReadUInt16();
             else if (opCode == 7)
             {
                 item.modelInvPosOffsetX = dataReader.ReadUInt16();
                 if (item.modelInvPosOffsetX > 32767)
                     item.modelInvPosOffsetX -= 0x10000;
             }
             else if (opCode == 8)
             {
                 item.modelInvPosOffsetY = dataReader.ReadUInt16();
                 if (item.modelInvPosOffsetY > 32767)
                     item.modelInvPosOffsetY -= 0x10000;
             }
             else if (opCode == 10)
                 dataReader.ReadUInt16();
             else if (opCode == 11)
                 item.stackable = true;
             else if (opCode == 12)
                 item.value = dataReader.ReadInt32();
             else if (opCode == 16)
                 item.membersObject = true;
             else if (opCode == 23)
             {
                 item.maleWornModelID = dataReader.ReadUInt16();
                 item.maleYOffset = dataReader.ReadByte();
             }
             else if (opCode == 24)
                 item.maleArmsID = dataReader.ReadUInt16();
             else if (opCode == 25)
             {
                 item.femaleWornModelID = dataReader.ReadUInt16();
                 item.femaleYOffset = dataReader.ReadByte();
             }
             else if (opCode == 26)
                 item.femaleArmsID = dataReader.ReadUInt16();
             else if (opCode >= 30 && opCode < 35)
             {
                 if (item.groundActions == null)
                     item.groundActions = new string[5];
                 item.groundActions[opCode - 30] = dataReader.ReadString().TrimEnd('\n');
                 if (item.groundActions[opCode - 30].ToLower() == "hidden")
                     item.groundActions[opCode - 30] = null;
             }
             else if (opCode >= 35 && opCode < 40)
             {
                 if (item.actions == null)
                     item.actions = new string[5];
                 item.actions[opCode - 35] = dataReader.ReadString().TrimEnd('\n');
             }
             else if (opCode == 40)
             {
                 int colors = dataReader.ReadByte();
                 item.originalModelColors = new int[colors];
                 item.modifiedModelColors = new int[colors];
                 for (int colorPtr = 0; colorPtr < colors; colorPtr++)
                 {
                     item.originalModelColors[colorPtr] = dataReader.ReadUInt16();
                     item.modifiedModelColors[colorPtr] = dataReader.ReadUInt16();
                 }
             }
             else if (opCode == 78)
                 item.maleEmblem = dataReader.ReadUInt16();
             else if (opCode == 79)
                 item.femaleEmblem = dataReader.ReadUInt16();
             else if (opCode == 90)
                 item.maleDialog = dataReader.ReadUInt16();
             else if (opCode == 91)
                 item.femaleDialog = dataReader.ReadUInt16();
             else if (opCode == 92)
                 item.maleDialogHat = dataReader.ReadUInt16();
             else if (opCode == 93)
                 item.femaleDialogHat = dataReader.ReadUInt16();
             else if (opCode == 95)
                 item.diagonalRotation = dataReader.ReadUInt16();
             else if (opCode == 97)
                 item.certID = dataReader.ReadUInt16();
             else if (opCode == 98)
                 item.certTemplateID = dataReader.ReadUInt16();
             else if (opCode >= 100 && opCode < 110)
             {
                 if (item.stackIDs == null)
                 {
                     item.stackIDs = new int[10];
                     item.stackAmounts = new int[10];
                 }
                 item.stackIDs[opCode - 100] = dataReader.ReadUInt16();
                 item.stackAmounts[opCode - 100] = dataReader.ReadUInt16();
             }
             else if (opCode == 110)
                 item.modelSizeX = dataReader.ReadUInt16();
             else if (opCode == 111)
                 item.modelSizeY = dataReader.ReadUInt16();
             else if (opCode == 112)
                 item.modelSizeZ = dataReader.ReadUInt16();
             else if (opCode == 113)
                 item.lightModifier = dataReader.ReadUInt16();
             else if (opCode == 114)
                 item.shadowModifier = dataReader.ReadByte() * 5;
             else if (opCode == 115)
                 item.team = dataReader.ReadByte();
             else if (opCode == 116)
                 item.lendID = dataReader.ReadUInt16();
             else if (opCode == 117)
                 item.lentItemID = dataReader.ReadUInt16();
             else
                 Logger.Log("Unknown Item Opcode: " + opCode, LogType.Error);
         } while (true);
         itemConfig[x] = item;
     }
     return itemConfig;
 }
 public static ObjectConfig[] ParseObjectConfig(byte[] data, byte[] index)
 {
     BigEndianBinaryReader indexReader = new BigEndianBinaryReader(new MemoryStream(index));
     BigEndianBinaryReader dataReader = new BigEndianBinaryReader(new MemoryStream(data));
     ObjectConfig[] obj = new ObjectConfig[indexReader.ReadUInt16()];
     int sIndex = 2;
     int[] streamIndices = new int[obj.Length];
     for (int i = 0; i < streamIndices.Length; i++)
     {
         streamIndices[i] = sIndex;
         sIndex += indexReader.ReadUInt16();
     }
     for (int j = 0; j < obj.Length; j++)
     {
         if (obj[j] == null) obj[j] = new ObjectConfig();
         dataReader.BaseStream.Position = streamIndices[j];
         bool breakTop = false;
         bool continueTop = false;
         int t = 0;
         do
         {
             continueTop = false;
             int k;
             do
             {
                 k = dataReader.ReadByte();
                 if (k == 0)
                     breakTop = true;
                 else if (k == 1)
                 {
                     int l = dataReader.ReadByte();
                     if (l > 0)
                         if (obj[j].objectModelIDs == null)
                         {
                             obj[j].types = new int[l];
                             obj[j].objectModelIDs = new int[l];
                             for (int k1 = 0; k1 < l; k1++)
                             {
                                 obj[j].objectModelIDs[k1] = dataReader.ReadUInt16();
                                 obj[j].types[k1] = dataReader.ReadByte();
                             }
                         }
                         else
                             dataReader.BaseStream.Position += l * 3;
                 }
                 else if (k == 2)
                     obj[j].name = dataReader.ReadString();
                 else if (k == 3)
                     obj[j].description = dataReader.ReadString();
                 else if (k == 5)
                 {
                     int l = dataReader.ReadByte();
                     if (l > 0)
                         if (obj[j].objectModelIDs == null)
                         {
                             obj[j].types = null;
                             obj[j].objectModelIDs = new int[l];
                             for (int l1 = 0; l1 < l; l1++)
                                 obj[j].objectModelIDs[l1] = dataReader.ReadUInt16();
                         }
                         else dataReader.BaseStream.Position += l * 2;
                 }
                 else if (k == 14)
                     obj[j].sizeX = dataReader.ReadByte();
                 else if (k == 15)
                     obj[j].sizeY = dataReader.ReadByte();
                 else if (k == 17)
                     obj[j].isUnwalkable = false;
                 else if (k == 18)
                     obj[j].aBoolean757 = false;
                 else if (k == 19)
                 {
                     t = dataReader.ReadByte();
                     if (t == 1)
                         obj[j].hasActions = true;
                 }
                 else if (k == 21)
                     obj[j].adjustToTerrain = true;
                 else if (k == 22)
                     obj[j].nonFlatShading = true;
                 else if (k == 23)
                     obj[j].aBoolean764 = true;
                 else if (k == 24)
                 {
                     obj[j].animationID = dataReader.ReadUInt16();
                     if (obj[j].animationID == 65535) obj[j].animationID = -1;
                 }
                 else if (k == 28)
                     obj[j].anInt775 = dataReader.ReadByte();
                 else if (k == 29)
                     obj[j].brightness = dataReader.ReadByte();
                 else if (k == 39)
                     obj[j].contrast = dataReader.ReadByte();
                 else if (k >= 30 && k < 39)
                 {
                     if (obj[j].actions == null)
                         obj[j].actions = new string[10];
                     obj[j].actions[k - 30] = dataReader.ReadString();
                     if (obj[j].actions[k - 30].ToLower() == "hidden")
                         obj[j].actions[k - 30] = null;
                 }
                 else if (k == 40)
                 {
                     int i1 = dataReader.ReadByte();
                     obj[j].modifiedModelColors = new int[i1];
                     obj[j].originalModelColors = new int[i1];
                     for (int i2 = 0; i2 < i1; i2++)
                     {
                         obj[j].modifiedModelColors[i2] = dataReader.ReadUInt16();
                         obj[j].originalModelColors[i2] = dataReader.ReadUInt16();
                     }
                 }
                 else if (k == 60)
                     obj[j].mapFunctionID = dataReader.ReadUInt16();
                 else if (k == 62)
                     obj[j].aBoolean751 = true;
                 else if (k == 64)
                     obj[j].aBoolean779 = false;
                 else if (k == 65)
                     obj[j].modelSizeX = dataReader.ReadUInt16();
                 else if (k == 66)
                     obj[j].modelSizeH = dataReader.ReadUInt16();
                 else if (k == 67)
                     obj[j].modelSizeY = dataReader.ReadUInt16();
                 else if (k == 68)
                     obj[j].mapSceneID = dataReader.ReadUInt16();
                 else if (k == 69)
                     obj[j].anInt768 = dataReader.ReadByte();
                 else if (k == 70)
                     obj[j].offsetX = dataReader.ReadUInt16();
                 else if (k == 71)
                     obj[j].offsetH = dataReader.ReadUInt16();
                 else if (k == 72)
                     obj[j].offsetY = dataReader.ReadUInt16();
                 else if (k == 73)
                     obj[j].aBoolean736 = true;
                 else if (k == 74)
                     obj[j].isSolidObject = true;
                 else
                 {
                     if (k != 75)
                         continue;
                     obj[j].anInt760 = dataReader.ReadByte();
                 }
                 continueTop = true;
             } while (k != 77 && !breakTop);
             if (breakTop) break;
             if (continueTop) continue;
             obj[j].configId_1 = dataReader.ReadUInt16();
             if (obj[j].configId_1 == 65535)
                 obj[j].configId_1 = -1;
             obj[j].configId_1 = dataReader.ReadUInt16();
             if (obj[j].configID == 65535)
                 obj[j].configID = -1;
             int j1 = dataReader.ReadByte();
             obj[j].configObjectIDs = new int[j1 + 1];
             for (int j2 = 0; j2 <= j1; j2++)
             {
                 obj[j].configObjectIDs[j2] = dataReader.ReadUInt16();
                 if (obj[j].configObjectIDs[j2] == 65535)
                     obj[j].configObjectIDs[j2] = -1;
             }
         } while (!breakTop);
         if (t == -1)
         {
             obj[j].hasActions = obj[j].objectModelIDs != null;
             if (obj[j].actions != null)
                 obj[j].hasActions = true;
         }
         if (obj[j].isSolidObject)
             obj[j].isUnwalkable = obj[j].aBoolean757 = false;
         if (obj[j].anInt760 == -1)
             obj[j].anInt760 = obj[j].isUnwalkable ? 1 : 0;
     }
     return obj;
 }
 public static NPCConfig[] ParseNPCConfig(byte[] data, byte[] index)
 {
     BigEndianBinaryReader dataReader = new BigEndianBinaryReader(new MemoryStream(data));
     BigEndianBinaryReader indexReader = new BigEndianBinaryReader(new MemoryStream(index));
     int totalNPCs = indexReader.ReadUInt16();
     NPCConfig[] NPCList = new NPCConfig[totalNPCs];
     int[] streamIndices = new int[totalNPCs];
     int offset = 2;
     for (int npcPtr = 0; npcPtr < totalNPCs; npcPtr++)
     {
         streamIndices[npcPtr] = offset;
         offset += indexReader.ReadUInt16();
     }
     for (int j = 0; j < totalNPCs; j++)
     {
         NPCConfig npc = new NPCConfig();
         dataReader.BaseStream.Position = streamIndices[j];
         do
         {
             byte i = dataReader.ReadByte();
             if (i == 0)
                 break;
             else if (i == 1)
             {
                 int modelCount = dataReader.ReadByte();
                 npc.npcModels = new int[modelCount];
                 for (int k = 0; k < modelCount; k++)
                     npc.npcModels[k] = dataReader.ReadUInt16();
             }
             else if (i == 2)
                 npc.name = dataReader.ReadString();
             else if (i == 3)
                 npc.description = dataReader.ReadString();
             else if (i == 12)
                 npc.boundDim = dataReader.ReadByte();
             else if (i == 13)
                 npc.idleAnimation = dataReader.ReadUInt16();
             else if (i == 14)
                 npc.walkAnimIndex = dataReader.ReadUInt16();
             else if (i == 17)
             {
                 npc.walkAnimIndex = dataReader.ReadUInt16();
                 npc.turn180AnimIndex = dataReader.ReadUInt16();
                 npc.turn90CWAnimIndex = dataReader.ReadUInt16();
                 npc.turn90CCWAnimIndex = dataReader.ReadUInt16();
             }
             else if (i >= 30 && i < 40)
             {
                 if (npc.actions == null)
                     npc.actions = new string[5];
                 npc.actions[i - 30] = dataReader.ReadString();
                 if (npc.actions[i - 30] == "hidden")
                     npc.actions[i - 30] = null;
             }
             else if (i == 40)
             {
                 int colors = dataReader.ReadByte();
                 npc.recolorOriginal = new int[colors];
                 npc.recolorTarget = new int[colors];
                 for (int l = 0; l < colors; l++)
                 {
                     npc.recolorOriginal[l] = dataReader.ReadUInt16();
                     npc.recolorTarget[l] = dataReader.ReadUInt16();
                 }
             }
             else if (i == 60)
             {
                 int additionalModelCount = dataReader.ReadByte();
                 npc.additionalModels = new int[additionalModelCount];
                 for (int l = 0; l < additionalModelCount; l++)
                     npc.additionalModels[l] = dataReader.ReadUInt16();
             }
             else if (i >= 90 && i < 93)
                 dataReader.ReadUInt16();
             else if (i == 93)
                 npc.drawMinimapDot = false;
             else if (i == 95)
                 npc.combatLevel = dataReader.ReadUInt16();
             else if (i == 97)
                 npc.scaleXZ = dataReader.ReadUInt16();
             else if (i == 98)
                 npc.scaleY = dataReader.ReadUInt16();
             else if (i == 99)
                 npc.invisible = true;
             else if (i == 100)
                 npc.lightModifier = dataReader.ReadByte();
             else if (i == 101)
                 npc.shadowModifier = dataReader.ReadByte() * 5;
             else if (i == 102)
                 npc.headIcon = dataReader.ReadUInt16();
             else if (i == 103)
                 npc.degreesToTurn = dataReader.ReadUInt16();
             else if (i == 106)
             {
                 npc.varBitID = dataReader.ReadUInt16();
                 if (npc.varBitID == 65535)
                     npc.varBitID = -1;
                 npc.sessionSettingID = dataReader.ReadUInt16();
                 if (npc.sessionSettingID == 65535)
                     npc.sessionSettingID = -1;
                 int childrensCount = dataReader.ReadByte();
                 npc.childrenIDs = new int[childrensCount + 1];
                 for (int c = 0; c <= childrensCount; c++)
                 {
                     npc.childrenIDs[c] = dataReader.ReadUInt16();
                     if (npc.childrenIDs[c] == 65535)
                         npc.childrenIDs[c] = -1;
                 }
             }
             else if (i == 107)
                 npc.clickable = false;
         }
         while (true);
         NPCList[j] = npc;
     }
     return NPCList;
 }
 public static string[] ParseTldList(byte[] tldenc)
 {
     BigEndianBinaryReader br = new BigEndianBinaryReader(new MemoryStream(tldenc));
     int length = br.ReadInt32();
     List<char[]> tldList = new List<char[]>();
     int[] tldArray = new int[length];
     for(int id = 0; id < length; id++)
     {
         tldArray[id] = br.ReadByte();
         char[] tld = new char[br.ReadByte()];
         for (int charID = 0; charID < tld.Length; charID++)
             tld[charID] = (char)br.ReadByte();
         tldList.Add(tld);
     }
     string[] s = new string[tldList.Count];
     for (int c = 0; c < s.Length; c++)
         s[c] = new string(tldList[c]);
     return s;
 }
 public static string[] ParseDomainEnc(byte[] domainenc)
 {
     BigEndianBinaryReader br = new BigEndianBinaryReader(new MemoryStream(domainenc));
     int length = br.ReadInt32();
     List<char[]> domains = new List<char[]>();
     for (int j = 0; j < length; j++)
     {
         char[] val = new char[br.ReadByte()];
         for (int k = 0; k < val.GetLength(0); k++)
             val[k] = (char)br.ReadChar();
         domains.Add(val);
     }
     string[] s = new string[domains.Count];
     for (int c = 0; c < s.Length; c++)
         s[c] = new string(domains[c]);
     return s;
 }
 public static string[] ParseBadEnc(byte[] badenc)
 {
     BigEndianBinaryReader br = new BigEndianBinaryReader(new MemoryStream(badenc));
     int length = br.ReadInt32();
     List<char[]> bads = new List<char[]>();
     for (int i = 0; i < length; i++)
     {
         char[] val = new char[br.ReadChar()];
         for (int charid = 0; charid < val.Length; charid++)
             val[charid] = (char)br.ReadChar();
         bads.Add(val);
         byte[,] b1 = new byte[br.ReadByte(), 2];
         for (int l = 0; l < b1.Length/2; l++)
         {
             b1[l, 0] = (byte)br.ReadByte();
             b1[l, 1] = (byte)br.ReadByte();
         }
     }
     string[] s = new string[bads.Count];
     for(int c=0;c<s.Length;c++)
         s[c] = new string(bads[c]);
     return s;
 }