public static TextureAtlas Load(MPQArchive mpq, string path, byte[] palette = null) { if (palette == null) { palette = DefaultPalette; } var celFile = CELFile.Load(mpq, path); int sheetDim = 1024; while (true) { loop: var packer = new TextureAtlasPacker(sheetDim); for (int i = 0; i < celFile.NumFrames; ++i) { var frame = celFile.GetFrame(i, palette); int rectId = packer.Insert(frame.Data, frame.Width, frame.Height, true); if (rectId < 0) { sheetDim *= 2; goto loop; } } return(packer.CreateAtlas()); } }
protected override void LoadContent() { spriteBatch = new SpriteBatch(GraphicsDevice); var mpq = new MPQArchive("DIABDAT.MPQ"); isoView.Level = TownLevel.Load(mpq); /*using (var wavStream = mpq.Open("music/dtowne.wav")) { * var wavData = new byte[wavStream.Length]; * var wavLen = wavStream.Read(wavData, 0, (int)wavStream.Length); * Debug.Assert(wavLen == wavStream.Length); * music = new SoundEffect(wavData, 22050, AudioChannels.Stereo); * }*/ charAtlas = TextureAtlas.Load(mpq, PlayerGfx.GetAnimPath( PlayerGfx.Class.Warrior, PlayerGfx.Armor.Light, PlayerGfx.Weapon.MaceShield, PlayerGfx.State.StandingInTown)); standingAnim = new Animation(new Sprite(charAtlas), 1.0f / 13); charAtlas = TextureAtlas.Load(mpq, PlayerGfx.GetAnimPath( PlayerGfx.Class.Warrior, PlayerGfx.Armor.Light, PlayerGfx.Weapon.MaceShield, PlayerGfx.State.WalkingInTown)); walkingAnim = new Animation(new Sprite(charAtlas), 1.0f / 13); player = new Creature { Position = new CoordF(75.5f, 68.5f), CurrentAnimation = standingAnim }; isoView.Level.Creatures.PushBack(player); isoView.Level.Map.PlaceCreature(player); }
public static Level Load(MPQArchive mpq) { var palette = new byte[768]; using (var f = mpq.Open("levels/towndata/town.pal")) { var len = f.Read(palette, 0, 768); Debug.Assert(len == palette.Length); } byte[] solData; using (var f = mpq.Open("levels/towndata/town.sol")) { solData = new byte[f.Length]; var len = f.Read(solData, 0, (int)f.Length); Debug.Assert(len == f.Length); } var celFile = CELFile.Load(mpq, "levels/towndata/town.cel"); var minFile = MINFile.Load(mpq, "levels/towndata/town.min"); var tilFile = TILFile.Load(mpq, "levels/towndata/town.til"); var dunNames = new string[] { "levels/towndata/sector1s.dun", "levels/towndata/sector2s.dun", "levels/towndata/sector3s.dun", "levels/towndata/sector4s.dun" }; var sectors = new SectorTemplate[4]; for (int i = 0; i < dunNames.Length; ++i) { var dunFile = DUNFile.Load(mpq, dunNames[i]); sectors[i] = new SectorTemplate(dunFile, tilFile, solData); } int mapWidth = sectors[0].Width + sectors[3].Width; int mapHeight = sectors[0].Height + sectors[3].Height; var map = new Map(mapWidth, mapHeight); map.PlaceSector(sectors[3], 0, 0); map.PlaceSector(sectors[2], 0, sectors[3].Height); map.PlaceSector(sectors[1], sectors[3].Width, 0); map.PlaceSector(sectors[0], sectors[3].Width, sectors[3].Height); var packer = new TextureAtlasPacker(2048); for (int i = 0; i < celFile.NumFrames; ++i) { var frame = celFile.GetFrame(i, palette); int rectId = packer.Insert(frame.Data, frame.Width, frame.Height, true); if (rectId < 0) { throw new Exception("atlas is full: " + i); } } var atlas = packer.CreateAtlas(); return(new Level { Map = map, Tileset = atlas, PillarDefs = minFile }); }