//private static IEnumerable<TOut> StringToList<TOut>(string xmlcsv)
        //{
        //	if( !string.IsNullOrWhiteSpace(xmlcsv) )
        //	{
        //		string[] split = xmlcsv.Split(',');
        //		foreach( var s in split )
        //		{
        //			yield return (TOut)Convert.ChangeType(s, typeof(TOut));
        //		}
        //	}
        //}

        //private static T InLineEnumTryParse<T>(string str) where T : struct
        //{
        //	T result;
        //	Enum.TryParse(str, true, out result);
        //	return result;
        //}

        //private static Vector2Short StringToVector2Short(string v, short defaultX = 0, short defaultY = 0)
        //{
        //	if( !string.IsNullOrWhiteSpace(v) )
        //	{

        //		short x = 0;
        //		short y = 0;
        //		var split = v.Split(',');
        //		if( split.Length == 2 )
        //		{
        //			if( short.TryParse(split[0], out x) && short.TryParse(split[1], out y) )
        //				return new Vector2Short(x, y);
        //		}
        //	}

        //	return new Vector2Short(defaultX, defaultY);
        //}

        //private static Color ColorFromString(string colorstring)
        //{
        //	if( !string.IsNullOrWhiteSpace(colorstring) )
        //	{
        //		var colorFromString = ColorConverter.ConvertFromString(colorstring);
        //		if( colorFromString != null )
        //		{
        //			return (Color)colorFromString;
        //		}
        //	}
        //	return Colors.Magenta;
        //}
        //private static XNA.Color XnaColorFromString(string colorstring)
        //{
        //	if( !string.IsNullOrWhiteSpace(colorstring) )
        //	{
        //		var colorFromString = ColorConverter.ConvertFromString(colorstring);
        //		if( colorFromString != null )
        //		{
        //			var c = (Color)colorFromString;
        //			return XNA.Color.FromNonPremultiplied(c.R, c.G, c.B, c.A);
        //		}
        //	}
        //	return XNA.Color.Magenta;
        //}

        private static void LoadObjectDbXml(string file)
        {
            var xmlSettings = XElement.Load(file);

            // Load Colors
            //foreach( var xElement in xmlSettings.Elements("GlobalColors").Elements("GlobalColor") )
            //{
            //	string name = (string)xElement.Attribute("Name");
            //	XNA.Color color = XnaColorFromString((string)xElement.Attribute("Color"));
            //	GlobalColors.Add(name, color);
            //}

            foreach (var xElement in xmlSettings.Elements("Tiles").Elements("Tile"))
            {
                var curTile = new TileProperty();

                // Read XML attributes
                //curTile.Color = ColorFromString((string)xElement.Attribute("Color"));
                curTile.Name = (string)xElement.Attribute("Name");
                //curTile.Id = (int?)xElement.Attribute("Id") ?? 0;
                curTile.IsFramed = (bool?)xElement.Attribute("Framed") ?? false;
                curTile.IsSolid  = (bool?)xElement.Attribute("Solid") ?? false;
                //curTile.IsSolidTop = (bool?)xElement.Attribute("SolidTop") ?? false;
                //curTile.IsLight = (bool?)xElement.Attribute("Light") ?? false;
                //curTile.FrameSize = StringToVector2Short((string)xElement.Attribute("Size"), 1, 1);
                //curTile.Placement = InLineEnumTryParse<FramePlacement>((string)xElement.Attribute("Placement"));
                //curTile.TextureGrid = StringToVector2Short((string)xElement.Attribute("TextureGrid"), 16, 16);
                //curTile.IsGrass = "Grass".Equals((string)xElement.Attribute("Special")); /* Heathtech */
                //curTile.IsPlatform = "Platform".Equals((string)xElement.Attribute("Special")); /* Heathtech */
                //curTile.IsCactus = "Cactus".Equals((string)xElement.Attribute("Special")); /* Heathtech */
                //curTile.IsStone = (bool?)xElement.Attribute("Stone") ?? false; /* Heathtech */
                //curTile.CanBlend = (bool?)xElement.Attribute("Blends") ?? false; /* Heathtech */
                //curTile.MergeWith = (int?)xElement.Attribute("MergeWith") ?? null; /* Heathtech */
                //curTile.HasFrameName = curTile.IsFramed && ( (bool?)xElement.Attribute("UseFrameName") ?? false );
                //string frameNamePostfix = (string)xElement.Attribute("FrameNamePostfix") ?? null;

                //foreach( var elementFrame in xElement.Elements("Frames").Elements("Frame") )
                //{
                //	var curFrame = new FrameProperty();
                //	// Read XML attributes
                //	curFrame.Name = (string)elementFrame.Attribute("Name");
                //	curFrame.Variety = (string)elementFrame.Attribute("Variety");
                //	curFrame.UV = StringToVector2Short((string)elementFrame.Attribute("UV"), 0, 0);
                //	curFrame.Anchor = InLineEnumTryParse<FrameAnchor>((string)elementFrame.Attribute("Anchor"));
                //	var frameSize = StringToVector2Short((string)elementFrame.Attribute("FrameSize"), curTile.FrameSize.X, curTile.FrameSize.Y);

                //	// Assign a default name if none existed
                //	if( string.IsNullOrWhiteSpace(curFrame.Name) )
                //		curFrame.Name = curTile.Name;

                //	curTile.Frames.Add(curFrame);
                //	string spriteName = null;
                //	if( curFrame.Name == curTile.Name )
                //	{
                //		if( !string.IsNullOrWhiteSpace(curFrame.Variety) )
                //			spriteName += curFrame.Variety;
                //	}
                //	else
                //	{
                //		spriteName += curFrame.Name;
                //		if( !string.IsNullOrWhiteSpace(curFrame.Variety) )
                //			spriteName += " - " + curFrame.Variety;
                //	}
                //	Sprites.Add(new Sprite
                //	{
                //		Anchor = curFrame.Anchor,
                //		IsPreviewTexture = false,
                //		Name = spriteName,
                //		Origin = curFrame.UV,
                //		Size = frameSize,
                //		Tile = (ushort)curTile.Id, /* SBlogic */
                //		TileName = curTile.Name
                //	});
                //	if( curTile.HasFrameName )
                //	{
                //		string frameName = curFrame.Name;
                //		if( frameNamePostfix != null )
                //			frameName += " (" + frameNamePostfix + ")";
                //		if( curFrame.Variety != null )
                //			frameName += ", " + curFrame.Variety;

                //		//  TODO:  There must be a more efficient way than to store each frame...
                //		for( int x = 0, mx = curTile.FrameSize.X; x < mx; x++ )
                //		{
                //			for( int y = 0, my = curTile.FrameSize.Y; y < my; y++ )
                //			{
                //				string frameNameKey = GetFrameNameKey(curTile.Id, (short)( curFrame.UV.X + ( x * 18 ) ), (short)( curFrame.UV.Y + ( y * 18 ) ));
                //				if( !FrameNames.ContainsKey(frameNameKey) )
                //					FrameNames.Add(frameNameKey, frameName);
                //				else
                //					System.Diagnostics.Debug.WriteLine(curFrame.Name + " collided with " + frameNameKey);
                //			}
                //		}
                //	}
                //}
                if (curTile.Frames.Count == 0 && curTile.IsFramed)
                {
                    var curFrame = new FrameProperty();
                    // Read XML attributes
                    curFrame.Name    = curTile.Name;
                    curFrame.Variety = string.Empty;
                    curFrame.UV      = new Vector2Short(0, 0);
                    //curFrame.Anchor = InLineEnumTryParse<FrameAnchor>((string)xElement.Attribute("Anchor"));

                    curTile.Frames.Add(curFrame);
                    // not sure why sprites are added here. Disabling.
                    //Sprites.Add(new Sprite
                    //{
                    //	Anchor = curFrame.Anchor,
                    //	IsPreviewTexture = false,
                    //	Name = null,
                    //	Origin = curFrame.UV,
                    //	Size = curTile.FrameSize,
                    //	Tile = (ushort)curTile.Id,
                    //	TileName = curTile.Name
                    //});
                }
                TileProperties.Add(curTile);

                //???? disabled
                //if( !curTile.IsFramed )
                //	TileBricks.Add(curTile);
            }

            //???? disabled
            //for( int i = TileProperties.Count; i < 255; i++ )
            //{
            //	TileProperties.Add(new TileProperty(i, "UNKNOWN", Color.FromArgb(255, 255, 0, 255), true));
            //}

            //foreach( var xElement in xmlSettings.Elements("Walls").Elements("Wall") )
            //{
            //	var curWall = new WallProperty();
            //	curWall.Color = ColorFromString((string)xElement.Attribute("Color"));
            //	curWall.Name = (string)xElement.Attribute("Name");
            //	curWall.Id = (int?)xElement.Attribute("Id") ?? -1;
            //	WallProperties.Add(curWall);
            //}

            foreach (var xElement in xmlSettings.Elements("Items").Elements("Item"))
            {
                var curItem = new ItemProperty();
                curItem.Id    = (int?)xElement.Attribute("Id") ?? -1;
                curItem.Name  = (string)xElement.Attribute("Name");
                curItem.Scale = (float?)xElement.Attribute("Scale") ?? 1f;
                ItemProperties.Add(curItem);
                _itemLookup.Add(curItem.Id, curItem);
                int tally = (int?)xElement.Attribute("Tally") ?? 0;
                if (tally > 0)
                {
                    _tallynames.Add(tally, curItem.Name);
                }
                int head = (int?)xElement.Attribute("Head") ?? -1;
                if (head >= 0)
                {
                    _armorHeadNames.Add(head, curItem.Name);
                }
                int body = (int?)xElement.Attribute("Body") ?? -1;
                if (body >= 0)
                {
                    _armorBodyNames.Add(body, curItem.Name);
                }
                int legs = (int?)xElement.Attribute("Legs") ?? -1;
                if (legs >= 0)
                {
                    _armorLegsNames.Add(legs, curItem.Name);
                }
                bool rack = (bool?)xElement.Attribute("Rack") ?? false;
                if (rack)
                {
                    _rackable.Add(curItem.Id, curItem.Name);
                }
            }

            //foreach( var xElement in xmlSettings.Elements("Paints").Elements("Paint") )
            //{
            //	var curPaint = new PaintProperty();
            //	curPaint.Id = (int?)xElement.Attribute("Id") ?? -1;
            //	curPaint.Name = (string)xElement.Attribute("Name");
            //	curPaint.Color = ColorFromString((string)xElement.Attribute("Color"));
            //	PaintProperties.Add(curPaint);
            //}

            //int chestId = 0;
            //foreach( var tileElement in xmlSettings.Elements("Tiles").Elements("Tile") )
            //{
            //	string tileName = (string)tileElement.Attribute("Name");
            //	if( tileName == "Chest" || tileName == "Dresser" )
            //	{
            //		ushort type = (ushort)( (int?)tileElement.Attribute("Id") ?? 21 );
            //		foreach( var xElement in tileElement.Elements("Frames").Elements("Frame") )
            //		{
            //			var curItem = new ChestProperty();
            //			curItem.Name = (string)xElement.Attribute("Name");
            //			string variety = (string)xElement.Attribute("Variety");
            //			if( variety != null )
            //			{
            //				if( tileName == "Dresser" )
            //				{
            //					curItem.Name = variety + " " + "Dresser";
            //				}
            //				else
            //				{
            //					curItem.Name = curItem.Name + " " + variety;
            //				}
            //			}
            //			curItem.ChestId = chestId++;
            //			curItem.UV = StringToVector2Short((string)xElement.Attribute("UV"), 0, 0);
            //			curItem.TileType = type;
            //			ChestProperties.Add(curItem);
            //		}
            //	}
            //}

            //int signId = 0;
            //foreach( var tileElement in xmlSettings.Elements("Tiles").Elements("Tile") )
            //{
            //	string tileName = (string)tileElement.Attribute("Name");
            //	if( tileName == "Sign" || tileName == "Grave Marker" || tileName == "Announcement Box" )
            //	{
            //		ushort type = (ushort)( (int?)tileElement.Attribute("Id") ?? 55 );
            //		foreach( var xElement in tileElement.Elements("Frames").Elements("Frame") )
            //		{
            //			var curItem = new SignProperty();
            //			string variety = (string)xElement.Attribute("Variety");
            //			if( variety != null )
            //			{
            //				if( tileName == "Sign" )
            //				{
            //					curItem.Name = "Sign " + variety;
            //				}
            //				else
            //				{
            //					curItem.Name = variety;
            //				}
            //			}
            //			curItem.SignId = signId++;
            //			curItem.UV = StringToVector2Short((string)xElement.Attribute("UV"), 0, 0);
            //			curItem.TileType = type;
            //			SignProperties.Add(curItem);
            //		}
            //	}
            //}

            //foreach( var xElement in xmlSettings.Elements("Npcs").Elements("Npc") )
            //{
            //	int id = (int?)xElement.Attribute("Id") ?? -1;
            //	string name = (string)xElement.Attribute("Name");
            //	NpcIds.Add(name, id);
            //	NpcNames.Add(id, name);
            //	int frames = (int?)xElement.Attribute("Frames") ?? 16;
            //	NpcFrames.Add(id, frames);
            //}

            foreach (var xElement in xmlSettings.Elements("ItemPrefix").Elements("Prefix"))
            {
                int    id   = (int?)xElement.Attribute("Id") ?? -1;
                string name = (string)xElement.Attribute("Name");
                ItemPrefix.Add((byte)id, name);
            }

            //foreach( var xElement in xmlSettings.Elements("ShortCutKeys").Elements("Shortcut") )
            //{
            //	var key = InLineEnumTryParse<Key>((string)xElement.Attribute("Key"));
            //	var tool = (string)xElement.Attribute("Tool");
            //	ShortcutKeys.Add(key, tool);
            //}

            //XElement appSettings = xmlSettings.Element("App");
            //int appWidth = (int?)appSettings.Attribute("Width") ?? 800;
            //int appHeight = (int?)appSettings.Attribute("Height") ?? 600;
            //int clipboardSize = (int)XNA.MathHelper.Clamp((int?)appSettings.Attribute("ClipboardRenderSize") ?? 512, 64, 4096);

            //_appSize = new Vector2(appWidth, appHeight);
            //ClipboardBuffer.ClipboardRenderSize = clipboardSize;

            //ToolDefaultData.LoadSettings(xmlSettings.Elements("Tools"));

            //AltC = (string)xmlSettings.Element("AltC");
            //SteamUserId = (int?)xmlSettings.Element("SteamUserId") ?? null;
        }
