mirror of
https://git.do.srb2.org/STJr/UltimateZoneBuilder.git
synced 2024-11-27 14:12:16 +00:00
228 lines
6.5 KiB
C#
228 lines
6.5 KiB
C#
|
|
||
|
#region ================== Copyright (c) 2007 Pascal vd Heiden
|
||
|
|
||
|
/*
|
||
|
* Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com
|
||
|
* This program is released under GNU General Public License
|
||
|
*
|
||
|
* This program is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU General Public License for more details.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#endregion
|
||
|
|
||
|
#region ================== Namespaces
|
||
|
|
||
|
using System;
|
||
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Globalization;
|
||
|
using System.Text;
|
||
|
using System.IO;
|
||
|
using CodeImp.DoomBuilder.Data;
|
||
|
using System.Diagnostics;
|
||
|
using CodeImp.DoomBuilder.Controls;
|
||
|
using System.Windows.Forms;
|
||
|
|
||
|
#endregion
|
||
|
|
||
|
namespace CodeImp.DoomBuilder.IO
|
||
|
{
|
||
|
internal class Launcher : IDisposable
|
||
|
{
|
||
|
#region ================== Constants
|
||
|
|
||
|
#endregion
|
||
|
|
||
|
#region ================== Variables
|
||
|
|
||
|
private string tempwad;
|
||
|
|
||
|
private bool isdisposed;
|
||
|
|
||
|
#endregion
|
||
|
|
||
|
#region ================== Properties
|
||
|
|
||
|
public string TempWAD { get { return tempwad; } }
|
||
|
|
||
|
#endregion
|
||
|
|
||
|
#region ================== Constructor / Destructor
|
||
|
|
||
|
// Constructor
|
||
|
public Launcher(MapManager manager)
|
||
|
{
|
||
|
// Initialize
|
||
|
this.tempwad = General.MakeTempFilename(manager.TempPath, "wad");
|
||
|
|
||
|
// Bind actions
|
||
|
General.Actions.BindMethods(this);
|
||
|
}
|
||
|
|
||
|
// Disposer
|
||
|
public void Dispose()
|
||
|
{
|
||
|
// Not yet disposed?
|
||
|
if(!isdisposed)
|
||
|
{
|
||
|
// Unbind actions
|
||
|
General.Actions.UnbindMethods(this);
|
||
|
|
||
|
// Done
|
||
|
isdisposed = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endregion
|
||
|
|
||
|
#region ================== Parameters
|
||
|
|
||
|
// This takes the unconverted parameters (with placeholders) and converts it
|
||
|
// to parameters with full paths, names and numbers where placeholders were put.
|
||
|
// The tempfile must be the full path and filename to the PWAD file to test.
|
||
|
public string ConvertParameters(string parameters)
|
||
|
{
|
||
|
string outp = parameters;
|
||
|
DataLocation iwadloc;
|
||
|
string p_wp = "", p_wf = "";
|
||
|
string p_ap = "", p_apq = "";
|
||
|
|
||
|
// Find the first IWAD file
|
||
|
if(General.Map.Data.FindFirstIWAD(out iwadloc))
|
||
|
{
|
||
|
// %WP and %WF result in IWAD file
|
||
|
p_wp = iwadloc.location;
|
||
|
p_wf = Path.GetFileName(p_wp);
|
||
|
}
|
||
|
|
||
|
// Make a list of all data locations, including map location
|
||
|
DataLocation maplocation = new DataLocation(DataLocation.RESOURCE_WAD, General.Map.FilePathName, false, false);
|
||
|
DataLocationList locations = new DataLocationList();
|
||
|
locations.AddRange(General.Map.Options.Resources);
|
||
|
locations.Add(maplocation);
|
||
|
|
||
|
// Go for all data locations
|
||
|
foreach(DataLocation dl in locations)
|
||
|
{
|
||
|
// Location not the IWAD file?
|
||
|
if((dl.type == DataLocation.RESOURCE_WAD) && (dl.location != iwadloc.location))
|
||
|
{
|
||
|
// Add to string of files
|
||
|
p_ap += dl.location + " ";
|
||
|
p_apq += "\"" + dl.location + "\" ";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Trim last space from resource file locations
|
||
|
p_ap = p_ap.TrimEnd(' ');
|
||
|
p_apq = p_apq.TrimEnd(' ');
|
||
|
|
||
|
// Make sure all our placeholders are in uppercase
|
||
|
outp = outp.Replace("%f", "%F");
|
||
|
outp = outp.Replace("%wp", "%WP");
|
||
|
outp = outp.Replace("%wf", "%WF");
|
||
|
outp = outp.Replace("%wP", "%WP");
|
||
|
outp = outp.Replace("%wF", "%WF");
|
||
|
outp = outp.Replace("%Wp", "%WP");
|
||
|
outp = outp.Replace("%Wf", "%WF");
|
||
|
outp = outp.Replace("%l", "%L");
|
||
|
outp = outp.Replace("%ap", "%AP");
|
||
|
outp = outp.Replace("%aP", "%AP");
|
||
|
outp = outp.Replace("%Ap", "%AP");
|
||
|
|
||
|
// Replace placeholders with actual values
|
||
|
outp = outp.Replace("%F", General.Map.Launcher.TempWAD);
|
||
|
outp = outp.Replace("%WP", p_wp);
|
||
|
outp = outp.Replace("%WF", p_wf);
|
||
|
outp = outp.Replace("%L", General.Map.Options.CurrentName);
|
||
|
outp = outp.Replace("\"%AP\"", p_apq);
|
||
|
outp = outp.Replace("%AP", p_ap);
|
||
|
|
||
|
// Return result
|
||
|
return outp;
|
||
|
}
|
||
|
|
||
|
#endregion
|
||
|
|
||
|
#region ================== Test
|
||
|
|
||
|
// This saves the map to a temporary file and launches a test
|
||
|
[BeginAction("testmap")]
|
||
|
public void Test()
|
||
|
{
|
||
|
Cursor oldcursor = Cursor.Current;
|
||
|
ProcessStartInfo processinfo;
|
||
|
Process process;
|
||
|
TimeSpan deltatime;
|
||
|
string args;
|
||
|
|
||
|
// Check if configuration is OK
|
||
|
if((General.Map.ConfigSettings.TestProgram == "") ||
|
||
|
!File.Exists(General.Map.ConfigSettings.TestProgram))
|
||
|
{
|
||
|
// Show message
|
||
|
Cursor.Current = Cursors.Default;
|
||
|
DialogResult result = General.ShowWarningMessage("Your test program is not set for the current game configuration. Would you like to set up your test program now?", MessageBoxButtons.YesNo);
|
||
|
if(result == DialogResult.Yes)
|
||
|
{
|
||
|
// Show game configuration on the right page
|
||
|
General.MainWindow.ShowConfigurationPage(2);
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Save map to temporary file
|
||
|
Cursor.Current = Cursors.WaitCursor;
|
||
|
tempwad = General.MakeTempFilename(General.Map.TempPath, "wad");
|
||
|
if(General.Map.SaveMap(tempwad, MapManager.SAVE_TEST))
|
||
|
{
|
||
|
// Make arguments
|
||
|
args = ConvertParameters(General.Map.ConfigSettings.TestParameters);
|
||
|
|
||
|
// Setup process info
|
||
|
processinfo = new ProcessStartInfo();
|
||
|
processinfo.Arguments = args;
|
||
|
processinfo.FileName = General.Map.ConfigSettings.TestProgram;
|
||
|
processinfo.CreateNoWindow = false;
|
||
|
processinfo.ErrorDialog = false;
|
||
|
processinfo.UseShellExecute = true;
|
||
|
processinfo.WindowStyle = ProcessWindowStyle.Normal;
|
||
|
processinfo.WorkingDirectory = Path.GetDirectoryName(processinfo.FileName);
|
||
|
|
||
|
// Output info
|
||
|
General.WriteLogLine("Running test program: " + processinfo.FileName);
|
||
|
General.WriteLogLine("Program parameters: " + processinfo.Arguments);
|
||
|
|
||
|
try
|
||
|
{
|
||
|
// Start the program
|
||
|
process = Process.Start(processinfo);
|
||
|
|
||
|
// Wait for program to complete
|
||
|
process.WaitForExit();
|
||
|
deltatime = TimeSpan.FromTicks(process.ExitTime.Ticks - process.StartTime.Ticks);
|
||
|
General.WriteLogLine("Test program has finished.");
|
||
|
General.WriteLogLine("Run time: " + deltatime.TotalSeconds.ToString("###########0.00") + " seconds");
|
||
|
}
|
||
|
catch(Exception e)
|
||
|
{
|
||
|
// Unable to start the program
|
||
|
General.ShowErrorMessage("Unable to start the test program, " + e.GetType().Name + ": " + e.Message, MessageBoxButtons.OK); ;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Remove temporary file
|
||
|
try { File.Delete(tempwad); } catch(Exception) { }
|
||
|
|
||
|
// Restore old cursor
|
||
|
Cursor.Current = oldcursor;
|
||
|
}
|
||
|
|
||
|
#endregion
|
||
|
}
|
||
|
}
|