public static Texture GetTile(int sheetNum, Maps.Loc2D tileLoc)
        {
            try
            {
                if (tileData[sheetNum] == null)
                {
                    tileData[sheetNum] = new TileMetadata();
                    tileData[sheetNum].Load(Paths.CachedGFXPath + "Tile\\Tiles" + sheetNum + ".tile");
                }

                int tileNum = (tileData[sheetNum].Size.Width / TILE_SIZE) * tileLoc.Y + tileLoc.X;
                Texture cacheSheet = tileCache.Get(sheetNum + "-" + tileLoc.X + "-" + tileLoc.Y);
                if (cacheSheet != null) return cacheSheet;

                if (sheetNum > -1 && sheetNum < TOTAL_TILE_SHEETS && tileNum > -1 && tileNum < tileData[sheetNum].TotalTiles)
                {
                    Texture sheet = new Texture();

                    byte[] tileBytes = new byte[tileData[sheetNum].TileSizes[tileNum]];
                    using (FileStream stream = new FileStream(Paths.CachedGFXPath + "Tile\\Tiles" + sheetNum + ".tile", FileMode.Open, FileAccess.Read, FileShare.Read))
                    {
                        // Seek to the location of the tile
                        stream.Seek(tileData[sheetNum].GetTilePosition(tileNum), SeekOrigin.Begin);
                        stream.Read(tileBytes, 0, tileBytes.Length);
                    }
                    using (MemoryStream tileStream = new MemoryStream(tileBytes))
                    {
                        sheet.LoadPixelsFromBytes(tileStream);
                        sheet.LoadTextureFromPixels32();
                    }

                    tileCache.Add(sheetNum + "-" + tileLoc.X + "-" + tileLoc.Y, sheet);
                    return sheet;
                }
            }
            catch (Exception ex)
            {
                Logs.Logger.LogError(new Exception("Error retrieving tile " + tileLoc.X + ", " + tileLoc.Y + " from Tileset #" + sheetNum + "\n", ex));
            }

            tileCache.Add(sheetNum + "-" + tileLoc.X + "-" + tileLoc.Y, ErrorTexture);
            return ErrorTexture;
        }
        public static void Init()
        {
            //run conversions
            if (!Directory.Exists(Paths.CachedGFXPath))
                Directory.CreateDirectory(Paths.CachedGFXPath);

            Conversion.CompileAllSprites(Paths.SpritesPath, Paths.CachedGFXPath + "Sprite");
            Conversion.CompileAllTiles(Paths.TilesPath, Paths.CachedGFXPath + "Tile");
            Conversion.CompileAllPortraits(Paths.PortraitsPath, Paths.CachedGFXPath + "Portrait");

            Game.UpdateLoadMsg("Loading Base Textures");
            //load error texture
            ErrorTexture = new AnimSheet();
            ErrorTexture.LoadPixelsFromFile32(Paths.BaseGFXPath+"Error.png");

            //load blank texture
            BlankTexture = new Texture();
            BlankTexture.LoadPixelsFromFile32(Paths.BaseGFXPath + "UI\\Blank.png");

            //load menu data
            MenuBack = new TileSheet();
            MenuBack.LoadPixelsFromFile32(Paths.BaseGFXPath + "UI\\Back.png");

            Picker = new TileSheet();
            Picker.LoadPixelsFromFile32(Paths.BaseGFXPath + "UI\\Picker.png");

            Game.UpdateLoadMsg("Loading Caches");
            //initialize caches
            spriteCache = new MultiNameLRUCache<string, SpriteSheet>(SPRITE_CACHE_SIZE);
            spriteCache.OnItemRemoved = DisposeCachedObject;
            mugshotCache = new MultiNameLRUCache<string, TileSheet>(MUGSHOT_CACHE_SIZE);
            mugshotCache.OnItemRemoved = DisposeCachedObject;
            spellCache = new LRUCache<string, AnimSheet>(SPELL_CACHE_SIZE);
            spellCache.OnItemRemoved = DisposeCachedObject;
            statusCache = new LRUCache<int, AnimSheet>(STATUS_CACHE_SIZE);
            statusCache.OnItemRemoved = DisposeCachedObject;
            itemCache = new LRUCache<int, AnimSheet>(ITEM_CACHE_SIZE);
            itemCache.OnItemRemoved = DisposeCachedObject;
            objectCache = new LRUCache<int, AnimSheet>(OBJECT_CACHE_SIZE);
            objectCache.OnItemRemoved = DisposeCachedObject;
            tileCache = new LRUCache<string, Texture>(TILE_CACHE_SIZE);
            tileCache.OnItemRemoved = DisposeCachedObject;

            //load metadata
            tileData = new TileMetadata[TOTAL_TILE_SHEETS];
        }
Exemple #3
0
        static void SaveTileMap(Bitmap bitmap, string destinationPath)
        {
            BitmapData data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            // File format:
            // [tileset-width(4)][tileset-height(4)][tile-count(4)]
            // [tileposition-1(4)][tilesize-1(4)][tileposition-2(4)][tilesize-2(4)][tileposition-n(n*4)][tilesize-n(n*4)]
            // [tile-1(variable)][tile-2(variable)][tile-n(variable)]
            using (System.IO.FileStream spriteStream = new System.IO.FileStream(destinationPath, System.IO.FileMode.Create, System.IO.FileAccess.Write))
            {
                using (BinaryWriter writer = new BinaryWriter(spriteStream))
                {
                    // Write tileset width
                    writer.Write(bitmap.Width);
                    // Write tileset height
                    writer.Write(bitmap.Height);

                    int count = (bitmap.Width / TextureManager.TILE_SIZE) * (bitmap.Height / TextureManager.TILE_SIZE);

                    long tileDataPosition = 0;
                    // Write header information about each tile
                    List<byte[]> tiles = new List<byte[]>();
                    for (int i = 0; i < count; i++)
                    {
                        //cut off the corresponding piece
                        using (Texture tileTex = new Texture())
                        {

                            tileTex.CreatePixels32(TextureManager.TILE_SIZE, TextureManager.TILE_SIZE);

                            int x = i % (bitmap.Width / TextureManager.TILE_SIZE);
                            int y = i / (bitmap.Width / TextureManager.TILE_SIZE);
                            tileTex.Blit(data, x * TextureManager.TILE_SIZE, y * TextureManager.TILE_SIZE, TextureManager.TILE_SIZE, TextureManager.TILE_SIZE, 0, 0);

                            //save as a PNG to a stream
                            using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
                            {
                                tileTex.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                                byte[] bytes = ms.ToArray();

                                tiles.Add(bytes);

                                // Write the position of the tile
                                writer.Write(tileDataPosition);
                                // Write the size of the tile
                                writer.Write(bytes.Length);
                                // Add the tile size to the position
                                tileDataPosition += bytes.Length;
                            }
                        }
                    }

                    // Now that all header is written, write tile data
                    for (int i = 0; i < count; i++)
                    {
                        writer.Write(tiles[i], 0, tiles[i].Length);
                    }
                }
            }
        }