diff --git a/GameBundle/GameBundle.csproj b/GameBundle/GameBundle.csproj
index 24e19c0..5271f12 100644
--- a/GameBundle/GameBundle.csproj
+++ b/GameBundle/GameBundle.csproj
@@ -13,7 +13,7 @@
https://raw.githubusercontent.com/Ellpeck/GameBundle/master/Logo.png
true
gamebundle
- 1.1.0
+ 1.1.1
diff --git a/GameBundle/Options.cs b/GameBundle/Options.cs
index 0c4b30c..abed456 100644
--- a/GameBundle/Options.cs
+++ b/GameBundle/Options.cs
@@ -19,6 +19,11 @@ namespace GameBundle {
[Option('m', "mac", HelpText = "Bundle for mac")]
public bool BuildMac { get; set; }
+ [Option('b', "mac-bundle", HelpText = "Create an app bundle for mac")]
+ public bool MacBundle { get; set; }
+ [Option("mac-bundle-resources", Default = new[] {"Content", "*.icns"}, HelpText = "When creating an app bundle for mac, things that should go into the Resources folder rather than the MacOS folder")]
+ public IEnumerable MacBundleResources { get; set; }
+
[Option('e', "exclude", HelpText = "Files that should not be moved to the library folder")]
public IEnumerable ExcludedFiles { get; set; }
[Option("32-bit", HelpText = "Publish for 32 bit instead of 64 bit. Note that this is only possible on Windows")]
diff --git a/GameBundle/Program.cs b/GameBundle/Program.cs
index 81c7057..9983376 100644
--- a/GameBundle/Program.cs
+++ b/GameBundle/Program.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
@@ -37,7 +38,10 @@ namespace GameBundle {
}
if (options.BuildMac) {
Console.WriteLine("Bundling for mac");
- Publish(options, proj, $"{bundleDir}/mac", "osx-x64");
+ var dir = $"{bundleDir}/mac";
+ Publish(options, proj, dir, "osx-x64");
+ if (options.MacBundle)
+ CreateMacBundle(options, new DirectoryInfo(dir), proj.FullName);
}
Console.WriteLine("Done");
@@ -82,5 +86,32 @@ namespace GameBundle {
return null;
}
+ private static void CreateMacBundle(Options options, DirectoryInfo dir, string proj) {
+ var app = dir.CreateSubdirectory($"{Path.GetFileNameWithoutExtension(proj)}.app");
+ var contents = app.CreateSubdirectory("Contents");
+ var resources = contents.CreateSubdirectory("Resources");
+ var macOs = contents.CreateSubdirectory("MacOS");
+ var resRegex = GlobRegex(options.MacBundleResources);
+ foreach (var file in dir.GetFiles()) {
+ var destDir = resRegex.IsMatch(file.Name) ? resources : macOs;
+ if (file.Name.EndsWith("plist"))
+ destDir = app;
+ file.MoveTo(Path.Combine(destDir.FullName, file.Name), true);
+ }
+ foreach (var sub in dir.GetDirectories()) {
+ if (sub.Name == app.Name)
+ continue;
+ var destDir = resRegex.IsMatch(sub.Name) ? resources : macOs;
+ var dest = new DirectoryInfo(Path.Combine(destDir.FullName, sub.Name));
+ if (dest.Exists)
+ dest.Delete(true);
+ sub.MoveTo(dest.FullName);
+ }
+ }
+
+ private static Regex GlobRegex(IEnumerable strings) {
+ return new Regex('(' + string.Join("|", strings.Select(s => s.Replace(".", "[.]").Replace("*", ".*").Replace("?", "."))) + ')');
+ }
+
}
}
\ No newline at end of file
diff --git a/README.md b/README.md
index ccd839a..da53f4b 100644
--- a/README.md
+++ b/README.md
@@ -25,6 +25,6 @@ gamebundle --help
# Future features
In the future, GameBundle plans to include the following features:
-- An option to create a `.app` folder for Mac
+- ~~An option to create a `.app` folder for Mac~~ Implemented in `1.1.1`
- An option to create an installer for Windows
- An option to create a flatpak (or similar) installer for Linux
\ No newline at end of file
diff --git a/Test/Bundle.bat b/Test/Bundle.bat
index c5a0c02..9f7072c 100644
--- a/Test/Bundle.bat
+++ b/Test/Bundle.bat
@@ -1 +1 @@
-"../GameBundle/bin/Debug/netcoreapp3.1/GameBundle.exe" -wlm -s Test.csproj -o bin/Bundled -v
\ No newline at end of file
+"../GameBundle/bin/Debug/netcoreapp3.1/GameBundle.exe" -wlm -s Test.csproj -o bin/Bundled -v -b
\ No newline at end of file
diff --git a/Test/GameImpl.cs b/Test/GameImpl.cs
index 0e9f419..09f102d 100644
--- a/Test/GameImpl.cs
+++ b/Test/GameImpl.cs
@@ -1,13 +1,29 @@
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
using MLEM.Startup;
namespace Test {
public class GameImpl : MlemGame {
public static GameImpl Instance { get; private set; }
+ private Texture2D texture;
public GameImpl() {
Instance = this;
}
+ protected override void LoadContent() {
+ base.LoadContent();
+ this.texture = LoadContent("Textures/Test");
+ }
+
+ protected override void DoDraw(GameTime gameTime) {
+ this.GraphicsDevice.Clear(Color.Black);
+ base.DoDraw(gameTime);
+ this.SpriteBatch.Begin(samplerState: SamplerState.PointClamp, transformMatrix: Matrix.CreateScale(10));
+ this.SpriteBatch.Draw(this.texture, Vector2.Zero, Color.White);
+ this.SpriteBatch.End();
+ }
+
}
}
\ No newline at end of file