1
0
mirror of https://github.com/openeggbert/BlupiEdit synced 2024-12-30 10:55:35 +01:00

Added default level file, completed level selection dialog

This commit is contained in:
MainMemory 2014-01-30 17:31:06 -06:00
parent c0720e4bdc
commit 36b254bc46
8 changed files with 709 additions and 505 deletions

View File

@ -68,11 +68,13 @@
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<None Include="Resources\DefaultLevel.blp" />
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>

View File

@ -7,450 +7,445 @@ using System.Text;
namespace BlupiEdit
{
public class LevelItem
{
public ItemTypes Type { get; set; }
[DisplayName("A to B time")]
public ushort ABTime { get; set; }
[DisplayName("A to B speed")]
public int ABSpeed
{
get
{
return (int)Math.Round(LevelData.Distance(PointA, PointB) / ABTime);
}
set
{
ABTime = (ushort)Math.Round(LevelData.Distance(PointA, PointB) / value);
}
}
[DisplayName("B to A time")]
public ushort BATime { get; set; }
[DisplayName("B to A speed")]
public int BASpeed
{
get
{
return (int)Math.Round(LevelData.Distance(PointB, PointA) / BATime);
}
set
{
BATime = (ushort)Math.Round(LevelData.Distance(PointB, PointA) / value);
}
}
[DisplayName("A Wait")]
public ushort AWait { get; set; }
[DisplayName("B Wait")]
public ushort BWait { get; set; }
public ushort field_A { get; set; }
[DisplayName("Point A")]
public Point PointA { get; set; }
[DisplayName("Point B")]
public Point PointB { get; set; }
[DisplayName("Point C?")]
public Point PointC { get; set; }
public ushort field_24 { get; set; }
public ushort field_26 { get; set; }
public ushort field_28 { get; set; }
[DisplayName("Art File")]
public TileTypes ArtFile { get; set; }
public ushort Tile { get; set; }
public ushort field_2E { get; set; }
public class LevelItem
{
public ItemTypes Type { get; set; }
[DisplayName("A to B time")]
public ushort ABTime { get; set; }
[DisplayName("A to B speed")]
public int ABSpeed
{
get
{
return (int)Math.Round(LevelData.Distance(PointA, PointB) / ABTime);
}
set
{
ABTime = (ushort)Math.Round(LevelData.Distance(PointA, PointB) / value);
}
}
[DisplayName("B to A time")]
public ushort BATime { get; set; }
[DisplayName("B to A speed")]
public int BASpeed
{
get
{
return (int)Math.Round(LevelData.Distance(PointB, PointA) / BATime);
}
set
{
BATime = (ushort)Math.Round(LevelData.Distance(PointB, PointA) / value);
}
}
[DisplayName("A Wait")]
public ushort AWait { get; set; }
[DisplayName("B Wait")]
public ushort BWait { get; set; }
public ushort field_A { get; set; }
[DisplayName("Point A")]
public Point PointA { get; set; }
[DisplayName("Point B")]
public Point PointB { get; set; }
[DisplayName("Point C?")]
public Point PointC { get; set; }
public ushort field_24 { get; set; }
public ushort field_26 { get; set; }
public ushort field_28 { get; set; }
[DisplayName("Art File")]
public TileTypes ArtFile { get; set; }
public ushort Tile { get; set; }
public ushort field_2E { get; set; }
public LevelItem(BinaryReader reader)
{
Type = (ItemTypes)reader.ReadUInt16();
ABTime = reader.ReadUInt16();
BATime = reader.ReadUInt16();
AWait = reader.ReadUInt16();
BWait = reader.ReadUInt16();
field_A = reader.ReadUInt16();
PointA = new Point(reader.ReadInt32(), reader.ReadInt32());
PointB = new Point(reader.ReadInt32(), reader.ReadInt32());
PointC = new Point(reader.ReadInt32(), reader.ReadInt32());
field_24 = reader.ReadUInt16();
field_26 = reader.ReadUInt16();
field_28 = reader.ReadUInt16();
ArtFile = (TileTypes)reader.ReadUInt16();
Tile = reader.ReadUInt16();
field_2E = reader.ReadUInt16();
}
public LevelItem(BinaryReader reader)
{
Type = (ItemTypes)reader.ReadUInt16();
ABTime = reader.ReadUInt16();
BATime = reader.ReadUInt16();
AWait = reader.ReadUInt16();
BWait = reader.ReadUInt16();
field_A = reader.ReadUInt16();
PointA = new Point(reader.ReadInt32(), reader.ReadInt32());
PointB = new Point(reader.ReadInt32(), reader.ReadInt32());
PointC = new Point(reader.ReadInt32(), reader.ReadInt32());
field_24 = reader.ReadUInt16();
field_26 = reader.ReadUInt16();
field_28 = reader.ReadUInt16();
ArtFile = (TileTypes)reader.ReadUInt16();
Tile = reader.ReadUInt16();
field_2E = reader.ReadUInt16();
}
public void Write(BinaryWriter writer)
{
writer.Write((ushort)Type);
writer.Write(ABTime);
writer.Write(BATime);
writer.Write(AWait);
writer.Write(BWait);
writer.Write(field_A);
writer.Write(PointA.X); writer.Write(PointA.Y);
writer.Write(PointB.X); writer.Write(PointB.Y);
writer.Write(PointC.X); writer.Write(PointC.Y);
writer.Write(field_24);
writer.Write(field_26);
writer.Write(field_28);
writer.Write((ushort)ArtFile);
writer.Write(Tile);
writer.Write(field_2E);
}
}
public void Write(BinaryWriter writer)
{
writer.Write((ushort)Type);
writer.Write(ABTime);
writer.Write(BATime);
writer.Write(AWait);
writer.Write(BWait);
writer.Write(field_A);
writer.Write(PointA.X); writer.Write(PointA.Y);
writer.Write(PointB.X); writer.Write(PointB.Y);
writer.Write(PointC.X); writer.Write(PointC.Y);
writer.Write(field_24);
writer.Write(field_26);
writer.Write(field_28);
writer.Write((ushort)ArtFile);
writer.Write(Tile);
writer.Write(field_2E);
}
}
public class TileInfo
{
public Rectangle Location { get; set; }
public Point Offset { get; set; }
public class TileInfo
{
public Rectangle Location { get; set; }
public Point Offset { get; set; }
public TileInfo(BinaryReader reader)
{
Point loc = new Point(reader.ReadInt16(), reader.ReadInt16());
Offset = new Point(reader.ReadInt16(), reader.ReadInt16());
Location = new Rectangle(loc, new Size(reader.ReadInt16(), reader.ReadInt16()));
}
public TileInfo(BinaryReader reader)
{
Point loc = new Point(reader.ReadInt16(), reader.ReadInt16());
Offset = new Point(reader.ReadInt16(), reader.ReadInt16());
Location = new Rectangle(loc, new Size(reader.ReadInt16(), reader.ReadInt16()));
}
public static TileInfo[] Read(Stream stream)
{
BinaryReader reader = new BinaryReader(stream);
TileInfo[] result = new TileInfo[reader.ReadInt16()];
for (int i = 0; i < result.Length; i++)
result[i] = new TileInfo(reader);
return result;
}
}
public static TileInfo[] Read(Stream stream)
{
BinaryReader reader = new BinaryReader(stream);
TileInfo[] result = new TileInfo[reader.ReadInt16()];
for (int i = 0; i < result.Length; i++)
result[i] = new TileInfo(reader);
return result;
}
}
public class LevelData
{
#region Instance Members
public byte MajorVersion { get; set; }
public byte MinorVersion { get; set; }
public bool HorizontalScroll { get; set; }
public bool VerticalScroll { get; set; }
public short Music { get; set; }
public short Background { get; set; }
public Point[] StartPositions { get; private set; }
public bool[] StartDirections { get; private set; }
public string LevelName { get; set; }
public short[,] Tiles { get; private set; }
public short[,] Tiles2 { get; private set; }
public List<LevelItem> Items { get; private set; }
public class LevelData
{
#region Instance Members
public byte MajorVersion { get; set; }
public byte MinorVersion { get; set; }
public bool HorizontalScroll { get; set; }
public bool VerticalScroll { get; set; }
public short Music { get; set; }
public short Background { get; set; }
public Point[] StartPositions { get; private set; }
public bool[] StartDirections { get; private set; }
public string LevelName { get; set; }
public short[,] Tiles { get; private set; }
public short[,] Tiles2 { get; private set; }
public List<LevelItem> Items { get; private set; }
public LevelData(string filename)
{
using (FileStream fs = File.OpenRead(filename))
using (BinaryReader reader = new BinaryReader(fs, Encoding.ASCII))
{
MajorVersion = reader.ReadByte();
MinorVersion = reader.ReadByte();
fs.Seek(0xD4, SeekOrigin.Begin);
HorizontalScroll = reader.ReadInt32() == 100;
VerticalScroll = reader.ReadInt32() == 100;
fs.Seek(2, SeekOrigin.Current);
Music = reader.ReadInt16();
Background = reader.ReadInt16();
fs.Seek(0x148, SeekOrigin.Begin);
StartPositions = new Point[4];
for (int i = 0; i < 4; i++)
StartPositions[i] = new Point(reader.ReadInt32(), reader.ReadInt32());
StartDirections = new bool[4];
for (int i = 0; i < 4; i++)
StartDirections[i] = reader.ReadInt32() != 0;
LevelName = reader.ReadString(40);
fs.Seek(0x364, SeekOrigin.Begin);
Tiles = new short[100, 100];
for (int x = 0; x < 100; x++)
for (int y = 0; y < 100; y++)
Tiles[x, y] = reader.ReadInt16();
Tiles2 = new short[100, 100];
for (int x = 0; x < 100; x++)
for (int y = 0; y < 100; y++)
Tiles2[x, y] = reader.ReadInt16();
Items = new List<LevelItem>();
for (int i = 0; i < 200; i++)
{
LevelItem item = new LevelItem(reader);
if (item.Type != ItemTypes.None)
Items.Add(item);
}
}
}
public LevelData()
{
public void Save(string filename)
{
using (FileStream fs = File.Create(filename))
using (BinaryWriter writer = new BinaryWriter(fs))
{
writer.Write(MajorVersion);
writer.Write(MinorVersion);
writer.Seek(0xD4, SeekOrigin.Begin);
writer.Write(HorizontalScroll ? 100 : 0);
writer.Write(VerticalScroll ? 100 : 0);
writer.Seek(2, SeekOrigin.Current);
writer.Write(Music);
writer.Write(Background);
fs.Seek(0x148, SeekOrigin.Begin);
for (int i = 0; i < 4; i++)
{
writer.Write(StartPositions[i].X);
writer.Write(StartPositions[i].Y);
}
for (int i = 0; i < 4; i++)
writer.Write(StartDirections[i] ? 1 : 0);
writer.WriteString(LevelName, 40);
fs.Seek(0x364, SeekOrigin.Begin);
for (int x = 0; x < 100; x++)
for (int y = 0; y < 100; y++)
writer.Write(Tiles[x, y]);
for (int x = 0; x < 100; x++)
for (int y = 0; y < 100; y++)
writer.Write(Tiles2[x, y]);
for (int i = 0; i < Items.Count; i++)
Items[i].Write(writer);
if (Items.Count < 200)
writer.Write(new byte[0x30 * (200 - Items.Count)]);
}
}
#endregion
#region Static Members
public const int LevelSize = 100;
public const int GridSize = 64;
public const int PixelSize = LevelSize * GridSize;
public static bool IsBlupi2 { get; private set; }
public static string CurrentLevelPath { get; private set; }
public static LevelData CurrentLevel { get; private set; }
public static TileInfo[] BlupiTiles { get; private set; }
public static TileInfo[] ObjectTiles { get; private set; }
public static TileInfo[] ElementTiles { get; private set; }
public static TileInfo[] ExploTiles { get; private set; }
public static Dictionary<TileTypes, Sprite[]> TileImages { get; private set; }
}
public static void LoadGame(string filename)
{
IsBlupi2 = true;
Environment.CurrentDirectory = Path.GetDirectoryName(Path.GetFullPath(filename));
using (FileStream fs = File.OpenRead(filename))
{
if (IsBlupi2)
{
fs.Seek(0x862F0, SeekOrigin.Begin);
BlupiTiles = TileInfo.Read(fs);
fs.Seek(0x872B8, SeekOrigin.Begin);
ObjectTiles = TileInfo.Read(fs);
fs.Seek(0x88768, SeekOrigin.Begin);
ElementTiles = TileInfo.Read(fs);
fs.Seek(0x894F8, SeekOrigin.Begin);
ExploTiles = TileInfo.Read(fs);
}
TileImages = new Dictionary<TileTypes, Sprite[]>();
List<Sprite> tmp = new List<Sprite>(BlupiTiles.Length);
using (Bitmap bmp = new Bitmap(@"IMAGE08\blupi000.blp"))
{
bmp.MakeTransparent(Color.Blue);
foreach (TileInfo item in BlupiTiles)
tmp.Add(new Sprite(bmp.Clone(item.Location, bmp.PixelFormat), item.Offset));
}
TileImages.Add(TileTypes.Blupi000, tmp.ToArray());
tmp = new List<Sprite>(BlupiTiles.Length);
using (Bitmap bmp = new Bitmap(@"IMAGE08\blupi001.blp"))
{
bmp.MakeTransparent(Color.Blue);
foreach (TileInfo item in BlupiTiles)
tmp.Add(new Sprite(bmp.Clone(item.Location, bmp.PixelFormat), item.Offset));
}
TileImages.Add(TileTypes.Blupi001, tmp.ToArray());
tmp = new List<Sprite>(BlupiTiles.Length);
using (Bitmap bmp = new Bitmap(@"IMAGE08\blupi002.blp"))
{
bmp.MakeTransparent(Color.Blue);
foreach (TileInfo item in BlupiTiles)
tmp.Add(new Sprite(bmp.Clone(item.Location, bmp.PixelFormat), item.Offset));
}
TileImages.Add(TileTypes.Blupi002, tmp.ToArray());
tmp = new List<Sprite>(BlupiTiles.Length);
using (Bitmap bmp = new Bitmap(@"IMAGE08\blupi003.blp"))
{
bmp.MakeTransparent(Color.Blue);
foreach (TileInfo item in BlupiTiles)
tmp.Add(new Sprite(bmp.Clone(item.Location, bmp.PixelFormat), item.Offset));
}
TileImages.Add(TileTypes.Blupi003, tmp.ToArray());
tmp = new List<Sprite>(ObjectTiles.Length);
using (Bitmap bmp = new Bitmap(@"IMAGE16\object.blp"))
{
bmp.MakeTransparent(Color.Blue);
foreach (TileInfo item in ObjectTiles)
tmp.Add(new Sprite(bmp.Clone(item.Location, bmp.PixelFormat), item.Offset));
}
TileImages.Add(TileTypes.Object, tmp.ToArray());
tmp = new List<Sprite>(ElementTiles.Length);
using (Bitmap bmp = new Bitmap(@"IMAGE16\element.blp"))
{
bmp.MakeTransparent(Color.Blue);
foreach (TileInfo item in ElementTiles)
tmp.Add(new Sprite(bmp.Clone(item.Location, bmp.PixelFormat), item.Offset));
}
TileImages.Add(TileTypes.Element, tmp.ToArray());
tmp = new List<Sprite>(ExploTiles.Length);
using (Bitmap bmp = new Bitmap(@"IMAGE16\explo.blp"))
{
bmp.MakeTransparent(Color.Blue);
foreach (TileInfo item in ExploTiles)
tmp.Add(new Sprite(bmp.Clone(item.Location, bmp.PixelFormat), item.Offset));
}
TileImages.Add(TileTypes.Explo, tmp.ToArray());
}
}
public LevelData(string filename)
{
Stream str;
if (File.Exists(filename))
str = File.OpenRead(filename);
else
str = new MemoryStream(Properties.Resources.DefaultLevel, false);
using (str)
using (BinaryReader reader = new BinaryReader(str))
{
MajorVersion = reader.ReadByte();
MinorVersion = reader.ReadByte();
str.Seek(0xD4, SeekOrigin.Begin);
HorizontalScroll = reader.ReadInt32() == 100;
VerticalScroll = reader.ReadInt32() == 100;
str.Seek(2, SeekOrigin.Current);
Music = reader.ReadInt16();
Background = reader.ReadInt16();
str.Seek(0x148, SeekOrigin.Begin);
StartPositions = new Point[4];
for (int i = 0; i < 4; i++)
StartPositions[i] = new Point(reader.ReadInt32(), reader.ReadInt32());
StartDirections = new bool[4];
for (int i = 0; i < 4; i++)
StartDirections[i] = reader.ReadInt32() != 0;
LevelName = reader.ReadString(40);
str.Seek(0x364, SeekOrigin.Begin);
Tiles = new short[100, 100];
for (int x = 0; x < 100; x++)
for (int y = 0; y < 100; y++)
Tiles[x, y] = reader.ReadInt16();
Tiles2 = new short[100, 100];
for (int x = 0; x < 100; x++)
for (int y = 0; y < 100; y++)
Tiles2[x, y] = reader.ReadInt16();
Items = new List<LevelItem>();
for (int i = 0; i < 200; i++)
{
LevelItem item = new LevelItem(reader);
if (item.Type != ItemTypes.None)
Items.Add(item);
}
}
}
public static void LoadLevel(int userid, int levelnum, bool userlevel)
{
CurrentLevelPath = GetLevelName(userid, levelnum, userlevel);
CurrentLevel = new LevelData(CurrentLevelPath);
}
public void Save(string filename)
{
using (FileStream fs = File.Create(filename))
using (BinaryWriter writer = new BinaryWriter(fs))
{
writer.Write(MajorVersion);
writer.Write(MinorVersion);
writer.Seek(0xD4, SeekOrigin.Begin);
writer.Write(HorizontalScroll ? 100 : 0);
writer.Write(VerticalScroll ? 100 : 0);
writer.Seek(2, SeekOrigin.Current);
writer.Write(Music);
writer.Write(Background);
fs.Seek(0x148, SeekOrigin.Begin);
for (int i = 0; i < 4; i++)
{
writer.Write(StartPositions[i].X);
writer.Write(StartPositions[i].Y);
}
for (int i = 0; i < 4; i++)
writer.Write(StartDirections[i] ? 1 : 0);
writer.WriteString(LevelName, 40);
fs.Seek(0x364, SeekOrigin.Begin);
for (int x = 0; x < 100; x++)
for (int y = 0; y < 100; y++)
writer.Write(Tiles[x, y]);
for (int x = 0; x < 100; x++)
for (int y = 0; y < 100; y++)
writer.Write(Tiles2[x, y]);
for (int i = 0; i < Items.Count; i++)
Items[i].Write(writer);
if (Items.Count < 200)
writer.Write(new byte[0x30 * (200 - Items.Count)]);
}
}
#endregion
#region Static Members
public const int LevelSize = 100;
public const int GridSize = 64;
public const int PixelSize = LevelSize * GridSize;
public static bool IsBlupi2 { get; private set; }
public static string CurrentLevelPath { get; private set; }
public static LevelData CurrentLevel { get; private set; }
public static TileInfo[] BlupiTiles { get; private set; }
public static TileInfo[] ObjectTiles { get; private set; }
public static TileInfo[] ElementTiles { get; private set; }
public static TileInfo[] ExploTiles { get; private set; }
public static Dictionary<TileTypes, Sprite[]> TileImages { get; private set; }
public static string GetLevelName(int userid, int levelnum, bool userlevel)
{
if (userlevel)
return string.Format("data\\u{0:000}-{1:000}.blp", userid, levelnum);
else
return string.Format("data\\world{0:000}.blp", levelnum);
}
public static void LoadGame(string filename)
{
IsBlupi2 = true;
Environment.CurrentDirectory = Path.GetDirectoryName(Path.GetFullPath(filename));
using (FileStream fs = File.OpenRead(filename))
{
if (IsBlupi2)
{
fs.Seek(0x862F0, SeekOrigin.Begin);
BlupiTiles = TileInfo.Read(fs);
fs.Seek(0x872B8, SeekOrigin.Begin);
ObjectTiles = TileInfo.Read(fs);
fs.Seek(0x88768, SeekOrigin.Begin);
ElementTiles = TileInfo.Read(fs);
fs.Seek(0x894F8, SeekOrigin.Begin);
ExploTiles = TileInfo.Read(fs);
}
TileImages = new Dictionary<TileTypes, Sprite[]>();
List<Sprite> tmp = new List<Sprite>(BlupiTiles.Length);
using (Bitmap bmp = LoadImage("blupi000"))
foreach (TileInfo item in BlupiTiles)
tmp.Add(new Sprite(bmp.Clone(item.Location, bmp.PixelFormat), item.Offset));
TileImages.Add(TileTypes.Blupi000, tmp.ToArray());
tmp = new List<Sprite>(BlupiTiles.Length);
using (Bitmap bmp = LoadImage("blupi001"))
foreach (TileInfo item in BlupiTiles)
tmp.Add(new Sprite(bmp.Clone(item.Location, bmp.PixelFormat), item.Offset));
TileImages.Add(TileTypes.Blupi001, tmp.ToArray());
tmp = new List<Sprite>(BlupiTiles.Length);
using (Bitmap bmp = LoadImage("blupi002"))
foreach (TileInfo item in BlupiTiles)
tmp.Add(new Sprite(bmp.Clone(item.Location, bmp.PixelFormat), item.Offset));
TileImages.Add(TileTypes.Blupi002, tmp.ToArray());
tmp = new List<Sprite>(BlupiTiles.Length);
using (Bitmap bmp = LoadImage("blupi003"))
foreach (TileInfo item in BlupiTiles)
tmp.Add(new Sprite(bmp.Clone(item.Location, bmp.PixelFormat), item.Offset));
TileImages.Add(TileTypes.Blupi003, tmp.ToArray());
tmp = new List<Sprite>(ObjectTiles.Length);
using (Bitmap bmp = LoadImage("object"))
foreach (TileInfo item in ObjectTiles)
tmp.Add(new Sprite(bmp.Clone(item.Location, bmp.PixelFormat), item.Offset));
TileImages.Add(TileTypes.Object, tmp.ToArray());
tmp = new List<Sprite>(ElementTiles.Length);
using (Bitmap bmp = LoadImage("element"))
foreach (TileInfo item in ElementTiles)
tmp.Add(new Sprite(bmp.Clone(item.Location, bmp.PixelFormat), item.Offset));
TileImages.Add(TileTypes.Element, tmp.ToArray());
tmp = new List<Sprite>(ExploTiles.Length);
using (Bitmap bmp = LoadImage("explo"))
foreach (TileInfo item in ExploTiles)
tmp.Add(new Sprite(bmp.Clone(item.Location, bmp.PixelFormat), item.Offset));
TileImages.Add(TileTypes.Explo, tmp.ToArray());
}
}
public static void SaveLevel()
{
CurrentLevel.Save(CurrentLevelPath);
}
public static void LoadLevel(int userid, int levelnum)
{
CurrentLevelPath = GetLevelName(userid, levelnum);
CurrentLevel = new LevelData(CurrentLevelPath);
}
public static double Distance(Point p1, Point p2)
{
return Math.Sqrt(Math.Pow(p2.X - p1.X, 2) + Math.Pow(p2.Y - p1.Y, 2));
}
public static string GetLevelName(int userid, int levelnum)
{
if (userid != 0)
return string.Format("data\\u{0:000}-{1:000}.blp", userid, levelnum);
else
return string.Format("data\\world{0:000}.blp", levelnum);
}
public static Bitmap LoadImage(string filename)
{
if (File.Exists(string.Format(@"IMAGE16\{0}.blp", filename)))
return new Bitmap(string.Format(@"IMAGE16\{0}.blp", filename));
else
return new Bitmap(string.Format(@"IMAGE08\{0}.blp", filename));
}
#endregion
}
public static void SaveLevel()
{
CurrentLevel.Save(CurrentLevelPath);
}
public enum ItemTypes : ushort
{
None = 0,
Lift = 1,
Bomb = 2,
HangingBomb = 3,
Bulldozer = 4,
TreasureChest = 5,
Egg = 6,
Goal = 7,
Explosion1 = 8,
Explosion2 = 9,
Explosion3 = 10,
Explosion4 = 11,
WoodenCase = 12,
Helicopter = 13,
Splash = 14,
Bubbles = 15,
MovingBomb = 16,
Fish = 17,
Jeep = 19,
Bird = 20,
Key = 21,
Skateboard = 24,
Shield = 25,
Lollypop = 26,
Sparkles = 27,
GlueTank = 28,
GlueSupply = 29,
InvisibilityPotion = 30,
RechargingDevice = 31,
HeliportedEnemy = 32,
MotorizedEnemy = 33,
StuckEnemy = 34,
Inverter = 40,
Wasp = 44,
Hovercraft = 46,
LiftWithConveyerBelt = 47,
RedKey = 49,
GreenKey = 50,
BlueKey = 51,
SlimeCreature = 54,
Dynamite = 55,
HomingBomb = 96,
YellowBomb = 200,
OrangeBomb = 201,
BlueBomb = 202,
GreenBomb = 203,
}
public static double Distance(Point p1, Point p2)
{
return Math.Sqrt(Math.Pow(p2.X - p1.X, 2) + Math.Pow(p2.Y - p1.Y, 2));
}
public enum TileTypes : ushort
{
None = 0,
Object = 1,
Blupi000 = 2,
Explo = 9,
Element = 10,
Blupi001 = 11,
Blupi002 = 12,
Blupi003 = 13,
}
public static Bitmap LoadImage(string filename)
{
Bitmap bmp;
if (File.Exists(string.Format(@"IMAGE16\{0}.blp", filename)))
bmp = new Bitmap(string.Format(@"IMAGE16\{0}.blp", filename));
else
bmp = new Bitmap(string.Format(@"IMAGE08\{0}.blp", filename));
bmp.MakeTransparent(Color.Blue);
return bmp;
}
public struct Sprite
{
public Point Offset;
public Bitmap Image;
public int X { get { return Offset.X; } set { Offset.X = value; } }
public int Y { get { return Offset.Y; } set { Offset.Y = value; } }
public int Width { get { return Image.Width; } }
public int Height { get { return Image.Height; } }
public Size Size { get { return Image.Size; } }
public int Left { get { return X; } }
public int Top { get { return Y; } }
public int Right { get { return X + Width; } }
public int Bottom { get { return Y + Height; } }
public Rectangle Bounds { get { return new Rectangle(Offset, Size); } }
static readonly Encoding encoding = Encoding.GetEncoding(1252);
public static Encoding Encoding { get { return encoding; } }
#endregion
}
public Sprite(Bitmap spr, Point off)
{
Image = spr;
Offset = off;
}
public enum ItemTypes : ushort
{
None = 0,
Lift = 1,
Bomb = 2,
HangingBomb = 3,
Bulldozer = 4,
TreasureChest = 5,
Egg = 6,
Goal = 7,
Explosion1 = 8,
Explosion2 = 9,
Explosion3 = 10,
Explosion4 = 11,
WoodenCase = 12,
Helicopter = 13,
Splash = 14,
Bubbles = 15,
MovingBomb = 16,
Fish = 17,
Jeep = 19,
Bird = 20,
Key = 21,
Skateboard = 24,
Shield = 25,
Lollypop = 26,
Sparkles = 27,
GlueTank = 28,
GlueSupply = 29,
InvisibilityPotion = 30,
RechargingDevice = 31,
HeliportedEnemy = 32,
MotorizedEnemy = 33,
StuckEnemy = 34,
Inverter = 40,
Wasp = 44,
Hovercraft = 46,
LiftWithConveyerBelt = 47,
RedKey = 49,
GreenKey = 50,
BlueKey = 51,
SlimeCreature = 54,
Dynamite = 55,
HomingBomb = 96,
YellowBomb = 200,
OrangeBomb = 201,
BlueBomb = 202,
GreenBomb = 203,
}
public Sprite(Sprite sprite)
{
Image = (Bitmap)sprite.Image.Clone();
Offset = sprite.Offset;
}
}
public enum TileTypes : ushort
{
None = 0,
Object = 1,
Blupi000 = 2,
Explo = 9,
Element = 10,
Blupi001 = 11,
Blupi002 = 12,
Blupi003 = 13,
}
public static class Extensions
{
/// <summary>
/// Reads a null-terminated ASCII string from the current stream and advances the position by <paramref name="length"/> bytes.
/// </summary>
/// <param name="length">The maximum length of the string, in bytes.</param>
public static string ReadString(this BinaryReader br, int length)
{
byte[] buffer = br.ReadBytes(length);
for (int i = 0; i < length; i++)
if (buffer[i] == 0)
return Encoding.ASCII.GetString(buffer, 0, i);
return Encoding.ASCII.GetString(buffer);
}
public struct Sprite
{
public Point Offset;
public Bitmap Image;
public int X { get { return Offset.X; } set { Offset.X = value; } }
public int Y { get { return Offset.Y; } set { Offset.Y = value; } }
public int Width { get { return Image.Width; } }
public int Height { get { return Image.Height; } }
public Size Size { get { return Image.Size; } }
public int Left { get { return X; } }
public int Top { get { return Y; } }
public int Right { get { return X + Width; } }
public int Bottom { get { return Y + Height; } }
public Rectangle Bounds { get { return new Rectangle(Offset, Size); } }
public static void WriteString(this BinaryWriter bw, string value, int length)
{
if (value.Length > length)
value = value.Substring(0, length);
bw.Write(Encoding.ASCII.GetBytes(value));
if (length > value.Length)
bw.Write(new byte[length - value.Length]);
}
public Sprite(Bitmap spr, Point off)
{
Image = spr;
Offset = off;
}
public static void DrawSprite(this Graphics gfx, Sprite spr, Point point)
{
gfx.DrawImage(spr.Image, point.X + spr.Offset.X, point.Y + spr.Offset.Y, spr.Width, spr.Height);
}
}
public Sprite(Sprite sprite)
{
Image = (Bitmap)sprite.Image.Clone();
Offset = sprite.Offset;
}
}
public static class Extensions
{
/// <summary>
/// Reads a null-terminated cp1252 string from the current stream and advances the position by <paramref name="length"/> bytes.
/// </summary>
/// <param name="length">The maximum length of the string, in bytes.</param>
public static string ReadString(this BinaryReader br, int length)
{
byte[] buffer = br.ReadBytes(length);
for (int i = 0; i < length; i++)
if (buffer[i] == 0)
return LevelData.Encoding.GetString(buffer, 0, i);
return LevelData.Encoding.GetString(buffer);
}
public static void WriteString(this BinaryWriter bw, string value, int length)
{
if (value.Length > length)
value = value.Substring(0, length);
bw.Write(LevelData.Encoding.GetBytes(value));
if (length > value.Length)
bw.Write(new byte[length - value.Length]);
}
public static void DrawSprite(this Graphics gfx, Sprite spr, Point point)
{
gfx.DrawImage(spr.Image, point.X + spr.Offset.X, point.Y + spr.Offset.Y, spr.Width, spr.Height);
}
}
}

