Git Product home page Git Product logo

zeromunge's Introduction

Zero Munge

Build Status Issues CodeFactor License
Release Downloads

What it is

The goal of Zero Munge is to act as a robust replacement for VisualMunge, the automated build tool provided with the SWBF2 mod tools.

It is written in Visual C# for .NET Framework 4.7.1.

What it does

At its core, Zero Munge goes through a user-specified list of munge.bat files and executes each one at a time and copies the associated LVL files to the appropriate staging directory.

Zero Munge includes the following features.

  • Sequentially execute a list of munge scripts and any other batch scripts
  • Toggle whether or not certain scripts in the list will be executed
  • Log each script's output in real-time (with timestamps) to a log window and log file
  • Various methods of adding munge scripts to the file list
  • Automatically copy each file's associated LVL file(s) to the appropriate directory
  • Easily create the munge folders/scripts for a side or world
  • Apply the sound munge fix to a project directory
  • Visual interface for modifying which sound folders get munged when sound is munged
  • Save and load different "presets" of the file list's contents
  • Auto-save and auto-load functionality for save files
  • Automatically check for updates and point user to latest release's download page
  • Support munging and copying for XBOX and PS2/PSP

How to use it

Please see the Getting Started page.

Video New features June 2021

zeromunge's People

Contributors

bad-al avatar marth8880 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

bad-al

zeromunge's Issues

Exception when checking for updates while window is minimized: System.NullReferenceException

Repro:

  1. Launch application.
  2. Continually click in an Explorer window (or elsewhere) to ensure that the application window is instantiated in a minimized state.
System.NullReferenceException
  HResult=0x80004003
  Message=Object reference not set to an instance of an object.
  Source=ZeroMunge
  StackTrace:
   at ZeroMunge.Utilities.<CheckForInternetConnection>g__TryConnection|21_0(String url) in C:\Users\aaron\source\repos\ZeroMunge\ZeroMunge\Modules\Utilities.cs:line 837
   at ZeroMunge.Utilities.CheckForInternetConnection() in C:\Users\aaron\source\repos\ZeroMunge\ZeroMunge\Modules\Utilities.cs:line 863
   at ZeroMunge.Utilities.CheckForUpdates() in C:\Users\aaron\source\repos\ZeroMunge\ZeroMunge\Modules\Utilities.cs:line 761
   at ZeroMunge.ZeroMunge.ZeroMunge_Shown(Object sender, EventArgs e) in C:\Users\aaron\source\repos\ZeroMunge\ZeroMunge\Forms\Main.cs:line 142
   at System.Windows.Forms.Form.OnShown(EventArgs e)
   at System.Windows.Forms.Control.InvokeMarshaledCallbackHelper(Object obj)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Windows.Forms.Control.InvokeMarshaledCallback(ThreadMethodEntry tme)
   at System.Windows.Forms.Control.InvokeMarshaledCallbacks()
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.Form.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at ZeroMunge.Program.Main() in C:\Users\aaron\source\repos\ZeroMunge\ZeroMunge\Program.cs:line 19

Exception when adding multiple folders to file list via 'Add Folders' button: System.ArgumentOutOfRangeException

************** Exception Text **************
System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
   at System.Collections.ArrayList.get_Item(Int32 index)
   at System.Windows.Forms.DataGridViewRowCollection.SharedRow(Int32 rowIndex)
   at System.Windows.Forms.DataGridViewRowCollection.get_Item(Int32 index)
   at System.Windows.Forms.DataGridView.get_Item(Int32 columnIndex, Int32 rowIndex)
   at ZeroMunge.ZeroMunge.AddFile(String file, Boolean isMungeScript)
   at ZeroMunge.ZeroMunge.btn_AddFolders_Click(Object sender, EventArgs e)
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Loaded Assemblies **************
mscorlib
    Assembly Version: 4.0.0.0
    Win32 Version: 4.7.2633.0 built by: NET471REL1LAST_C
    CodeBase: file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/mscorlib.dll
----------------------------------------
ZeroMunge
    Assembly Version: 1.0.0.0
    Win32 Version: 1.0.0.0
    CodeBase: file:///J:/BF2_ModTools/data_TCW/data_TCW/_BUILD/ZeroMunge.exe