Exemple #2
0
        public static Tile ReadTileDataFromStreamV1(BinaryReader b, uint version)
        {
            var tile = new Tile();

            tile.IsActive = b.ReadBoolean();

            TileProperty tileProperty = null;

            if (tile.IsActive)
            {
                tile.Type    = b.ReadByte();
                tileProperty = TileProperties[tile.Type];


                if (tile.Type == (int)TileType.IceByRod)
                {
                    tile.IsActive = false;
                }

                if (version < 72 &&
                    (tile.Type == 35 || tile.Type == 36 || tile.Type == 170 || tile.Type == 171 || tile.Type == 172))
                {
                    tile.U = b.ReadInt16();
                    tile.V = b.ReadInt16();
                }
                else if (!tileProperty.IsFramed)
                {
                    tile.U = -1;
                    tile.V = -1;
                }
                else if (version < 28 && tile.Type == (int)(TileType.Torch))
                {
                    // torches didn't have extra in older versions.
                    tile.U = 0;
                    tile.V = 0;
                }
                else if (version < 40 && tile.Type == (int)TileType.Platform)
                {
                    tile.U = 0;
                    tile.V = 0;
                }
                else
                {
                    tile.U = b.ReadInt16();
                    tile.V = b.ReadInt16();

                    if (tile.Type == (int)TileType.Timer)
                    {
                        tile.V = 0;
                    }
                }


                if (version >= 48 && b.ReadBoolean())
                {
                    tile.TileColor = b.ReadByte();
                }
            }

            //skip obsolete hasLight
            if (version <= 25)
            {
                b.ReadBoolean();
            }

            if (b.ReadBoolean())
            {
                tile.Wall = b.ReadByte();
                if (version >= 48 && b.ReadBoolean())
                {
                    tile.WallColor = b.ReadByte();
                }
            }

            if (b.ReadBoolean())
            {
                tile.LiquidType   = LiquidType.Water;
                tile.LiquidAmount = b.ReadByte();
                if (b.ReadBoolean())
                {
                    tile.LiquidType = LiquidType.Lava;
                }
                if (version >= 51)
                {
                    if (b.ReadBoolean())
                    {
                        tile.LiquidType = LiquidType.Honey;
                    }
                }
            }

            if (version >= 33)
            {
                tile.WireRed = b.ReadBoolean();
            }
            if (version >= 43)
            {
                tile.WireGreen = b.ReadBoolean();
                tile.WireBlue  = b.ReadBoolean();
            }

            if (version >= 41)
            {
                bool isHalfBrick = b.ReadBoolean();

                if (tileProperty == null || !tileProperty.IsSolid)
                {
                    isHalfBrick = false;
                }

                if (version >= 49)
                {
                    tile.BrickStyle = (BrickStyle)b.ReadByte();

                    if (tileProperty == null || !tileProperty.IsSolid)
                    {
                        tile.BrickStyle = 0;
                    }
                }
            }
            if (version >= 42)
            {
                tile.Actuator = b.ReadBoolean();
                tile.InActive = b.ReadBoolean();
            }
            return(tile);
        }