View File

@ -28,22 +28,124 @@
/// </summary>
private void InitializeComponent()
{
this.SuspendLayout();
//
// LevelSelectForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(284, 262);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "LevelSelectForm";
this.Text = "LevelSelectForm";
this.ResumeLayout(false);
this.levelSetList = new System.Windows.Forms.ListBox();
this.levelList = new System.Windows.Forms.ListBox();
this.cancelButton = new System.Windows.Forms.Button();
this.openButton = new System.Windows.Forms.Button();
this.numericUpDown1 = new System.Windows.Forms.NumericUpDown();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// levelSetList
//
this.levelSetList.Items.AddRange(new object[] {
"Worlds"});
this.levelSetList.Location = new System.Drawing.Point(12, 12);
this.levelSetList.Name = "levelSetList";
this.levelSetList.Size = new System.Drawing.Size(120, 121);
this.levelSetList.TabIndex = 0;
this.levelSetList.SelectedIndexChanged += new System.EventHandler(this.levelSetList_SelectedIndexChanged);
//
// levelList
//
this.levelList.FormattingEnabled = true;
this.levelList.Location = new System.Drawing.Point(138, 12);
this.levelList.Name = "levelList";
this.levelList.Size = new System.Drawing.Size(152, 173);
this.levelList.TabIndex = 1;
this.levelList.SelectedIndexChanged += new System.EventHandler(this.levelList_SelectedIndexChanged);
//
// cancelButton
//
this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.cancelButton.Location = new System.Drawing.Point(215, 227);
this.cancelButton.Name = "cancelButton";
this.cancelButton.Size = new System.Drawing.Size(75, 23);
this.cancelButton.TabIndex = 2;
this.cancelButton.Text = "&Cancel";
this.cancelButton.UseVisualStyleBackColor = true;
//
// openButton
//
this.openButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.openButton.DialogResult = System.Windows.Forms.DialogResult.OK;
this.openButton.Location = new System.Drawing.Point(134, 227);
this.openButton.Name = "openButton";
this.openButton.Size = new System.Drawing.Size(75, 23);
this.openButton.TabIndex = 3;
this.openButton.Text = "&Open";
this.openButton.UseVisualStyleBackColor = true;
//
// numericUpDown1
//
this.numericUpDown1.Location = new System.Drawing.Point(138, 192);
this.numericUpDown1.Maximum = new decimal(new int[] {
399,
0,
0,
0});
this.numericUpDown1.Minimum = new decimal(new int[] {
1,
0,
0,
0});
this.numericUpDown1.Name = "numericUpDown1";
this.numericUpDown1.Size = new System.Drawing.Size(120, 20);
this.numericUpDown1.TabIndex = 5;
this.numericUpDown1.Value = new decimal(new int[] {
1,
0,
0,
0});
this.numericUpDown1.ValueChanged += new System.EventHandler(this.numericUpDown1_ValueChanged);
//
// pictureBox1
//
this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.pictureBox1.Location = new System.Drawing.Point(296, 12);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(238, 238);
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pictureBox1.TabIndex = 6;
this.pictureBox1.TabStop = false;
//
// LevelSelectForm
//
this.AcceptButton = this.openButton;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.cancelButton;
this.ClientSize = new System.Drawing.Size(546, 262);
this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.numericUpDown1);
this.Controls.Add(this.openButton);
this.Controls.Add(this.cancelButton);
this.Controls.Add(this.levelList);
this.Controls.Add(this.levelSetList);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "LevelSelectForm";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.Text = "Select a level...";
this.Load += new System.EventHandler(this.LevelSelectForm_Load);
((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.ListBox levelSetList;
private System.Windows.Forms.ListBox levelList;
private System.Windows.Forms.Button cancelButton;
private System.Windows.Forms.Button openButton;
private System.Windows.Forms.NumericUpDown numericUpDown1;
private System.Windows.Forms.PictureBox pictureBox1;
}
}