----------------------------------------
System.Windows.Forms
    Assembly Version: 4.0.0.0
    Win32 Version: 4.7.2556.0 built by: NET471REL1
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System
    Assembly Version: 4.0.0.0
    Win32 Version: 4.7.2556.0 built by: NET471REL1
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Drawing
    Assembly Version: 4.0.0.0
    Win32 Version: 4.7.2556.0 built by: NET471REL1
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
Microsoft.WindowsAPICodePack.Shell
    Assembly Version: 1.1.0.0
    Win32 Version: 1.1.0.0
    CodeBase: file:///J:/BF2_ModTools/data_TCW/data_TCW/_BUILD/Microsoft.WindowsAPICodePack.Shell.DLL
----------------------------------------
Microsoft.WindowsAPICodePack
    Assembly Version: 1.1.2.0
    Win32 Version: 1.1.2.0
    CodeBase: file:///J:/BF2_ModTools/data_TCW/data_TCW/_BUILD/Microsoft.WindowsAPICodePack.DLL
----------------------------------------
System.Core
    Assembly Version: 4.0.0.0
    Win32 Version: 4.7.2633.0 built by: NET471REL1LAST_C
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
System.Configuration
    Assembly Version: 4.0.0.0
    Win32 Version: 4.7.2556.0 built by: NET471REL1
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
    Assembly Version: 4.0.0.0
    Win32 Version: 4.7.2612.0 built by: NET471REL1LAST_B
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
Newtonsoft.Json
    Assembly Version: 10.0.0.0
    Win32 Version: 10.0.3.21018
    CodeBase: file:///J:/BF2_ModTools/data_TCW/data_TCW/_BUILD/Newtonsoft.Json.DLL
----------------------------------------
Accessibility
    Assembly Version: 4.0.0.0
    Win32 Version: 4.7.2556.0 built by: NET471REL1
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/Accessibility/v4.0_4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll
----------------------------------------
PresentationFramework
    Assembly Version: 4.0.0.0
    Win32 Version: 4.7.2633.0
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/PresentationFramework/v4.0_4.0.0.0__31bf3856ad364e35/PresentationFramework.dll
----------------------------------------
WindowsBase
    Assembly Version: 4.0.0.0
    Win32 Version: 4.7.2633.0 built by: NET471REL1LAST_C
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/WindowsBase/v4.0_4.0.0.0__31bf3856ad364e35/WindowsBase.dll
----------------------------------------
PresentationCore
    Assembly Version: 4.0.0.0
    Win32 Version: 4.7.2633.0 built by: NET471REL1LAST_C
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_64/PresentationCore/v4.0_4.0.0.0__31bf3856ad364e35/PresentationCore.dll
----------------------------------------
System.Xaml
    Assembly Version: 4.0.0.0
    Win32 Version: 4.7.2633.0 built by: NET471REL1LAST_C
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Xaml/v4.0_4.0.0.0__b77a5c561934e089/System.Xaml.dll
----------------------------------------

Exception when job finishes that contains an empty Munged Files list: System.ArgumentOutOfRangeException

