void btnOK_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(tbTilesetName.Text))
            {
                MessageBox.Show("You must enter a name for the tileset.");
                return;
            }

            if (string.IsNullOrEmpty(tbTilesetImage.Text))
            {
                MessageBox.Show("You must select an image for the tileset.");
                return;
            }

            int tileWidth  = 0;
            int tileHeight = 0;
            int tilesWide  = 0;
            int tilesHigh  = 0;

            if (!int.TryParse(mtbTileWidth.Text, out tileWidth))
            {
                MessageBox.Show("Tile width must be an integer value.");
                return;
            }
            else if (tileWidth < 1)
            {
                MessageBox.Show("Tile width must me greater than zero.");
                return;
            }

            if (!int.TryParse(mtbTileHeight.Text, out tileHeight))
            {
                MessageBox.Show("Tile height must be an integer value.");
                return;
            }
            else if (tileHeight < 1)
            {
                MessageBox.Show("Tile height must be greater than zero.");
                return;
            }

            Image tileSet = (Image)Bitmap.FromFile(tbTilesetImage.Text);

            tilesWide = tileSet.Width / tileWidth;
            tilesHigh = tileSet.Height / tileHeight;

            tilesetData = new TilesetData
            {
                TilesetName        = tbTilesetName.Text,
                TilesetImageName   = tbTilesetImage.Text,
                TileWidthInPixels  = tileWidth,
                TileHeightInPixels = tileHeight,
                TilesWide          = tilesWide,
                TilesHigh          = tilesHigh
            };

            okPressed = true;

            this.Close();
        }
        private static MapData ReadMapDataFromTMXFile(XmlDocument xmlDocument)
        {
            var mapData = new MapData();

            //read metadata
            var xmlData = xmlDocument.DocumentElement.SelectSingleNode("/map");

            if (xmlData == null)
            {
                return(null);
            }

            if (!int.TryParse(xmlData.Attributes["width"].Value.Trim(), out mapData.width))
            {
                return(null);
            }

            if (!int.TryParse(xmlData.Attributes["height"].Value.Trim(), out mapData.height))
            {
                return(null);
            }

            var tilesetsXMLData = xmlDocument.DocumentElement.SelectNodes("/map/tileset");

            for (var i = 0; i < tilesetsXMLData.Count; i++)
            {
                if (mapData.tilesetData == null)
                {
                    mapData.tilesetData = new List <TilesetData>();
                }

                var tilesetData = new TilesetData();

                tilesetData.firstgid  = int.Parse(tilesetsXMLData[i].Attributes["firstgid"].Value.Trim());
                tilesetData.prefix    = tilesetsXMLData[i].Attributes["name"].Value.Trim();
                tilesetData.tilecount = int.Parse(tilesetsXMLData[i].Attributes["tilecount"].Value.Trim());

                mapData.tilesetData.Add(tilesetData);
            }

            //read tile map data
            var dataNode = xmlDocument.DocumentElement.SelectSingleNode("/map/layer[@name='Map']/data");
            var tiles    = dataNode.InnerText.Split(',');
            var index    = 0;

            mapData.data = new int[mapData.width][];

            for (var i = 0; i < mapData.width; i++)
            {
                mapData.data[i] = new int[mapData.height];

                for (var j = 0; j < mapData.height; j++)
                {
                    mapData.data[i][j] = int.Parse(tiles[index].Trim());
                    index++;
                }
            }

            return(mapData);
        }
Exemple #3
0
 private void SetTileSet(TilesetData set)
 {
     (CurrentTileset = set).LoadImages(WorkingDirectory);
     pnlPossibleTiles.Controls.Clear();
     for (int i = 0; i < set.Tiles.Count; i++)
     {
         PictureBox tileButton = new PictureBox();
         tileButton.Width  = 16;
         tileButton.Height = 16;
         tileButton.Left   = 16 * (i % 6);
         tileButton.Top    = 16 * (i / 6);
         set.Tiles[i].Image.CurrentPalette = set.Tiles[i].Palette == 1 ? set.Palette1 : set.Palette2;
         tileButton.Image  = set.Tiles[i].Image.Target;
         tileButton.Tag    = i;
         tileButton.Click += btnTileButton_Click;
         tileButton.ResizeByZoom();
         pnlPossibleTiles.Controls.Add(tileButton);
         tileButton.FixZoom();
     }
     if (Tiles != null)
     {
         Render();
         UpdatePreview();
     }
 }
Exemple #4
0
    public static List <TiledMapLayer> BuildLayers(MapData2D map, TilesetData tileset, ref int nextLayerId)
    {
        var underlayId = nextLayerId++;
        var overlayId  = nextLayerId++;

        return(new()
        {
            new()
            {
                Id = underlayId,
                Name = LayerName.Underlay,
                Width = map.Width,
                Height = map.Height,
                Data = new LayerData {
                    Encoding = "csv", Content = BuildCsvData(map, tileset, false)
                }
            },
            new()
            {
                Id = overlayId,
                Name = LayerName.Overlay,
                Width = map.Width,
                Height = map.Height,
                Data = new LayerData {
                    Encoding = "csv", Content = BuildCsvData(map, tileset, true)
                }
            }
        });
    }