View File

@ -5,14 +5,109 @@ using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Drawing.Drawing2D;
namespace BlupiEdit
{
public partial class LevelSelectForm : Form
{
public LevelSelectForm()
{
InitializeComponent();
}
}
}
public partial class LevelSelectForm : Form
{
public LevelSelectForm()
{
InitializeComponent();
}
List<int> users = new List<int>(8) { 0 };
List<int> levels;
private void LevelSelectForm_Load(object sender, EventArgs e)
{
levelSetList.BeginUpdate();
for (int i = 1; i < 9; i++)
if (File.Exists(string.Format("data\\info{0:000}.blp", i)))
{
users.Add(i);
using (FileStream str = File.OpenRead(string.Format("data\\info{0:000}.blp", i)))
using (BinaryReader r = new BinaryReader(str))
{
str.Seek(0x16, SeekOrigin.Begin);
levelSetList.Items.Add("User " + i + " - " + r.ReadString(40));
}
}
levelSetList.EndUpdate();
levelSetList.SelectedIndex = 0;
}
private void levelSetList_SelectedIndexChanged(object sender, EventArgs e)
{
int max = levelSetList.SelectedIndex == 0 ? 399 : 20;
numericUpDown1.Maximum = max;
levels = new List<int>();
levelList.BeginUpdate();
levelList.Items.Clear();
for (int i = 1; i <= max; i++)
{
string s = LevelData.GetLevelName(users[levelSetList.SelectedIndex], i);
if (File.Exists(s))
{
levels.Add(i);
using (FileStream str = File.OpenRead(s))
using (BinaryReader r = new BinaryReader(str))
{
str.Seek(0x178, SeekOrigin.Begin);
string n = r.ReadString(40);
levelList.Items.Add("#" + i + (string.IsNullOrEmpty(n) ? "" : " - " + n));
}
}
}
levelList.EndUpdate();
}
private void levelList_SelectedIndexChanged(object sender, EventArgs e)
{
if (levelList.SelectedIndex == -1)
pictureBox1.Image = null;
else
{
int imgsize = LevelData.GridSize * 8;
Bitmap bmp = new Bitmap(imgsize, imgsize);
Graphics gfx = Graphics.FromImage(bmp);
gfx.CompositingQuality = CompositingQuality.HighSpeed;
gfx.InterpolationMode = InterpolationMode.NearestNeighbor;
gfx.PixelOffsetMode = PixelOffsetMode.None;
gfx.SmoothingMode = SmoothingMode.None;
LevelData level = new LevelData(LevelData.GetLevelName(users[levelSetList.SelectedIndex], levels[levelList.SelectedIndex]));
int startx = level.HorizontalScroll ? Math.Max(Math.Min(level.StartPositions[0].X - (imgsize / 2), LevelData.PixelSize - imgsize), 0) : 0;
int starty = level.VerticalScroll ? Math.Max(Math.Min(level.StartPositions[0].Y - (imgsize / 2), LevelData.PixelSize - imgsize), 0) : 0;
using (Bitmap bg = LevelData.LoadImage(string.Format("decor{0:000}", level.Background)))
for (int x = -startx / 2; x < bmp.Width; x += 640)
for (int y = -starty / 2; y < bmp.Height; y += 480)
gfx.DrawImage(bg, x, y, bg.Width, bg.Height);
gfx.DrawSprite(LevelData.TileImages[TileTypes.Blupi000][level.StartDirections[0] ? 0 : 1],
level.StartPositions[0] - new Size(startx, starty));
foreach (LevelItem item in level.Items)
gfx.DrawSprite(LevelData.TileImages[item.ArtFile][item.Tile],
item.PointA - new Size(startx, starty));
for (int y = Math.Max(starty / LevelData.GridSize, 0); y < Math.Min((starty + imgsize), LevelData.PixelSize) / LevelData.GridSize; y++)
for (int x = Math.Max(startx / LevelData.GridSize, 0); x < Math.Min((startx + imgsize), LevelData.PixelSize) / LevelData.GridSize; x++)
if (level.Tiles[x, y] != -1)
gfx.DrawSprite(LevelData.TileImages[TileTypes.Object][level.Tiles[x, y]],
new Point(x * LevelData.GridSize - startx, y * LevelData.GridSize - starty));
pictureBox1.Image = bmp;
numericUpDown1.Value = levels[levelList.SelectedIndex];
}
}
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
if ((levelList.SelectedIndex = levels.IndexOf((int)numericUpDown1.Value)) == -1)
openButton.Text = "&New";
else
openButton.Text = "&Open";
}
public int UserID { get { return users[levelSetList.SelectedIndex]; } }
public int LevelNum { get { return (int)numericUpDown1.Value; } }
}
}