System.ArgumentOutOfRangeException
  HResult=0x80131502
  Message=Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
  Source=mscorlib
  StackTrace:
   at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
   at System.Collections.Generic.List`1.get_Item(Int32 index)
   at ZeroMunge.ZeroMunge.ProcManager_NotifyProcessComplete(Int32 whichFile, Boolean singleFile) in C:\Users\aaron\source\repos\ZeroMunge\ZeroMunge\Forms\Main.cs:line 423
   at ZeroMunge.ZeroMunge.<>c__DisplayClass52_0.<ProcManager_StartProcess>b__2(Object sender, EventArgs e) in C:\Users\aaron\source\repos\ZeroMunge\ZeroMunge\Forms\Main.cs:line 625
   at System.Diagnostics.Process.OnExited()
   at System.Diagnostics.Process.RaiseOnExited()
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(Object state, Boolean timedOut)

Exception when attempting to commit empty Munged Files list: System.IndexOutOfRangeException

System.IndexOutOfRangeException
  HResult=0x80131508
  Message=Index was outside the bounds of the array.
  Source=ZeroMunge
  StackTrace:
   at ZeroMunge.ZeroMunge.text_MungedFilesEdit_Commit() in C:\Users\aaron\source\repos\ZeroMunge\ZeroMunge\Forms\Main.cs:line 2179
   at ZeroMunge.ZeroMunge.text_MungedFilesEdit_KeyDown(Object sender, KeyEventArgs e) in C:\Users\aaron\source\repos\ZeroMunge\ZeroMunge\Forms\Main.cs:line 2105
   at System.Windows.Forms.Control.OnKeyDown(KeyEventArgs e)
   at System.Windows.Forms.Control.ProcessKeyEventArgs(Message& m)
   at System.Windows.Forms.Control.WmKeyChar(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.RichTextBox.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at ZeroMunge.Program.Main() in C:\Users\aaron\source\repos\ZeroMunge\ZeroMunge\Program.cs:line 19

Add functionality to load previous save file on launch

Add functionality to restore the state of the File List on application launch.

  • Previous save file is simply stored as a file path in application settings.
  • If a save file was saved on last exit, load that file.
  • If no save file was saved on last exit, load the auto-save file.

Exception when adding file to file list: System.ArgumentOutOfRangeException

just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
   at System.Collections.ArrayList.get_Item(Int32 index)
   at System.Windows.Forms.DataGridViewRowCollection.SharedRow(Int32 rowIndex)
   at System.Windows.Forms.DataGridViewRowCollection.get_Item(Int32 index)
   at System.Windows.Forms.DataGridView.get_Item(Int32 columnIndex, Int32 rowIndex)
   at AutomationTool.AutomationTool.AddFile(String file, Boolean isMungeScript)
   at AutomationTool.AutomationTool.openDlg_AddFilesPrompt_FileOk(Object sender, CancelEventArgs e)
   at System.Windows.Forms.FileDialog.OnFileOk(CancelEventArgs e)
   at System.Windows.Forms.FileDialog.HandleVistaFileOk(IFileDialog dialog)


************** Loaded Assemblies **************
mscorlib
    Assembly Version: 4.0.0.0
    Win32 Version: 4.7.2102.0 built by: NET47REL1LAST
    CodeBase: file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/mscorlib.dll
----------------------------------------
ZeroMunge
    Assembly Version: 1.0.0.0
    Win32 Version: 1.0.0.0
    CodeBase: file:///J:/BF2_ModTools/data_SOL/data_SOL/_BUILD/ZeroMunge.exe
----------------------------------------
System.Windows.Forms
    Assembly Version: 4.0.0.0
    Win32 Version: 4.7.2104.0 built by: NET47REL1LAST
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System
    Assembly Version: 4.0.0.0
    Win32 Version: 4.7.2103.2 built by: NET47REL1LAST
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Drawing
    Assembly Version: 4.0.0.0
    Win32 Version: 4.7.2046.0 built by: NET47REL1
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
Microsoft.WindowsAPICodePack.Shell
    Assembly Version: 1.1.0.0
    Win32 Version: 1.1.0.0
    CodeBase: file:///J:/BF2_ModTools/data_SOL/data_SOL/_BUILD/Microsoft.WindowsAPICodePack.Shell.DLL
----------------------------------------
Microsoft.WindowsAPICodePack
    Assembly Version: 1.1.2.0
    Win32 Version: 1.1.2.0
    CodeBase: file:///J:/BF2_ModTools/data_SOL/data_SOL/_BUILD/Microsoft.WindowsAPICodePack.DLL
----------------------------------------
System.Core
    Assembly Version: 4.0.0.0
    Win32 Version: 4.7.2102.0 built by: NET47REL1LAST
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
System.Configuration
    Assembly Version: 4.0.0.0
    Win32 Version: 4.7.2046.0 built by: NET47REL1
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
    Assembly Version: 4.0.0.0
    Win32 Version: 4.7.2102.0 built by: NET47REL1LAST
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
Accessibility
    Assembly Version: 4.0.0.0
    Win32 Version: 4.7.2046.0 built by: NET47REL1
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/Accessibility/v4.0_4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll
----------------------------------------

************** JIT Debugging **************
To enable just-in-time (JIT) debugging, the .config file for this
application or computer (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.

For example:

<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>

When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the computer
rather than be handled by this dialog box.```

ParseReqsInDirectory doesn't exclude stray sub-REQs

