From c0720e4bdcce445e86621a344ad5354f5d8147f9 Mon Sep 17 00:00:00 2001 From: MainMemory Date: Sun, 19 Jan 2014 10:28:57 -0600 Subject: [PATCH] Initial Commit --- .gitattributes | 22 + .gitignore | 215 ++++++++++ BlupiEdit.sln | 20 + BlupiEdit/BlupiEdit.csproj | 90 ++++ BlupiEdit/LevelData.cs | 456 +++++++++++++++++++++ BlupiEdit/LevelSelectForm.Designer.cs | 49 +++ BlupiEdit/LevelSelectForm.cs | 18 + BlupiEdit/LevelSelectForm.resx | 120 ++++++ BlupiEdit/MainForm.Designer.cs | 135 ++++++ BlupiEdit/MainForm.cs | 51 +++ BlupiEdit/MainForm.resx | 123 ++++++ BlupiEdit/Program.cs | 24 ++ BlupiEdit/Properties/AssemblyInfo.cs | 36 ++ BlupiEdit/Properties/Resources.Designer.cs | 71 ++++ BlupiEdit/Properties/Resources.resx | 117 ++++++ BlupiEdit/Properties/Settings.Designer.cs | 30 ++ BlupiEdit/Properties/Settings.settings | 7 + 17 files changed, 1584 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 BlupiEdit.sln create mode 100644 BlupiEdit/BlupiEdit.csproj create mode 100644 BlupiEdit/LevelData.cs create mode 100644 BlupiEdit/LevelSelectForm.Designer.cs create mode 100644 BlupiEdit/LevelSelectForm.cs create mode 100644 BlupiEdit/LevelSelectForm.resx create mode 100644 BlupiEdit/MainForm.Designer.cs create mode 100644 BlupiEdit/MainForm.cs create mode 100644 BlupiEdit/MainForm.resx create mode 100644 BlupiEdit/Program.cs create mode 100644 BlupiEdit/Properties/AssemblyInfo.cs create mode 100644 BlupiEdit/Properties/Resources.Designer.cs create mode 100644 BlupiEdit/Properties/Resources.resx create mode 100644 BlupiEdit/Properties/Settings.Designer.cs create mode 100644 BlupiEdit/Properties/Settings.settings diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..412eeda --- /dev/null +++ b/.gitattributes @@ -0,0 +1,22 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b9d6bd9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,215 @@ +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results + +[Dd]ebug/ +[Rr]elease/ +x64/ +build/ +[Bb]in/ +[Oo]bj/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.log +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +*.ncrunch* +.*crunch*.local.xml + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.Publish.xml +*.pubxml + +# NuGet Packages Directory +## TODO: If you have NuGet Package Restore enabled, uncomment the next line +#packages/ + +# Windows Azure Build Output +csx +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.[Pp]ublish.xml +*.pfx +*.publishsettings + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +App_Data/*.mdf +App_Data/*.ldf + +############# +## Windows detritus +############# + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Mac crap +.DS_Store + + +############# +## Python +############# + +*.py[co] + +# Packages +*.egg +*.egg-info +dist/ +build/ +eggs/ +parts/ +var/ +sdist/ +develop-eggs/ +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg diff --git a/BlupiEdit.sln b/BlupiEdit.sln new file mode 100644 index 0000000..b42c18f --- /dev/null +++ b/BlupiEdit.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual C# Express 2008 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlupiEdit", "BlupiEdit\BlupiEdit.csproj", "{78D7FDC5-4505-4552-928D-2C0A4BF601B0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {78D7FDC5-4505-4552-928D-2C0A4BF601B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {78D7FDC5-4505-4552-928D-2C0A4BF601B0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {78D7FDC5-4505-4552-928D-2C0A4BF601B0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {78D7FDC5-4505-4552-928D-2C0A4BF601B0}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/BlupiEdit/BlupiEdit.csproj b/BlupiEdit/BlupiEdit.csproj new file mode 100644 index 0000000..e6f115b --- /dev/null +++ b/BlupiEdit/BlupiEdit.csproj @@ -0,0 +1,90 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {78D7FDC5-4505-4552-928D-2C0A4BF601B0} + WinExe + Properties + BlupiEdit + BlupiEdit + v3.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + 3.5 + + + + + + + + Form + + + LevelSelectForm.cs + + + Form + + + MainForm.cs + + + + + LevelSelectForm.cs + + + MainForm.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + \ No newline at end of file diff --git a/BlupiEdit/LevelData.cs b/BlupiEdit/LevelData.cs new file mode 100644 index 0000000..ca5eeb3 --- /dev/null +++ b/BlupiEdit/LevelData.cs @@ -0,0 +1,456 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.IO; +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 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 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 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 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(); + for (int i = 0; i < 200; i++) + { + LevelItem item = new LevelItem(reader); + if (item.Type != ItemTypes.None) + Items.Add(item); + } + } + } + + 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 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(); + List tmp = new List(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(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(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(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(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(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(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 static void LoadLevel(int userid, int levelnum, bool userlevel) + { + CurrentLevelPath = GetLevelName(userid, levelnum, userlevel); + CurrentLevel = new LevelData(CurrentLevelPath); + } + + 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 SaveLevel() + { + CurrentLevel.Save(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 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 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 enum TileTypes : ushort + { + None = 0, + Object = 1, + Blupi000 = 2, + Explo = 9, + Element = 10, + Blupi001 = 11, + Blupi002 = 12, + Blupi003 = 13, + } + + 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 Sprite(Bitmap spr, Point off) + { + Image = spr; + Offset = off; + } + + public Sprite(Sprite sprite) + { + Image = (Bitmap)sprite.Image.Clone(); + Offset = sprite.Offset; + } + } + + public static class Extensions + { + /// + /// Reads a null-terminated ASCII string from the current stream and advances the position by bytes. + /// + /// The maximum length of the string, in bytes. + 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 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 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); + } + } +} \ No newline at end of file diff --git a/BlupiEdit/LevelSelectForm.Designer.cs b/BlupiEdit/LevelSelectForm.Designer.cs new file mode 100644 index 0000000..97f6315 --- /dev/null +++ b/BlupiEdit/LevelSelectForm.Designer.cs @@ -0,0 +1,49 @@ +namespace BlupiEdit +{ + partial class LevelSelectForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + 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); + + } + + #endregion + } +} \ No newline at end of file diff --git a/BlupiEdit/LevelSelectForm.cs b/BlupiEdit/LevelSelectForm.cs new file mode 100644 index 0000000..656c7f0 --- /dev/null +++ b/BlupiEdit/LevelSelectForm.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace BlupiEdit +{ + public partial class LevelSelectForm : Form + { + public LevelSelectForm() + { + InitializeComponent(); + } + } +} diff --git a/BlupiEdit/LevelSelectForm.resx b/BlupiEdit/LevelSelectForm.resx new file mode 100644 index 0000000..19dc0dd --- /dev/null +++ b/BlupiEdit/LevelSelectForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/BlupiEdit/MainForm.Designer.cs b/BlupiEdit/MainForm.Designer.cs new file mode 100644 index 0000000..6f5f20d --- /dev/null +++ b/BlupiEdit/MainForm.Designer.cs @@ -0,0 +1,135 @@ +namespace BlupiEdit +{ + partial class MainForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.changeLevelToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.menuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // menuStrip1 + // + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(584, 24); + this.menuStrip1.TabIndex = 0; + this.menuStrip1.Text = "menuStrip1"; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.openToolStripMenuItem, + this.changeLevelToolStripMenuItem, + this.saveToolStripMenuItem, + this.saveAsToolStripMenuItem, + this.toolStripSeparator1, + this.exitToolStripMenuItem}); + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); + this.fileToolStripMenuItem.Text = "&File"; + // + // openToolStripMenuItem + // + this.openToolStripMenuItem.Name = "openToolStripMenuItem"; + this.openToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.openToolStripMenuItem.Text = "&Open..."; + this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click); + // + // changeLevelToolStripMenuItem + // + this.changeLevelToolStripMenuItem.Enabled = false; + this.changeLevelToolStripMenuItem.Name = "changeLevelToolStripMenuItem"; + this.changeLevelToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.changeLevelToolStripMenuItem.Text = "&Change Level..."; + this.changeLevelToolStripMenuItem.Click += new System.EventHandler(this.changeLevelToolStripMenuItem_Click); + // + // saveToolStripMenuItem + // + this.saveToolStripMenuItem.Enabled = false; + this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; + this.saveToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.saveToolStripMenuItem.Text = "&Save"; + // + // saveAsToolStripMenuItem + // + this.saveAsToolStripMenuItem.Enabled = false; + this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem"; + this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.saveAsToolStripMenuItem.Text = "Save &As..."; + // + // exitToolStripMenuItem + // + this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; + this.exitToolStripMenuItem.Size = new System.Drawing.Size(154, 22); + this.exitToolStripMenuItem.Text = "E&xit"; + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(151, 6); + // + // MainForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(584, 562); + this.Controls.Add(this.menuStrip1); + this.MainMenuStrip = this.menuStrip1; + this.Name = "MainForm"; + this.Text = "BlupiEdit"; + this.Load += new System.EventHandler(this.MainForm_Load); + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.MainForm_FormClosed); + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem changeLevelToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; + } +} + diff --git a/BlupiEdit/MainForm.cs b/BlupiEdit/MainForm.cs new file mode 100644 index 0000000..63e8130 --- /dev/null +++ b/BlupiEdit/MainForm.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.IO; + +namespace BlupiEdit +{ + public partial class MainForm : Form + { + + + public MainForm() + { + InitializeComponent(); + } + + 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 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 changeLevelToolStripMenuItem_Click(object sender, EventArgs e) + { + using (LevelSelectForm ls = new LevelSelectForm()) + ls.ShowDialog(this); + } + } +} diff --git a/BlupiEdit/MainForm.resx b/BlupiEdit/MainForm.resx new file mode 100644 index 0000000..541af56 --- /dev/null +++ b/BlupiEdit/MainForm.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/BlupiEdit/Program.cs b/BlupiEdit/Program.cs new file mode 100644 index 0000000..ba6ae55 --- /dev/null +++ b/BlupiEdit/Program.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; + +namespace BlupiEdit +{ + static class Program + { + public static string[] Arguments { get; private set; } + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main(string[] args) + { + Arguments = args; + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainForm()); + } + } +} diff --git a/BlupiEdit/Properties/AssemblyInfo.cs b/BlupiEdit/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..963d7fa --- /dev/null +++ b/BlupiEdit/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("BlupiEdit")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("BlupiEdit")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("24fcab83-934f-469c-8551-8372d4bf80d8")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/BlupiEdit/Properties/Resources.Designer.cs b/BlupiEdit/Properties/Resources.Designer.cs new file mode 100644 index 0000000..6a13e84 --- /dev/null +++ b/BlupiEdit/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.5466 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace BlupiEdit.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [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 + { + + 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() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BlupiEdit.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/BlupiEdit/Properties/Resources.resx b/BlupiEdit/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/BlupiEdit/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/BlupiEdit/Properties/Settings.Designer.cs b/BlupiEdit/Properties/Settings.Designer.cs new file mode 100644 index 0000000..50886a8 --- /dev/null +++ b/BlupiEdit/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.5466 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace BlupiEdit.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/BlupiEdit/Properties/Settings.settings b/BlupiEdit/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/BlupiEdit/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + +