1
0
mirror of https://github.com/MainMemory/BlupiEdit.git synced 2025-03-16 18:45:07 +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

@ -134,20 +134,30 @@ namespace BlupiEdit
public short[,] Tiles2 { get; private set; }
public List<LevelItem> Items { get; private set; }
public LevelData()
{
}
public LevelData(string filename)
{
using (FileStream fs = File.OpenRead(filename))
using (BinaryReader reader = new BinaryReader(fs, Encoding.ASCII))
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();
fs.Seek(0xD4, SeekOrigin.Begin);
str.Seek(0xD4, SeekOrigin.Begin);
HorizontalScroll = reader.ReadInt32() == 100;
VerticalScroll = reader.ReadInt32() == 100;
fs.Seek(2, SeekOrigin.Current);
str.Seek(2, SeekOrigin.Current);
Music = reader.ReadInt16();
Background = reader.ReadInt16();
fs.Seek(0x148, SeekOrigin.Begin);
str.Seek(0x148, SeekOrigin.Begin);
StartPositions = new Point[4];
for (int i = 0; i < 4; i++)
StartPositions[i] = new Point(reader.ReadInt32(), reader.ReadInt32());
@ -155,7 +165,7 @@ namespace BlupiEdit
for (int i = 0; i < 4; i++)
StartDirections[i] = reader.ReadInt32() != 0;
LevelName = reader.ReadString(40);
fs.Seek(0x364, SeekOrigin.Begin);
str.Seek(0x364, SeekOrigin.Begin);
Tiles = new short[100, 100];
for (int x = 0; x < 100; x++)
for (int y = 0; y < 100; y++)
@ -242,73 +252,52 @@ namespace BlupiEdit
}
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);
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 = new Bitmap(@"IMAGE08\blupi001.blp"))
{
bmp.MakeTransparent(Color.Blue);
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 = new Bitmap(@"IMAGE08\blupi002.blp"))
{
bmp.MakeTransparent(Color.Blue);
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 = new Bitmap(@"IMAGE08\blupi003.blp"))
{
bmp.MakeTransparent(Color.Blue);
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 = new Bitmap(@"IMAGE16\object.blp"))
{
bmp.MakeTransparent(Color.Blue);
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 = new Bitmap(@"IMAGE16\element.blp"))
{
bmp.MakeTransparent(Color.Blue);
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 = new Bitmap(@"IMAGE16\explo.blp"))
{
bmp.MakeTransparent(Color.Blue);
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 LoadLevel(int userid, int levelnum, bool userlevel)
public static void LoadLevel(int userid, int levelnum)
{
CurrentLevelPath = GetLevelName(userid, levelnum, userlevel);
CurrentLevelPath = GetLevelName(userid, levelnum);
CurrentLevel = new LevelData(CurrentLevelPath);
}
public static string GetLevelName(int userid, int levelnum, bool userlevel)
public static string GetLevelName(int userid, int levelnum)
{
if (userlevel)
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);
@ -326,11 +315,17 @@ namespace BlupiEdit
public static Bitmap LoadImage(string filename)
{
Bitmap bmp;
if (File.Exists(string.Format(@"IMAGE16\{0}.blp", filename)))
return new Bitmap(string.Format(@"IMAGE16\{0}.blp", filename));
bmp = new Bitmap(string.Format(@"IMAGE16\{0}.blp", filename));
else
return new Bitmap(string.Format(@"IMAGE08\{0}.blp", filename));
bmp = new Bitmap(string.Format(@"IMAGE08\{0}.blp", filename));
bmp.MakeTransparent(Color.Blue);
return bmp;
}
static readonly Encoding encoding = Encoding.GetEncoding(1252);
public static Encoding Encoding { get { return encoding; } }
#endregion
}
@ -427,7 +422,7 @@ namespace BlupiEdit
public static class Extensions
{
/// <summary>
/// Reads a null-terminated ASCII string from the current stream and advances the position by <paramref name="length"/> bytes.
/// 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)
@ -435,15 +430,15 @@ namespace BlupiEdit
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);
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(Encoding.ASCII.GetBytes(value));
bw.Write(LevelData.Encoding.GetBytes(value));
if (length > value.Length)
bw.Write(new byte[length - value.Length]);
}

View File

@ -28,22 +28,124 @@
/// </summary>
private void InitializeComponent()
{
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.ClientSize = new System.Drawing.Size(284, 262);
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.Text = "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,6 +5,8 @@ using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Drawing.Drawing2D;
namespace BlupiEdit
{
@ -14,5 +16,98 @@ namespace BlupiEdit
{
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

@ -45,7 +45,11 @@ namespace BlupiEdit
private void changeLevelToolStripMenuItem_Click(object sender, EventArgs e)
{
using (LevelSelectForm ls = new LevelSelectForm())
ls.ShowDialog(this);
if (ls.ShowDialog(this) == DialogResult.OK)
{
LevelData.LoadLevel(ls.UserID, ls.LevelNum);
// TODO: more stuff
}
}
}
}

View File

@ -1,15 +1,15 @@
//------------------------------------------------------------------------------
// <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>
@ -22,28 +22,23 @@ 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;
}
@ -56,16 +51,20 @@ namespace BlupiEdit.Properties
/// 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.