private TileInfo newVariant(TileInfo parent, XmlNode node)
 {
     TileInfo info = new TileInfo();
     info.name = (node.Attributes["name"] == null) ? parent.name : node.Attributes["name"].Value;
     info.color = (node.Attributes["color"] == null) ? parent.color : parseColor(node.Attributes["color"].Value);
     info.transparent = (node.Attributes["letLight"] == null) ? parent.transparent : true;
     info.solid = (node.Attributes["solid"] == null) ? parent.solid : true;
     info.light = (node.Attributes["light"] == null) ? parent.light : parseDouble(node.Attributes["light"].Value);
     info.lightR = (node.Attributes["lightr"] == null) ? parent.lightR : parseDouble(node.Attributes["lightr"].Value);
     info.lightG = (node.Attributes["lightg"] == null) ? parent.lightG : parseDouble(node.Attributes["lightg"].Value);
     info.lightB = (node.Attributes["lightb"] == null) ? parent.lightB : parseDouble(node.Attributes["lightb"].Value);
     info.u = (node.Attributes["u"] == null) ? -1 : parseInt(node.Attributes["u"].Value);
     info.v = (node.Attributes["v"] == null) ? -1 : parseInt(node.Attributes["v"].Value);
     info.minu = (node.Attributes["minu"] == null) ? -1 : parseInt(node.Attributes["minu"].Value);
     info.maxu = (node.Attributes["maxu"] == null) ? -1 : parseInt(node.Attributes["maxu"].Value);
     info.minv = (node.Attributes["minv"] == null) ? -1 : parseInt(node.Attributes["minv"].Value);
     info.maxv = (node.Attributes["maxv"] == null) ? -1 : parseInt(node.Attributes["maxv"].Value);
     info.variants = new List<TileInfo>();
     if (node.HasChildNodes)
         for (int i = 0; i < node.ChildNodes.Count; i++)
             info.variants.Add(newVariant(info, node.ChildNodes[i]));
     return info;
 }
        private void addVariants(ArrayList quickItems, TileInfo info)
        {
            // LOOK_AT_ME: I don't know what that method does, but it was highlighting lots of blocks on start and so making highlight looks ugly

            //foreach (TileInfo v in info.variants)
            //{
            //    if (v.name != info.name)
            //    {
            //        v.isHilighting = true;
            //        quickItems.Add(new HTile(v.name,v));
            //    }
            //    addVariants(quickItems, v);
            //}
        }
 private TileInfo find(TileInfo info, Int16 u, Int16 v)
 {
     foreach (TileInfo vars in info.variants)
     {
         // must match *all* restrictions... and we take the first match we find.
         if ((vars.u < 0 || vars.u == u) &&
             (vars.v < 0 || vars.v == v) &&
             (vars.minu < 0 || vars.minu <= u) &&
             (vars.minv < 0 || vars.minv <= v) &&
             (vars.maxu < 0 || vars.maxu > u) &&
             (vars.maxv < 0 || vars.maxv > v))
             return find(vars, u, v); //check for sub-variants
     }
     // if we get here, there are no variants that match
     return info;
 }
 private void loadInfo(TileInfo info, XmlNode node)
 {
     info.name = node.Attributes["name"].Value;
     info.color = parseColor(node.Attributes["color"].Value);
     info.hasExtra = node.Attributes["hasExtra"] != null;
     info.light = (node.Attributes["light"] == null) ? 0.0 : parseDouble(node.Attributes["light"].Value);
     info.lightR = (node.Attributes["lightr"] == null) ? 0.0 : parseDouble(node.Attributes["lightr"].Value);
     info.lightG = (node.Attributes["lightg"] == null) ? 0.0 : parseDouble(node.Attributes["lightg"].Value);
     info.lightB = (node.Attributes["lightb"] == null) ? 0.0 : parseDouble(node.Attributes["lightb"].Value);
     info.transparent = node.Attributes["letLight"] != null;
     info.solid = node.Attributes["solid"] != null;
     info.isStone = node.Attributes["isStone"] != null;
     info.isGrass = node.Attributes["isGrass"] != null;
     info.canMerge = node.Attributes["merge"] != null;
     if (node.Attributes["blend"] != null)
         info.blend = parseInt(node.Attributes["blend"].Value);
     else
         info.blend = -1;
     info.variants = new List<TileInfo>();
     if (node.HasChildNodes)
         for (int i = 0; i < node.ChildNodes.Count; i++)
             info.variants.Add(newVariant(info, node.ChildNodes[i]));
 }
 public TileInfos(XmlNodeList nodes)
 {
     info = new TileInfo[nodes.Count];
     for (int i = 0; i < nodes.Count; i++)
     {
         int id = Convert.ToInt32(nodes[i].Attributes["num"].Value);
         info[id] = new TileInfo();
         loadInfo(info[id], nodes[i]);
     }
 }
 public HTile(string name, TileInfo info)
 {
     this.name = name;
     Info = info;
 }
 private void hiliteVariants(TileInfo info)
 {
     foreach (TileInfo v in info.variants)
     {
         v.isHilighting = true;
         hiliteVariants(v);
     }
 }
 private void addVariants(ArrayList quickItems, TileInfo info)
 {
     foreach (TileInfo v in info.variants)
     {
         if (v.name != info.name)
         {
             v.isHilighting = true;
             quickItems.Add(new HTile(v.name, v));
         }
         addVariants(quickItems, v);
     }
 }
 private void AddVariants(ArrayList tiles, TileInfo info)
 {
     foreach (TileInfo v in info.variants)
     {
         if (v.name != info.name)
         {
             v.isHilighting = false;
             tiles.Add(new HTile(v.name, v));
         }
         AddVariants(tiles, v);
     }
 }