Jaysyn904 6ec137a24e Updated AMS marker feats
Updated AMS marker feats.  Removed arcane & divine marker feats.  Updated Dread Necromancer for epic progression. Updated weapon baseitem models.  Updated new weapons for crafting & npc equip.
 Updated prefix.  Updated release archive.
2024-02-11 14:01:05 -05:00

224 lines
6.3 KiB
C#

using System;
using System.Collections;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Threading;
using System.Windows.Forms;
using HakInstaller.Utilities;
using NWN;
namespace HakInstaller
{
/// <summary>
/// Class to contain the application's main method.
/// </summary>
public class MainContainer
{
#region private static fields/properties/methods
private static bool consoleMode = false;
private static bool installPathGiven = false;
private static StringCollection hifStrings = new StringCollection();
private static StringCollection moduleStrings = new StringCollection();
/// <summary>
/// Either displays the message in a message box or on the command line,
/// depending on whether the application is running in console mode or not.
/// </summary>
/// <param name="format">The format string</param>
/// <param name="args">The format arguments</param>
private static void ShowMessage(string format, params object[] args)
{
System.Text.StringBuilder b = new System.Text.StringBuilder();
b.AppendFormat(format, args);
if (consoleMode)
Console.WriteLine(b.ToString());
else
MessageBox.Show(b.ToString(), "Error", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
/// <summary>
/// Validates all of the files in the collection to make sure that they
/// exist.
/// </summary>
/// <param name="files">The list of files to validate</param>
/// <returns>True if all files exist</returns>
private static bool ValidateFiles(StringCollection files)
{
// Make sure all of the source files exist.
foreach (string file in files)
if (!File.Exists(Path.Combine(NWNInfo.GetPathForFile(file), file)))
{
ShowMessage("The file {0} does not exist", file);
return false;
}
return true;
}
/// <summary>
/// Runs the application in console mode, silently adding the haks to
/// the modules given on the command line.
/// </summary>
/// <returns>0 if successful, otherwise -1</returns>
private static int ConsoleMode()
{
// Validate the files, if we fail validation then exit now.
if (!ValidateFiles(hifStrings) || !ValidateFiles(moduleStrings))
return -1;
// Convert the string collections to arrays and install the haks
// in the modules.
string[] hifs = new string[hifStrings.Count];
hifStrings.CopyTo(hifs, 0);
string[] modules = new string[moduleStrings.Count];
moduleStrings.CopyTo(modules, 0);
try
{
HakInstaller.InstallHaks(hifs, modules, null);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
return 0;
}
/// <summary>
/// Terminates the application.
/// </summary>
/// <param name="showHelp">True if help should be displayed.</param>
private static void Terminate(bool showHelp)
{
if (showHelp) Help();
throw new EntryPointNotFoundException();
}
/// <summary>
/// Displays help
/// </summary>
private static void Help()
{
Console.WriteLine("HakInstaller: install hak/erf/tlk files in modules");
Console.WriteLine("Usage: HakInstaller -n<path> file.hif/mod ...");
Console.WriteLine(" -n<path>:Specifies the NWN install path, if this is not given");
Console.WriteLine(" then it will be read from the registry.");
Console.WriteLine("");
Console.WriteLine("One or more .hif and .mod files may be specified on the command");
Console.WriteLine("line, if none are given a UI will be displayed allowing you to");
Console.WriteLine("choose the hif/mod files. Paths should not be given on the files");
Console.WriteLine("they will be searched for in the appropriate subdirectories of");
Console.WriteLine("the NWN install path (as either given on the command line or read");
Console.WriteLine("from the registry).");
}
/// <summary>
/// Processes command line arguments.
/// </summary>
/// <param name="args"></param>
private static void ProcessArguments(string[] args)
{
foreach (string arg in args)
{
// Process any command line switches.
if ('-' == arg[0] || '/' == arg[1])
{
switch (arg[1])
{
case 'n':
case 'N':
// The NWN install path was specified on the command line,
// save it to override whatever is in the registry.
installPathGiven = true;
NWNInfo.InstallPath = arg.Substring(2);
// Make sure that the directory exists.
if (!Directory.Exists(NWNInfo.InstallPath))
{
ShowMessage("The path '{0}' does not exist.", NWNInfo.InstallPath);
Terminate(false);
}
break;
default:
Help();
break;
}
}
else
{
// If we get a hif or module on the command line then we
// are in console mode.
consoleMode = true;
string extension = Path.GetExtension(arg);
if (0 == string.Compare(".hif", extension, true))
hifStrings.Add(arg);
else if (0 == string.Compare(".mod", extension, true))
moduleStrings.Add(arg);
else
{
Console.WriteLine("Unknown file {0}\n", arg);
Terminate(true);
}
}
}
// We must have at least one hif and one mod if we are in console mode.
if (consoleMode && (0 == hifStrings.Count || 0 == moduleStrings.Count))
{
Console.WriteLine("Must specify at least one .mod and one .hif file\n");
Terminate(true);
}
}
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static int Main(string[] args)
{
try
{
// Process command line arguments.
ProcessArguments(args);
// Make sure NWN is installed before doing anything. If the user
// gave an install path on the command line we could be installing on
// a remote machine, so do not check for an install on this machine.
if (!installPathGiven && !NWNInfo.IsInstalled)
{
ShowMessage("Neverwinter Nights is not installed");
return -1;
}
if (consoleMode)
return ConsoleMode();
else
{
// Requires .NET framework 1.1
//Application.EnableVisualStyles();
Application.Run(new InstallForm());
return 0;
}
}
catch (EntryPointNotFoundException)
{
// Dummy exception thrown to terminate the application by Help(),
// don't display anything just return -1.
return -1;
}
catch (Exception e)
{
ShowMessage(e.Message);
return -1;
}
}
#endregion
}
}