View File

@ -9,43 +9,47 @@ using System.IO;
namespace BlupiEdit
{
public partial class MainForm : Form
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
if (Program.Arguments.Length > 0)
LoadGame(Program.Arguments[0]);
}
private void MainForm_Load(object sender, EventArgs e)
{
if (Program.Arguments.Length > 0)
LoadGame(Program.Arguments[0]);
}
private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
{
private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
{
}
}
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
using (OpenFileDialog fd = new OpenFileDialog() { DefaultExt = "exe", Filter = "EXE Files|*.exe", RestoreDirectory = true })
if (fd.ShowDialog(this) == DialogResult.OK)
LoadGame(fd.FileName);
}
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
using (OpenFileDialog fd = new OpenFileDialog() { DefaultExt = "exe", Filter = "EXE Files|*.exe", RestoreDirectory = true })
if (fd.ShowDialog(this) == DialogResult.OK)
LoadGame(fd.FileName);
}
private void LoadGame(string filename)
{
LevelData.LoadGame(filename);
changeLevelToolStripMenuItem.Enabled = true;
}
private void LoadGame(string filename)
{
LevelData.LoadGame(filename);
changeLevelToolStripMenuItem.Enabled = true;
}
private void changeLevelToolStripMenuItem_Click(object sender, EventArgs e)
{
using (LevelSelectForm ls = new LevelSelectForm())
ls.ShowDialog(this);
}
}
private void changeLevelToolStripMenuItem_Click(object sender, EventArgs e)
{
using (LevelSelectForm ls = new LevelSelectForm())
if (ls.ShowDialog(this) == DialogResult.OK)
{
LevelData.LoadLevel(ls.UserID, ls.LevelNum);
// TODO: more stuff
}
}
}
}

View File

@ -1,17 +1,17 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:2.0.50727.5466
// Runtime Version:2.0.50727.5472
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace BlupiEdit.Properties
{
namespace BlupiEdit.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
@ -22,50 +22,49 @@ namespace BlupiEdit.Properties
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BlupiEdit.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set
{
set {
resourceCulture = value;
}
}
internal static byte[] DefaultLevel {
get {
object obj = ResourceManager.GetObject("DefaultLevel", resourceCulture);
return ((byte[])(obj));
}
}
}
}

View File

@ -46,7 +46,7 @@
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
@ -60,6 +60,7 @@
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
@ -68,9 +69,10 @@
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
@ -85,9 +87,10 @@
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
@ -114,4 +117,8 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="DefaultLevel" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\DefaultLevel.blp;System.Byte[], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

Binary file not shown.