If a side (for example) is added to the list and there are REQs in its asset directory that aren't listed in the side's main REQ's LVL chunk, those REQs are added to the Munged Files list.

EXPECTED:

Sub-LVLs and stray REQs are excluded from the Munged Files list.

Easy File Picker

The goal is to make easier the process of selecting files to add to the File List.

How do we do that? With a tree view, of course!

Logic Flow

  1. User clicks "Easy File Picker" button.
  2. "Easy File Picker" form is shown.
  3. User is prompted to browse for a mod project directory.
    a. This directory path is saved to the user prefs and remembered each time the picker is opened.
  4. Zero Munge creates a nested tree of the entire project by scouring the directory for munge scripts for sides, worlds, common, sound, addme, and shell.
    a. For sides, it looks for munge.bat in all folders located inside data_***\_BUILD\Sides.
    b. For worlds, it looks for munge.bat in all folders located inside data_***\_BUILD\Worlds. Each world will probably also want to check for an existing REQ file in the data_***\Worlds\<world> directory since all of the stock worlds are usually present and unused in data_***\_BUILD\Worlds.
    c. For common, it looks for munge.bat in data_***\_BUILD\Common.
    d. For sound, it looks for munge.bat in data_***\_BUILD\Sound.
    e. For addme, it looks for mungeAddme.bat in data_***\addme.
    f. For shell, it looks for munge.bat in data_***\_BUILD\Shell.
    g. The items in the tree are organized the same way as in the project directory; all the sides are located in a folder called "Sides", worlds in a folder called "Worlds", etc. Sound is treated a bit differently since in most cases there's just one munge.bat file that munges all sound folders.
    h. Each item and folder in the tree view has an associated checkbox. Checking/unchecking a folder checks/unchecks all of its child items. I suspect .NET handles this functionality automatically.
  5. When the user clicks the "OK" button in the form, each checked item's munge script is added to the File List.
    a. Optionally, the user can add more project directories with the "Add Project" button, which goes back to step 3.

Components

  • "Easy File Picker" form containing a TreeView, "OK"/"Cancel" buttons, an "Add Project" button, and a folder select dialog.
  • List of munge script file paths that the picker returns to the main form after closing via the "OK" button. Alternatively we could use a struct but it shouldn't be necessary.
  • Logic for scouring the project directory for the munge scripts.

Wireframes

Form layout:

easyfilepicker_01

Tree view example:

easyfilepicker_02

Tools menu: Create Side Munge Folder

This is a button that would prompt the user to select a side's folder (or REQ file) and if a munge folder does not exist for it, one would be created with the appropriate munge.bat and clean.bat scripts and all.

Exception when trying to save zmd: System.NullReferenceException

When list of Actions contains an empty entry, NullReferenceException occurs while saving:

   at ZeroMunge.ZeroMunge.SerializeData(String filePath)
   at ZeroMunge.ZeroMunge.SaveFileListToFile(String filePath)
   at ZeroMunge.ZeroMunge.saveDlg_SaveFileListPrompt_FileOk(Object sender, CancelEventArgs e)
   at System.Windows.Forms.FileDialog.OnFileOk(CancelEventArgs e)
   at System.Windows.Forms.FileDialog.HandleVistaFileOk(IFileDialog dialog)
  1. Open ZeroMunge
  2. In the Action List, set checkmark at Process (will cerate new Action)
  3. Click File -> Save As -> somefile.zmd

Tools menu: Fix World Munge Script

Would be good to have functionality to fix the world munge scripts for custom worlds.

By default, a custom world's munge.bat script uses YAV as the world ID parameter; VisualMunge is supposed to fix this when creating the world but it doesn't.

Perhaps the best way to fix this would be to have a button that prompts the user to select a world's folder in data_***\_BUILD\Worlds and, if the folder's munge.bat script's contents are @call ..\munge_world.bat YAV %1, rewrite the file with @call ..\munge_world.bat @#$ %1 where @#$ is the name of the containing folder.

Additionally, we might want to add functionality to notify the user if a world's munge script hasn't been fixed. This notification would be displayed when the user adds the munge script to the File List.

Simple analytics integration

I'd like to track how many people are using this tool and which settings they're using. This can be done through an analytics API such as Google Analytics or Segment.

Data collected:

  • Number of unique users
  • Each unique user's preference settings