Exemple #5
0
    public static Tileset FromAlbion(TilesetData tileset, Tilemap2DProperties properties)
    {
        if (tileset == null)
        {
            throw new ArgumentNullException(nameof(tileset));
        }
        if (properties == null)
        {
            throw new ArgumentNullException(nameof(properties));
        }

        List <Tile> tiles =
            tileset.Tiles
            .Where(x => !x.IsBlank)
            .Select(x =>
                    TileMapping.BuildTile(
                        tileset.Id.Id,
                        x.Index,
                        x.FrameCount > 0 ? x.ImageNumber : null,
                        TileMapping.BuildTileProperties(x),
                        properties))
            .ToList();

        // Add tiles for the extra frames of animated tiles
        int nextId  = tileset.Tiles[^ 1].Index + 1;
Exemple #6
0
        public MapRenderable2D(MapData2D mapData, ITexture tileset, TilesetData tileData) : base(Handlers)
        {
            _mapData  = mapData;
            _tileset  = tileset;
            _tileData = tileData;
            _tileset.GetSubImageDetails(0, out var tileSize, out _, out _, out _);
            TileSize = tileSize;

            var underlay = new SpriteInstanceData[_mapData.Width * _mapData.Height];
            var overlay  = new SpriteInstanceData[_mapData.Width * _mapData.Height];

            _underlay = new MultiSprite(new SpriteKey(
                                            _tileset,
                                            (int)DrawLayer.Underlay,
                                            underlay[0].Flags))
            {
                Instances = underlay.ToArray()
            };

            _overlay = new MultiSprite(new SpriteKey(
                                           _tileset,
                                           (int)DrawLayer.Overlay3,
                                           overlay[0].Flags))
            {
                Instances = overlay.ToArray()
            };
        }
Exemple #7
0
        public LogicalMap2D(IAssetManager assetManager, MapData2D mapData,
                            IList <MapChange> tempChanges,
                            IList <MapChange> permChanges)
        {
            _mapData        = mapData ?? throw new ArgumentNullException(nameof(mapData));
            _tempChanges    = tempChanges ?? throw new ArgumentNullException(nameof(tempChanges));
            _permChanges    = permChanges ?? throw new ArgumentNullException(nameof(permChanges));
            _tileData       = assetManager.LoadTileData(_mapData.TilesetId);
            _blockList      = assetManager.LoadBlockList((BlockListId)_mapData.TilesetId); // Note: Assuming a 1:1 correspondence between blocklist and tileset ids.
            UseSmallSprites = _tileData.UseSmallGraphics;

            // Clear out temp changes for other maps
            for (int i = 0; i < tempChanges.Count;)
            {
                if (_tempChanges[i].MapId != mapData.Id)
                {
                    _tempChanges.RemoveAt(i);
                }
                else
                {
                    i++;
                }
            }

            // Replay any changes for this map
            foreach (var change in permChanges.Where(x => x.MapId == mapData.Id))
            {
                ApplyChange(change.X, change.Y, change.ChangeType, change.Value, change.Unk3);
            }

            foreach (var change in tempChanges)
            {
                ApplyChange(change.X, change.Y, change.ChangeType, change.Value, change.Unk3);
            }
        }
Exemple #8
0
        public static TileMap AddTilemap(TilemapData data, TilesetData setting)
        {
            if (TILEMAPS.ContainsKey(data.Name))
            {
                return(TILEMAPS[data.Name]);
            }
            string[,] tiles = new string[data.Map.GetLength(0), data.Map.GetLength(1)];
            for (int y = 0; y < data.Map.GetLength(0); y++)
            {
                for (int x = 0; x < data.Map.GetLength(1); x++)
                {
                    if (setting.Tiles.ContainsKey(data.Map[y, x]))
                    {
                        tiles[y, x] = $@"C\Tiles\{setting.Tiles[data.Map[y, x]]}";
                    }
                    else
                    {
                        tiles[y, x] = @"C\Tiles\empty";
                    }
                }
            }
            TileMap ret = new TileMap(data.Name, tiles);

            TILEMAPS.Add(data.Name, ret);
            return(ret);
        }
 public MapRenderable2D(MapData2D mapData, ITexture tileset, TilesetData tileData) : base(Handlers)
 {
     _mapData  = mapData;
     _tileset  = tileset;
     _tileData = tileData;
     _tileset.GetSubImageDetails(0, out var tileSize, out _, out _, out _);
     TileSize = tileSize;
 }
        void newTilesetToolStripMenuItem_Click(object sender, EventArgs e)
        {
            using (FormNewTileset frmNewTileset = new FormNewTileset())
            {
                frmNewTileset.ShowDialog();

                if (frmNewTileset.OKPressed)
                {
                    TilesetData data = frmNewTileset.TilesetData;

                    try
                    {
                        GDIImage image = (GDIImage)GDIBitmap.FromFile(data.TilesetImageName);

                        tileSetImages.Add(image);

                        Stream stream = new FileStream(data.TilesetImageName, FileMode.Open,
                                                       FileAccess.Read);

                        Texture2D texture = Texture2D.FromStream(GraphicsDevice, stream);

                        Tileset tileset = new Tileset(
                            texture,
                            data.TilesWide,
                            data.TilesHigh,
                            data.TileWidthInPixels,
                            data.TileHeightInPixels);

                        tileSets.Add(tileset);
                        tileSetData.Add(data);

                        if (map != null)
                        {
                            map.AddTileset(tileset);
                        }

                        stream.Close();
                        stream.Dispose();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Error reading file.\n" + ex.Message, "Error reading image");
                        return;
                    }

                    lbTileset.Items.Add(data.TilesetName);

                    if (lbTileset.SelectedItem == null)
                    {
                        lbTileset.SelectedIndex = 0;
                    }

                    mapLayerToolStripMenuItem.Enabled = true;
                }
            }
        }
Exemple #11
0
        private void AreaOpened(AreaDataObservable area)
        {
            TilesetData      tileset = _moduleDataService.Load <TilesetData>(area.TilesetGlobalID);
            ResourceItemData data    = _resourceService.GetResourceByName(ResourceType.Tileset, tileset.ResourceName);

            ActiveTilesetImage       = BitmapImageHelpers.LoadFromBytes(data.Data);
            ActiveTilesetImageWidth  = ActiveTilesetImage.Width;
            ActiveTilesetImageHeight = ActiveTilesetImage.Height;
            TileGridVisibility       = Visibility.Visible;
        }
Exemple #12
0
    public void HandleCustomProperties(UnityEngine.GameObject gameObject,
                                       IDictionary <string, string> props)

    {
        if (props.ContainsKey("Areas"))
        {
            foreach (string areaName in props["Areas"].Split('|'))
            {
                string[] guids = AssetDatabase.FindAssets(areaName, new string[1] {
                    "Assets/Resources"
                });
                TilesetData data = null;
                if (guids.Length == 0)
                {
                    // create a MapConfig;
                    data            = ScriptableObject.CreateInstance <TilesetData>();
                    data.SmallRooms = new List <string>();
                    data.LargeRooms = new List <string>();
                    AssetDatabase.CreateAsset(data, "Assets/Resources/" + areaName + ".asset");
                }
                else
                {
                    // load the mapconfig and add this mapchunk to it.
                    data = AssetDatabase.LoadAssetAtPath <TilesetData>(AssetDatabase.GUIDToAssetPath(guids[0]));
                }
                if (props["IsLargeRoom"] == "true")
                {
                    if (!data.LargeRooms.Contains(gameObject.name))
                    {
                        data.LargeRooms.Add(gameObject.name);
                    }
                }
                else
                {
                    if (!data.SmallRooms.Contains(gameObject.name))
                    {
                        data.SmallRooms.Add(gameObject.name);
                    }
                }
                EditorUtility.SetDirty(data);
            }
        }

        if (props.ContainsKey("Facing"))
        {
            gameObject.AddComponent <Door>();
            Door door = gameObject.GetComponent <Door>();
            door.facing = props["Facing"];
        }

        if (props.ContainsKey("SpawnerType"))
        {
            gameObject.name = props["SpawnerType"] + "Spawner";
        }
    }
Exemple #13
0
 private TilesetData TilesetDataFromUI(TilesetData data)
 {
     data.Name              = txtName.Text;
     data.Palette1          = plt1.Data;
     data.Palette2          = plt2.Data;
     data.Tiles             = CurrentTiles.ConvertAll(a => a.Clone());
     data.BattleBackgrounds = bblBattleBackgrounds.Datas;
     CurrentFile            = data.Name;
     Dirty = false;
     return(data);
 }
Exemple #14
0
        public static TilesetData AddTilesetData(string name)
        {
            if (TILESETDATAS.ContainsKey(name))
            {
                return(TILESETDATAS[name]);
            }
            TilesetData load = Program.Content.Load <TilesetData>(name);

            TILESETDATAS.Add(name, load);
            return(load);
        }
Exemple #15
0
 private void TilesetDataToUI(TilesetData data)
 {
     data.LoadImages(WorkingDirectory);
     txtName.Text = data.Name;
     plt1.Data    = data.Palette1;
     plt2.Data    = data.Palette2;
     CurrentTiles = data.Tiles.ConvertAll(a => a.Clone());
     bblBattleBackgrounds.Datas = data.BattleBackgrounds;
     SelectedIndex = -1;
     Render();
     CurrentFile = data.Name;
     Dirty       = false;
 }
Exemple #16
0
        public static (Map, string) FromAlbionMap2D(
            MapData2D map,
            TilesetData tileset,
            Tilemap2DProperties properties,
            string tilesetPath,
            Tileset npcTileset,
            EventFormatter eventFormatter)
        {
            if (map == null)
            {
                throw new ArgumentNullException(nameof(map));
            }
            if (tileset == null)
            {
                throw new ArgumentNullException(nameof(tileset));
            }
            if (properties == null)
            {
                throw new ArgumentNullException(nameof(properties));
            }
            if (npcTileset == null)
            {
                throw new ArgumentNullException(nameof(npcTileset));
            }

            ushort blankTileIndex = 0;
            int    nextObjectId   = 1;
            int    nextLayerId    = 3; // 1 & 2 are always underlay & overlay.

            npcTileset.GidOffset            = tileset.Tiles.Count;
            var(script, functionsByEventId) = BuildScript(map, eventFormatter);

            var result = new Map
            {
                TiledVersion    = "1.4.2",
                Version         = "1.4",
                Width           = map.Width,
                Height          = map.Height,
                TileWidth       = properties.TileWidth,
                TileHeight      = properties.TileHeight,
                Infinite        = 0,
                NextLayerId     = 5, // max(layer or objectgroup id) + 1
                Orientation     = "orthogonal",
                RenderOrder     = "right-down",
                BackgroundColor = "#000000",
                Properties      = BuildMapProperties(map),
                Tilesets        = new List <MapTileset>
                {
                    new() { FirstGid = 0, Source = tilesetPath, },
                    new() { FirstGid = npcTileset.GidOffset, Source = npcTileset.Filename }
                },
        /* This function is called when the OK button is clicked. It creates the new tileset using the user input. */
        void btnOK_Click(object sender, EventArgs e)
        {
            /* First, the two text boxes are checked to make sure they contain text, using the string.IsNullOrEmpty() function.
             * If one of the text boxes is empty, then a message box is shown to the user telling them they need to write something. */
            if (string.IsNullOrEmpty(tbTilesetName.Text))
            {
                MessageBox.Show("You must enter a name for the tileset.");
                return;
            }
            if (string.IsNullOrEmpty(tbTilesetImage.Text))
            {
                MessageBox.Show("You must choose a tileset image.");
                return;
            }

            /* The tileWidth and tileHeight fields are initialized with zero as the default value.
             * The function tries to convert the contents of the tile width and height text boxes into integers using TryParse().
             * It also checks if either of the values are less than one.
             * If either of these fail, then a message box is displayed informing the user. */
            int tileWidth  = 0;
            int tileHeight = 0;

            if (!int.TryParse(mtbTileWidth.Text, out tileWidth) || tileWidth < 1)
            {
                MessageBox.Show("Tile Width must be 1 or more.");
                return;
            }
            if (!int.TryParse(mtbTileHeight.Text, out tileHeight) || tileHeight < 1)
            {
                MessageBox.Show("Tile Height must be 1 or more.");
                return;
            }

            /* Next, the function loads in the actual image associated with the tileset as a System.Drawing.Image, from the file name in the tileset image text box.
            * The tilesWide and tilesHigh fields for the tileset are calculated by dividing the image's width/height by the width/height of each individual tile. */
            SysImage tilesetImage = SysImage.FromFile(tbTilesetImage.Text);

            /* The new TilesetData is initialized and set with the name and image path from the text boxes in the form.
             * The tile width and height are set from the numbers entered into the form.
             * The number of tiles wide/high in the tileset is calculated by dividing the tileset image width/height by the individual tile width/height.
             * Finally, since the form has finished processing the new tileset, formFinished is set to true. */
            tilesetData                    = new TilesetData();
            tilesetData.TilesetName        = tbTilesetName.Text;
            tilesetData.TilesetImageName   = tbTilesetImage.Text;
            tilesetData.TileWidthInPixels  = tileWidth;
            tilesetData.TileHeightInPixels = tileHeight;
            tilesetData.TilesWide          = tilesetImage.Width / tileWidth;
            tilesetData.TilesHigh          = tilesetImage.Height / tileHeight;
            formFinished                   = true;
            Close();
        }
Exemple #18
0
 public LogicalMap2D(
     IAssetManager assetManager,
     MapData2D mapData,
     MapChangeCollection tempChanges,
     MapChangeCollection permChanges) : base(mapData, tempChanges, permChanges)
 {
     if (assetManager == null)
     {
         throw new ArgumentNullException(nameof(assetManager));
     }
     _mapData        = mapData ?? throw new ArgumentNullException(nameof(mapData));
     _tileData       = assetManager.LoadTileData(_mapData.TilesetId);
     _blockList      = assetManager.LoadBlockList(_mapData.TilesetId.ToBlockList());
     UseSmallSprites = _tileData.UseSmallGraphics;
 }
Exemple #19
0
        public override bool BushFlag()
        {
            MapData data = MapComponent.Instance.GetMapInstance().GetMapData();

            if (data == null)
            {
                return(false);
            }
            for (int i = 0; i < 3; i++)
            {
                float x = _mapPlayer.GetPlayerPacket().RealX;
                float y = _mapPlayer.GetPlayerPacket().RealY;
                if ((x % 32) / 32f < 0.5)
                {
                    x = (int)Math.Floor(x / 32);
                }
                else
                {
                    x = (int)Math.Ceiling(x / 32);
                }

                if ((y % 32) / 32f < 0.3)
                {
                    y = (int)Math.Floor(y / 32);
                }
                else
                {
                    y = (int)Math.Ceiling(y / 32);
                }

                Tuple <int, int> tileInfo = data.GetTile(i, (int)x, (int)y);
                if (tileInfo == null)
                {
                    continue;
                }
                TilesetData.Tileset tileset = TilesetData.GetTileset(tileInfo.Item2);
                if (tileset != null)
                {
                    if (tileset.GetBushFlag(tileInfo.Item1))
                    {
                        return(true);
                    }
                }
            }

            return(base.BushFlag());
        }
Exemple #20
0
        public override bool BushFlag()
        {
            if (_mapEvent.Priority == RenderPriority.OnTop)
            {
                return(false);
            }
            MapData data = MapComponent.Instance.GetMapInstance().GetMapData();

            for (int i = 0; i < 3; i++)
            {
                float x = _mapEvent.RealX;
                float y = _mapEvent.RealY;
                if ((x % 32) / 32f < 0.5)
                {
                    x = (int)Math.Floor(x / 32);
                }
                else
                {
                    x = (int)Math.Ceiling(x / 32);
                }

                if ((y % 32) / 32f < 0.3)
                {
                    y = (int)Math.Floor(y / 32);
                }
                else
                {
                    y = (int)Math.Ceiling(y / 32);
                }

                Tuple <int, int> tileInfo = data.GetTile(i, (int)x, (int)y);
                if (tileInfo != null)
                {
                    TilesetData.Tileset tileset = TilesetData.GetTileset(tileInfo.Item2);
                    if (tileset != null)
                    {
                        if (tileset.GetBushFlag(tileInfo.Item1))
                        {
                            return(true);
                        }
                    }
                }
            }

            return(base.BushFlag());
        }
Exemple #21
0
        public static Tileset FromTileset(TilesetData tileset, TilemapProperties properties)
        {
            if (tileset == null)
            {
                throw new ArgumentNullException(nameof(tileset));
            }
            if (properties == null)
            {
                throw new ArgumentNullException(nameof(properties));
            }
            // +1 to go from max index to count, then + another so we have a blank tile at the end.

            int count = tileset.Tiles
                        .Where(x => x.ImageNumber != 0xffff)
                        .Max(x => x.ImageNumber + x.FrameCount - 1)
                        + 2;
            int columns = (properties.SheetWidth - 2 * properties.Margin) / (properties.TileWidth + properties.Spacing);
Exemple #22
0
        public override void Subscribed()
        {
            if (_mapData == null)
            {
                var assets = Resolve <IAssetManager>();
                _mapData = assets.LoadMap2D(MapId);
                var tileset = assets.LoadTexture((IconGraphicsId)_mapData.TilesetId);
                _tileData        = assets.LoadTileData((IconDataId)_mapData.TilesetId);
                _renderable      = new MapRenderable2D(_mapData, tileset, _tileData);
                _useSmallSprites = _tileData.UseSmallGraphics;

                Exchange.Attach(_renderable);
                Children.Add(_renderable);
                foreach (var npc in _mapData.Npcs)
                {
                    IComponent sprite =
                        _useSmallSprites
                            ? new SmallNpc((SmallNpcId)npc.ObjectNumber, npc.Waypoints) as IComponent
                            : new LargeNpc((LargeNpcId)npc.ObjectNumber, npc.Waypoints);

                    Exchange.Attach(sprite);
                    Children.Add(sprite);
                }

                IMovement partyMovement = new PartyMovement(_useSmallSprites, Vector2.Zero, PartyMovement.Direction.Right);  // TODO: Initial position.
                Exchange.Register(partyMovement);
                Children.Add(partyMovement);

                var state = Resolve <IGameState>();
                foreach (var player in state.Party.StatusBarOrder)
                {
                    player.GetPosition = () => partyMovement.GetPositionHistory(player.Id).Item1;
                    var playerSprite = _useSmallSprites
                        ? (IComponent) new SmallPlayer(player.Id, (SmallPartyGraphicsId)player.Id, () => partyMovement.GetPositionHistory(player.Id)) // TODO: Use a function to translate logical to sprite id
                        : new LargePlayer(player.Id, (LargePartyGraphicsId)player.Id, () => partyMovement.GetPositionHistory(player.Id));             // TODO: Use a function to translate logical to sprite id

                    Exchange.Attach(playerSprite);
                    Children.Add(playerSprite);
                }
            }

            Raise(new SetClearColourEvent(0, 0, 0));
        }
Exemple #23
0
    static string BuildCsvData(MapData2D map, TilesetData tileset, bool useOverlay)
    {
        var sb = new StringBuilder();

        for (int j = 0; j < map.Height; j++)
        {
            for (int i = 0; i < map.Width; i++)
            {
                int index     = j * map.Width + i;
                var tileIndex = useOverlay ? map.Overlay[index] : map.Underlay[index];
                var tile      = tileset.Tiles[tileIndex];
                sb.Append(tile.IsBlank ? BlankTileIndex : tileIndex);
                sb.Append(',');
            }

            sb.AppendLine();
        }
        return(sb.ToString(0, sb.Length - (Environment.NewLine.Length + 1)));
    }
Exemple #24
0
    public TestTilemap(ITextureBuilderFont font, ITextureBuilderFont bigFont)
    {
        var tiles = new List <IReadOnlyTexture <byte> >
        {
            Constants.T.FillAll(Constants.CBlack1).Texture,
            Constants.T.FillAll(Constants.CBlack1).Texture,
            Constants.T.FillAll(Constants.CGrey12).Texture,
        };

        Tileset = new TilesetData(UAlbion.Base.Tileset.Toronto)
        {
            UseSmallGraphics = false
        };
        Tileset.Tiles.Add(new(Tileset.Tiles.Count, 1, TileType.Normal, TileLayer.Normal));
        BlankOffset = Tileset.Tiles.Count;
        Tileset.Tiles.Add(new(Tileset.Tiles.Count, 1, TileType.Normal, TileLayer.Normal));
        SolidOffset = Tileset.Tiles.Count;
        Tileset.Tiles.Add(new(Tileset.Tiles.Count, 2, TileType.Normal, TileLayer.Normal)
                          { Collision = Passability.Solid });
Exemple #25
0
        public LogicalMap2D(
            IAssetManager assetManager,
            MapData2D mapData,
            MapChangeCollection tempChanges,
            MapChangeCollection permChanges)
        {
            if (assetManager == null)
            {
                throw new ArgumentNullException(nameof(assetManager));
            }
            _mapData        = mapData ?? throw new ArgumentNullException(nameof(mapData));
            _tempChanges    = tempChanges ?? throw new ArgumentNullException(nameof(tempChanges));
            _permChanges    = permChanges ?? throw new ArgumentNullException(nameof(permChanges));
            _tileData       = assetManager.LoadTileData(_mapData.TilesetId);
            _blockList      = assetManager.LoadBlockList(_mapData.TilesetId.ToBlockList());
            UseSmallSprites = _tileData.UseSmallGraphics;

            // Clear out temp changes for other maps
            for (int i = 0; i < tempChanges.Count;)
            {
                if (_tempChanges[i].MapId != mapData.Id)
                {
                    _tempChanges.RemoveAt(i);
                }
                else
                {
                    i++;
                }
            }

            // Replay any changes for this map
            foreach (var change in permChanges.Where(x => x.MapId == mapData.Id))
            {
                ApplyChange(change.X, change.Y, change.ChangeType, change.Value);
            }

            foreach (var change in tempChanges)
            {
                ApplyChange(change.X, change.Y, change.ChangeType, change.Value);
            }
        }
Exemple #26
0
        public object Load(BinaryReader br, long streamLength, string name, AssetInfo config)
        {
            var td = new TilesetData();

            td.UseSmallGraphics = config.UseSmallGraphics ?? false;

            var validPassabilities = typeof(TilesetData.Passability).GetEnumValues().Cast <int>().ToList();
            var validLayers        = typeof(TilesetData.TileLayer).GetEnumValues().Cast <byte>().ToList();
            var validTypes         = typeof(TilesetData.TileType).GetEnumValues().Cast <byte>().ToList();

            int tileCount = (int)(streamLength / 8);

            for (int i = 0; i < tileCount; i++)
            {
                var t = new TilesetData.TileData {
                    TileNumber = i
                };

                byte firstByte = br.ReadByte();                    // 0
                t.Layer = (TilesetData.TileLayer)(firstByte >> 4); // Upper nibble of first byte (0h)
                Debug.Assert(validLayers.Contains((byte)t.Layer), "Unexpected tile layer found");

                t.Type = (TilesetData.TileType)(firstByte & 0xf); // Lower nibble of first byte (0l)
                Debug.Assert(validTypes.Contains((byte)t.Type), "Unexpected tile type found");

                t.Collision = (TilesetData.Passability)br.ReadByte(); // 1
                Debug.Assert(validPassabilities.Contains((int)t.Collision));

                t.Flags = (TilesetData.TileFlags)br.ReadUInt16(); // 2
                Debug.Assert((t.Flags & TilesetData.TileFlags.UnusedMask) == 0, "Unused flags set");
                t.ImageNumber = br.ReadUInt16();                  // 4
                t.FrameCount  = br.ReadByte();                    // 6
                t.Unk7        = br.ReadByte();                    // 7

                td.Tiles.Add(t);
            }

            return(td);
        }
Exemple #27
0
        public void SerializerConfig_TilesetData_ShouldBeEqual()
        {
            TilesetData data = new TilesetData
            {
                Name        = "it's a name",
                Resref      = "it's a resref",
                Comment     = "it's a comment",
                Description = "it's a description",
                Tag         = "it's a tag"
            };
            TilesetData result;

            using (MemoryStream stream = new MemoryStream())
            {
                Serializer.Serialize(stream, data);
                stream.Position = 0;

                result = Serializer.Deserialize <TilesetData>(stream);
            }

            Assert.IsTrue(_compareLogic.Compare(data, result).AreEqual);
        }
Exemple #28
0
    void GenerateTilemap()
    {
        if (meshObject.GetComponent <MeshFilter>() != null)
        {
            DestroyImmediate(meshObject.GetComponent <MeshFilter>());
            mesh = null;
        }

        meshFilter = meshObject.AddComponent <MeshFilter>();
        mesh       = new Mesh();

        if (meshObject.GetComponent <MeshCollider>() == null)
        {
            if (_generateMeshCollider)
            {
                meshCollider = meshObject.AddComponent <MeshCollider>();
            }
        }
        else if (!_generateMeshCollider)
        {
            DestroyImmediate(meshObject.GetComponent <MeshCollider>());
            meshCollider = null;
        }
        else if (_generateMeshCollider)
        {
            meshCollider = meshObject.GetComponent <MeshCollider>();
        }

        if (meshObject.GetComponent <MeshRenderer>() == null)
        {
            meshRenderer = meshObject.AddComponent <MeshRenderer>();
        }
        else
        {
            meshRenderer = meshObject.GetComponent <MeshRenderer>();
        }

        List <Vector3> vertices = new List <Vector3>();
        List <Vector2> uvs      = new List <Vector2>();

        // Tileset id, Triangles List (each tileset = submesh)
        Dictionary <int, List <int> > submeshesTriangles = new Dictionary <int, List <int> >();

        float actualZ       = 0;
        int   triangleFaces = -1;

        for (int layerIdx = 0; layerIdx < layers.Count; layerIdx++)
        {
            actualZ += _layerZ;
            TilelayerData layer = layers[layerIdx];

            for (int row = 1; row <= tilemapHeight; ++row)
            {
                for (int col = 0; col < tilemapWidth; ++col)
                {
                    // Get GID
                    int gid = layer.gids[row - 1, col];
                    if (gid == 0)
                    {
                        continue;
                    }

                    // Get tileset for this gid
                    int         tilesetId          = tilesetIdToGid[gid];
                    TilesetData tileset            = tilesets[tilesetId];
                    int         textureTilesPerRow = tileset.tilesPerRow;
                    int         firstGid           = tileset.firstgid;
                    float       textureWidth       = tileset.imagewidth;
                    float       textureHeight      = tileset.imageheight;

                    if (!submeshesTriangles.ContainsKey(tilesetId))
                    {
                        submeshesTriangles.Add(tilesetId, new List <int>());
                    }

                    // Tile position
                    Vector3 pos0 = new Vector3(col * scaleX, (-(tileHeight * row - anchorY) * scale), 0);
                    Vector3 pos1 = pos0 + new Vector3(scaleX, scaleY, 0);

                    // Vertices
                    Vector3 p0 = new Vector3(pos0.x, pos0.y, actualZ);
                    Vector3 p1 = new Vector3(pos1.x, pos0.y, actualZ);
                    Vector3 p2 = new Vector3(pos0.x, pos1.y, actualZ);
                    Vector3 p3 = new Vector3(pos1.x, pos1.y, actualZ);

                    vertices.Add(p0);
                    vertices.Add(p1);
                    vertices.Add(p2);
                    vertices.Add(p3);

                    // Triangles
                    triangleFaces += 4;

                    submeshesTriangles[tilesetId].Add(triangleFaces - 3);
                    submeshesTriangles[tilesetId].Add(triangleFaces - 1);
                    submeshesTriangles[tilesetId].Add(triangleFaces - 2);
                    submeshesTriangles[tilesetId].Add(triangleFaces - 2);
                    submeshesTriangles[tilesetId].Add(triangleFaces - 1);
                    submeshesTriangles[tilesetId].Add(triangleFaces);

                    // UV
                    int equivalentGidFromFirstRow = gid - firstGid + 1;
                    int tilesRow = 1;

                    for (; equivalentGidFromFirstRow > (textureTilesPerRow); equivalentGidFromFirstRow -= (textureTilesPerRow))
                    {
                        tilesRow++;
                    }

                    float tileX           = ((equivalentGidFromFirstRow - 1) * (tileWidth + tileset.spacing)) + tileset.margin;
                    float tileYBottomLeft = (((tileHeight + tileset.spacing) * tilesRow) - tileset.spacing) + tileset.margin;

                    float pixelMinX = textureWidth;
                    float pixelMinY = textureHeight;

                    if (tileX != 0f)
                    {
                        pixelMinX = tileX / pixelMinX;
                    }
                    if (tileYBottomLeft != 0f)
                    {
                        pixelMinY = tileYBottomLeft / pixelMinY;
                    }

                    Vector2 pixelMin  = new Vector2(pixelMinX, 1.0f - pixelMinY);
                    Vector2 pixelDims = new Vector2((tileWidth / textureWidth), (tileHeight / textureHeight));

                    Vector2 min = pixelMin;

                    // Amount of UV's have to match the amount of verts
                    // And their winding.
                    // Fix gaps with eps: http://forum.unity3d.com/threads/41187-Web-demo-of-my-2D-platformer?p=263666&viewfull=1#post263666
                    float eps = BleedingOffset;
                    uvs.Add(min + new Vector2(pixelDims.x * 0.0f + eps, pixelDims.y * 0.0f + eps));
                    uvs.Add(min + new Vector2(pixelDims.x * 1.0f - eps, pixelDims.y * 0.0f + eps));
                    uvs.Add(min + new Vector2(pixelDims.x * 0.0f + eps, pixelDims.y * 1.0f - eps));
                    uvs.Add(min + new Vector2(pixelDims.x * 1.0f - eps, pixelDims.y * 1.0f - eps));
                }
            }
        }         // end iterate layers

        mesh.vertices = vertices.ToArray();
        mesh.uv       = uvs.ToArray();

        // Only one tileset, no need for more than one submesh
        if (_amountTilesets == 1)
        {
            mesh.triangles = submeshesTriangles[0].ToArray();
        }
        // A submesh to each tileset
        else
        {
            mesh.subMeshCount = _amountTilesets;

            for (int tilesetId = 0; tilesetId < _amountTilesets; tilesetId++)
            {
                if (submeshesTriangles.ContainsKey(tilesetId))
                {
                    mesh.SetTriangles(submeshesTriangles[tilesetId].ToArray(), tilesetId);
                }
                else
                {
                    mesh.SetTriangles(new int[0], tilesetId);
                }
            }
        }

        meshFilter.mesh = mesh;

        mesh.RecalculateNormals();
        mesh.RecalculateBounds();
        ;

        if (_generateMeshCollider)
        {
            meshCollider.sharedMesh = null;
            meshCollider.sharedMesh = mesh;
        }

        meshRenderer.materials = TilesetsMaterials;
    }
Exemple #29
0
    void ImportTiledXML()
    {
        if (LoadTiledXML())
        {
            if (_xml.DocumentElement.Name == "map")
            {
                tilemapWidth  = System.Convert.ToInt32(_xml.DocumentElement.Attributes["width"].Value);
                tilemapHeight = System.Convert.ToInt32(_xml.DocumentElement.Attributes["height"].Value);
                tileWidth     = System.Convert.ToInt32(_xml.DocumentElement.Attributes["tilewidth"].Value);
                tileHeight    = System.Convert.ToInt32(_xml.DocumentElement.Attributes["tileheight"].Value);

                scaleX = tileWidth * scale;
                scaleY = tileHeight * scale;

                anchorX = 0;
                anchorY = tileHeight;

                XmlNodeList tilesetsNodes = _xml.DocumentElement.SelectNodes("tileset");
                XmlNodeList layersNodes   = _xml.DocumentElement.SelectNodes("layer");

                XmlNode subNode    = null;
                XmlNode subSubNode = null;

                tilesets       = new List <TilesetData>();
                layers         = new List <TilelayerData>();
                tilesetIdToGid = new Dictionary <int, int>();

                for (int tilesetId = 0; tilesetId < tilesetsNodes.Count; ++tilesetId)
                {
                    subNode = tilesetsNodes[tilesetId];

                    TilesetData tileset = new TilesetData();
                    tileset.name       = subNode.Attributes["name"].Value;
                    tileset.firstgid   = System.Convert.ToInt32(subNode.Attributes["firstgid"].Value);
                    tileset.tilewidth  = System.Convert.ToInt32(subNode.Attributes["tilewidth"].Value);
                    tileset.tileheight = System.Convert.ToInt32(subNode.Attributes["tileheight"].Value);

                    if (subNode.Attributes["margin"] != null)
                    {
                        tileset.margin = System.Convert.ToInt32(subNode.Attributes["margin"].Value);
                    }
                    else
                    {
                        tileset.margin = 0;
                    }

                    if (subNode.Attributes["spacing"] != null)
                    {
                        tileset.spacing = System.Convert.ToInt32(subNode.Attributes["spacing"].Value);
                    }
                    else
                    {
                        tileset.spacing = 0;
                    }

                    subSubNode          = subNode.SelectSingleNode("image");
                    tileset.imagesource = subSubNode.Attributes["source"].Value;
                    tileset.imagewidth  = (float)System.Convert.ToDouble(subSubNode.Attributes["width"].Value);
                    tileset.imageheight = (float)System.Convert.ToDouble(subSubNode.Attributes["height"].Value);

                    tileset.tilesPerRow = (int)((tileset.imagewidth - tileset.margin * 2 + tileset.spacing) /
                                                (tileset.tilewidth + tileset.spacing)
                                                );

                    tileset.tilesPerColumn = (int)((tileset.imageheight - tileset.margin * 2 + tileset.spacing) /
                                                   (tileset.tileheight + tileset.spacing)
                                                   );

                    tileset.amountTiles = tileset.tilesPerRow * tileset.tilesPerColumn;

                    tilesets.Add(tileset);

                    // Map each gid of this tileset with the Tileset ID, so when building the tilemap
                    // mesh, we can easily grab the tileset related to the gid.
                    for (int gid = tileset.firstgid; gid <= (tileset.firstgid + tileset.amountTiles - 1); gid++)
                    {
                        tilesetIdToGid.Add(gid, tilesetId);
                    }
                }

                for (int layerId = 0; layerId < layersNodes.Count; ++layerId)
                {
                    subNode = layersNodes[layerId];

                    TilelayerData layer = new TilelayerData();
                    layer.name = subNode.Attributes["name"].Value;

                    XmlNodeList gidsNodes = subNode.SelectNodes("data/tile");

                    int gidRow    = 0;
                    int gidColumn = 0;

                    layer.gids = new int[tilemapWidth, tilemapHeight];

                    for (int gi = 0; gi < gidsNodes.Count; gi++)
                    {
                        layer.gids[gidRow, gidColumn] = System.Convert.ToInt32(gidsNodes[gi].Attributes["gid"].Value);
                        gidColumn++;

                        if ((gi + 1) % tilemapWidth == 0)
                        {
                            gidRow++;
                            gidColumn = 0;
                        }
                    }

                    layers.Add(layer);
                }

                _amountTilesets = tilesets.Count;

                if (TilesetsTextures != null && TilesetsTextures.Length != _amountTilesets)
                {
                    for (int i = 0; i < TilesetsMaterials.Length; i++)
                    {
                        if (TilesetsMaterials[i] != null)
                        {
                            DestroyImmediate(TilesetsMaterials[i]);
                        }
                    }

                    TilesetsTextures  = null;
                    TilesetsMaterials = null;
                }

                if (TilesetsTextures == null)
                {
                    TilesetsTextures  = new Texture[_amountTilesets];
                    TilesetsMaterials = new Material[TilesetsTextures.Length];
                }
            }
        }
    }
Exemple #30
0
        public static void Dump(string baseDir, IAssetManager assets, ISet <AssetType> types, AssetId[] dumpIds)
        {
            var disposeList = new List <IDisposable>();

            TextWriter Writer(string name)
            {
                var filename  = Path.Combine(baseDir, "data", "exported", "json", name);
                var directory = Path.GetDirectoryName(filename);

                if (!Directory.Exists(directory))
                {
                    Directory.CreateDirectory(directory);
                }

                var stream = File.Open(filename, FileMode.Create);
                var writer = new StreamWriter(stream);

                disposeList.Add(writer);
                disposeList.Add(stream);
                return(writer);
            }

            void Flush()
            {
                foreach (var d in disposeList)
                {
                    d.Dispose();
                }
                disposeList.Clear();
            }

            var settings = new JsonSerializerSettings
            {
                Formatting           = Formatting.Indented,
                DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate,
            };

            var        s = JsonSerializer.Create(settings);
            TextWriter tw;

            if (types.Contains(AssetType.TilesetData))
            {
                foreach (var id in DumpUtil.All(AssetType.TilesetData, dumpIds))
                {
                    TilesetData asset = assets.LoadTileData(id);
                    if (asset == null)
                    {
                        continue;
                    }
                    tw = Writer($"tilesets/tileset{id.Id}.json");
                    s.Serialize(tw, asset);
                }

                Flush();
            }

            if (types.Contains(AssetType.Labyrinth))
            {
                foreach (var id in DumpUtil.All(AssetType.Labyrinth, dumpIds))
                {
                    LabyrinthData asset = assets.LoadLabyrinthData(id);
                    if (asset == null)
                    {
                        continue;
                    }
                    tw = Writer($"labdata/labyrinth{id.Id}.json");
                    s.Serialize(tw, asset);
                }

                Flush();
            }

            // string str = assets.LoadString(StringId id, GameLanguage language);

            if (types.Contains(AssetType.Map))
            {
                foreach (var id in DumpUtil.All(AssetType.Map, dumpIds))
                {
                    IMapData asset = assets.LoadMap(id);
                    if (asset == null)
                    {
                        continue;
                    }
                    tw = Writer($"maps/map{id.Id}_{id}.json");
                    s.Serialize(tw, asset);
                }

                Flush();
            }

            if (types.Contains(AssetType.Item))
            {
                tw = Writer("items.json");
                s.Serialize(tw, DumpUtil.AllAssets(AssetType.Item, dumpIds, x => assets.LoadItem(x)));
                Flush();
            }

            if (types.Contains(AssetType.PartyMember))
            {
                tw = Writer("party_members.json");
                s.Serialize(tw, DumpUtil.AllAssets(AssetType.PartyMember, dumpIds, x => assets.LoadSheet(x)));
                Flush();
            }

            if (types.Contains(AssetType.Npc))
            {
                tw = Writer("npcs.json");
                s.Serialize(tw, DumpUtil.AllAssets(AssetType.Npc, dumpIds, x => assets.LoadSheet(x)));
                Flush();
            }

            if (types.Contains(AssetType.Monster))
            {
                tw = Writer("monsters.json");
                s.Serialize(tw, DumpUtil.AllAssets(AssetType.Monster, dumpIds, x => assets.LoadSheet(x)));
                Flush();
            }

            if (types.Contains(AssetType.Chest))
            {
                tw = Writer("chests.json");
                s.Serialize(tw, DumpUtil.AllAssets(AssetType.Chest, dumpIds, assets.LoadInventory));
                Flush();
            }

            if (types.Contains(AssetType.Merchant))
            {
                tw = Writer("merchants.json");
                s.Serialize(tw, DumpUtil.AllAssets(AssetType.Merchant, dumpIds, assets.LoadInventory));
                Flush();
            }

            if (types.Contains(AssetType.BlockList))
            {
                foreach (var id in DumpUtil.All(AssetType.BlockList, dumpIds))
                {
                    IList <Block> asset = assets.LoadBlockList(id);
                    if (asset == null)
                    {
                        continue;
                    }
                    tw = Writer($"blocks/blocklist{id.Id}.json");
                    s.Serialize(tw, asset);
                }
                Flush();
            }

            if (types.Contains(AssetType.EventSet))
            {
                tw = Writer("event_sets.json");
                s.Serialize(tw, DumpUtil.AllAssets(AssetType.EventSet, dumpIds, x => assets.LoadEventSet(x)));
                Flush();
            }

            if (types.Contains(AssetType.Script))
            {
                foreach (var id in DumpUtil.All(AssetType.Script, dumpIds))
                {
                    IList <IEvent> asset = assets.LoadScript(id);
                    if (asset == null)
                    {
                        continue;
                    }
                    tw = Writer($"scripts/script{id.Id}.json");
                    s.Serialize(tw, asset.Select(x => x.ToString()).ToArray());
                }
                Flush();
            }

            if (types.Contains(AssetType.Spell))
            {
                tw = Writer("spells.json");
                s.Serialize(tw, DumpUtil.AllAssets(AssetType.Spell, dumpIds, x => assets.LoadSpell(x)));
                Flush();
            }

            if (types.Contains(AssetType.MonsterGroup))
            {
                tw = Writer("monster_groups.json");
                s.Serialize(tw, DumpUtil.AllAssets(AssetType.MonsterGroup, dumpIds, x => assets.LoadMonsterGroup(x)));
                Flush();
            }

            if (types.Contains(AssetType.Palette))
            {
                foreach (var id in DumpUtil.All(AssetType.Palette, dumpIds))
                {
                    tw = Writer($"palettes/palette{id.Id}_{id}.json");
                    var palette = assets.LoadPalette(id);
                    s.Serialize(tw, palette);
                }
                Flush();
            }
        }
Exemple #31
0
        /// <summary>
        /// Gibt das Tileset zurück in welchem 
        /// das Tile ist
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        public TilesetData GetTileset(int number)
        {
            TilesetData ret=new TilesetData();

            foreach(TilesetData i in Tilesets)
            {
                if(number>=i.firstgid)
                {
                    ret=i;
                }
            }

            return ret;
        }
Exemple #32
0
        void Open(string filename, bool loadTilesets)
        {
            //Datei öffnen
            Tilesets=new List<TilesetData>();
            Layers=new List<LayerData>();
            ObjectLayers=new List<Objectgroup>();
            Properties=new List<Property>();

            //XMLdata öffnen
            FileData=new XmlData(filename);

            #region MapsInfo ermitteln
            XmlNodeList xnl=FileData.Document.SelectNodes("/map");

            MapVersion=xnl[0].Attributes["version"].Value;
            Orientation=xnl[0].Attributes["orientation"].Value;

            Width=Convert.ToInt32(xnl[0].Attributes["width"].Value);
            Height=Convert.ToInt32(xnl[0].Attributes["height"].Value);

            TileWidth=Convert.ToInt32(xnl[0].Attributes["tilewidth"].Value);
            TileHeight=Convert.ToInt32(xnl[0].Attributes["tileheight"].Value);
            #endregion

            #region Properties auslesen
            xnl=FileData.Document.SelectNodes("/map/properties");

            foreach(XmlNode j in xnl)
            {
                XmlNodeList subnodes=j.SelectNodes("child::property");

                foreach(XmlNode pNode in subnodes)
                {
                    string name=pNode.Attributes[0].Name;
                    string value=pNode.Attributes[0].Value;

                    Properties.Add(new Property(pNode));
                }
            }
            #endregion

            #region Tilesets ermitteln
            xnl=FileData.Document.SelectNodes("/map/tileset");

            foreach(XmlNode j in xnl)
            {
                //Tilesets
                TilesetData ts=new TilesetData();

                ts.imgsource=j.SelectNodes("child::image")[0].Attributes[0].Value; //Image Source für den Layer
                string imgsourceComplete=FileSystem.GetPath(filename)+ts.imgsource;

                //Tiles laden, wenn vorhanden
                XmlNodeList nodelist=j.SelectNodes("child::tile");

                foreach(XmlNode tileXml in nodelist)
                {
                    Tile tile=new Tile();
                    tile.ID=tileXml.Attributes["id"].Value.ToString();

                    xnl=tileXml.SelectNodes("child::properties");

                    foreach(XmlNode jProp in xnl)
                    {
                        XmlNodeList subnodes=jProp.SelectNodes("child::property");

                        foreach(XmlNode pNode in subnodes)
                        {
                            tile.Properties.Add(new Property(pNode));
                        }
                    }

                    ts.Tiles.Add(tile);
                }

                //Tilebildl laden
                if(loadTilesets)
                {
                    try
                    {
                        ts.img=pooledLoader.FromFile(imgsourceComplete);
                    }
                    catch(FileNotFoundException ex)
                    {
                        throw new TilesetNotExistsException(ex.Message);
                    }
                }

                //Attrribute
                ts.name=j.Attributes["name"].Value; 
                ts.firstgid=Convert.ToInt32(j.Attributes["firstgid"].Value);
                ts.tilewidth=Convert.ToInt32(j.Attributes["tilewidth"].Value);
                ts.tileheight=Convert.ToInt32(j.Attributes["tileheight"].Value);

                Tilesets.Add(ts);
            }
            #endregion

            #region Layers ermitteln
            xnl=FileData.Document.SelectNodes("/map/layer");

            foreach(XmlNode j in xnl) //pro layer
            {
                //Layer
                LayerData lr=new LayerData();

                //Attribute
                lr.name=j.Attributes["name"].Value;
                lr.width=Convert.ToInt32(j.Attributes["width"].Value);
                lr.height=Convert.ToInt32(j.Attributes["height"].Value);

                //Layerdaten
                // Attribute werden als "<data encoding="base64" compression="gzip">" angenommen
                string encoding=j["data"].Attributes["encoding"].Value;

                string compression="uncompressed";

                if(j["data"].Attributes["compression"]!=null)
                {
                    compression=j["data"].Attributes["compression"].Value;
                }

                if(encoding!="base64")
                {
                    throw (new NotImplementedException("Weitere Codierungsarten sind noch nicht implementiert!"));
                }


                if(compression!="uncompressed"&&compression!="gzip")
                {
                    throw (new NotSupportedCompressionException("Weitere Kompressionsverfahren sind noch nicht implementiert!"));
                }

                //Base64 Encodierung
                string layerdataBase64Compressed=j.SelectNodes("child::data")[0].InnerText;
                layerdataBase64Compressed=layerdataBase64Compressed.TrimStart('\n');
                layerdataBase64Compressed=layerdataBase64Compressed.Trim();
                byte[] layerdataCompressed=CSCL.Crypto.Encoding.Base64.Decode(layerdataBase64Compressed); 

                //Gzip Decodierung (wenn nötig)
                byte[] layerdataDecompressed;
                if(compression=="uncompressed")
                {
                    layerdataDecompressed=layerdataCompressed;
                }
                else
                {
                    layerdataDecompressed=gzip.Decompress(layerdataCompressed);
                }

                //Interpretieren der Codierten Daten
                lr.data=new int[lr.width, lr.height];
                //int[,] zelle=new int[4, 3];
                BinaryReader br=new BinaryReader(new MemoryStream(layerdataDecompressed));

                for(int y=0;y<lr.height;y++)
                {
                    for(int x=0;x<lr.width;x++)
                    {
                        lr.data[x, y]=br.ReadInt32();
                    }
                }
				
                Layers.Add(lr);
            }
            #endregion

            #region Objektlayer ermitteln
            xnl=FileData.Document.SelectNodes("/map/objectgroup");

            foreach(XmlNode j in xnl) //pro layer
            {
                ObjectLayers.Add(new Objectgroup(j));
            }
            #endregion
        }