Further requirements:

  • Ability for users to opt-out if desired
  • Privacy statement integration

Add pre-exit prompt to save dirty file list if auto-save is disabled

When the user exits the application:

  1. Is auto-save disabled? ->
  2. Is the file list dirty? ->
  3. Display prompt: "There are unsaved changes to the file list. Would you like to save before closing?" ->
    a. "Yes": Attempt to save the file list to the current save file or open a Save As dialog if it's a new file.
    b. "No": Exit the application.
    c. "Cancel": Close the prompt.

Refactor third-party software functionality to read software info from a json file

Currently the information is hard-coded into ThirdPartySoftware.cs like so:

List<Software> software = new List<Software>()
{
	new Software("license_NewtonsoftJson")
	{
		Name = "Json.NET",
		Author = "James Newton-King",
		Url = "https://www.newtonsoft.com/json"
	},

	new Software("license_markdig")
	{
		Name = "Markdig",
		Author = "Alexandre Mutel",
		Url = "https://github.com/lunet-io/markdig"
	},

	new Software("license_prettybin")
	{
		Name = "PrettyBin",
		Author = "Andrey Ershov",
		Url = "https://github.com/slmjy/PrettyBin"
	},

	new Software("license_WindowsAPICodePack")
	{
		Name = "Windows API Code Pack for Microsoft .NET Framework",
		Author = "Microsoft",
		Url = "https://github.com/aybe/Windows-API-Code-Pack-1.1"
	}
};

Instead, this should be read from a json file that's loaded at runtime as an embedded resource.

Auto-save functionality

Add functionality for an auto-save feature.

  • If no save file is manually specified by the user, automatically save file list contents to predetermined file on application close.
  • User should be able to toggle this feature in Preferences.

Main window's title doesn't reflect the current file when a save file is opened

When a save file is opened, the main window's title doesn't update to reflect this.

For example, if a file called "Test.zmd" is opened, the window title should update to "Zero Munge - Test.zmd", but instead it remains whatever it was before the file was opened.

This issue also occurs with the auto-load functionality.

Exception when loading save file that contains empty file list: NullReferenceException

System.NullReferenceException
  HResult=0x80004003
  Message=Object reference not set to an instance of an object.
  Source=ZeroMunge
  StackTrace:
   at ZeroMunge.ZeroMunge.LoadDataIntoFileList(DataFilesContainer data, Boolean replaceCurrentContents) in C:\Users\Aaron\Source\Repos\ZeroMunge\ZeroMunge\Forms\Main.cs:line 1741
   at ZeroMunge.ZeroMunge.openDlg_OpenFileListPrompt_FileOk(Object sender, CancelEventArgs e) in C:\Users\Aaron\Source\Repos\ZeroMunge\ZeroMunge\Forms\Main.cs:line 3100
   at System.Windows.Forms.FileDialog.OnFileOk(CancelEventArgs e)
   at System.Windows.Forms.FileDialog.HandleVistaFileOk(IFileDialog dialog)
   at System.Windows.Forms.FileDialog.VistaDialogEvents.OnFileOk(IFileDialog pfd)

World munge auto-detects wrong LVL file names for stock worlds

For example, adding _BUILD\Worlds\TAT\munge.bat would auto-detect the Munged Files to be tat.lvl instead of tat2.lvl and tat3.lvl. This is because the application currently goes off of the first argument that's supplied to munge_world.bat, e.g.: @call ..\munge_world.bat TAT %1

A solution to this would be to add conditions for munging worlds that auto-detects the LVL outputs based on the world's REQ files. If it works out, might want to do this with sides as well, but that could become tricky since many sides have sub-REQ files that are compiled into a single LVL file.

Refactor Output Log to poll the log file at a timed interval

Refactor Output Log to poll the log file at a timed interval instead of whenever the log file is updated. This should solve the majority of the Output Log's performance issues.

Also will add a Preference to manually set the polling interval in milliseconds.

'Add Files...' button updates the selected row instead of always inserting a new row

Adding a file to the File List via the 'Add Files...' button updates the contents of the selected row instead of always inserting a new row.

Repro:

  1. Launch application.
  2. Add any file to the list via any means and select the row.
  3. Via the 'Add Files...' button, browse for a new (different) file and click 'Open' in the 'Select Files' dialog.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.