diff --git a/BizHawk.Client.ApiHawk/Attributes/ExternalToolAttribute.cs b/BizHawk.Client.ApiHawk/Attributes/ExternalToolAttribute.cs new file mode 100644 index 0000000000..260eaf71c7 --- /dev/null +++ b/BizHawk.Client.ApiHawk/Attributes/ExternalToolAttribute.cs @@ -0,0 +1,92 @@ +using System; + +namespace BizHawk.Client.ApiHawk +{ + /// + /// This class hold logic interraction for the ExternalToolAttribute + /// This attribute helps BizHawk to handle ExternalTools + /// + [AttributeUsage(AttributeTargets.Assembly)] + public sealed class BizHawkExternalToolAttribute : Attribute + { + #region Fields + + private string _Name; + private string _Description; + private string _IconResourceName; + + #endregion + + #region cTor(s) + + /// + /// Initialize a new instance of + /// + /// Tool's name + /// Small description about the tool itself + /// Icon embedded resource name + public BizHawkExternalToolAttribute(string name, string description, string iconResourceName) + { + _Name = name; + _Description = description; + _IconResourceName = iconResourceName; + } + + /// + /// Initialize a new instance of + /// + /// Tool's name + /// Small description about the tool itself + public BizHawkExternalToolAttribute(string name, string description) + : this(name, description, string.Empty) + { } + + /// + /// Initialize a new instance of + /// + /// Tool's name + public BizHawkExternalToolAttribute(string name) + :this(name, string.Empty, string.Empty) + {} + + #endregion + + #region Properties + + /// + /// Gets tool's friendly name + /// + public string Name + { + get + { + return _Name; + } + } + + /// + /// Gets tool's descriptino + /// + public string Description + { + get + { + return _Description; + } + } + + /// + /// Get the name of the embedded resource icon + /// + /// Don't forget to set compile => Embedded reource to the icon file in your project + public string IconResourceName + { + get + { + return _IconResourceName; + } + } + + #endregion + } +} diff --git a/BizHawk.Client.ApiHawk/BizHawk.Client.ApiHawk.csproj b/BizHawk.Client.ApiHawk/BizHawk.Client.ApiHawk.csproj index 3ecb098c69..3d00484fca 100644 --- a/BizHawk.Client.ApiHawk/BizHawk.Client.ApiHawk.csproj +++ b/BizHawk.Client.ApiHawk/BizHawk.Client.ApiHawk.csproj @@ -1,96 +1,102 @@ - - - - - Debug - AnyCPU - {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA} - Library - Properties - BizHawk.Client.ApiHawk - BizHawk.Client.ApiHawk - v4.0 - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - x86 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - true - ..\output\dll\ - DEBUG;TRACE - full - x86 - prompt - MinimumRecommendedRules.ruleset - - - ..\output\dll\ - TRACE - true - pdbonly - x86 - prompt - MinimumRecommendedRules.ruleset - - - - - - - - - - - - - - - - - - - - - {24a0aa3c-b25f-4197-b23d-476d6462dba0} - BizHawk.Client.Common - - - {866f8d13-0678-4ff9-80a4-a3993fd4d8a3} - BizHawk.Common - - - {e1a23168-b571-411c-b360-2229e7225e0e} - BizHawk.Emulation.Common - - - - - - - - - + + + + + Debug + AnyCPU + {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA} + Library + Properties + BizHawk.Client.ApiHawk + BizHawk.Client.ApiHawk + v4.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + x86 + + + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + true + ..\output\dll\ + DEBUG;TRACE + full + x86 + prompt + MinimumRecommendedRules.ruleset + + + + + ..\output\dll\ + TRACE + true + pdbonly + x86 + prompt + MinimumRecommendedRules.ruleset + + + + + + + + + + + + + + + + + + + + + + + {24a0aa3c-b25f-4197-b23d-476d6462dba0} + BizHawk.Client.Common + + + {866f8d13-0678-4ff9-80a4-a3993fd4d8a3} + BizHawk.Common + + + {e1a23168-b571-411c-b360-2229e7225e0e} + BizHawk.Emulation.Common + + + + + + + + --> \ No newline at end of file diff --git a/BizHawk.Client.ApiHawk/Classes/ExternalToolManager.cs b/BizHawk.Client.ApiHawk/Classes/ExternalToolManager.cs new file mode 100644 index 0000000000..631d789319 --- /dev/null +++ b/BizHawk.Client.ApiHawk/Classes/ExternalToolManager.cs @@ -0,0 +1,174 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Reflection; + +using System.Windows.Forms; +using BizHawk.Client.Common; +using BizHawk.Client.EmuHawk; + +namespace BizHawk.Client.ApiHawk +{ + /// + /// This static class handle all ExternalTools + /// + public static class ExternalToolManager + { + #region Fields + + private static FileSystemWatcher directoryMonitor; + private static List menuItems = new List(); + + #endregion + + #region cTor(s) + + /// + /// Initilization + /// + static ExternalToolManager() + { + if(!Directory.Exists(Global.Config.PathEntries["Global", "External Tools"].Path)) + { + Directory.CreateDirectory(Global.Config.PathEntries["Global", "External Tools"].Path); + } + directoryMonitor = new FileSystemWatcher(Global.Config.PathEntries["Global", "External Tools"].Path, "*.dll"); + directoryMonitor.IncludeSubdirectories = false; + directoryMonitor.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName; + directoryMonitor.Filter = "*.dll"; + directoryMonitor.Created += new FileSystemEventHandler(DirectoryMonitor_Created); + directoryMonitor.EnableRaisingEvents = true; + + BuildToolStrip(); + } + + #endregion + + #region Methods + + /// + /// Build the toolstrip menu + /// + private static void BuildToolStrip() + { + menuItems.Clear(); + if (Directory.Exists(directoryMonitor.Path)) + { + DirectoryInfo dInfo = new DirectoryInfo(directoryMonitor.Path); + + foreach (FileInfo fi in dInfo.GetFiles("*.dll")) + { + menuItems.Add(GenerateToolTipFromFileName(fi.FullName)); + } + } + } + + /// + /// Generate a from an + /// external tool dll. + /// The assembly must have in its + /// assembly attributes + /// + /// File that will be reflected + /// A new ; assembly path can be found in the Tag property + /// For the moment, you could only load a dll that have a form (which implements ) + private static ToolStripMenuItem GenerateToolTipFromFileName(string fileName) + { + Type customFormType; + Assembly externalToolFile; + ToolStripMenuItem item = null; + try + { + externalToolFile = Assembly.LoadFrom(fileName); + object[] attributes = externalToolFile.GetCustomAttributes(typeof(BizHawkExternalToolAttribute), false); + if (attributes != null && attributes.Count() == 1) + { + BizHawkExternalToolAttribute attribute = (BizHawkExternalToolAttribute)attributes[0]; + item = new ToolStripMenuItem(attribute.Name); + item.ToolTipText = attribute.Description; + if (attribute.IconResourceName != string.Empty) + { + Stream s = externalToolFile.GetManifestResourceStream(string.Format("{0}.{1}", externalToolFile.GetName().Name, attribute.IconResourceName)); + if (s != null) + { + item.Image = new Bitmap(s); + } + } + + customFormType = externalToolFile.GetTypes().FirstOrDefault(t => t != null && t.FullName == "BizHawk.Client.EmuHawk.CustomMainForm"); + if (customFormType == null) + { + item.ToolTipText = "Does not have a CustomMainForm"; + item.Enabled = false; + } + item.Tag = fileName; + } + else + { + item = new ToolStripMenuItem(externalToolFile.GetName().Name); + item.ToolTipText = "BizHawkExternalTool attribute hasn't been found"; + item.Enabled = false; + } + } + catch (BadImageFormatException) + { + item = new ToolStripMenuItem(fileName); + item.ToolTipText = "This is not an assembly"; + item.Enabled = false; + } + +#if DEBUG //I added special debug stuff to get additionnal informations. Don(t think it can be usefull for released versions + catch (ReflectionTypeLoadException ex) + { + foreach (Exception e in ex.LoaderExceptions) + { + Debug.WriteLine(e.Message); + } + item.ToolTipText = "Something goes wrong while trying to load"; + item.Enabled = false; + } +#else + catch (ReflectionTypeLoadException) + { + item.ToolTipText = "Something goes wrong while trying to load"; + item.Enabled = false; + } +#endif + + return item; + } + + /// + /// This event is raised when we add a dll file into + /// the external tools path. + /// It will automatically load the assembly and add it into the list + /// + /// Object that raised the event + /// Event arguments + private static void DirectoryMonitor_Created(object sender, FileSystemEventArgs e) + { + menuItems.Add(GenerateToolTipFromFileName(e.FullPath)); + } + + #endregion + + #region Properties + + /// + /// Gets a prebuild + /// This list auto-updated by the itself + /// + public static IEnumerable ToolStripMenu + { + get + { + return menuItems; + } + } + + #endregion + } +} diff --git a/BizHawk.Client.ApiHawk/Resources/ApiClassDiagram.cd b/BizHawk.Client.ApiHawk/Resources/ApiClassDiagram.cd index 54b73a0b86..669f44d4a3 100644 --- a/BizHawk.Client.ApiHawk/Resources/ApiClassDiagram.cd +++ b/BizHawk.Client.ApiHawk/Resources/ApiClassDiagram.cd @@ -1,14 +1,7 @@  - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Attributes\ConfigPersistAttribute.cs - - - + @@ -16,19 +9,19 @@ - + - + - + - + @@ -36,14 +29,27 @@ - - - - - + + + + + + + + AAAAAQAAAAAAAAAAAAAQAAAAAAgBAAAAAAACAAAAAAI= + Classes\ExternalToolManager.cs + + + + + + AAAAAAAAAAAgAAAAIAAAIAQAAAAAACAEAAAAAAAAAAA= + Attributes\ExternalToolAttribute.cs + + @@ -53,24 +59,18 @@ - - ECAAAAAAAABACAAgAAEAABAAAAAEAAAAAAAAAACAQAA= - Interfaces\IToolForm.cs - + - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Interfaces\IToolFormAutoConfig.cs - + - + - + diff --git a/BizHawk.Client.Common/BizHawk.Client.Common.csproj b/BizHawk.Client.Common/BizHawk.Client.Common.csproj index 51de386cc8..9f25fdcc5b 100644 --- a/BizHawk.Client.Common/BizHawk.Client.Common.csproj +++ b/BizHawk.Client.Common/BizHawk.Client.Common.csproj @@ -105,6 +105,7 @@ + @@ -232,6 +233,8 @@ + + @@ -239,9 +242,15 @@ + + + + + + diff --git a/BizHawk.Client.Common/RomLoader.cs b/BizHawk.Client.Common/RomLoader.cs index cc977ef0a4..677f153f25 100644 --- a/BizHawk.Client.Common/RomLoader.cs +++ b/BizHawk.Client.Common/RomLoader.cs @@ -652,13 +652,16 @@ namespace BizHawk.Client.Common rom = new RomGame(file); game = rom.GameInfo; } - else if(ext != null) // most extensions + else if (ext != null) // most extensions { rom = new RomGame(file); //hacky for now if (file.Extension.ToLowerInvariant() == ".exe") rom.GameInfo.System = "PSX"; + else if (file.Extension.ToLowerInvariant() == ".nsf") + rom.GameInfo.System = "NES"; + if (string.IsNullOrEmpty(rom.GameInfo.System)) { diff --git a/BizHawk.Client.ApiHawk/Attributes/ConfigPersistAttribute.cs b/BizHawk.Client.Common/config/ConfigPersistAttribute.cs similarity index 100% rename from BizHawk.Client.ApiHawk/Attributes/ConfigPersistAttribute.cs rename to BizHawk.Client.Common/config/ConfigPersistAttribute.cs diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.Emu.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.Emu.cs index 6aa64e4dc9..93f55f608f 100644 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.Emu.cs +++ b/BizHawk.Client.Common/lua/EmuLuaLibrary.Emu.cs @@ -159,7 +159,7 @@ namespace BizHawk.Client.Common [LuaMethodAttributes( "islagged", - "returns whether or not the current frame is a lag frame" + "Returns whether or not the current frame is a lag frame" )] public bool IsLagged() { @@ -174,6 +174,22 @@ namespace BizHawk.Client.Common } } + [LuaMethodAttributes( + "setislagged", + "Sets the lag flag for the current frame. If no value is provided, it will default to true" + )] + public void SetIsLagged(bool value = true) + { + if (InputPollableCore != null) + { + InputPollableCore.IsLagFrame = value; + } + else + { + Log(string.Format("Can not set lag information, {0} does not implement IInputPollable", Emulator.Attributes().CoreName)); + } + } + [LuaMethodAttributes( "lagcount", "Returns the current lag count" diff --git a/BizHawk.Client.Common/lua/EmuLuaLibrary.Memory.cs b/BizHawk.Client.Common/lua/EmuLuaLibrary.Memory.cs index 6a9a4c3c12..1972a0b0a1 100644 --- a/BizHawk.Client.Common/lua/EmuLuaLibrary.Memory.cs +++ b/BizHawk.Client.Common/lua/EmuLuaLibrary.Memory.cs @@ -7,7 +7,7 @@ using BizHawk.Emulation.Common.IEmulatorExtensions; namespace BizHawk.Client.Common { - [Description("These functions behavior identically to the mainmemory functions but the user can set the memory domain to read and write from. The default domain is main memory. Use getcurrentmemorydomain(), and setcurrentmemorydomain() to control which domain is used. Each core has its own set of valid memory domains. Use getmemorydomainlist() to get a list of memory domains for the current core loaded.")] + [Description("These functions behavior identically to the mainmemory functions but the user can set the memory domain to read and write from. The default domain is main memory. Use getcurrentmemorydomain(), and usememorydomain() to control which domain is used. Each core has its own set of valid memory domains. Use getmemorydomainlist() to get a list of memory domains for the current core loaded.")] public sealed class MemoryLuaLibrary : LuaMemoryBase { //private int _currentMemoryDomain; // Main memory by default probably (index 0 is currently always main memory but may never be) diff --git a/BizHawk.Client.Common/movie/MovieSession.cs b/BizHawk.Client.Common/movie/MovieSession.cs index 5b59362755..31a76adcc2 100644 --- a/BizHawk.Client.Common/movie/MovieSession.cs +++ b/BizHawk.Client.Common/movie/MovieSession.cs @@ -219,7 +219,7 @@ namespace BizHawk.Client.Common { if (Movie.IsActive) { - writer.Write(Movie.GetInputLog()); + Movie.WriteInputLog(writer); } } diff --git a/BizHawk.Client.Common/movie/bk2/Bk2Movie.HeaderApi.cs b/BizHawk.Client.Common/movie/bk2/Bk2Movie.HeaderApi.cs index 92137a7cb5..ddc3e1b5da 100644 --- a/BizHawk.Client.Common/movie/bk2/Bk2Movie.HeaderApi.cs +++ b/BizHawk.Client.Common/movie/bk2/Bk2Movie.HeaderApi.cs @@ -67,7 +67,7 @@ namespace BizHawk.Client.Common { if (value) { - Header.Add(HeaderKeys.STARTSFROMSAVESTATE, "True"); + Header[HeaderKeys.STARTSFROMSAVESTATE] = "True"; } else { diff --git a/BizHawk.Client.Common/movie/bk2/Bk2Movie.IO.cs b/BizHawk.Client.Common/movie/bk2/Bk2Movie.IO.cs index 396f6239f8..e9e0b1bc83 100644 --- a/BizHawk.Client.Common/movie/bk2/Bk2Movie.IO.cs +++ b/BizHawk.Client.Common/movie/bk2/Bk2Movie.IO.cs @@ -183,7 +183,7 @@ namespace BizHawk.Client.Common bs.PutLump(BinaryStateLump.Subtitles, tw => tw.WriteLine(Subtitles.ToString())); bs.PutLump(BinaryStateLump.SyncSettings, tw => tw.WriteLine(_syncSettingsJson)); - bs.PutLump(BinaryStateLump.Input, tw => tw.WriteLine(RawInputLog())); + bs.PutLump(BinaryStateLump.Input, tw => WriteInputLog(tw)); if (StartsFromSavestate) { diff --git a/BizHawk.Client.Common/movie/bk2/Bk2Movie.InputLog.cs b/BizHawk.Client.Common/movie/bk2/Bk2Movie.InputLog.cs index 99425ac9ed..efd991227d 100644 --- a/BizHawk.Client.Common/movie/bk2/Bk2Movie.InputLog.cs +++ b/BizHawk.Client.Common/movie/bk2/Bk2Movie.InputLog.cs @@ -14,14 +14,19 @@ namespace BizHawk.Client.Common public string GetInputLog() { var sb = new StringBuilder(); - - sb.AppendLine("[Input]"); - sb.Append(RawInputLog()); - sb.AppendLine("[/Input]"); - + var writer = new StringWriter(sb); + WriteInputLog(writer); + writer.Flush(); return sb.ToString(); } + public void WriteInputLog(TextWriter writer) + { + writer.WriteLine("[Input]"); + WriteRawInputLog(writer); + writer.WriteLine("[/Input]"); + } + public string GetInputLogEntry(int frame) { if (frame < FrameCount && frame >= 0) @@ -294,19 +299,17 @@ namespace BizHawk.Client.Common return true; } - protected StringBuilder RawInputLog() + protected void WriteRawInputLog(TextWriter writer) { var lg = new Bk2LogEntryGenerator(LogKey); lg.SetSource(Global.MovieOutputHardpoint); - var sb = new StringBuilder(); - sb.AppendLine(lg.GenerateLogKey()); + writer.WriteLine(lg.GenerateLogKey()); + foreach (var record in _log) { - sb.AppendLine(record); + writer.WriteLine(record); } - - return sb; } /// diff --git a/BizHawk.Client.Common/movie/bk2/StringLogs.cs b/BizHawk.Client.Common/movie/bk2/StringLogs.cs index 16391df2b5..e284fadf8c 100644 --- a/BizHawk.Client.Common/movie/bk2/StringLogs.cs +++ b/BizHawk.Client.Common/movie/bk2/StringLogs.cs @@ -143,7 +143,7 @@ namespace BizHawk.Client.Common class Enumerator : IEnumerator { public DiskStringLog log; - int index; + int index = -1; public string Current { get { return log[index]; } } object System.Collections.IEnumerator.Current { get { return log[index]; } } bool System.Collections.IEnumerator.MoveNext() @@ -156,7 +156,7 @@ namespace BizHawk.Client.Common } return true; } - void System.Collections.IEnumerator.Reset() { index = 0; } + void System.Collections.IEnumerator.Reset() { index = -1; } public void Dispose() { } } diff --git a/BizHawk.Client.Common/movie/bkm/BkmMovie.InputLog.cs b/BizHawk.Client.Common/movie/bkm/BkmMovie.InputLog.cs index a508936aca..5926206ce2 100644 --- a/BizHawk.Client.Common/movie/bkm/BkmMovie.InputLog.cs +++ b/BizHawk.Client.Common/movie/bkm/BkmMovie.InputLog.cs @@ -13,17 +13,22 @@ namespace BizHawk.Client.Common public string GetInputLog() { var sb = new StringBuilder(); + var writer = new StringWriter(sb); + WriteInputLog(writer); + writer.Flush(); + return sb.ToString(); + } - sb.AppendLine("[Input]"); + public void WriteInputLog(TextWriter writer) + { + writer.WriteLine("[Input]"); foreach (var record in _log) { - sb.AppendLine(record); + writer.WriteLine(record); } - sb.AppendLine("[/Input]"); - - return sb.ToString(); + writer.WriteLine("[/Input]"); } public string GetInputLogEntry(int frame) diff --git a/BizHawk.Client.Common/movie/interfaces/IMovie.cs b/BizHawk.Client.Common/movie/interfaces/IMovie.cs index d6edda3e0a..4da742a75a 100644 --- a/BizHawk.Client.Common/movie/interfaces/IMovie.cs +++ b/BizHawk.Client.Common/movie/interfaces/IMovie.cs @@ -114,6 +114,11 @@ namespace BizHawk.Client.Common /// returns a string represntation of the input log in its current state string GetInputLog(); + /// + /// Writes the input log directly to the stream, bypassing the need to load it all into ram as a string + /// + void WriteInputLog(TextWriter writer); + /// /// Gets one frame from the input log. /// diff --git a/BizHawk.Client.Common/movie/tasproj/TasMovie.History.cs b/BizHawk.Client.Common/movie/tasproj/TasMovie.History.cs index 5a0c12abb2..2ddc1a639e 100644 --- a/BizHawk.Client.Common/movie/tasproj/TasMovie.History.cs +++ b/BizHawk.Client.Common/movie/tasproj/TasMovie.History.cs @@ -283,6 +283,11 @@ namespace BizHawk.Client.Common { if (IsRecording || force) { + if (oldPosition == -1) + name = "Set Marker at frame " + newMarker.Frame; + else + name = "Remove Marker at frame " + oldPosition; + AddMovieAction(name); History.Last().Add(new MovieActionMarker(newMarker, oldPosition, old_message)); } diff --git a/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs b/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs index 51f979c27f..ae9ae95442 100644 --- a/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs +++ b/BizHawk.Client.Common/movie/tasproj/TasMovie.IO.cs @@ -17,23 +17,8 @@ namespace BizHawk.Client.Common public Func ClientSettingsForSave { get; set; } public Action GetClientSettingsOnLoad { get; set; } - private const double PROGRESS_STEP = 100 / 12; // TODO hardcoded for now, there might be a better way of doing this - - private double _totalProgress = 0; - - private void ReportProgress(double percent) - { - if (_progressReportWorker != null) - { - _totalProgress += percent; - _progressReportWorker.ReportProgress((int)_totalProgress); - } - } - protected override void Write(string fn) { - _totalProgress = 0; - var file = new FileInfo(fn); if (!file.Directory.Exists) { @@ -43,29 +28,21 @@ namespace BizHawk.Client.Common using (var bs = new BinaryStateSaver(fn, false)) { bs.PutLump(BinaryStateLump.Movieheader, tw => tw.WriteLine(Header.ToString())); - ReportProgress(PROGRESS_STEP); bs.PutLump(BinaryStateLump.Comments, tw => tw.WriteLine(CommentsString())); - ReportProgress(PROGRESS_STEP); bs.PutLump(BinaryStateLump.Subtitles, tw => tw.WriteLine(Subtitles.ToString())); - ReportProgress(PROGRESS_STEP); bs.PutLump(BinaryStateLump.SyncSettings, tw => tw.WriteLine(SyncSettingsJson)); - ReportProgress(PROGRESS_STEP); - bs.PutLump(BinaryStateLump.Input, tw => tw.WriteLine(RawInputLog())); - ReportProgress(PROGRESS_STEP); + bs.PutLump(BinaryStateLump.Input, tw => WriteInputLog(tw)); // TasProj extras bs.PutLump(BinaryStateLump.StateHistorySettings, tw => tw.WriteLine(StateManager.Settings.ToString())); - ReportProgress(PROGRESS_STEP); + if (StateManager.Settings.SaveStateHistory) { bs.PutLump(BinaryStateLump.StateHistory, (BinaryWriter bw) => StateManager.Save(bw)); } - ReportProgress(PROGRESS_STEP); bs.PutLump(BinaryStateLump.LagLog, (BinaryWriter bw) => LagLog.Save(bw)); - ReportProgress(PROGRESS_STEP); bs.PutLump(BinaryStateLump.Markers, tw => tw.WriteLine(Markers.ToString())); - ReportProgress(PROGRESS_STEP); if (StartsFromSavestate) { @@ -82,14 +59,12 @@ namespace BizHawk.Client.Common { bs.PutLump(BinaryStateLump.MovieSaveRam, (BinaryWriter bw) => bw.Write(SaveRam)); } - ReportProgress(PROGRESS_STEP); if (ClientSettingsForSave != null) { var clientSettingsJson = ClientSettingsForSave(); bs.PutLump(BinaryStateLump.ClientSettings, (TextWriter tw) => tw.Write(clientSettingsJson)); } - ReportProgress(PROGRESS_STEP); if (VerificationLog.Any()) { @@ -104,7 +79,6 @@ namespace BizHawk.Client.Common bs.PutLump(BinaryStateLump.BranchStateHistory, (BinaryWriter bw) => StateManager.SaveBranchStates(bw)); } } - ReportProgress(PROGRESS_STEP); bs.PutLump(BinaryStateLump.Session, tw => tw.WriteLine(Session.ToString())); } diff --git a/BizHawk.Client.Common/movie/tasproj/TasMovie.cs b/BizHawk.Client.Common/movie/tasproj/TasMovie.cs index f8ef6337b0..e2e64d8e2c 100644 --- a/BizHawk.Client.Common/movie/tasproj/TasMovie.cs +++ b/BizHawk.Client.Common/movie/tasproj/TasMovie.cs @@ -24,7 +24,7 @@ namespace BizHawk.Client.Common public readonly IStringLog VerificationLog = StringLogUtil.MakeStringLog(); // For movies that do not begin with power-on, this is the input required to get into the initial state public readonly TasBranchCollection Branches = new TasBranchCollection(); - private BackgroundWorker _progressReportWorker = null; + public BackgroundWorker _progressReportWorker = null; public void NewBGWorker(BackgroundWorker newWorker) { _progressReportWorker = newWorker; @@ -149,6 +149,16 @@ namespace BizHawk.Client.Common } } + public void ReportProgress(double percent) + { + if (percent > 100d) + return; + if (_progressReportWorker != null) + { + _progressReportWorker.ReportProgress((int)percent); + } + } + #region Events and Handlers public event PropertyChangedEventHandler PropertyChanged; diff --git a/BizHawk.Client.Common/movie/tasproj/TasMovieMarker.cs b/BizHawk.Client.Common/movie/tasproj/TasMovieMarker.cs index 41fca12525..3328df7ed4 100644 --- a/BizHawk.Client.Common/movie/tasproj/TasMovieMarker.cs +++ b/BizHawk.Client.Common/movie/tasproj/TasMovieMarker.cs @@ -169,7 +169,7 @@ namespace BizHawk.Client.Common public new void Remove(TasMovieMarker item) { - if (item == null) // TODO: Don't do this. + if (item == null || item.Frame == 0) // TODO: Don't do this. return; _movie.ChangeLog.AddMarkerChange(null, item.Frame, item.Message); base.Remove(item); diff --git a/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs b/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs index 7e9118efe0..06a6e75f86 100644 --- a/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs +++ b/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs @@ -138,6 +138,10 @@ namespace BizHawk.Client.Common { get { + if (frame == 0) { + return new KeyValuePair(0, InitialState); + } + if (States.ContainsKey(frame)) { StateAccessed(frame); @@ -316,7 +320,7 @@ namespace BizHawk.Client.Common for (int i = from; i < upTo; i++) { - if (!_movie[i].Lagged.Value) + if (_movie[i].Lagged == null) return false; } @@ -561,6 +565,7 @@ namespace BizHawk.Client.Common bw.Write(kvp.Key); bw.Write(kvp.Value.Length); bw.Write(kvp.Value.State); + _movie.ReportProgress((double)100d / States.Count * i); } } diff --git a/BizHawk.Client.ApiHawk/Interfaces/IToolForm.cs b/BizHawk.Client.Common/tools/Interfaces/IToolForm.cs similarity index 100% rename from BizHawk.Client.ApiHawk/Interfaces/IToolForm.cs rename to BizHawk.Client.Common/tools/Interfaces/IToolForm.cs diff --git a/BizHawk.Client.ApiHawk/Interfaces/IToolFormAutoConfig.cs b/BizHawk.Client.Common/tools/Interfaces/IToolFormAutoConfig.cs similarity index 100% rename from BizHawk.Client.ApiHawk/Interfaces/IToolFormAutoConfig.cs rename to BizHawk.Client.Common/tools/Interfaces/IToolFormAutoConfig.cs diff --git a/BizHawk.Client.Common/tools/Watch/ByteWatch.cs b/BizHawk.Client.Common/tools/Watch/ByteWatch.cs index 18b62e4078..f5ecd6204b 100644 --- a/BizHawk.Client.Common/tools/Watch/ByteWatch.cs +++ b/BizHawk.Client.Common/tools/Watch/ByteWatch.cs @@ -38,14 +38,21 @@ namespace BizHawk.Client.Common internal ByteWatch(MemoryDomain domain, long address, DisplayType type, bool bigEndian, string note, byte value, byte previous, int changeCount) : base(domain, address, WatchSize.Byte, type, bigEndian, note) { - this._value = value; + if (value == 0) + { + this._value = GetByte(); + } + else + { + this._value = value; + } this._previous = previous; this._changecount = changeCount; } #endregion - #region Methods + #region Methods /// /// Enumerate wich are valid for a @@ -281,7 +288,7 @@ namespace BizHawk.Client.Common { get { - return FormatValue(_value); + return FormatValue(GetByte()); } } diff --git a/BizHawk.Client.Common/tools/Watch/DwordWatch.cs b/BizHawk.Client.Common/tools/Watch/DwordWatch.cs index 860aad7ee7..afc57b1cf7 100644 --- a/BizHawk.Client.Common/tools/Watch/DwordWatch.cs +++ b/BizHawk.Client.Common/tools/Watch/DwordWatch.cs @@ -38,7 +38,14 @@ namespace BizHawk.Client.Common internal DWordWatch(MemoryDomain domain, long address, DisplayType type, bool bigEndian, string note, uint value, uint previous, int changeCount) : base(domain, address, WatchSize.DWord, type, bigEndian, note) { - this._value = value; + if (value == 0) + { + this._value = GetDWord(); + } + else + { + this._value = value; + } this._previous = previous; this._changecount = changeCount; } diff --git a/BizHawk.Client.Common/tools/Watch/SeparatorWatch.cs b/BizHawk.Client.Common/tools/Watch/SeparatorWatch.cs index e00d522ee6..a7314c7f4c 100644 --- a/BizHawk.Client.Common/tools/Watch/SeparatorWatch.cs +++ b/BizHawk.Client.Common/tools/Watch/SeparatorWatch.cs @@ -74,8 +74,13 @@ namespace BizHawk.Client.Common { get { return string.Empty; } } - - public override string ToString() + + /// + /// TTransform the current instance into a displayable (short representation) string + /// It's used by the "Display on screen" option in the RamWatch window + /// + /// A well formatted string representation + public override string ToDisplayString() { return "----"; } diff --git a/BizHawk.Client.Common/tools/Watch/Watch.cs b/BizHawk.Client.Common/tools/Watch/Watch.cs index 2b74007322..affdf673fb 100644 --- a/BizHawk.Client.Common/tools/Watch/Watch.cs +++ b/BizHawk.Client.Common/tools/Watch/Watch.cs @@ -232,7 +232,18 @@ namespace BizHawk.Client.Common /// True if they are equals; otherwise, false public static bool operator ==(Watch a, Cheat b) { - return a.Equals(b); + if (object.ReferenceEquals(a, null) || object.ReferenceEquals(b, null)) + { + return false; + } + else if (object.ReferenceEquals(a, b)) + { + return true; + } + else + { + return a.Equals(b); + } } /// @@ -547,7 +558,7 @@ namespace BizHawk.Client.Common public override string ToString() { return string.Format("{0}\t{1}\t{2}\t{3}\t{4}\t{5}" - , Address.ToHexString((Domain.Size - 1).NumHexDigits()) + , Domain == null && Address == 0 ? "0" : Address.ToHexString((Domain.Size - 1).NumHexDigits()) , SizeAsChar , TypeAsChar , Convert.ToInt32(BigEndian) @@ -556,6 +567,16 @@ namespace BizHawk.Client.Common ); } + /// + /// Transform the current instance into a displayable (short representation) string + /// It's used by the "Display on screen" option in the RamWatch window + /// + /// A well formatted string representation + public virtual string ToDisplayString() + { + return string.Format("{0}: {1}", Notes, ValueString); + } + #endregion #region Properties diff --git a/BizHawk.Client.Common/tools/Watch/WatchList/WatchAddressComparer.cs b/BizHawk.Client.Common/tools/Watch/WatchList/WatchAddressComparer.cs index e17f4b4c30..eb30ad8e7d 100644 --- a/BizHawk.Client.Common/tools/Watch/WatchList/WatchAddressComparer.cs +++ b/BizHawk.Client.Common/tools/Watch/WatchList/WatchAddressComparer.cs @@ -12,83 +12,40 @@ namespace BizHawk.Client.Common /// Netsed private class that define how to compare two /// based on their address /// - private struct WatchAddressComparer - : IEqualityComparer, + private sealed class WatchAddressComparer + : WatchEqualityComparer, IComparer { /// - /// Compare two between them - /// and determine wich one comes first. + /// Compares two between them + /// and determines wich one comes first. /// If they are equals, comapraison will done one the domain and next on size /// /// First - /// True if are equal; otherwise, false - /// + /// Second + /// 0 for equality, 1 if x comes first; -1 if y comes first public int Compare(Watch x, Watch y) - { - if (Equals(x, y)) { - return 0; - } - else if (x.Address.Equals(y.Address)) - { - if (x.Domain.Name.Equals(y.Domain.Name)) + if (Equals(x, y)) { - return x.Size.CompareTo(y.Size); + return 0; + } + else if (x.Address.Equals(y.Address)) + { + if (x.Domain.Name.Equals(y.Domain.Name)) + { + return x.Size.CompareTo(y.Size); + } + else + { + return x.Domain.Name.CompareTo(y.Domain.Name); + } } else { - return x.Domain.Name.CompareTo(y.Domain.Name); + return x.Address.CompareTo(y.Address); } } - else - { - return x.Address.CompareTo(y.Address); - } - } - - /// - /// Determine if two are equals - /// - /// First - /// Second - /// True if are equal; otherwise, false - public bool Equals(Watch x, Watch y) - { - if (object.ReferenceEquals(x, null)) - { - if (object.ReferenceEquals(y, null)) - { - return true; - } - else - { - return false; - } - } - else if (object.ReferenceEquals(y, null)) - { - return false; - } - else if (object.ReferenceEquals(x, y)) - { - return true; - } - else - { - return x.Address.Equals(y.Address); - } - } - - /// - /// Get the hash value of specified - /// - /// Watch to get hash - /// int that can serves as a unique representation of current Watch - public int GetHashCode(Watch obj) - { - return obj.GetHashCode(); } } } -} diff --git a/BizHawk.Client.Common/tools/Watch/WatchList/WatchChangeCountComparer.cs b/BizHawk.Client.Common/tools/Watch/WatchList/WatchChangeCountComparer.cs new file mode 100644 index 0000000000..ceb96266d4 --- /dev/null +++ b/BizHawk.Client.Common/tools/Watch/WatchList/WatchChangeCountComparer.cs @@ -0,0 +1,51 @@ +using System.Collections.Generic; + +namespace BizHawk.Client.Common +{ + /// + /// This class hold a collection + /// Different memory domain can be mixed + /// + public sealed partial class WatchList + { + /// + /// Netsed private class that define how to compare two + /// based on the number of changes + /// + private sealed class WatchChangeCountComparer + :WatchEqualityComparer + ,IComparer + { + /// + /// Compares two between them + /// and determines wich one comes first. + /// If they are equals, comapraison will done one the address and next on size + /// + /// First + /// Second + /// 0 for equality, 1 if x comes first; -1 if y comes first + public int Compare(Watch x, Watch y) + { + if (Equals(x, y)) + { + return 0; + } + else if (x.ChangeCount.Equals(y.ChangeCount)) + { + if (x.Address.Equals(y.Address)) + { + return x.Size.CompareTo(y.Size); + } + else + { + return x.Address.CompareTo(y.Address); + } + } + else + { + return x.ChangeCount.CompareTo(y.ChangeCount); + } + } + } + } +} diff --git a/BizHawk.Client.Common/tools/Watch/WatchList/WatchDomainComparer.cs b/BizHawk.Client.Common/tools/Watch/WatchList/WatchDomainComparer.cs index 39e3778a46..4293797f48 100644 --- a/BizHawk.Client.Common/tools/Watch/WatchList/WatchDomainComparer.cs +++ b/BizHawk.Client.Common/tools/Watch/WatchList/WatchDomainComparer.cs @@ -12,25 +12,25 @@ namespace BizHawk.Client.Common /// Netsed private class that define how to compare two /// based on their domain /// - private struct WatchDomainComparer - : IEqualityComparer, + private sealed class WatchDomainComparer + : WatchEqualityComparer, IComparer { /// - /// Compare two between them - /// and determine wich one comes first. + /// Compares two between them + /// and determines wich one comes first. /// If they are equals, comapraison will done one the address and next on size /// /// First - /// True if are equal; otherwise, false - /// + ///Second + /// 0 for equality, 1 if x comes first; -1 if y comes first public int Compare(Watch x, Watch y) { - if(Equals(x, y)) + if (Equals(x, y)) { return 0; } - else if(x.Domain.Name.Equals(y.Domain.Name)) + else if (x.Domain.Name.Equals(y.Domain.Name)) { if (x.Address.Equals(y.Address)) { @@ -46,49 +46,6 @@ namespace BizHawk.Client.Common return x.Domain.Name.CompareTo(y.Domain.Name); } } - - /// - /// Determine if two are equals - /// - /// First - /// Second - /// True if are equal; otherwise, false - public bool Equals(Watch x, Watch y) - { - if(object.ReferenceEquals(x, null)) - { - if(object.ReferenceEquals(y, null)) - { - return true; - } - else - { - return false; - } - } - else if(object.ReferenceEquals(y, null)) - { - return false; - } - else if(object.ReferenceEquals(x,y)) - { - return true; - } - else - { - return x.Domain.Name.Equals(y.Domain.Name); - } - } - - /// - /// Get the hash value of specified - /// - /// Watch to get hash - /// int that can serves as a unique representation of current Watch - public int GetHashCode(Watch obj) - { - return obj.GetHashCode(); - } } } } diff --git a/BizHawk.Client.Common/tools/Watch/WatchList/WatchEqualityComparer.cs b/BizHawk.Client.Common/tools/Watch/WatchList/WatchEqualityComparer.cs new file mode 100644 index 0000000000..a7445904c3 --- /dev/null +++ b/BizHawk.Client.Common/tools/Watch/WatchList/WatchEqualityComparer.cs @@ -0,0 +1,58 @@ +using System.Collections.Generic; + +namespace BizHawk.Client.Common +{ + /// + /// This class hold a collection + /// Different memory domain can be mixed + /// + public sealed partial class WatchList + { + private class WatchEqualityComparer + : IEqualityComparer + { + /// + /// Determines if two are equals + /// + /// First + /// Second + /// True if are equal; otherwise, false + public bool Equals(Watch x, Watch y) + { + if (ReferenceEquals(x, null)) + { + if (ReferenceEquals(y, null)) + { + return true; + } + else + { + return false; + } + } + else if (ReferenceEquals(y, null)) + { + return false; + } + else if (ReferenceEquals(x, y)) + { + return true; + } + else + { + return false; + } + } + + /// + /// Gets the hash value of specified + /// + /// Watch to get hash + /// int that can serves as a unique representation of current Watch + public int GetHashCode(Watch obj) + { + return obj.GetHashCode(); + } + } + } +} diff --git a/BizHawk.Client.Common/tools/Watch/WatchList/WatchList.cs b/BizHawk.Client.Common/tools/Watch/WatchList/WatchList.cs index cb96859d9e..f3470cb9c7 100644 --- a/BizHawk.Client.Common/tools/Watch/WatchList/WatchList.cs +++ b/BizHawk.Client.Common/tools/Watch/WatchList/WatchList.cs @@ -33,6 +33,11 @@ namespace BizHawk.Client.Common private static readonly WatchDomainComparer domainComparer = new WatchDomainComparer(); private static readonly WatchAddressComparer addressComparer = new WatchAddressComparer(); + private static readonly WatchValueComparer valueComparer = new WatchValueComparer(); + private static readonly WatchPreviousValueComparer previousValueComparer = new WatchPreviousValueComparer(); + private static readonly WatchValueDifferenceComparer valueDifferenceComparer = new WatchValueDifferenceComparer(); + private static readonly WatchChangeCountComparer changeCountComparer = new WatchChangeCountComparer(); + private static readonly WatchNoteComparer noteComparer = new WatchNoteComparer(); private static IMemoryDomains _memoryDomains; @@ -256,92 +261,58 @@ namespace BizHawk.Client.Common } break; + case VALUE: if (reverse) { - _watchList = _watchList - .OrderByDescending(x => x.Value) - .ThenBy(x => x.Address) - .ThenBy(x => x.Size) - .ThenBy(x => x.Type) - .ThenBy(x => x.BigEndian) - .ToList(); + _watchList.Sort(valueComparer); + _watchList.Reverse(); } else { - _watchList = _watchList - .OrderBy(x => x.Value) - .ThenBy(x => x.Address) - .ThenBy(x => x.Size) - .ThenBy(x => x.Type) - .ThenBy(x => x.BigEndian) - .ToList(); + _watchList.Sort(valueComparer); } break; - case PREV: // Note: these only work if all entries are detailed objects! + + case PREV: if (reverse) { - _watchList = _watchList - .OrderByDescending(x => x.PreviousStr) - .ThenBy(x => x.Address) - .ThenBy(x => x.Size) - .ThenBy(x => x.Type) - .ToList(); + _watchList.Sort(previousValueComparer); + _watchList.Reverse(); } else { - _watchList = _watchList - .OrderBy(x => x.PreviousStr) - .ThenBy(x => x.Address) - .ThenBy(x => x.Size) - .ThenBy(x => x.Type) - .ToList(); + _watchList.Sort(previousValueComparer); } break; + case DIFF: if (reverse) { - _watchList = _watchList - .OrderByDescending(x => x.Diff) - .ThenBy(x => x.Address) - .ThenBy(x => x.Size) - .ThenBy(x => x.Type) - .ToList(); + _watchList.Sort(valueDifferenceComparer); + _watchList.Reverse(); } else { - _watchList = _watchList - .OrderBy(x => x.Diff) - .ThenBy(x => x.Address) - .ThenBy(x => x.Size) - .ThenBy(x => x.Type) - .ToList(); + _watchList.Sort(valueDifferenceComparer); } - break; + case CHANGES: if (reverse) { - _watchList = _watchList - .OrderByDescending(x => x.ChangeCount) - .ThenBy(x => x.Address) - .ThenBy(x => x.Size) - .ThenBy(x => x.Type) - .ToList(); + _watchList.Sort(changeCountComparer); + _watchList.Reverse(); } else { - _watchList = _watchList - .OrderBy(x => x.ChangeCount) - .ThenBy(x => x.Address) - .ThenBy(x => x.Size) - .ThenBy(x => x.Type) - .ToList(); + _watchList.Sort(changeCountComparer); } break; + case DOMAIN: if (reverse) { @@ -354,24 +325,16 @@ namespace BizHawk.Client.Common } break; + case NOTES: if (reverse) { - _watchList = _watchList - .OrderByDescending(x => x.Notes) - .ThenBy(x => x.Address) - .ThenBy(x => x.Size) - .ThenBy(x => x.Type) - .ToList(); + _watchList.Sort(noteComparer); + _watchList.Reverse(); } else { - _watchList = _watchList - .OrderBy(x => x.Notes) - .ThenBy(x => x.Address) - .ThenBy(x => x.Size) - .ThenBy(x => x.Type) - .ToList(); + _watchList.Sort(noteComparer); } break; @@ -521,7 +484,14 @@ namespace BizHawk.Client.Common }); } - [Obsolete("Use count property instead")] + [Obsolete("Use domain from individual watch instead")] + public MemoryDomain Domain + { + get { return _domain; } + set { _domain = value; } + } + + [Obsolete("Use count property instead", true)] public int ItemCount { get @@ -530,13 +500,6 @@ namespace BizHawk.Client.Common } } - [Obsolete("Use domain from individual watch instead")] - public MemoryDomain Domain - { - get { return _domain; } - set { _domain = value; } - } - #region File handling logic - probably needs to be its own class public bool Load(string path, bool append) diff --git a/BizHawk.Client.Common/tools/Watch/WatchList/WatchNoteComparer.cs b/BizHawk.Client.Common/tools/Watch/WatchList/WatchNoteComparer.cs new file mode 100644 index 0000000000..8c8caa5432 --- /dev/null +++ b/BizHawk.Client.Common/tools/Watch/WatchList/WatchNoteComparer.cs @@ -0,0 +1,51 @@ +using System.Collections.Generic; + +namespace BizHawk.Client.Common +{ + /// + /// This class hold a collection + /// Different memory domain can be mixed + /// + public sealed partial class WatchList + { + /// + /// Netsed private class that define how to compare two + /// based on their note + /// + private sealed class WatchNoteComparer + :WatchEqualityComparer, + IComparer + { + /// + /// Compares two between them + /// and determines wich one comes first. + /// If they are equals, comapraison will done one the address and next on size + /// + /// First + /// Second + /// 0 for equality, 1 if x comes first; -1 if y comes first + public int Compare(Watch x, Watch y) + { + if (Equals(x, y)) + { + return 0; + } + else if (string.Compare(x.Notes, y.Notes, true) == 0) + { + if (x.Address.Equals(y.Address)) + { + return x.Size.CompareTo(y.Size); + } + else + { + return x.Address.CompareTo(y.Address); + } + } + else + { + return string.Compare(x.Notes, y.Notes, true); + } + } + } + } +} diff --git a/BizHawk.Client.Common/tools/Watch/WatchList/WatchPreviousValueComparer.cs b/BizHawk.Client.Common/tools/Watch/WatchList/WatchPreviousValueComparer.cs new file mode 100644 index 0000000000..17045b3753 --- /dev/null +++ b/BizHawk.Client.Common/tools/Watch/WatchList/WatchPreviousValueComparer.cs @@ -0,0 +1,51 @@ +using System.Collections.Generic; + +namespace BizHawk.Client.Common +{ + /// + /// This class hold a collection + /// Different memory domain can be mixed + /// + public sealed partial class WatchList + { + /// + /// Netsed private class that define how to compare two + /// based on their previous value + /// + private sealed class WatchPreviousValueComparer + : WatchEqualityComparer, + IComparer + { + /// + /// Compares two between them + /// and determines wich one comes first. + /// If they are equals, comapraison will done one the address and next on size + /// + /// First + /// Second + /// 0 for equality, 1 if x comes first; -1 if y comes first + public int Compare(Watch x, Watch y) + { + if (Equals(x, y)) + { + return 0; + } + else if (x.Previous.Equals(y.Previous)) + { + if (x.Address.Equals(y.Address)) + { + return x.Size.CompareTo(y.Size); + } + else + { + return x.Address.CompareTo(y.Address); + } + } + else + { + return x.Previous.CompareTo(y.Previous); + } + } + } + } +} diff --git a/BizHawk.Client.Common/tools/Watch/WatchList/WatchValueComparer.cs b/BizHawk.Client.Common/tools/Watch/WatchList/WatchValueComparer.cs new file mode 100644 index 0000000000..c0ec61d2d9 --- /dev/null +++ b/BizHawk.Client.Common/tools/Watch/WatchList/WatchValueComparer.cs @@ -0,0 +1,72 @@ +using System.Collections.Generic; + +namespace BizHawk.Client.Common +{ + /// + /// This class hold a collection + /// Different memory domain can be mixed + /// + public sealed partial class WatchList + { + /// + /// Netsed private class that define how to compare two + /// based on their values + /// + private sealed class WatchValueComparer + : WatchEqualityComparer, + IComparer + { + /// + /// Compares two between them + /// and determines wich one comes first. + /// If they are equals, comapraison will done one the address and next on size + /// + /// First + ///Second + /// 0 for equality, 1 if x comes first; -1 if y comes first + public int Compare(Watch x, Watch y) + { + int xValue; + int yValue; + + if (x.Type == DisplayType.Signed) + { + int.TryParse(x.ValueString, out xValue); + } + else + { + xValue = x.Value; + } + + if (y.Type == DisplayType.Signed) + { + int.TryParse(y.ValueString, out yValue); + } + else + { + yValue = y.Value; + } + + if (Equals(x, y)) + { + return 0; + } + else if (xValue.Equals(yValue)) + { + if (x.Address.Equals(y.Address)) + { + return x.Size.CompareTo(y.Size); + } + else + { + return x.Address.CompareTo(y.Address); + } + } + else + { + return xValue.CompareTo(yValue); + } + } + } + } +} \ No newline at end of file diff --git a/BizHawk.Client.Common/tools/Watch/WatchList/WatchValueDifferenceComparer.cs b/BizHawk.Client.Common/tools/Watch/WatchList/WatchValueDifferenceComparer.cs new file mode 100644 index 0000000000..662b7886fc --- /dev/null +++ b/BizHawk.Client.Common/tools/Watch/WatchList/WatchValueDifferenceComparer.cs @@ -0,0 +1,52 @@ +using System.Collections.Generic; + +namespace BizHawk.Client.Common +{ + /// + /// This class hold a collection + /// Different memory domain can be mixed + /// + public sealed partial class WatchList + { + /// + /// Netsed private class that define how to compare two + /// based on the diffence between current and previous value + /// + private sealed class WatchValueDifferenceComparer + : WatchEqualityComparer + , IComparer + { + + /// + /// Compares two between them + /// and determines wich one comes first. + /// If they are equals, comapraison will done one the address and next on size + /// + /// First + /// Second + /// 0 for equality, 1 if x comes first; -1 if y comes first + public int Compare(Watch x, Watch y) + { + if (Equals(x, y)) + { + return 0; + } + else if (x.Diff.Equals(y.Diff)) + { + if (x.Address.Equals(y.Address)) + { + return x.Size.CompareTo(y.Size); + } + else + { + return x.Address.CompareTo(y.Address); + } + } + else + { + return x.Diff.CompareTo(y.Diff); + } + } + } + } +} diff --git a/BizHawk.Client.Common/tools/Watch/WordWatch.cs b/BizHawk.Client.Common/tools/Watch/WordWatch.cs index d0e393be9c..b8e1268ce3 100644 --- a/BizHawk.Client.Common/tools/Watch/WordWatch.cs +++ b/BizHawk.Client.Common/tools/Watch/WordWatch.cs @@ -38,7 +38,14 @@ namespace BizHawk.Client.Common internal WordWatch(MemoryDomain domain, long address, DisplayType type, bool bigEndian, string note, ushort value, ushort previous, int changeCount) : base(domain, address, WatchSize.Word, type, bigEndian, note) { - this._value = value; + if (value == 0) + { + this._value = GetWord(); + } + else + { + this._value = value; + } this._previous = previous; this._changecount = changeCount; } diff --git a/BizHawk.Client.DBMan/Program.cs b/BizHawk.Client.DBMan/Program.cs index 4cf8786185..cea5503d08 100644 --- a/BizHawk.Client.DBMan/Program.cs +++ b/BizHawk.Client.DBMan/Program.cs @@ -68,25 +68,6 @@ namespace BizHawk.Client.DBMan DeleteFileW(path + ":Zone.Identifier"); } - //for debugging purposes, this is provided. when we're satisfied everyone understands whats going on, we'll get rid of this - [DllImportAttribute("kernel32.dll", EntryPoint = "CreateFileW")] - public static extern System.IntPtr CreateFileW([InAttribute()] [MarshalAsAttribute(UnmanagedType.LPWStr)] string lpFileName, int dwDesiredAccess, int dwShareMode, [InAttribute()] int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, [InAttribute()] int hTemplateFile); - static void ApplyMOTW(string path) - { - int generic_write = 0x40000000; - int file_share_write = 2; - int create_always = 2; - var adsHandle = CreateFileW(path + ":Zone.Identifier", generic_write, file_share_write, 0, create_always, 0, 0); - using (var sfh = new Microsoft.Win32.SafeHandles.SafeFileHandle(adsHandle, true)) - { - var adsStream = new System.IO.FileStream(sfh, FileAccess.Write); - StreamWriter sw = new StreamWriter(adsStream); - sw.Write("[ZoneTransfer]\r\nZoneId=3"); - sw.Flush(); - adsStream.Close(); - } - } - static void WhackAllMOTW(string dllDir) { var todo = new Queue(new[] { new DirectoryInfo(dllDir) }); diff --git a/BizHawk.Client.DiscoHawk/DiscoHawk.cs b/BizHawk.Client.DiscoHawk/DiscoHawk.cs index 682af2bfa2..7508c3bcd2 100644 --- a/BizHawk.Client.DiscoHawk/DiscoHawk.cs +++ b/BizHawk.Client.DiscoHawk/DiscoHawk.cs @@ -123,25 +123,6 @@ namespace BizHawk.Client.DiscoHawk DeleteFileW(path + ":Zone.Identifier"); } - //for debugging purposes, this is provided. when we're satisfied everyone understands whats going on, we'll get rid of this - [DllImportAttribute("kernel32.dll", EntryPoint = "CreateFileW")] - public static extern System.IntPtr CreateFileW([InAttribute()] [MarshalAsAttribute(UnmanagedType.LPWStr)] string lpFileName, int dwDesiredAccess, int dwShareMode, [InAttribute()] int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, [InAttribute()] int hTemplateFile); - static void ApplyMOTW(string path) - { - int generic_write = 0x40000000; - int file_share_write = 2; - int create_always = 2; - var adsHandle = CreateFileW(path + ":Zone.Identifier", generic_write, file_share_write, 0, create_always, 0, 0); - using (var sfh = new Microsoft.Win32.SafeHandles.SafeFileHandle(adsHandle, true)) - { - var adsStream = new System.IO.FileStream(sfh, FileAccess.Write); - StreamWriter sw = new StreamWriter(adsStream); - sw.Write("[ZoneTransfer]\r\nZoneId=3"); - sw.Flush(); - adsStream.Close(); - } - } - static void WhackAllMOTW(string dllDir) { var todo = new Queue(new[] { new DirectoryInfo(dllDir) }); diff --git a/BizHawk.Client.EmuHawk/AVOut/AviWriter.cs b/BizHawk.Client.EmuHawk/AVOut/AviWriter.cs index 0f3556fa3e..84e02d7bec 100644 --- a/BizHawk.Client.EmuHawk/AVOut/AviWriter.cs +++ b/BizHawk.Client.EmuHawk/AVOut/AviWriter.cs @@ -228,7 +228,7 @@ namespace BizHawk.Client.EmuHawk File.Delete(tempfile); tempfile = Path.ChangeExtension(tempfile, "avi"); temp.OpenFile(tempfile, temp_params, null); //lastToken); - CodecToken token = (CodecToken)temp.AcquireVideoCodecToken(hwnd.Handle); + CodecToken token = (CodecToken)temp.AcquireVideoCodecToken(hwnd.Handle, currVideoCodecToken); temp.CloseFile(); File.Delete(tempfile); return token; @@ -346,66 +346,59 @@ namespace BizHawk.Client.EmuHawk public class CodecToken : IDisposable { - ~CodecToken() - { - Dispose(); - } - public static CodecToken TakePossession(Win32.AVICOMPRESSOPTIONS comprOptions) + public void Dispose() { } + private CodecToken() { } + private Win32.AVICOMPRESSOPTIONS comprOptions; + public string codec; + public byte[] Format = new byte[0]; + public byte[] Parms = new byte[0]; + + public static CodecToken CreateFromAVICOMPRESSOPTIONS(ref Win32.AVICOMPRESSOPTIONS opts) { CodecToken ret = new CodecToken(); - ret.allocated = true; - ret.comprOptions = comprOptions; - ret.codec = Win32.decode_mmioFOURCC(comprOptions.fccHandler); + ret.comprOptions = opts; + ret.codec = Win32.decode_mmioFOURCC(opts.fccHandler); + ret.Format = new byte[opts.cbFormat]; + ret.Parms = new byte[opts.cbParms]; + if(opts.lpFormat != 0) Marshal.Copy(new IntPtr(opts.lpFormat), ret.Format, 0, opts.cbFormat); + if (opts.lpParms != 0) Marshal.Copy(new IntPtr(opts.lpParms), ret.Parms, 0, opts.cbParms); + return ret; } - private CodecToken() { } - public Win32.AVICOMPRESSOPTIONS comprOptions; - public string codec; - /// - /// true if data was allocated by AviSaveOptions and should be freed by AVISaveOptionsFree - /// - bool allocated = false; - /// - /// true if data was allocated by AllocHGlobal and should be freed by FreeHGlobal - /// - bool marshaled = false; - public void Dispose() + + + [DllImport("kernel32.dll", SetLastError = true)] + public static extern bool HeapFree(IntPtr hHeap, uint dwFlags, int lpMem); + [DllImport("kernel32.dll", SetLastError = true)] + public static extern IntPtr GetProcessHeap(); + [DllImport("kernel32.dll", SetLastError = false)] + public static extern IntPtr HeapAlloc(IntPtr hHeap, uint dwFlags, int dwBytes); + + public static void DeallocateAVICOMPRESSOPTIONS(ref Win32.AVICOMPRESSOPTIONS opts) { - if (allocated) - { - IntPtr[] infPtrs = new IntPtr[1]; - IntPtr mem; - - // alloc unmanaged memory - mem = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Win32.AVICOMPRESSOPTIONS))); - infPtrs[0] = mem; - - // copy from managed structure to unmanaged memory - Marshal.StructureToPtr(comprOptions, mem, false); - - Win32.AVISaveOptionsFree(1, infPtrs); - Marshal.FreeHGlobal(mem); - - codec = null; - comprOptions = new Win32.AVICOMPRESSOPTIONS(); - allocated = false; - } - if (marshaled) - { - IntPtr p; - p = (IntPtr)comprOptions.lpFormat; - if (p != IntPtr.Zero) - Marshal.FreeHGlobal(p); - p = (IntPtr)comprOptions.lpParms; - if (p != IntPtr.Zero) - Marshal.FreeHGlobal(p); - - codec = null; - comprOptions = new Win32.AVICOMPRESSOPTIONS(); - marshaled = false; - } + //test: increase stability by never freeing anything, ever + //if (opts.lpParms != 0) CodecToken.HeapFree(CodecToken.GetProcessHeap(), 0, opts.lpParms); + //if (opts.lpFormat != 0) CodecToken.HeapFree(CodecToken.GetProcessHeap(), 0, opts.lpFormat); + opts.lpParms = 0; + opts.lpFormat = 0; } + + public void AllocateToAVICOMPRESSOPTIONS(ref Win32.AVICOMPRESSOPTIONS opts) + { + opts = comprOptions; + if (opts.cbParms != 0) + { + opts.lpParms = HeapAlloc(GetProcessHeap(), 0, opts.cbParms).ToInt32(); + Marshal.Copy(Parms, 0, new IntPtr(opts.lpParms), opts.cbParms); + } + if (opts.cbFormat != 0) + { + opts.lpFormat = HeapAlloc(GetProcessHeap(), 0, opts.cbFormat).ToInt32(); + Marshal.Copy(Format, 0, new IntPtr(opts.lpFormat), opts.cbFormat); + } + } + byte[] SerializeToByteArray() { var m = new MemoryStream(); @@ -422,17 +415,8 @@ namespace BizHawk.Client.EmuHawk //b.Write(comprOptions.lpParms); b.Write(comprOptions.cbParms); b.Write(comprOptions.dwInterleaveEvery); - - // make opaque copies of the unmanaged structs pointed to - byte[] Format = new byte[comprOptions.cbFormat]; - byte[] Params = new byte[comprOptions.cbParms]; - if (comprOptions.lpFormat != 0) - Marshal.Copy(new IntPtr(comprOptions.lpFormat), Format, 0, Format.Length); - if (comprOptions.lpParms != 0) - Marshal.Copy(new IntPtr(comprOptions.lpParms), Params, 0, Params.Length); - b.Write(Format); - b.Write(Params); + b.Write(Parms); b.Close(); return m.ToArray(); } @@ -445,7 +429,7 @@ namespace BizHawk.Client.EmuHawk Win32.AVICOMPRESSOPTIONS comprOptions = new Win32.AVICOMPRESSOPTIONS(); byte[] Format; - byte[] Params; + byte[] Parms; try { @@ -463,7 +447,7 @@ namespace BizHawk.Client.EmuHawk comprOptions.dwInterleaveEvery = b.ReadInt32(); Format = b.ReadBytes(comprOptions.cbFormat); - Params = b.ReadBytes(comprOptions.cbParms); + Parms = b.ReadBytes(comprOptions.cbParms); } catch (IOException) { @@ -475,27 +459,10 @@ namespace BizHawk.Client.EmuHawk b.Close(); } - // create unmanaged copies of Format, Params - if (comprOptions.cbFormat != 0) - { - IntPtr lpFormat = Marshal.AllocHGlobal(comprOptions.cbFormat); - Marshal.Copy(Format, 0, lpFormat, comprOptions.cbFormat); - comprOptions.lpFormat = (int)lpFormat; - } - else - comprOptions.lpFormat = (int)IntPtr.Zero; - if (comprOptions.cbParms != 0) - { - IntPtr lpParms = Marshal.AllocHGlobal(comprOptions.cbParms); - Marshal.Copy(Params, 0, lpParms, comprOptions.cbParms); - comprOptions.lpParms = (int)lpParms; - } - else - comprOptions.lpParms = (int)IntPtr.Zero; - CodecToken ret = new CodecToken(); - ret.marshaled = true; ret.comprOptions = comprOptions; + ret.Format = Format; + ret.Parms = Parms; ret.codec = Win32.decode_mmioFOURCC(comprOptions.fccHandler); return ret; } @@ -573,22 +540,15 @@ namespace BizHawk.Client.EmuHawk public long GetLengthApproximation() { return outStatus.video_bytes + outStatus.audio_bytes; } - static int AVISaveOptions(IntPtr stream, ref Win32.AVICOMPRESSOPTIONS opts, IntPtr owner) + static unsafe int AVISaveOptions(IntPtr stream, ref Win32.AVICOMPRESSOPTIONS opts, IntPtr owner) { - IntPtr mem = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Win32.AVICOMPRESSOPTIONS))); - - Marshal.StructureToPtr(opts, mem, false); - - IntPtr[] streams = new[] { stream }; - IntPtr[] infPtrs = new[] { mem }; - - int ret = Win32.AVISaveOptions(owner, 0, 1, streams, infPtrs); - - opts = (Win32.AVICOMPRESSOPTIONS)Marshal.PtrToStructure(mem, typeof(Win32.AVICOMPRESSOPTIONS)); - - Marshal.FreeHGlobal(mem); - - return ret; + fixed (Win32.AVICOMPRESSOPTIONS* _popts = &opts) + { + IntPtr* pStream = &stream; + Win32.AVICOMPRESSOPTIONS* popts = _popts; + Win32.AVICOMPRESSOPTIONS** ppopts = &popts; + return Win32.AVISaveOptions(owner, 0, 1, (void*)pStream, (void*)ppopts); + } } Parameters parameters; @@ -640,23 +600,40 @@ namespace BizHawk.Client.EmuHawk IsOpen = true; } + /// /// Acquires a video codec configuration from the user /// - public IDisposable AcquireVideoCodecToken(IntPtr hwnd) + public IDisposable AcquireVideoCodecToken(IntPtr hwnd, CodecToken lastCodecToken) { if (!IsOpen) throw new InvalidOperationException("File must be opened before acquiring a codec token (or else the stream formats wouldnt be known)"); + if (lastCodecToken != null) + currVideoCodecToken = lastCodecToken; + //encoder params Win32.AVICOMPRESSOPTIONS comprOptions = new Win32.AVICOMPRESSOPTIONS(); if (currVideoCodecToken != null) { - comprOptions = currVideoCodecToken.comprOptions; + currVideoCodecToken.AllocateToAVICOMPRESSOPTIONS(ref comprOptions); } - if (AVISaveOptions(pAviRawVideoStream, ref comprOptions, hwnd) != 0) + + bool result = AVISaveOptions(pAviRawVideoStream, ref comprOptions, hwnd) != 0; + CodecToken ret = CodecToken.CreateFromAVICOMPRESSOPTIONS(ref comprOptions); + + //so, AVISaveOptions may have changed some of the pointers + //if it changed the pointers, did it it free the old ones? we don't know + //let's assume it frees them. if we're wrong, we leak. if we assume otherwise and we're wrong, we may crash. + //so that means any pointers that come in here are either + //1. ones we allocated a minute ago + //2. ones VFW allocated + //guess what? doesn't matter. We'll free them all ourselves. + CodecToken.DeallocateAVICOMPRESSOPTIONS(ref comprOptions); + + + if(result) { - CodecToken ret = CodecToken.TakePossession(comprOptions); - // save to config as well + // save to config and return it Global.Config.AVICodecToken = ret.Serialize(); return ret; } @@ -673,7 +650,12 @@ namespace BizHawk.Client.EmuHawk throw new InvalidOperationException("set a video codec token before opening the streams!"); //open compressed video stream - if (Win32.FAILED(Win32.AVIMakeCompressedStream(out pAviCompressedVideoStream, pAviRawVideoStream, ref currVideoCodecToken.comprOptions, IntPtr.Zero))) + Win32.AVICOMPRESSOPTIONS opts = new Win32.AVICOMPRESSOPTIONS(); + currVideoCodecToken.AllocateToAVICOMPRESSOPTIONS(ref opts); + bool failed = Win32.FAILED(Win32.AVIMakeCompressedStream(out pAviCompressedVideoStream, pAviRawVideoStream, ref opts, IntPtr.Zero)); + CodecToken.DeallocateAVICOMPRESSOPTIONS(ref opts); + + if(failed) { CloseStreams(); throw new InvalidOperationException("Failed making compressed video stream"); diff --git a/BizHawk.Client.EmuHawk/AVOut/FFmpegWriter.cs b/BizHawk.Client.EmuHawk/AVOut/FFmpegWriter.cs index 517f0c3265..51d7d08db1 100644 --- a/BizHawk.Client.EmuHawk/AVOut/FFmpegWriter.cs +++ b/BizHawk.Client.EmuHawk/AVOut/FFmpegWriter.cs @@ -82,7 +82,7 @@ namespace BizHawk.Client.EmuHawk { ffmpeg = new Process(); #if WINDOWS - ffmpeg.StartInfo.FileName = System.IO.Path.Combine(PathManager.GetDllDirectory(), "dll", "ffmpeg.exe"); + ffmpeg.StartInfo.FileName = System.IO.Path.Combine(PathManager.GetDllDirectory(), "ffmpeg.exe"); #else ffmpeg.StartInfo.FileName = "ffmpeg"; // expecting native version to be in path #endif diff --git a/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj b/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj index 88b0b3faa6..a99f24dbb9 100644 --- a/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj +++ b/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj @@ -479,6 +479,9 @@ Component + + Component + Form @@ -501,6 +504,12 @@ MsgBox.cs + + Form + + + PrereqsAlert.cs + Form @@ -807,6 +816,12 @@ HexFind.cs + + Form + + + NewHexEditor.cs + @@ -1318,6 +1333,9 @@ MsgBox.cs + + PrereqsAlert.cs + QuickProgressPopup.cs @@ -1421,6 +1439,9 @@ HexFind.cs + + NewHexEditor.cs + LuaCanvas.cs diff --git a/BizHawk.Client.EmuHawk/CustomControls/HexView.cs b/BizHawk.Client.EmuHawk/CustomControls/HexView.cs new file mode 100644 index 0000000000..30faae953b --- /dev/null +++ b/BizHawk.Client.EmuHawk/CustomControls/HexView.cs @@ -0,0 +1,116 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Windows.Forms; + +using BizHawk.Client.Common; +using BizHawk.Client.EmuHawk.CustomControls; + +namespace BizHawk.Client.EmuHawk +{ + public class HexView : Control + { + private readonly GDIRenderer Gdi; + private readonly Font NormalFont; + private Size _charSize; + + private long _arrayLength; + + public HexView() + { + NormalFont = new Font("Courier New", 8); // Only support fixed width + + SetStyle(ControlStyles.AllPaintingInWmPaint, true); + SetStyle(ControlStyles.UserPaint, true); + SetStyle(ControlStyles.SupportsTransparentBackColor, true); + SetStyle(ControlStyles.Opaque, true); + + Gdi = new GDIRenderer(); + + using (var g = CreateGraphics()) + using (var LCK = Gdi.LockGraphics(g)) + { + _charSize = Gdi.MeasureString("A", NormalFont); // TODO make this a property so changing it updates other values. + } + } + + protected override void Dispose(bool disposing) + { + Gdi.Dispose(); + + NormalFont.Dispose(); + + base.Dispose(disposing); + } + + #region Paint + + protected override void OnPaint(PaintEventArgs e) + { + using (var LCK = Gdi.LockGraphics(e.Graphics)) + { + Gdi.StartOffScreenBitmap(Width, Height); + + // White Background + Gdi.SetBrush(Color.White); + Gdi.SetSolidPen(Color.White); + Gdi.FillRectangle(0, 0, Width, Height); + + + Gdi.DrawString("Hello World", new Point(10, 10)); + + Gdi.CopyToScreen(); + Gdi.EndOffScreenBitmap(); + } + } + + #endregion + + #region Properties + + /// + /// Gets or sets the sets the virtual number of the length of the array to display + /// + [Category("Behavior")] + public long ArrayLength + { + get + { + return _arrayLength; + } + + set + { + _arrayLength = value; + RecalculateScrollBars(); + } + } + + #endregion + + #region Event Handlers + + [Category("Virtual")] + public event QueryIndexValueHandler QueryIndexValue; + + [Category("Virtual")] + public event QueryIndexBkColorHandler QueryIndexBgColor; + + [Category("Virtual")] + public event QueryIndexForeColorHandler QueryIndexForeColor; + + public delegate void QueryIndexValueHandler(int index, out long value); + + public delegate void QueryIndexBkColorHandler(int index, ref Color color); + + public delegate void QueryIndexForeColorHandler(int index, ref Color color); + + #endregion + + private void RecalculateScrollBars() + { + } + } +} diff --git a/BizHawk.Client.EmuHawk/CustomControls/InputRoll.cs b/BizHawk.Client.EmuHawk/CustomControls/InputRoll.cs index e596621cfc..79a33f85b4 100644 --- a/BizHawk.Client.EmuHawk/CustomControls/InputRoll.cs +++ b/BizHawk.Client.EmuHawk/CustomControls/InputRoll.cs @@ -279,6 +279,12 @@ namespace BizHawk.Client.EmuHawk [Category("Behavior")] public bool AlwaysScroll { get; set; } + /// + /// Gets or sets the lowest seek interval to activate the progress bar + /// + [Category("Behavior")] + public int SeekingCutoffInterval { get; set; } + /// /// Returns all columns including those that are not visible /// diff --git a/BizHawk.Client.EmuHawk/CustomControls/PrereqsAlert.Designer.cs b/BizHawk.Client.EmuHawk/CustomControls/PrereqsAlert.Designer.cs new file mode 100644 index 0000000000..506c08a998 --- /dev/null +++ b/BizHawk.Client.EmuHawk/CustomControls/PrereqsAlert.Designer.cs @@ -0,0 +1,168 @@ +namespace BizHawk.Client.EmuHawk.CustomControls +{ + partial class PrereqsAlert + { + /// + /// 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() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PrereqsAlert)); + this.linkLabel1 = new System.Windows.Forms.LinkLabel(); + this.label1 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.linkLabel2 = new System.Windows.Forms.LinkLabel(); + this.label3 = new System.Windows.Forms.Label(); + this.button1 = new System.Windows.Forms.Button(); + this.label4 = new System.Windows.Forms.Label(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // linkLabel1 + // + this.linkLabel1.AutoSize = true; + this.linkLabel1.Location = new System.Drawing.Point(21, 214); + this.linkLabel1.Name = "linkLabel1"; + this.linkLabel1.Size = new System.Drawing.Size(291, 13); + this.linkLabel1.TabIndex = 0; + this.linkLabel1.TabStop = true; + this.linkLabel1.Text = "https://sourceforge.net/projects/bizhawk/files/Prerequisites"; + this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 9); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(425, 13); + this.label1.TabIndex = 1; + this.label1.Text = "You\'re missing some of the following prerequisites, which prevents BizHawk from r" + + "unning:"; + // + // textBox1 + // + this.textBox1.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBox1.Location = new System.Drawing.Point(12, 34); + this.textBox1.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.ReadOnly = true; + this.textBox1.Size = new System.Drawing.Size(422, 142); + this.textBox1.TabIndex = 2; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(0, 191); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(250, 13); + this.label2.TabIndex = 3; + this.label2.Text = "You should run the latest prerequisites installer from:"; + // + // linkLabel2 + // + this.linkLabel2.AutoSize = true; + this.linkLabel2.Location = new System.Drawing.Point(21, 261); + this.linkLabel2.Name = "linkLabel2"; + this.linkLabel2.Size = new System.Drawing.Size(168, 13); + this.linkLabel2.TabIndex = 4; + this.linkLabel2.TabStop = true; + this.linkLabel2.Text = "http://tasvideos.org/Bizhawk.html"; + this.linkLabel2.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel2_LinkClicked); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(3, 238); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(282, 13); + this.label3.TabIndex = 5; + this.label3.Text = "In case that URL is gone, you can get more information at:"; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(374, 370); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 6; + this.button1.Text = "Close"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(3, 286); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(141, 13); + this.label4.TabIndex = 7; + this.label4.Text = "Here\'s some general advice:"; + // + // textBox2 + // + this.textBox2.Location = new System.Drawing.Point(12, 315); + this.textBox2.Multiline = true; + this.textBox2.Name = "textBox2"; + this.textBox2.ReadOnly = true; + this.textBox2.Size = new System.Drawing.Size(332, 78); + this.textBox2.TabIndex = 8; + this.textBox2.Text = resources.GetString("textBox2.Text"); + // + // PrereqsAlert + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(461, 402); + this.Controls.Add(this.textBox2); + this.Controls.Add(this.label4); + this.Controls.Add(this.button1); + this.Controls.Add(this.label3); + this.Controls.Add(this.linkLabel2); + this.Controls.Add(this.label2); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.label1); + this.Controls.Add(this.linkLabel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "PrereqsAlert"; + this.Text = "Prerequisites Missing!"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.LinkLabel linkLabel1; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.LinkLabel linkLabel2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Button button1; + public System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox textBox2; + } +} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/CustomControls/PrereqsAlert.cs b/BizHawk.Client.EmuHawk/CustomControls/PrereqsAlert.cs new file mode 100644 index 0000000000..f3f2aebf4c --- /dev/null +++ b/BizHawk.Client.EmuHawk/CustomControls/PrereqsAlert.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace BizHawk.Client.EmuHawk.CustomControls +{ + public partial class PrereqsAlert : Form + { + public PrereqsAlert() + { + InitializeComponent(); + } + + private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + linkLabel1.LinkVisited = true; + System.Diagnostics.Process.Start("https://sourceforge.net/projects/bizhawk/files/Prerequisites"); + } + + private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + linkLabel2.LinkVisited = true; + System.Diagnostics.Process.Start("http://tasvideos.org/Bizhawk.html"); + } + + private void button1_Click(object sender, EventArgs e) + { + Close(); + } + } +} diff --git a/BizHawk.Client.EmuHawk/CustomControls/PrereqsAlert.resx b/BizHawk.Client.EmuHawk/CustomControls/PrereqsAlert.resx new file mode 100644 index 0000000000..c4598d71c2 --- /dev/null +++ b/BizHawk.Client.EmuHawk/CustomControls/PrereqsAlert.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + We're not checking the version number of the VC 2010 runtime. Be sure you have the SP1 version installed. +DirectX Web Update is reportedly failing for some people as part of our prereqs installer. Try installing it manually. + + \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/CustomControls/Win32.cs b/BizHawk.Client.EmuHawk/CustomControls/Win32.cs index d1ebb963b5..9e734d75eb 100644 --- a/BizHawk.Client.EmuHawk/CustomControls/Win32.cs +++ b/BizHawk.Client.EmuHawk/CustomControls/Win32.cs @@ -7,7 +7,7 @@ using Microsoft.Win32.SafeHandles; namespace BizHawk.Client.EmuHawk { - public static class Win32 + public unsafe static class Win32 { public static bool Is64BitProcess { get { return (IntPtr.Size == 8); } } public static bool Is64BitOperatingSystem { get { return Is64BitProcess || InternalCheckIsWow64(); } } @@ -386,12 +386,7 @@ namespace BizHawk.Client.EmuHawk // Retrieve the save options for a file and returns them in a buffer [DllImport("avifil32.dll")] - public static extern int AVISaveOptions( - IntPtr hwnd, - int flags, - int streams, - [In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] IntPtr[] ppavi, - [In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] IntPtr[] plpOptions); + public static extern int AVISaveOptions(IntPtr hwnd, int flags, int streams, void* ppAvi, void* plpOptions); // Free the resources allocated by the AVISaveOptions function [DllImport("avifil32.dll")] diff --git a/BizHawk.Client.EmuHawk/GlobalWin.cs b/BizHawk.Client.EmuHawk/GlobalWin.cs index 490c2a5a86..757abd40dc 100644 --- a/BizHawk.Client.EmuHawk/GlobalWin.cs +++ b/BizHawk.Client.EmuHawk/GlobalWin.cs @@ -24,5 +24,7 @@ namespace BizHawk.Client.EmuHawk public static OSDManager OSD = new OSDManager(); public static DisplayManager DisplayManager; public static GLManager GLManager; + + public static int ExitCode; } } diff --git a/BizHawk.Client.EmuHawk/IControlMainform.cs b/BizHawk.Client.EmuHawk/IControlMainform.cs index 25d0e07832..3716de65b5 100644 --- a/BizHawk.Client.EmuHawk/IControlMainform.cs +++ b/BizHawk.Client.EmuHawk/IControlMainform.cs @@ -2,6 +2,18 @@ { public interface IControlMainform { + bool WantsToControlSavestates { get; } + + void SaveState(); + void LoadState(); + void SaveStateAs(); + void LoadStateAs(); + void SaveQuickSave(int slot); + void LoadQuickSave(int slot); + void SelectSlot(int slot); + void PreviousSlot(); + void NextSlot(); + bool WantsToControlReadOnly { get; } /// diff --git a/BizHawk.Client.EmuHawk/Input/GamePad360.cs b/BizHawk.Client.EmuHawk/Input/GamePad360.cs index 63dbd570ab..ee121155eb 100644 --- a/BizHawk.Client.EmuHawk/Input/GamePad360.cs +++ b/BizHawk.Client.EmuHawk/Input/GamePad360.cs @@ -181,10 +181,10 @@ namespace BizHawk.Client.EmuHawk AddItem("LStickLeft", () => state.Gamepad.sThumbLX <= dzn); AddItem("LStickRight", () => state.Gamepad.sThumbLX >= dzp); - AddItem("RStickUp", () => state.Gamepad.sThumbLY >= dzp); - AddItem("RStickDown", () => state.Gamepad.sThumbLY <= dzn); - AddItem("RStickLeft", () => state.Gamepad.sThumbLX <= dzn); - AddItem("RStickRight", () => state.Gamepad.sThumbLX >= dzp); + AddItem("RStickUp", () => state.Gamepad.sThumbRY >= dzp); + AddItem("RStickDown", () => state.Gamepad.sThumbRY <= dzn); + AddItem("RStickLeft", () => state.Gamepad.sThumbRX <= dzn); + AddItem("RStickRight", () => state.Gamepad.sThumbRX >= dzp); AddItem("LeftTrigger", () => state.Gamepad.bLeftTrigger > dzt); AddItem("RightTrigger", () => state.Gamepad.bRightTrigger > dzt); diff --git a/BizHawk.Client.EmuHawk/MainForm.Designer.cs b/BizHawk.Client.EmuHawk/MainForm.Designer.cs index 68603d3b1e..10fd359a5f 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Designer.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Designer.cs @@ -85,6 +85,7 @@ this.PlayFromBeginningMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.ImportMoviesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.SaveMovieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SaveMovieAsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.StopMovieWithoutSavingMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); this.AutomaticallyBackupMoviesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -96,6 +97,7 @@ this.MovieEndPauseMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.AVSubMenu = new System.Windows.Forms.ToolStripMenuItem(); this.RecordAVMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ConfigAndRecordAVMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.StopAVIMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator19 = new System.Windows.Forms.ToolStripSeparator(); this.CaptureOSDMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -190,7 +192,9 @@ this.setLibretroCoreToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); this.SaveConfigMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SaveConfigAsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.LoadConfigMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.LoadConfigFromMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.ToolsSubMenu = new System.Windows.Forms.ToolStripMenuItem(); this.ToolBoxMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); @@ -203,17 +207,19 @@ this.TAStudioMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.MacroToolMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.VirtualPadMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.AutoHawkMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.BasicBotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.LuaConsoleMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); this.CheatsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LuaConsoleMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.externalToolToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.dummyExternalTool = new System.Windows.Forms.ToolStripMenuItem(); + this.gameSharkConverterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator29 = new System.Windows.Forms.ToolStripSeparator(); this.MultiDiskBundlerFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.gameSharkConverterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.externalToolToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.dummyExternalTool = new System.Windows.Forms.ToolStripMenuItem(); this.batchRunnerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ExperimentalToolsSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.AutoHawkMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.NewHexEditorMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.NESSubMenu = new System.Windows.Forms.ToolStripMenuItem(); this.coreToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.quickNESToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -410,6 +416,7 @@ this.ShowMenuContextMenuSeparator = new System.Windows.Forms.ToolStripSeparator(); this.ShowMenuContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.timerMouseIdle = new System.Windows.Forms.Timer(this.components); + this.SaveMovieAsContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.MainformMenu.SuspendLayout(); this.MainStatusBar.SuspendLayout(); this.MainFormContextMenu.SuspendLayout(); @@ -445,7 +452,7 @@ this.MainformMenu.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.Flow; this.MainformMenu.Location = new System.Drawing.Point(0, 0); this.MainformMenu.Name = "MainformMenu"; - this.MainformMenu.Size = new System.Drawing.Size(470, 61); + this.MainformMenu.Size = new System.Drawing.Size(470, 55); this.MainformMenu.TabIndex = 0; this.MainformMenu.Text = "menuStrip1"; this.MainformMenu.MenuActivate += new System.EventHandler(this.MainformMenu_MenuActivate); @@ -471,7 +478,7 @@ this.toolStripSeparator4, this.ExitMenuItem}); this.FileSubMenu.Name = "FileSubMenu"; - this.FileSubMenu.Size = new System.Drawing.Size(37, 19); + this.FileSubMenu.Size = new System.Drawing.Size(35, 17); this.FileSubMenu.Text = "&File"; this.FileSubMenu.DropDownOpened += new System.EventHandler(this.FileSubMenu_DropDownOpened); // @@ -479,7 +486,7 @@ // this.OpenRomMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.OpenFile; this.OpenRomMenuItem.Name = "OpenRomMenuItem"; - this.OpenRomMenuItem.Size = new System.Drawing.Size(159, 22); + this.OpenRomMenuItem.Size = new System.Drawing.Size(162, 22); this.OpenRomMenuItem.Text = "&Open ROM"; this.OpenRomMenuItem.Click += new System.EventHandler(this.OpenRomMenuItem_Click); // @@ -489,7 +496,7 @@ this.toolStripSeparator3}); this.RecentRomSubMenu.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Recent; this.RecentRomSubMenu.Name = "RecentRomSubMenu"; - this.RecentRomSubMenu.Size = new System.Drawing.Size(159, 22); + this.RecentRomSubMenu.Size = new System.Drawing.Size(162, 22); this.RecentRomSubMenu.Text = "&Recent ROM"; this.RecentRomSubMenu.DropDownOpened += new System.EventHandler(this.RecentRomMenuItem_DropDownOpened); // @@ -501,7 +508,7 @@ // OpenAdvancedMenuItem // this.OpenAdvancedMenuItem.Name = "OpenAdvancedMenuItem"; - this.OpenAdvancedMenuItem.Size = new System.Drawing.Size(159, 22); + this.OpenAdvancedMenuItem.Size = new System.Drawing.Size(162, 22); this.OpenAdvancedMenuItem.Text = "Open Ad&vanced"; this.OpenAdvancedMenuItem.Click += new System.EventHandler(this.OpenAdvancedMenuItem_Click); // @@ -509,14 +516,14 @@ // this.CloseRomMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Close; this.CloseRomMenuItem.Name = "CloseRomMenuItem"; - this.CloseRomMenuItem.Size = new System.Drawing.Size(159, 22); + this.CloseRomMenuItem.Size = new System.Drawing.Size(162, 22); this.CloseRomMenuItem.Text = "&Close ROM"; this.CloseRomMenuItem.Click += new System.EventHandler(this.CloseRomMenuItem_Click); // // toolStripMenuItem1 // this.toolStripMenuItem1.Name = "toolStripMenuItem1"; - this.toolStripMenuItem1.Size = new System.Drawing.Size(156, 6); + this.toolStripMenuItem1.Size = new System.Drawing.Size(159, 6); // // SaveStateSubMenu // @@ -534,89 +541,89 @@ this.toolStripSeparator6, this.SaveNamedStateMenuItem}); this.SaveStateSubMenu.Name = "SaveStateSubMenu"; - this.SaveStateSubMenu.Size = new System.Drawing.Size(159, 22); + this.SaveStateSubMenu.Size = new System.Drawing.Size(162, 22); this.SaveStateSubMenu.Text = "&Save State"; this.SaveStateSubMenu.DropDownOpened += new System.EventHandler(this.SaveStateSubMenu_DropDownOpened); // // SaveState1MenuItem // this.SaveState1MenuItem.Name = "SaveState1MenuItem"; - this.SaveState1MenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveState1MenuItem.Size = new System.Drawing.Size(186, 22); this.SaveState1MenuItem.Text = "1"; this.SaveState1MenuItem.Click += new System.EventHandler(this.Savestate1MenuItem_Click); // // SaveState2MenuItem // this.SaveState2MenuItem.Name = "SaveState2MenuItem"; - this.SaveState2MenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveState2MenuItem.Size = new System.Drawing.Size(186, 22); this.SaveState2MenuItem.Text = "2"; this.SaveState2MenuItem.Click += new System.EventHandler(this.Savestate2MenuItem_Click); // // SaveState3MenuItem // this.SaveState3MenuItem.Name = "SaveState3MenuItem"; - this.SaveState3MenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveState3MenuItem.Size = new System.Drawing.Size(186, 22); this.SaveState3MenuItem.Text = "3"; this.SaveState3MenuItem.Click += new System.EventHandler(this.Savestate3MenuItem_Click); // // SaveState4MenuItem // this.SaveState4MenuItem.Name = "SaveState4MenuItem"; - this.SaveState4MenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveState4MenuItem.Size = new System.Drawing.Size(186, 22); this.SaveState4MenuItem.Text = "4"; this.SaveState4MenuItem.Click += new System.EventHandler(this.Savestate4MenuItem_Click); // // SaveState5MenuItem // this.SaveState5MenuItem.Name = "SaveState5MenuItem"; - this.SaveState5MenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveState5MenuItem.Size = new System.Drawing.Size(186, 22); this.SaveState5MenuItem.Text = "5"; this.SaveState5MenuItem.Click += new System.EventHandler(this.Savestate5MenuItem_Click); // // SaveState6MenuItem // this.SaveState6MenuItem.Name = "SaveState6MenuItem"; - this.SaveState6MenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveState6MenuItem.Size = new System.Drawing.Size(186, 22); this.SaveState6MenuItem.Text = "6"; this.SaveState6MenuItem.Click += new System.EventHandler(this.Savestate6MenuItem_Click); // // SaveState7MenuItem // this.SaveState7MenuItem.Name = "SaveState7MenuItem"; - this.SaveState7MenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveState7MenuItem.Size = new System.Drawing.Size(186, 22); this.SaveState7MenuItem.Text = "7"; this.SaveState7MenuItem.Click += new System.EventHandler(this.Savestate7MenuItem_Click); // // SaveState8MenuItem // this.SaveState8MenuItem.Name = "SaveState8MenuItem"; - this.SaveState8MenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveState8MenuItem.Size = new System.Drawing.Size(186, 22); this.SaveState8MenuItem.Text = "8"; this.SaveState8MenuItem.Click += new System.EventHandler(this.Savestate8MenuItem_Click); // // SaveState9MenuItem // this.SaveState9MenuItem.Name = "SaveState9MenuItem"; - this.SaveState9MenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveState9MenuItem.Size = new System.Drawing.Size(186, 22); this.SaveState9MenuItem.Text = "9"; this.SaveState9MenuItem.Click += new System.EventHandler(this.Savestate9MenuItem_Click); // // SaveState0MenuItem // this.SaveState0MenuItem.Name = "SaveState0MenuItem"; - this.SaveState0MenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveState0MenuItem.Size = new System.Drawing.Size(186, 22); this.SaveState0MenuItem.Text = "0"; this.SaveState0MenuItem.Click += new System.EventHandler(this.Savestate0MenuItem_Click); // // toolStripSeparator6 // this.toolStripSeparator6.Name = "toolStripSeparator6"; - this.toolStripSeparator6.Size = new System.Drawing.Size(175, 6); + this.toolStripSeparator6.Size = new System.Drawing.Size(183, 6); // // SaveNamedStateMenuItem // this.SaveNamedStateMenuItem.Name = "SaveNamedStateMenuItem"; - this.SaveNamedStateMenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveNamedStateMenuItem.Size = new System.Drawing.Size(186, 22); this.SaveNamedStateMenuItem.Text = "Save Named State..."; this.SaveNamedStateMenuItem.Click += new System.EventHandler(this.SaveNamedStateMenuItem_Click); // @@ -638,101 +645,101 @@ this.toolStripSeparator21, this.AutoloadLastSlotMenuItem}); this.LoadStateSubMenu.Name = "LoadStateSubMenu"; - this.LoadStateSubMenu.Size = new System.Drawing.Size(159, 22); + this.LoadStateSubMenu.Size = new System.Drawing.Size(162, 22); this.LoadStateSubMenu.Text = "&Load State"; this.LoadStateSubMenu.DropDownOpened += new System.EventHandler(this.LoadStateSubMenu_DropDownOpened); // // LoadState1MenuItem // this.LoadState1MenuItem.Name = "LoadState1MenuItem"; - this.LoadState1MenuItem.Size = new System.Drawing.Size(180, 22); + this.LoadState1MenuItem.Size = new System.Drawing.Size(185, 22); this.LoadState1MenuItem.Text = "1"; this.LoadState1MenuItem.Click += new System.EventHandler(this.Loadstate1MenuItem_Click); // // LoadState2MenuItem // this.LoadState2MenuItem.Name = "LoadState2MenuItem"; - this.LoadState2MenuItem.Size = new System.Drawing.Size(180, 22); + this.LoadState2MenuItem.Size = new System.Drawing.Size(185, 22); this.LoadState2MenuItem.Text = "2"; this.LoadState2MenuItem.Click += new System.EventHandler(this.Loadstate2MenuItem_Click); // // LoadState3MenuItem // this.LoadState3MenuItem.Name = "LoadState3MenuItem"; - this.LoadState3MenuItem.Size = new System.Drawing.Size(180, 22); + this.LoadState3MenuItem.Size = new System.Drawing.Size(185, 22); this.LoadState3MenuItem.Text = "3"; this.LoadState3MenuItem.Click += new System.EventHandler(this.Loadstate3MenuItem_Click); // // LoadState4MenuItem // this.LoadState4MenuItem.Name = "LoadState4MenuItem"; - this.LoadState4MenuItem.Size = new System.Drawing.Size(180, 22); + this.LoadState4MenuItem.Size = new System.Drawing.Size(185, 22); this.LoadState4MenuItem.Text = "4"; this.LoadState4MenuItem.Click += new System.EventHandler(this.Loadstate4MenuItem_Click); // // LoadState5MenuItem // this.LoadState5MenuItem.Name = "LoadState5MenuItem"; - this.LoadState5MenuItem.Size = new System.Drawing.Size(180, 22); + this.LoadState5MenuItem.Size = new System.Drawing.Size(185, 22); this.LoadState5MenuItem.Text = "5"; this.LoadState5MenuItem.Click += new System.EventHandler(this.Loadstate5MenuItem_Click); // // LoadState6MenuItem // this.LoadState6MenuItem.Name = "LoadState6MenuItem"; - this.LoadState6MenuItem.Size = new System.Drawing.Size(180, 22); + this.LoadState6MenuItem.Size = new System.Drawing.Size(185, 22); this.LoadState6MenuItem.Text = "6"; this.LoadState6MenuItem.Click += new System.EventHandler(this.Loadstate6MenuItem_Click); // // LoadState7MenuItem // this.LoadState7MenuItem.Name = "LoadState7MenuItem"; - this.LoadState7MenuItem.Size = new System.Drawing.Size(180, 22); + this.LoadState7MenuItem.Size = new System.Drawing.Size(185, 22); this.LoadState7MenuItem.Text = "7"; this.LoadState7MenuItem.Click += new System.EventHandler(this.Loadstate7MenuItem_Click); // // LoadState8MenuItem // this.LoadState8MenuItem.Name = "LoadState8MenuItem"; - this.LoadState8MenuItem.Size = new System.Drawing.Size(180, 22); + this.LoadState8MenuItem.Size = new System.Drawing.Size(185, 22); this.LoadState8MenuItem.Text = "8"; this.LoadState8MenuItem.Click += new System.EventHandler(this.Loadstate8MenuItem_Click); // // LoadState9MenuItem // this.LoadState9MenuItem.Name = "LoadState9MenuItem"; - this.LoadState9MenuItem.Size = new System.Drawing.Size(180, 22); + this.LoadState9MenuItem.Size = new System.Drawing.Size(185, 22); this.LoadState9MenuItem.Text = "9"; this.LoadState9MenuItem.Click += new System.EventHandler(this.Loadstate9MenuItem_Click); // // LoadState0MenuItem // this.LoadState0MenuItem.Name = "LoadState0MenuItem"; - this.LoadState0MenuItem.Size = new System.Drawing.Size(180, 22); + this.LoadState0MenuItem.Size = new System.Drawing.Size(185, 22); this.LoadState0MenuItem.Text = "0"; this.LoadState0MenuItem.Click += new System.EventHandler(this.Loadstate0MenuItem_Click); // // toolStripSeparator7 // this.toolStripSeparator7.Name = "toolStripSeparator7"; - this.toolStripSeparator7.Size = new System.Drawing.Size(177, 6); + this.toolStripSeparator7.Size = new System.Drawing.Size(182, 6); // // LoadNamedStateMenuItem // this.LoadNamedStateMenuItem.Name = "LoadNamedStateMenuItem"; - this.LoadNamedStateMenuItem.Size = new System.Drawing.Size(180, 22); + this.LoadNamedStateMenuItem.Size = new System.Drawing.Size(185, 22); this.LoadNamedStateMenuItem.Text = "Load Named State..."; this.LoadNamedStateMenuItem.Click += new System.EventHandler(this.LoadNamedStateMenuItem_Click); // // toolStripSeparator21 // this.toolStripSeparator21.Name = "toolStripSeparator21"; - this.toolStripSeparator21.Size = new System.Drawing.Size(177, 6); + this.toolStripSeparator21.Size = new System.Drawing.Size(182, 6); // // AutoloadLastSlotMenuItem // this.AutoloadLastSlotMenuItem.Name = "AutoloadLastSlotMenuItem"; - this.AutoloadLastSlotMenuItem.Size = new System.Drawing.Size(180, 22); + this.AutoloadLastSlotMenuItem.Size = new System.Drawing.Size(185, 22); this.AutoloadLastSlotMenuItem.Text = "Autoload last Slot"; this.AutoloadLastSlotMenuItem.Click += new System.EventHandler(this.AutoloadLastSlotMenuItem_Click); // @@ -755,77 +762,77 @@ this.SaveToCurrentSlotMenuItem, this.LoadCurrentSlotMenuItem}); this.SaveSlotSubMenu.Name = "SaveSlotSubMenu"; - this.SaveSlotSubMenu.Size = new System.Drawing.Size(159, 22); + this.SaveSlotSubMenu.Size = new System.Drawing.Size(162, 22); this.SaveSlotSubMenu.Text = "Save S&lot"; this.SaveSlotSubMenu.DropDownOpened += new System.EventHandler(this.SaveSlotSubMenu_DropDownOpened); // // SelectSlot0MenuItem // this.SelectSlot0MenuItem.Name = "SelectSlot0MenuItem"; - this.SelectSlot0MenuItem.Size = new System.Drawing.Size(178, 22); + this.SelectSlot0MenuItem.Size = new System.Drawing.Size(183, 22); this.SelectSlot0MenuItem.Text = "Select Slot 0"; this.SelectSlot0MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); // // SelectSlot1MenuItem // this.SelectSlot1MenuItem.Name = "SelectSlot1MenuItem"; - this.SelectSlot1MenuItem.Size = new System.Drawing.Size(178, 22); + this.SelectSlot1MenuItem.Size = new System.Drawing.Size(183, 22); this.SelectSlot1MenuItem.Text = "Select Slot 1"; this.SelectSlot1MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); // // SelectSlot2MenuItem // this.SelectSlot2MenuItem.Name = "SelectSlot2MenuItem"; - this.SelectSlot2MenuItem.Size = new System.Drawing.Size(178, 22); + this.SelectSlot2MenuItem.Size = new System.Drawing.Size(183, 22); this.SelectSlot2MenuItem.Text = "Select Slot 2"; this.SelectSlot2MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); // // SelectSlot3MenuItem // this.SelectSlot3MenuItem.Name = "SelectSlot3MenuItem"; - this.SelectSlot3MenuItem.Size = new System.Drawing.Size(178, 22); + this.SelectSlot3MenuItem.Size = new System.Drawing.Size(183, 22); this.SelectSlot3MenuItem.Text = "Select Slot 3"; this.SelectSlot3MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); // // SelectSlot4MenuItem // this.SelectSlot4MenuItem.Name = "SelectSlot4MenuItem"; - this.SelectSlot4MenuItem.Size = new System.Drawing.Size(178, 22); + this.SelectSlot4MenuItem.Size = new System.Drawing.Size(183, 22); this.SelectSlot4MenuItem.Text = "Select Slot 4"; this.SelectSlot4MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); // // SelectSlot5MenuItem // this.SelectSlot5MenuItem.Name = "SelectSlot5MenuItem"; - this.SelectSlot5MenuItem.Size = new System.Drawing.Size(178, 22); + this.SelectSlot5MenuItem.Size = new System.Drawing.Size(183, 22); this.SelectSlot5MenuItem.Text = "Select Slot 5"; this.SelectSlot5MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); // // SelectSlot6MenuItem // this.SelectSlot6MenuItem.Name = "SelectSlot6MenuItem"; - this.SelectSlot6MenuItem.Size = new System.Drawing.Size(178, 22); + this.SelectSlot6MenuItem.Size = new System.Drawing.Size(183, 22); this.SelectSlot6MenuItem.Text = "Select Slot 6"; this.SelectSlot6MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); // // SelectSlot7MenuItem // this.SelectSlot7MenuItem.Name = "SelectSlot7MenuItem"; - this.SelectSlot7MenuItem.Size = new System.Drawing.Size(178, 22); + this.SelectSlot7MenuItem.Size = new System.Drawing.Size(183, 22); this.SelectSlot7MenuItem.Text = "Select Slot 7"; this.SelectSlot7MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); // // SelectSlot8MenuItem // this.SelectSlot8MenuItem.Name = "SelectSlot8MenuItem"; - this.SelectSlot8MenuItem.Size = new System.Drawing.Size(178, 22); + this.SelectSlot8MenuItem.Size = new System.Drawing.Size(183, 22); this.SelectSlot8MenuItem.Text = "Select Slot 8"; this.SelectSlot8MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); // // SelectSlot9MenuItem // this.SelectSlot9MenuItem.Name = "SelectSlot9MenuItem"; - this.SelectSlot9MenuItem.Size = new System.Drawing.Size(178, 22); + this.SelectSlot9MenuItem.Size = new System.Drawing.Size(183, 22); this.SelectSlot9MenuItem.Text = "Select Slot 9"; this.SelectSlot9MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); // @@ -833,7 +840,7 @@ // this.PreviousSlotMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.MoveLeft; this.PreviousSlotMenuItem.Name = "PreviousSlotMenuItem"; - this.PreviousSlotMenuItem.Size = new System.Drawing.Size(178, 22); + this.PreviousSlotMenuItem.Size = new System.Drawing.Size(183, 22); this.PreviousSlotMenuItem.Text = "Previous Slot"; this.PreviousSlotMenuItem.Click += new System.EventHandler(this.PreviousSlotMenuItem_Click); // @@ -841,26 +848,26 @@ // this.NextSlotMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.MoveRight; this.NextSlotMenuItem.Name = "NextSlotMenuItem"; - this.NextSlotMenuItem.Size = new System.Drawing.Size(178, 22); + this.NextSlotMenuItem.Size = new System.Drawing.Size(183, 22); this.NextSlotMenuItem.Text = "Next Slot"; this.NextSlotMenuItem.Click += new System.EventHandler(this.NextSlotMenuItem_Click); // // toolStripSeparator5 // this.toolStripSeparator5.Name = "toolStripSeparator5"; - this.toolStripSeparator5.Size = new System.Drawing.Size(175, 6); + this.toolStripSeparator5.Size = new System.Drawing.Size(180, 6); // // SaveToCurrentSlotMenuItem // this.SaveToCurrentSlotMenuItem.Name = "SaveToCurrentSlotMenuItem"; - this.SaveToCurrentSlotMenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveToCurrentSlotMenuItem.Size = new System.Drawing.Size(183, 22); this.SaveToCurrentSlotMenuItem.Text = "Save to Current Slot"; this.SaveToCurrentSlotMenuItem.Click += new System.EventHandler(this.SaveToCurrentSlotMenuItem_Click); // // LoadCurrentSlotMenuItem // this.LoadCurrentSlotMenuItem.Name = "LoadCurrentSlotMenuItem"; - this.LoadCurrentSlotMenuItem.Size = new System.Drawing.Size(178, 22); + this.LoadCurrentSlotMenuItem.Size = new System.Drawing.Size(183, 22); this.LoadCurrentSlotMenuItem.Text = "Load Current Slot"; this.LoadCurrentSlotMenuItem.Click += new System.EventHandler(this.LoadCurrentSlotMenuItem_Click); // @@ -870,21 +877,21 @@ this.FlushSaveRAMMenuItem}); this.SaveRAMSubMenu.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Bold); this.SaveRAMSubMenu.Name = "SaveRAMSubMenu"; - this.SaveRAMSubMenu.Size = new System.Drawing.Size(159, 22); + this.SaveRAMSubMenu.Size = new System.Drawing.Size(162, 22); this.SaveRAMSubMenu.Text = "Save &RAM"; // // FlushSaveRAMMenuItem // this.FlushSaveRAMMenuItem.Font = new System.Drawing.Font("Tahoma", 8.25F); this.FlushSaveRAMMenuItem.Name = "FlushSaveRAMMenuItem"; - this.FlushSaveRAMMenuItem.Size = new System.Drawing.Size(150, 22); + this.FlushSaveRAMMenuItem.Size = new System.Drawing.Size(161, 22); this.FlushSaveRAMMenuItem.Text = "&Flush Save Ram"; this.FlushSaveRAMMenuItem.Click += new System.EventHandler(this.FlushSaveRAMMenuItem_Click); // // toolStripMenuItem2 // this.toolStripMenuItem2.Name = "toolStripMenuItem2"; - this.toolStripMenuItem2.Size = new System.Drawing.Size(156, 6); + this.toolStripMenuItem2.Size = new System.Drawing.Size(159, 6); // // MovieSubMenu // @@ -898,13 +905,14 @@ this.PlayFromBeginningMenuItem, this.ImportMoviesMenuItem, this.SaveMovieMenuItem, + this.SaveMovieAsMenuItem, this.StopMovieWithoutSavingMenuItem, this.toolStripSeparator14, this.AutomaticallyBackupMoviesMenuItem, this.FullMovieLoadstatesMenuItem, this.MovieEndSubMenu}); this.MovieSubMenu.Name = "MovieSubMenu"; - this.MovieSubMenu.Size = new System.Drawing.Size(159, 22); + this.MovieSubMenu.Size = new System.Drawing.Size(162, 22); this.MovieSubMenu.Text = "&Movie"; this.MovieSubMenu.DropDownOpened += new System.EventHandler(this.MovieSubMenu_DropDownOpened); // @@ -912,14 +920,14 @@ // this.ReadonlyMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.ReadOnly; this.ReadonlyMenuItem.Name = "ReadonlyMenuItem"; - this.ReadonlyMenuItem.Size = new System.Drawing.Size(231, 22); + this.ReadonlyMenuItem.Size = new System.Drawing.Size(222, 22); this.ReadonlyMenuItem.Text = "Read-only"; this.ReadonlyMenuItem.Click += new System.EventHandler(this.ReadonlyMenuItem_Click); // // toolStripSeparator15 // this.toolStripSeparator15.Name = "toolStripSeparator15"; - this.toolStripSeparator15.Size = new System.Drawing.Size(228, 6); + this.toolStripSeparator15.Size = new System.Drawing.Size(219, 6); // // RecentMovieSubMenu // @@ -927,7 +935,7 @@ this.toolStripSeparator16}); this.RecentMovieSubMenu.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Recent; this.RecentMovieSubMenu.Name = "RecentMovieSubMenu"; - this.RecentMovieSubMenu.Size = new System.Drawing.Size(231, 22); + this.RecentMovieSubMenu.Size = new System.Drawing.Size(222, 22); this.RecentMovieSubMenu.Text = "Recent"; this.RecentMovieSubMenu.DropDownOpened += new System.EventHandler(this.RecentMovieSubMenu_DropDownOpened); // @@ -940,7 +948,7 @@ // this.RecordMovieMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.RecordHS; this.RecordMovieMenuItem.Name = "RecordMovieMenuItem"; - this.RecordMovieMenuItem.Size = new System.Drawing.Size(231, 22); + this.RecordMovieMenuItem.Size = new System.Drawing.Size(222, 22); this.RecordMovieMenuItem.Text = "&Record Movie..."; this.RecordMovieMenuItem.Click += new System.EventHandler(this.RecordMovieMenuItem_Click); // @@ -948,7 +956,7 @@ // this.PlayMovieMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Play; this.PlayMovieMenuItem.Name = "PlayMovieMenuItem"; - this.PlayMovieMenuItem.Size = new System.Drawing.Size(231, 22); + this.PlayMovieMenuItem.Size = new System.Drawing.Size(222, 22); this.PlayMovieMenuItem.Text = "&Play Movie..."; this.PlayMovieMenuItem.Click += new System.EventHandler(this.PlayMovieMenuItem_Click); // @@ -956,7 +964,7 @@ // this.StopMovieMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; this.StopMovieMenuItem.Name = "StopMovieMenuItem"; - this.StopMovieMenuItem.Size = new System.Drawing.Size(231, 22); + this.StopMovieMenuItem.Size = new System.Drawing.Size(222, 22); this.StopMovieMenuItem.Text = "Stop Movie"; this.StopMovieMenuItem.Click += new System.EventHandler(this.StopMovieMenuItem_Click); // @@ -964,7 +972,7 @@ // this.PlayFromBeginningMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.restart; this.PlayFromBeginningMenuItem.Name = "PlayFromBeginningMenuItem"; - this.PlayFromBeginningMenuItem.Size = new System.Drawing.Size(231, 22); + this.PlayFromBeginningMenuItem.Size = new System.Drawing.Size(222, 22); this.PlayFromBeginningMenuItem.Text = "Play from Beginning"; this.PlayFromBeginningMenuItem.Click += new System.EventHandler(this.PlayFromBeginningMenuItem_Click); // @@ -972,7 +980,7 @@ // this.ImportMoviesMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Import; this.ImportMoviesMenuItem.Name = "ImportMoviesMenuItem"; - this.ImportMoviesMenuItem.Size = new System.Drawing.Size(231, 22); + this.ImportMoviesMenuItem.Size = new System.Drawing.Size(222, 22); this.ImportMoviesMenuItem.Text = "Import Movies..."; this.ImportMoviesMenuItem.Click += new System.EventHandler(this.ImportMovieMenuItem_Click); // @@ -980,34 +988,42 @@ // this.SaveMovieMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveAs; this.SaveMovieMenuItem.Name = "SaveMovieMenuItem"; - this.SaveMovieMenuItem.Size = new System.Drawing.Size(231, 22); + this.SaveMovieMenuItem.Size = new System.Drawing.Size(222, 22); this.SaveMovieMenuItem.Text = "&Save Movie"; this.SaveMovieMenuItem.Click += new System.EventHandler(this.SaveMovieMenuItem_Click); // + // SaveMovieAsMenuItem + // + this.SaveMovieAsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveAs; + this.SaveMovieAsMenuItem.Name = "SaveMovieAsMenuItem"; + this.SaveMovieAsMenuItem.Size = new System.Drawing.Size(222, 22); + this.SaveMovieAsMenuItem.Text = "Save Movie As..."; + this.SaveMovieAsMenuItem.Click += new System.EventHandler(this.SaveMovieAsMenuItem_Click); + // // StopMovieWithoutSavingMenuItem // this.StopMovieWithoutSavingMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; this.StopMovieWithoutSavingMenuItem.Name = "StopMovieWithoutSavingMenuItem"; - this.StopMovieWithoutSavingMenuItem.Size = new System.Drawing.Size(231, 22); + this.StopMovieWithoutSavingMenuItem.Size = new System.Drawing.Size(222, 22); this.StopMovieWithoutSavingMenuItem.Text = "Stop Movie without Saving"; this.StopMovieWithoutSavingMenuItem.Click += new System.EventHandler(this.StopMovieWithoutSavingMenuItem_Click); // // toolStripSeparator14 // this.toolStripSeparator14.Name = "toolStripSeparator14"; - this.toolStripSeparator14.Size = new System.Drawing.Size(228, 6); + this.toolStripSeparator14.Size = new System.Drawing.Size(219, 6); // // AutomaticallyBackupMoviesMenuItem // this.AutomaticallyBackupMoviesMenuItem.Name = "AutomaticallyBackupMoviesMenuItem"; - this.AutomaticallyBackupMoviesMenuItem.Size = new System.Drawing.Size(231, 22); + this.AutomaticallyBackupMoviesMenuItem.Size = new System.Drawing.Size(222, 22); this.AutomaticallyBackupMoviesMenuItem.Text = "Automatically Backup Movies"; this.AutomaticallyBackupMoviesMenuItem.Click += new System.EventHandler(this.AutomaticMovieBackupMenuItem_Click); // // FullMovieLoadstatesMenuItem // this.FullMovieLoadstatesMenuItem.Name = "FullMovieLoadstatesMenuItem"; - this.FullMovieLoadstatesMenuItem.Size = new System.Drawing.Size(231, 22); + this.FullMovieLoadstatesMenuItem.Size = new System.Drawing.Size(222, 22); this.FullMovieLoadstatesMenuItem.Text = "Full Movie Loadstates"; this.FullMovieLoadstatesMenuItem.Click += new System.EventHandler(this.FullMovieLoadstatesMenuItem_Click); // @@ -1019,35 +1035,35 @@ this.MovieEndStopMenuItem, this.MovieEndPauseMenuItem}); this.MovieEndSubMenu.Name = "MovieEndSubMenu"; - this.MovieEndSubMenu.Size = new System.Drawing.Size(231, 22); + this.MovieEndSubMenu.Size = new System.Drawing.Size(222, 22); this.MovieEndSubMenu.Text = "On Movie End"; this.MovieEndSubMenu.DropDownOpened += new System.EventHandler(this.MovieEndSubMenu_DropDownOpened); // // MovieEndFinishMenuItem // this.MovieEndFinishMenuItem.Name = "MovieEndFinishMenuItem"; - this.MovieEndFinishMenuItem.Size = new System.Drawing.Size(170, 22); + this.MovieEndFinishMenuItem.Size = new System.Drawing.Size(171, 22); this.MovieEndFinishMenuItem.Text = "Switch to Finished"; this.MovieEndFinishMenuItem.Click += new System.EventHandler(this.MovieEndFinishMenuItem_Click); // // MovieEndRecordMenuItem // this.MovieEndRecordMenuItem.Name = "MovieEndRecordMenuItem"; - this.MovieEndRecordMenuItem.Size = new System.Drawing.Size(170, 22); + this.MovieEndRecordMenuItem.Size = new System.Drawing.Size(171, 22); this.MovieEndRecordMenuItem.Text = "Switch To Record"; this.MovieEndRecordMenuItem.Click += new System.EventHandler(this.MovieEndRecordMenuItem_Click); // // MovieEndStopMenuItem // this.MovieEndStopMenuItem.Name = "MovieEndStopMenuItem"; - this.MovieEndStopMenuItem.Size = new System.Drawing.Size(170, 22); + this.MovieEndStopMenuItem.Size = new System.Drawing.Size(171, 22); this.MovieEndStopMenuItem.Text = "Stop"; this.MovieEndStopMenuItem.Click += new System.EventHandler(this.MovieEndStopMenuItem_Click); // // MovieEndPauseMenuItem // this.MovieEndPauseMenuItem.Name = "MovieEndPauseMenuItem"; - this.MovieEndPauseMenuItem.Size = new System.Drawing.Size(170, 22); + this.MovieEndPauseMenuItem.Size = new System.Drawing.Size(171, 22); this.MovieEndPauseMenuItem.Text = "Pause"; this.MovieEndPauseMenuItem.Click += new System.EventHandler(this.MovieEndPauseMenuItem_Click); // @@ -1055,47 +1071,56 @@ // this.AVSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.RecordAVMenuItem, + this.ConfigAndRecordAVMenuItem, this.StopAVIMenuItem, this.toolStripSeparator19, this.CaptureOSDMenuItem, this.SynclessRecordingMenuItem}); this.AVSubMenu.Name = "AVSubMenu"; - this.AVSubMenu.Size = new System.Drawing.Size(159, 22); + this.AVSubMenu.Size = new System.Drawing.Size(162, 22); this.AVSubMenu.Text = "&AVI/WAV"; this.AVSubMenu.DropDownOpened += new System.EventHandler(this.AVSubMenu_DropDownOpened); // // RecordAVMenuItem // - this.RecordAVMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.AVI; + this.RecordAVMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.RecordHS; this.RecordAVMenuItem.Name = "RecordAVMenuItem"; - this.RecordAVMenuItem.Size = new System.Drawing.Size(206, 22); + this.RecordAVMenuItem.Size = new System.Drawing.Size(221, 22); this.RecordAVMenuItem.Text = "&Record AVI/WAV"; this.RecordAVMenuItem.Click += new System.EventHandler(this.RecordAVMenuItem_Click); // + // ConfigAndRecordAVMenuItem + // + this.ConfigAndRecordAVMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.AVI; + this.ConfigAndRecordAVMenuItem.Name = "ConfigAndRecordAVMenuItem"; + this.ConfigAndRecordAVMenuItem.Size = new System.Drawing.Size(221, 22); + this.ConfigAndRecordAVMenuItem.Text = "Config and Record AVI/WAV"; + this.ConfigAndRecordAVMenuItem.Click += new System.EventHandler(this.ConfigAndRecordAVMenuItem_Click); + // // StopAVIMenuItem // this.StopAVIMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; this.StopAVIMenuItem.Name = "StopAVIMenuItem"; - this.StopAVIMenuItem.Size = new System.Drawing.Size(206, 22); + this.StopAVIMenuItem.Size = new System.Drawing.Size(221, 22); this.StopAVIMenuItem.Text = "&Stop AVI/WAV"; this.StopAVIMenuItem.Click += new System.EventHandler(this.StopAVMenuItem_Click); // // toolStripSeparator19 // this.toolStripSeparator19.Name = "toolStripSeparator19"; - this.toolStripSeparator19.Size = new System.Drawing.Size(203, 6); + this.toolStripSeparator19.Size = new System.Drawing.Size(218, 6); // // CaptureOSDMenuItem // this.CaptureOSDMenuItem.Name = "CaptureOSDMenuItem"; - this.CaptureOSDMenuItem.Size = new System.Drawing.Size(206, 22); + this.CaptureOSDMenuItem.Size = new System.Drawing.Size(221, 22); this.CaptureOSDMenuItem.Text = "Capture OSD"; this.CaptureOSDMenuItem.Click += new System.EventHandler(this.CaptureOSDMenuItem_Click); // // SynclessRecordingMenuItem // this.SynclessRecordingMenuItem.Name = "SynclessRecordingMenuItem"; - this.SynclessRecordingMenuItem.Size = new System.Drawing.Size(206, 22); + this.SynclessRecordingMenuItem.Size = new System.Drawing.Size(221, 22); this.SynclessRecordingMenuItem.Text = "S&yncless Recording Tools"; this.SynclessRecordingMenuItem.Click += new System.EventHandler(this.SynclessRecordingMenuItem_Click); // @@ -1109,7 +1134,7 @@ this.toolStripSeparator20, this.ScreenshotCaptureOSDMenuItem1}); this.ScreenshotSubMenu.Name = "ScreenshotSubMenu"; - this.ScreenshotSubMenu.Size = new System.Drawing.Size(159, 22); + this.ScreenshotSubMenu.Size = new System.Drawing.Size(162, 22); this.ScreenshotSubMenu.Text = "Scree&nshot"; this.ScreenshotSubMenu.DropDownOpening += new System.EventHandler(this.ScreenshotSubMenu_DropDownOpening); // @@ -1117,14 +1142,14 @@ // this.ScreenshotMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.camera; this.ScreenshotMenuItem.Name = "ScreenshotMenuItem"; - this.ScreenshotMenuItem.Size = new System.Drawing.Size(317, 22); + this.ScreenshotMenuItem.Size = new System.Drawing.Size(307, 22); this.ScreenshotMenuItem.Text = "Screenshot"; this.ScreenshotMenuItem.Click += new System.EventHandler(this.ScreenshotMenuItem_Click); // // ScreenshotAsMenuItem // this.ScreenshotAsMenuItem.Name = "ScreenshotAsMenuItem"; - this.ScreenshotAsMenuItem.Size = new System.Drawing.Size(317, 22); + this.ScreenshotAsMenuItem.Size = new System.Drawing.Size(307, 22); this.ScreenshotAsMenuItem.Text = "Screenshot As..."; this.ScreenshotAsMenuItem.Click += new System.EventHandler(this.ScreenshotAsMenuItem_Click); // @@ -1132,7 +1157,7 @@ // this.ScreenshotClipboardMenuItem.Name = "ScreenshotClipboardMenuItem"; this.ScreenshotClipboardMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C))); - this.ScreenshotClipboardMenuItem.Size = new System.Drawing.Size(317, 22); + this.ScreenshotClipboardMenuItem.Size = new System.Drawing.Size(307, 22); this.ScreenshotClipboardMenuItem.Text = "Screenshot (raw) -> Clipboard"; this.ScreenshotClipboardMenuItem.Click += new System.EventHandler(this.ScreenshotClipboardMenuItem_Click); // @@ -1141,32 +1166,32 @@ this.ScreenshotClientClipboardMenuItem.Name = "ScreenshotClientClipboardMenuItem"; this.ScreenshotClientClipboardMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) | System.Windows.Forms.Keys.C))); - this.ScreenshotClientClipboardMenuItem.Size = new System.Drawing.Size(317, 22); + this.ScreenshotClientClipboardMenuItem.Size = new System.Drawing.Size(307, 22); this.ScreenshotClientClipboardMenuItem.Text = "Screenshot (client) -> Clipboard"; this.ScreenshotClientClipboardMenuItem.Click += new System.EventHandler(this.ScreenshotClientClipboardMenuItem_Click); // // toolStripSeparator20 // this.toolStripSeparator20.Name = "toolStripSeparator20"; - this.toolStripSeparator20.Size = new System.Drawing.Size(314, 6); + this.toolStripSeparator20.Size = new System.Drawing.Size(304, 6); // // ScreenshotCaptureOSDMenuItem1 // this.ScreenshotCaptureOSDMenuItem1.Name = "ScreenshotCaptureOSDMenuItem1"; - this.ScreenshotCaptureOSDMenuItem1.Size = new System.Drawing.Size(317, 22); + this.ScreenshotCaptureOSDMenuItem1.Size = new System.Drawing.Size(307, 22); this.ScreenshotCaptureOSDMenuItem1.Text = "Capture OSD"; this.ScreenshotCaptureOSDMenuItem1.Click += new System.EventHandler(this.ScreenshotCaptureOSDMenuItem_Click); // // toolStripSeparator4 // this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(156, 6); + this.toolStripSeparator4.Size = new System.Drawing.Size(159, 6); // // ExitMenuItem // this.ExitMenuItem.Name = "ExitMenuItem"; this.ExitMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4))); - this.ExitMenuItem.Size = new System.Drawing.Size(159, 22); + this.ExitMenuItem.Size = new System.Drawing.Size(162, 22); this.ExitMenuItem.Text = "E&xit"; this.ExitMenuItem.Click += new System.EventHandler(this.ExitMenuItem_Click); // @@ -1179,7 +1204,7 @@ this.SoftResetMenuItem, this.HardResetMenuItem}); this.EmulationSubMenu.Name = "EmulationSubMenu"; - this.EmulationSubMenu.Size = new System.Drawing.Size(73, 19); + this.EmulationSubMenu.Size = new System.Drawing.Size(65, 17); this.EmulationSubMenu.Text = "&Emulation"; this.EmulationSubMenu.DropDownOpened += new System.EventHandler(this.emulationToolStripMenuItem_DropDownOpened); // @@ -1187,7 +1212,7 @@ // this.PauseMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Pause; this.PauseMenuItem.Name = "PauseMenuItem"; - this.PauseMenuItem.Size = new System.Drawing.Size(140, 22); + this.PauseMenuItem.Size = new System.Drawing.Size(146, 22); this.PauseMenuItem.Text = "&Pause"; this.PauseMenuItem.Click += new System.EventHandler(this.PauseMenuItem_Click); // @@ -1195,26 +1220,26 @@ // this.RebootCoreMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.reboot; this.RebootCoreMenuItem.Name = "RebootCoreMenuItem"; - this.RebootCoreMenuItem.Size = new System.Drawing.Size(140, 22); + this.RebootCoreMenuItem.Size = new System.Drawing.Size(146, 22); this.RebootCoreMenuItem.Text = "&Reboot Core"; this.RebootCoreMenuItem.Click += new System.EventHandler(this.PowerMenuItem_Click); // // toolStripSeparator1 // this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(137, 6); + this.toolStripSeparator1.Size = new System.Drawing.Size(143, 6); // // SoftResetMenuItem // this.SoftResetMenuItem.Name = "SoftResetMenuItem"; - this.SoftResetMenuItem.Size = new System.Drawing.Size(140, 22); + this.SoftResetMenuItem.Size = new System.Drawing.Size(146, 22); this.SoftResetMenuItem.Text = "&Soft Reset"; this.SoftResetMenuItem.Click += new System.EventHandler(this.SoftResetMenuItem_Click); // // HardResetMenuItem // this.HardResetMenuItem.Name = "HardResetMenuItem"; - this.HardResetMenuItem.Size = new System.Drawing.Size(140, 22); + this.HardResetMenuItem.Size = new System.Drawing.Size(146, 22); this.HardResetMenuItem.Text = "&Hard Reset"; this.HardResetMenuItem.Click += new System.EventHandler(this.HardResetMenuItem_Click); // @@ -1235,7 +1260,7 @@ this.DisplayMessagesMenuItem, this.DisplayLogWindowMenuItem}); this.ViewSubMenu.Name = "ViewSubMenu"; - this.ViewSubMenu.Size = new System.Drawing.Size(44, 19); + this.ViewSubMenu.Size = new System.Drawing.Size(41, 17); this.ViewSubMenu.Text = "&View"; this.ViewSubMenu.DropDownOpened += new System.EventHandler(this.ViewSubMenu_DropDownOpened); // @@ -1256,42 +1281,42 @@ // x1MenuItem // this.x1MenuItem.Name = "x1MenuItem"; - this.x1MenuItem.Size = new System.Drawing.Size(96, 22); + this.x1MenuItem.Size = new System.Drawing.Size(105, 22); this.x1MenuItem.Text = "&1x"; this.x1MenuItem.Click += new System.EventHandler(this.WindowSize_Click); // // x2MenuItem // this.x2MenuItem.Name = "x2MenuItem"; - this.x2MenuItem.Size = new System.Drawing.Size(96, 22); + this.x2MenuItem.Size = new System.Drawing.Size(105, 22); this.x2MenuItem.Text = "&2x"; this.x2MenuItem.Click += new System.EventHandler(this.WindowSize_Click); // // x3MenuItem // this.x3MenuItem.Name = "x3MenuItem"; - this.x3MenuItem.Size = new System.Drawing.Size(96, 22); + this.x3MenuItem.Size = new System.Drawing.Size(105, 22); this.x3MenuItem.Text = "&3x"; this.x3MenuItem.Click += new System.EventHandler(this.WindowSize_Click); // // x4MenuItem // this.x4MenuItem.Name = "x4MenuItem"; - this.x4MenuItem.Size = new System.Drawing.Size(96, 22); + this.x4MenuItem.Size = new System.Drawing.Size(105, 22); this.x4MenuItem.Text = "&4x"; this.x4MenuItem.Click += new System.EventHandler(this.WindowSize_Click); // // x5MenuItem // this.x5MenuItem.Name = "x5MenuItem"; - this.x5MenuItem.Size = new System.Drawing.Size(96, 22); + this.x5MenuItem.Size = new System.Drawing.Size(105, 22); this.x5MenuItem.Text = "&5x"; this.x5MenuItem.Click += new System.EventHandler(this.WindowSize_Click); // // mzMenuItem // this.mzMenuItem.Name = "mzMenuItem"; - this.mzMenuItem.Size = new System.Drawing.Size(96, 22); + this.mzMenuItem.Size = new System.Drawing.Size(105, 22); this.mzMenuItem.Text = "&Max"; this.mzMenuItem.Click += new System.EventHandler(this.WindowSize_Click); // @@ -1397,9 +1422,11 @@ this.CoresSubMenu, this.toolStripSeparator10, this.SaveConfigMenuItem, - this.LoadConfigMenuItem}); + this.SaveConfigAsMenuItem, + this.LoadConfigMenuItem, + this.LoadConfigFromMenuItem}); this.ConfigSubMenu.Name = "ConfigSubMenu"; - this.ConfigSubMenu.Size = new System.Drawing.Size(55, 19); + this.ConfigSubMenu.Size = new System.Drawing.Size(50, 17); this.ConfigSubMenu.Text = "&Config"; this.ConfigSubMenu.DropDownOpened += new System.EventHandler(this.ConfigSubMenu_DropDownOpened); // @@ -1407,7 +1434,7 @@ // this.ControllersMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; this.ControllersMenuItem.Name = "ControllersMenuItem"; - this.ControllersMenuItem.Size = new System.Drawing.Size(169, 22); + this.ControllersMenuItem.Size = new System.Drawing.Size(181, 22); this.ControllersMenuItem.Text = "&Controllers..."; this.ControllersMenuItem.Click += new System.EventHandler(this.ControllersMenuItem_Click); // @@ -1415,7 +1442,7 @@ // this.HotkeysMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.HotKeys; this.HotkeysMenuItem.Name = "HotkeysMenuItem"; - this.HotkeysMenuItem.Size = new System.Drawing.Size(169, 22); + this.HotkeysMenuItem.Size = new System.Drawing.Size(181, 22); this.HotkeysMenuItem.Text = "&Hotkeys..."; this.HotkeysMenuItem.Click += new System.EventHandler(this.HotkeysMenuItem_Click); // @@ -1423,7 +1450,7 @@ // this.DisplayConfigMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("DisplayConfigMenuItem.Image"))); this.DisplayConfigMenuItem.Name = "DisplayConfigMenuItem"; - this.DisplayConfigMenuItem.Size = new System.Drawing.Size(169, 22); + this.DisplayConfigMenuItem.Size = new System.Drawing.Size(181, 22); this.DisplayConfigMenuItem.Text = "Display..."; this.DisplayConfigMenuItem.Click += new System.EventHandler(this.DisplayConfigMenuItem_Click); // @@ -1431,7 +1458,7 @@ // this.SoundMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.AudioHS; this.SoundMenuItem.Name = "SoundMenuItem"; - this.SoundMenuItem.Size = new System.Drawing.Size(169, 22); + this.SoundMenuItem.Size = new System.Drawing.Size(181, 22); this.SoundMenuItem.Text = "&Sound..."; this.SoundMenuItem.Click += new System.EventHandler(this.SoundMenuItem_Click); // @@ -1439,7 +1466,7 @@ // this.PathsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.CopyFolderHS; this.PathsMenuItem.Name = "PathsMenuItem"; - this.PathsMenuItem.Size = new System.Drawing.Size(169, 22); + this.PathsMenuItem.Size = new System.Drawing.Size(181, 22); this.PathsMenuItem.Text = "Paths..."; this.PathsMenuItem.Click += new System.EventHandler(this.PathsMenuItem_Click); // @@ -1447,7 +1474,7 @@ // this.FirmwaresMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("FirmwaresMenuItem.Image"))); this.FirmwaresMenuItem.Name = "FirmwaresMenuItem"; - this.FirmwaresMenuItem.Size = new System.Drawing.Size(169, 22); + this.FirmwaresMenuItem.Size = new System.Drawing.Size(181, 22); this.FirmwaresMenuItem.Text = "&Firmwares..."; this.FirmwaresMenuItem.Click += new System.EventHandler(this.FirmwaresMenuItem_Click); // @@ -1455,7 +1482,7 @@ // this.MessagesMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.MessageConfig; this.MessagesMenuItem.Name = "MessagesMenuItem"; - this.MessagesMenuItem.Size = new System.Drawing.Size(169, 22); + this.MessagesMenuItem.Size = new System.Drawing.Size(181, 22); this.MessagesMenuItem.Text = "&Messages..."; this.MessagesMenuItem.Click += new System.EventHandler(this.MessagesMenuItem_Click); // @@ -1463,7 +1490,7 @@ // this.AutofireMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Lightning; this.AutofireMenuItem.Name = "AutofireMenuItem"; - this.AutofireMenuItem.Size = new System.Drawing.Size(169, 22); + this.AutofireMenuItem.Size = new System.Drawing.Size(181, 22); this.AutofireMenuItem.Text = "&Autofire..."; this.AutofireMenuItem.Click += new System.EventHandler(this.AutofireMenuItem_Click); // @@ -1471,21 +1498,21 @@ // this.RewindOptionsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Previous; this.RewindOptionsMenuItem.Name = "RewindOptionsMenuItem"; - this.RewindOptionsMenuItem.Size = new System.Drawing.Size(169, 22); + this.RewindOptionsMenuItem.Size = new System.Drawing.Size(181, 22); this.RewindOptionsMenuItem.Text = "&Rewind && States..."; this.RewindOptionsMenuItem.Click += new System.EventHandler(this.RewindOptionsMenuItem_Click); // // extensionsToolStripMenuItem // this.extensionsToolStripMenuItem.Name = "extensionsToolStripMenuItem"; - this.extensionsToolStripMenuItem.Size = new System.Drawing.Size(169, 22); + this.extensionsToolStripMenuItem.Size = new System.Drawing.Size(181, 22); this.extensionsToolStripMenuItem.Text = "File Extensions..."; this.extensionsToolStripMenuItem.Click += new System.EventHandler(this.FileExtensionsMenuItem_Click); // // ClientOptionsMenuItem // this.ClientOptionsMenuItem.Name = "ClientOptionsMenuItem"; - this.ClientOptionsMenuItem.Size = new System.Drawing.Size(169, 22); + this.ClientOptionsMenuItem.Size = new System.Drawing.Size(181, 22); this.ClientOptionsMenuItem.Text = "&Customize..."; this.ClientOptionsMenuItem.Click += new System.EventHandler(this.CustomizeMenuItem_Click); // @@ -1493,14 +1520,14 @@ // this.ProfilesMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.user_blue_small; this.ProfilesMenuItem.Name = "ProfilesMenuItem"; - this.ProfilesMenuItem.Size = new System.Drawing.Size(169, 22); + this.ProfilesMenuItem.Size = new System.Drawing.Size(181, 22); this.ProfilesMenuItem.Text = "&Profiles..."; this.ProfilesMenuItem.Click += new System.EventHandler(this.ProfilesMenuItem_Click); // // toolStripSeparator9 // this.toolStripSeparator9.Name = "toolStripSeparator9"; - this.toolStripSeparator9.Size = new System.Drawing.Size(166, 6); + this.toolStripSeparator9.Size = new System.Drawing.Size(178, 6); // // SpeedSkipSubMenu // @@ -1523,66 +1550,66 @@ this.Speed200MenuItem, this.Speed400MenuItem}); this.SpeedSkipSubMenu.Name = "SpeedSkipSubMenu"; - this.SpeedSkipSubMenu.Size = new System.Drawing.Size(169, 22); + this.SpeedSkipSubMenu.Size = new System.Drawing.Size(181, 22); this.SpeedSkipSubMenu.Text = "Speed/Skip"; this.SpeedSkipSubMenu.DropDownOpened += new System.EventHandler(this.FrameSkipMenuItem_DropDownOpened); // // ClockThrottleMenuItem // this.ClockThrottleMenuItem.Name = "ClockThrottleMenuItem"; - this.ClockThrottleMenuItem.Size = new System.Drawing.Size(202, 22); + this.ClockThrottleMenuItem.Size = new System.Drawing.Size(192, 22); this.ClockThrottleMenuItem.Text = "Clock Throttle"; this.ClockThrottleMenuItem.Click += new System.EventHandler(this.ClockThrottleMenuItem_Click); // // AudioThrottleMenuItem // this.AudioThrottleMenuItem.Name = "AudioThrottleMenuItem"; - this.AudioThrottleMenuItem.Size = new System.Drawing.Size(202, 22); + this.AudioThrottleMenuItem.Size = new System.Drawing.Size(192, 22); this.AudioThrottleMenuItem.Text = "Audio Throttle"; this.AudioThrottleMenuItem.Click += new System.EventHandler(this.AudioThrottleMenuItem_Click); // // VsyncThrottleMenuItem // this.VsyncThrottleMenuItem.Name = "VsyncThrottleMenuItem"; - this.VsyncThrottleMenuItem.Size = new System.Drawing.Size(202, 22); + this.VsyncThrottleMenuItem.Size = new System.Drawing.Size(192, 22); this.VsyncThrottleMenuItem.Text = "VSync Throttle"; this.VsyncThrottleMenuItem.Click += new System.EventHandler(this.VsyncThrottleMenuItem_Click); // // toolStripSeparator27 // this.toolStripSeparator27.Name = "toolStripSeparator27"; - this.toolStripSeparator27.Size = new System.Drawing.Size(199, 6); + this.toolStripSeparator27.Size = new System.Drawing.Size(189, 6); // // VsyncEnabledMenuItem // this.VsyncEnabledMenuItem.Name = "VsyncEnabledMenuItem"; - this.VsyncEnabledMenuItem.Size = new System.Drawing.Size(202, 22); + this.VsyncEnabledMenuItem.Size = new System.Drawing.Size(192, 22); this.VsyncEnabledMenuItem.Text = "VSync Enabled"; this.VsyncEnabledMenuItem.Click += new System.EventHandler(this.VsyncEnabledMenuItem_Click); // // toolStripMenuItem3 // this.toolStripMenuItem3.Name = "toolStripMenuItem3"; - this.toolStripMenuItem3.Size = new System.Drawing.Size(199, 6); + this.toolStripMenuItem3.Size = new System.Drawing.Size(189, 6); // // miUnthrottled // this.miUnthrottled.Name = "miUnthrottled"; - this.miUnthrottled.Size = new System.Drawing.Size(202, 22); + this.miUnthrottled.Size = new System.Drawing.Size(192, 22); this.miUnthrottled.Text = "Unthrottled"; this.miUnthrottled.Click += new System.EventHandler(this.miUnthrottled_Click); // // MinimizeSkippingMenuItem // this.MinimizeSkippingMenuItem.Name = "MinimizeSkippingMenuItem"; - this.MinimizeSkippingMenuItem.Size = new System.Drawing.Size(202, 22); + this.MinimizeSkippingMenuItem.Size = new System.Drawing.Size(192, 22); this.MinimizeSkippingMenuItem.Text = "Auto-minimize skipping"; this.MinimizeSkippingMenuItem.Click += new System.EventHandler(this.MinimizeSkippingMenuItem_Click); // // NeverSkipMenuItem // this.NeverSkipMenuItem.Name = "NeverSkipMenuItem"; - this.NeverSkipMenuItem.Size = new System.Drawing.Size(202, 22); + this.NeverSkipMenuItem.Size = new System.Drawing.Size(192, 22); this.NeverSkipMenuItem.Text = "Skip 0 (never)"; this.NeverSkipMenuItem.Click += new System.EventHandler(this.NeverSkipMenuItem_Click); // @@ -1599,116 +1626,116 @@ this.Frameskip8MenuItem, this.Frameskip9MenuItem}); this.toolStripMenuItem17.Name = "toolStripMenuItem17"; - this.toolStripMenuItem17.Size = new System.Drawing.Size(202, 22); + this.toolStripMenuItem17.Size = new System.Drawing.Size(192, 22); this.toolStripMenuItem17.Text = "Skip 1..9"; // // Frameskip1MenuItem // this.Frameskip1MenuItem.Name = "Frameskip1MenuItem"; - this.Frameskip1MenuItem.Size = new System.Drawing.Size(80, 22); + this.Frameskip1MenuItem.Size = new System.Drawing.Size(91, 22); this.Frameskip1MenuItem.Text = "1"; this.Frameskip1MenuItem.Click += new System.EventHandler(this.Frameskip1MenuItem_Click); // // Frameskip2MenuItem // this.Frameskip2MenuItem.Name = "Frameskip2MenuItem"; - this.Frameskip2MenuItem.Size = new System.Drawing.Size(80, 22); + this.Frameskip2MenuItem.Size = new System.Drawing.Size(91, 22); this.Frameskip2MenuItem.Text = "2"; this.Frameskip2MenuItem.Click += new System.EventHandler(this.Frameskip2MenuItem_Click); // // Frameskip3MenuItem // this.Frameskip3MenuItem.Name = "Frameskip3MenuItem"; - this.Frameskip3MenuItem.Size = new System.Drawing.Size(80, 22); + this.Frameskip3MenuItem.Size = new System.Drawing.Size(91, 22); this.Frameskip3MenuItem.Text = "3"; this.Frameskip3MenuItem.Click += new System.EventHandler(this.Frameskip3MenuItem_Click); // // Frameskip4MenuItem // this.Frameskip4MenuItem.Name = "Frameskip4MenuItem"; - this.Frameskip4MenuItem.Size = new System.Drawing.Size(80, 22); + this.Frameskip4MenuItem.Size = new System.Drawing.Size(91, 22); this.Frameskip4MenuItem.Text = "4"; this.Frameskip4MenuItem.Click += new System.EventHandler(this.Frameskip4MenuItem_Click); // // Frameskip5MenuItem // this.Frameskip5MenuItem.Name = "Frameskip5MenuItem"; - this.Frameskip5MenuItem.Size = new System.Drawing.Size(80, 22); + this.Frameskip5MenuItem.Size = new System.Drawing.Size(91, 22); this.Frameskip5MenuItem.Text = "5"; this.Frameskip5MenuItem.Click += new System.EventHandler(this.Frameskip5MenuItem_Click); // // Frameskip6MenuItem // this.Frameskip6MenuItem.Name = "Frameskip6MenuItem"; - this.Frameskip6MenuItem.Size = new System.Drawing.Size(80, 22); + this.Frameskip6MenuItem.Size = new System.Drawing.Size(91, 22); this.Frameskip6MenuItem.Text = "6"; this.Frameskip6MenuItem.Click += new System.EventHandler(this.Frameskip6MenuItem_Click); // // Frameskip7MenuItem // this.Frameskip7MenuItem.Name = "Frameskip7MenuItem"; - this.Frameskip7MenuItem.Size = new System.Drawing.Size(80, 22); + this.Frameskip7MenuItem.Size = new System.Drawing.Size(91, 22); this.Frameskip7MenuItem.Text = "7"; this.Frameskip7MenuItem.Click += new System.EventHandler(this.Frameskip7MenuItem_Click); // // Frameskip8MenuItem // this.Frameskip8MenuItem.Name = "Frameskip8MenuItem"; - this.Frameskip8MenuItem.Size = new System.Drawing.Size(80, 22); + this.Frameskip8MenuItem.Size = new System.Drawing.Size(91, 22); this.Frameskip8MenuItem.Text = "8"; this.Frameskip8MenuItem.Click += new System.EventHandler(this.Frameskip8MenuItem_Click); // // Frameskip9MenuItem // this.Frameskip9MenuItem.Name = "Frameskip9MenuItem"; - this.Frameskip9MenuItem.Size = new System.Drawing.Size(80, 22); + this.Frameskip9MenuItem.Size = new System.Drawing.Size(91, 22); this.Frameskip9MenuItem.Text = "9"; this.Frameskip9MenuItem.Click += new System.EventHandler(this.Frameskip9MenuItem_Click); // // toolStripMenuItem5 // this.toolStripMenuItem5.Name = "toolStripMenuItem5"; - this.toolStripMenuItem5.Size = new System.Drawing.Size(199, 6); + this.toolStripMenuItem5.Size = new System.Drawing.Size(189, 6); // // Speed50MenuItem // this.Speed50MenuItem.Name = "Speed50MenuItem"; - this.Speed50MenuItem.Size = new System.Drawing.Size(202, 22); + this.Speed50MenuItem.Size = new System.Drawing.Size(192, 22); this.Speed50MenuItem.Text = "Speed 50%"; this.Speed50MenuItem.Click += new System.EventHandler(this.Speed50MenuItem_Click); // // Speed75MenuItem // this.Speed75MenuItem.Name = "Speed75MenuItem"; - this.Speed75MenuItem.Size = new System.Drawing.Size(202, 22); + this.Speed75MenuItem.Size = new System.Drawing.Size(192, 22); this.Speed75MenuItem.Text = "Speed 75%"; this.Speed75MenuItem.Click += new System.EventHandler(this.Speed75MenuItem_Click); // // Speed100MenuItem // this.Speed100MenuItem.Name = "Speed100MenuItem"; - this.Speed100MenuItem.Size = new System.Drawing.Size(202, 22); + this.Speed100MenuItem.Size = new System.Drawing.Size(192, 22); this.Speed100MenuItem.Text = "Speed 100%"; this.Speed100MenuItem.Click += new System.EventHandler(this.Speed100MenuItem_Click); // // Speed150MenuItem // this.Speed150MenuItem.Name = "Speed150MenuItem"; - this.Speed150MenuItem.Size = new System.Drawing.Size(202, 22); + this.Speed150MenuItem.Size = new System.Drawing.Size(192, 22); this.Speed150MenuItem.Text = "Speed 150%"; this.Speed150MenuItem.Click += new System.EventHandler(this.Speed150MenuItem_Click); // // Speed200MenuItem // this.Speed200MenuItem.Name = "Speed200MenuItem"; - this.Speed200MenuItem.Size = new System.Drawing.Size(202, 22); + this.Speed200MenuItem.Size = new System.Drawing.Size(192, 22); this.Speed200MenuItem.Text = "Speed 200%"; this.Speed200MenuItem.Click += new System.EventHandler(this.Speed200MenuItem_Click); // // Speed400MenuItem // this.Speed400MenuItem.Name = "Speed400MenuItem"; - this.Speed400MenuItem.Size = new System.Drawing.Size(202, 22); + this.Speed400MenuItem.Size = new System.Drawing.Size(192, 22); this.Speed400MenuItem.Text = "Speed 400%"; this.Speed400MenuItem.Click += new System.EventHandler(this.Speed400MenuItem_Click); // @@ -1719,28 +1746,28 @@ this.InputOverHkMenuItem, this.HkOverInputMenuItem}); this.KeyPrioritySubMenu.Name = "KeyPrioritySubMenu"; - this.KeyPrioritySubMenu.Size = new System.Drawing.Size(169, 22); + this.KeyPrioritySubMenu.Size = new System.Drawing.Size(181, 22); this.KeyPrioritySubMenu.Text = "Key Priority"; this.KeyPrioritySubMenu.DropDownOpened += new System.EventHandler(this.KeyPriorityMenuItem_DropDownOpened); // // BothHkAndControllerMenuItem // this.BothHkAndControllerMenuItem.Name = "BothHkAndControllerMenuItem"; - this.BothHkAndControllerMenuItem.Size = new System.Drawing.Size(229, 22); + this.BothHkAndControllerMenuItem.Size = new System.Drawing.Size(225, 22); this.BothHkAndControllerMenuItem.Text = "Both Hotkeys and Controllers"; this.BothHkAndControllerMenuItem.Click += new System.EventHandler(this.BothHkAndControllerMenuItem_Click); // // InputOverHkMenuItem // this.InputOverHkMenuItem.Name = "InputOverHkMenuItem"; - this.InputOverHkMenuItem.Size = new System.Drawing.Size(229, 22); + this.InputOverHkMenuItem.Size = new System.Drawing.Size(225, 22); this.InputOverHkMenuItem.Text = "Input overrides Hotkeys"; this.InputOverHkMenuItem.Click += new System.EventHandler(this.InputOverHkMenuItem_Click); // // HkOverInputMenuItem // this.HkOverInputMenuItem.Name = "HkOverInputMenuItem"; - this.HkOverInputMenuItem.Size = new System.Drawing.Size(229, 22); + this.HkOverInputMenuItem.Size = new System.Drawing.Size(225, 22); this.HkOverInputMenuItem.Text = "Hotkeys override Input"; this.HkOverInputMenuItem.Click += new System.EventHandler(this.HkOverInputMenuItem_Click); // @@ -1755,79 +1782,93 @@ this.N64VideoPluginSettingsMenuItem, this.setLibretroCoreToolStripMenuItem}); this.CoresSubMenu.Name = "CoresSubMenu"; - this.CoresSubMenu.Size = new System.Drawing.Size(169, 22); + this.CoresSubMenu.Size = new System.Drawing.Size(181, 22); this.CoresSubMenu.Text = "Cores"; this.CoresSubMenu.DropDownOpened += new System.EventHandler(this.CoresSubMenu_DropDownOpened); // // GBInSGBMenuItem // this.GBInSGBMenuItem.Name = "GBInSGBMenuItem"; - this.GBInSGBMenuItem.Size = new System.Drawing.Size(210, 22); + this.GBInSGBMenuItem.Size = new System.Drawing.Size(206, 22); this.GBInSGBMenuItem.Text = "GB in SGB"; this.GBInSGBMenuItem.Click += new System.EventHandler(this.GBInSGBMenuItem_Click); // // NesInQuickNESMenuItem // this.NesInQuickNESMenuItem.Name = "NesInQuickNESMenuItem"; - this.NesInQuickNESMenuItem.Size = new System.Drawing.Size(210, 22); + this.NesInQuickNESMenuItem.Size = new System.Drawing.Size(206, 22); this.NesInQuickNESMenuItem.Text = "NES with QuickNES"; this.NesInQuickNESMenuItem.Click += new System.EventHandler(this.NesInQuickNESMenuItem_Click); // // SnesWithSnes9xMenuItem // this.SnesWithSnes9xMenuItem.Name = "SnesWithSnes9xMenuItem"; - this.SnesWithSnes9xMenuItem.Size = new System.Drawing.Size(210, 22); + this.SnesWithSnes9xMenuItem.Size = new System.Drawing.Size(206, 22); this.SnesWithSnes9xMenuItem.Text = "SNES with Snes9x"; this.SnesWithSnes9xMenuItem.Click += new System.EventHandler(this.SnesWithSnes9xMenuItem_Click); // // gBAWithMGBAToolStripMenuItem // this.gBAWithMGBAToolStripMenuItem.Name = "gBAWithMGBAToolStripMenuItem"; - this.gBAWithMGBAToolStripMenuItem.Size = new System.Drawing.Size(210, 22); + this.gBAWithMGBAToolStripMenuItem.Size = new System.Drawing.Size(206, 22); this.gBAWithMGBAToolStripMenuItem.Text = "GBA with mGBA"; this.gBAWithMGBAToolStripMenuItem.Click += new System.EventHandler(this.gBAWithMGBAToolStripMenuItem_Click); // // toolStripSeparator8 // this.toolStripSeparator8.Name = "toolStripSeparator8"; - this.toolStripSeparator8.Size = new System.Drawing.Size(207, 6); + this.toolStripSeparator8.Size = new System.Drawing.Size(203, 6); // // N64VideoPluginSettingsMenuItem // this.N64VideoPluginSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.monitor; this.N64VideoPluginSettingsMenuItem.Name = "N64VideoPluginSettingsMenuItem"; - this.N64VideoPluginSettingsMenuItem.Size = new System.Drawing.Size(210, 22); + this.N64VideoPluginSettingsMenuItem.Size = new System.Drawing.Size(206, 22); this.N64VideoPluginSettingsMenuItem.Text = "N64 Video Plugin Settings"; this.N64VideoPluginSettingsMenuItem.Click += new System.EventHandler(this.N64VideoPluginSettingsMenuItem_Click); // // setLibretroCoreToolStripMenuItem // this.setLibretroCoreToolStripMenuItem.Name = "setLibretroCoreToolStripMenuItem"; - this.setLibretroCoreToolStripMenuItem.Size = new System.Drawing.Size(210, 22); + this.setLibretroCoreToolStripMenuItem.Size = new System.Drawing.Size(206, 22); this.setLibretroCoreToolStripMenuItem.Text = "Set Libretro Core"; this.setLibretroCoreToolStripMenuItem.Click += new System.EventHandler(this.setLibretroCoreToolStripMenuItem_Click); // // toolStripSeparator10 // this.toolStripSeparator10.Name = "toolStripSeparator10"; - this.toolStripSeparator10.Size = new System.Drawing.Size(166, 6); + this.toolStripSeparator10.Size = new System.Drawing.Size(178, 6); // // SaveConfigMenuItem // this.SaveConfigMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Save; this.SaveConfigMenuItem.Name = "SaveConfigMenuItem"; - this.SaveConfigMenuItem.Size = new System.Drawing.Size(169, 22); + this.SaveConfigMenuItem.Size = new System.Drawing.Size(181, 22); this.SaveConfigMenuItem.Text = "Save Config"; this.SaveConfigMenuItem.Click += new System.EventHandler(this.SaveConfigMenuItem_Click); // + // SaveConfigAsMenuItem + // + this.SaveConfigAsMenuItem.Name = "SaveConfigAsMenuItem"; + this.SaveConfigAsMenuItem.Size = new System.Drawing.Size(181, 22); + this.SaveConfigAsMenuItem.Text = "Save Config As..."; + this.SaveConfigAsMenuItem.Click += new System.EventHandler(this.SaveConfigAsMenuItem_Click); + // // LoadConfigMenuItem // this.LoadConfigMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.LoadConfig; this.LoadConfigMenuItem.Name = "LoadConfigMenuItem"; - this.LoadConfigMenuItem.Size = new System.Drawing.Size(169, 22); + this.LoadConfigMenuItem.Size = new System.Drawing.Size(181, 22); this.LoadConfigMenuItem.Text = "Load Config"; this.LoadConfigMenuItem.Click += new System.EventHandler(this.LoadConfigMenuItem_Click); // + // LoadConfigFromMenuItem + // + this.LoadConfigFromMenuItem.Name = "LoadConfigFromMenuItem"; + this.LoadConfigFromMenuItem.Size = new System.Drawing.Size(181, 22); + this.LoadConfigFromMenuItem.Text = "Load Config From..."; + this.LoadConfigFromMenuItem.Click += new System.EventHandler(this.LoadConfigFromMenuItem_Click); + // // ToolsSubMenu // this.ToolsSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -1842,18 +1883,18 @@ this.TAStudioMenuItem, this.MacroToolMenuItem, this.VirtualPadMenuItem, - this.AutoHawkMenuItem, this.BasicBotMenuItem, + this.LuaConsoleMenuItem, this.toolStripSeparator11, this.CheatsMenuItem, - this.LuaConsoleMenuItem, - this.externalToolToolStripMenuItem, + this.gameSharkConverterToolStripMenuItem, this.toolStripSeparator29, this.MultiDiskBundlerFileMenuItem, - this.gameSharkConverterToolStripMenuItem, - this.batchRunnerToolStripMenuItem}); + this.externalToolToolStripMenuItem, + this.batchRunnerToolStripMenuItem, + this.ExperimentalToolsSubMenu}); this.ToolsSubMenu.Name = "ToolsSubMenu"; - this.ToolsSubMenu.Size = new System.Drawing.Size(47, 19); + this.ToolsSubMenu.Size = new System.Drawing.Size(44, 17); this.ToolsSubMenu.Text = "&Tools"; this.ToolsSubMenu.DropDownOpened += new System.EventHandler(this.ToolsSubMenu_DropDownOpened); // @@ -1861,20 +1902,20 @@ // this.ToolBoxMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.ToolBox; this.ToolBoxMenuItem.Name = "ToolBoxMenuItem"; - this.ToolBoxMenuItem.Size = new System.Drawing.Size(189, 22); + this.ToolBoxMenuItem.Size = new System.Drawing.Size(191, 22); this.ToolBoxMenuItem.Text = "&Tool Box"; this.ToolBoxMenuItem.Click += new System.EventHandler(this.ToolBoxMenuItem_Click); // // toolStripSeparator12 // this.toolStripSeparator12.Name = "toolStripSeparator12"; - this.toolStripSeparator12.Size = new System.Drawing.Size(186, 6); + this.toolStripSeparator12.Size = new System.Drawing.Size(188, 6); // // RamWatchMenuItem // this.RamWatchMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.watch; this.RamWatchMenuItem.Name = "RamWatchMenuItem"; - this.RamWatchMenuItem.Size = new System.Drawing.Size(189, 22); + this.RamWatchMenuItem.Size = new System.Drawing.Size(191, 22); this.RamWatchMenuItem.Text = "RAM &Watch"; this.RamWatchMenuItem.Click += new System.EventHandler(this.RamWatchMenuItem_Click); // @@ -1882,7 +1923,7 @@ // this.RamSearchMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.search; this.RamSearchMenuItem.Name = "RamSearchMenuItem"; - this.RamSearchMenuItem.Size = new System.Drawing.Size(189, 22); + this.RamSearchMenuItem.Size = new System.Drawing.Size(191, 22); this.RamSearchMenuItem.Text = "RAM &Search"; this.RamSearchMenuItem.Click += new System.EventHandler(this.RamSearchMenuItem_Click); // @@ -1890,7 +1931,7 @@ // this.HexEditorMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.poke; this.HexEditorMenuItem.Name = "HexEditorMenuItem"; - this.HexEditorMenuItem.Size = new System.Drawing.Size(189, 22); + this.HexEditorMenuItem.Size = new System.Drawing.Size(191, 22); this.HexEditorMenuItem.Text = "&Hex Editor"; this.HexEditorMenuItem.Click += new System.EventHandler(this.HexEditorMenuItem_Click); // @@ -1898,7 +1939,7 @@ // this.TraceLoggerMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.pencil; this.TraceLoggerMenuItem.Name = "TraceLoggerMenuItem"; - this.TraceLoggerMenuItem.Size = new System.Drawing.Size(189, 22); + this.TraceLoggerMenuItem.Size = new System.Drawing.Size(191, 22); this.TraceLoggerMenuItem.Text = "Trace &Logger"; this.TraceLoggerMenuItem.Click += new System.EventHandler(this.TraceLoggerMenuItem_Click); // @@ -1906,7 +1947,7 @@ // this.CodeDataLoggerMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.cdlogger; this.CodeDataLoggerMenuItem.Name = "CodeDataLoggerMenuItem"; - this.CodeDataLoggerMenuItem.Size = new System.Drawing.Size(189, 22); + this.CodeDataLoggerMenuItem.Size = new System.Drawing.Size(191, 22); this.CodeDataLoggerMenuItem.Text = "Code-Data Logger"; this.CodeDataLoggerMenuItem.Click += new System.EventHandler(this.CodeDataLoggerMenuItem_Click); // @@ -1914,7 +1955,7 @@ // this.DebuggerMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Bug; this.DebuggerMenuItem.Name = "DebuggerMenuItem"; - this.DebuggerMenuItem.Size = new System.Drawing.Size(189, 22); + this.DebuggerMenuItem.Size = new System.Drawing.Size(191, 22); this.DebuggerMenuItem.Text = "&Debugger"; this.DebuggerMenuItem.Click += new System.EventHandler(this.DebuggerMenuItem_Click); // @@ -1922,14 +1963,14 @@ // this.TAStudioMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.TAStudio; this.TAStudioMenuItem.Name = "TAStudioMenuItem"; - this.TAStudioMenuItem.Size = new System.Drawing.Size(189, 22); + this.TAStudioMenuItem.Size = new System.Drawing.Size(191, 22); this.TAStudioMenuItem.Text = "&TAStudio"; this.TAStudioMenuItem.Click += new System.EventHandler(this.TAStudioMenuItem_Click); // // MacroToolMenuItem // this.MacroToolMenuItem.Name = "MacroToolMenuItem"; - this.MacroToolMenuItem.Size = new System.Drawing.Size(189, 22); + this.MacroToolMenuItem.Size = new System.Drawing.Size(191, 22); this.MacroToolMenuItem.Text = "&Macro Tool"; this.MacroToolMenuItem.Click += new System.EventHandler(this.MacroToolMenuItem_Click); // @@ -1937,89 +1978,105 @@ // this.VirtualPadMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; this.VirtualPadMenuItem.Name = "VirtualPadMenuItem"; - this.VirtualPadMenuItem.Size = new System.Drawing.Size(189, 22); + this.VirtualPadMenuItem.Size = new System.Drawing.Size(191, 22); this.VirtualPadMenuItem.Text = "Virtual Pad"; this.VirtualPadMenuItem.Click += new System.EventHandler(this.VirtualPadMenuItem_Click); // - // AutoHawkMenuItem - // - this.AutoHawkMenuItem.Name = "AutoHawkMenuItem"; - this.AutoHawkMenuItem.Size = new System.Drawing.Size(189, 22); - this.AutoHawkMenuItem.Text = "AutoHawk"; - this.AutoHawkMenuItem.Click += new System.EventHandler(this.AutoHawkMenuItem_Click); - // // BasicBotMenuItem // this.BasicBotMenuItem.Name = "BasicBotMenuItem"; - this.BasicBotMenuItem.Size = new System.Drawing.Size(189, 22); + this.BasicBotMenuItem.Size = new System.Drawing.Size(191, 22); this.BasicBotMenuItem.Text = "Basic Bot"; this.BasicBotMenuItem.Click += new System.EventHandler(this.BasicBotMenuItem_Click); // - // toolStripSeparator11 - // - this.toolStripSeparator11.Name = "toolStripSeparator11"; - this.toolStripSeparator11.Size = new System.Drawing.Size(186, 6); - // - // CheatsMenuItem - // - this.CheatsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Freeze; - this.CheatsMenuItem.Name = "CheatsMenuItem"; - this.CheatsMenuItem.Size = new System.Drawing.Size(189, 22); - this.CheatsMenuItem.Text = "Cheats"; - this.CheatsMenuItem.Click += new System.EventHandler(this.CheatsMenuItem_Click); - // // LuaConsoleMenuItem // this.LuaConsoleMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Lua; this.LuaConsoleMenuItem.Name = "LuaConsoleMenuItem"; - this.LuaConsoleMenuItem.Size = new System.Drawing.Size(189, 22); + this.LuaConsoleMenuItem.Size = new System.Drawing.Size(191, 22); this.LuaConsoleMenuItem.Text = "Lua Console"; this.LuaConsoleMenuItem.Click += new System.EventHandler(this.LuaConsoleMenuItem_Click); // + // toolStripSeparator11 + // + this.toolStripSeparator11.Name = "toolStripSeparator11"; + this.toolStripSeparator11.Size = new System.Drawing.Size(188, 6); + // + // CheatsMenuItem + // + this.CheatsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Freeze; + this.CheatsMenuItem.Name = "CheatsMenuItem"; + this.CheatsMenuItem.Size = new System.Drawing.Size(191, 22); + this.CheatsMenuItem.Text = "Cheats"; + this.CheatsMenuItem.Click += new System.EventHandler(this.CheatsMenuItem_Click); + // + // gameSharkConverterToolStripMenuItem + // + this.gameSharkConverterToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("gameSharkConverterToolStripMenuItem.Image"))); + this.gameSharkConverterToolStripMenuItem.Name = "gameSharkConverterToolStripMenuItem"; + this.gameSharkConverterToolStripMenuItem.Size = new System.Drawing.Size(191, 22); + this.gameSharkConverterToolStripMenuItem.Text = "GameShark Converter"; + this.gameSharkConverterToolStripMenuItem.Click += new System.EventHandler(this.gameSharkConverterToolStripMenuItem_Click); + // + // toolStripSeparator29 + // + this.toolStripSeparator29.Name = "toolStripSeparator29"; + this.toolStripSeparator29.Size = new System.Drawing.Size(188, 6); + // + // MultiDiskBundlerFileMenuItem + // + this.MultiDiskBundlerFileMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveConfig; + this.MultiDiskBundlerFileMenuItem.Name = "MultiDiskBundlerFileMenuItem"; + this.MultiDiskBundlerFileMenuItem.Size = new System.Drawing.Size(191, 22); + this.MultiDiskBundlerFileMenuItem.Text = "Multi-disk Bundler"; + this.MultiDiskBundlerFileMenuItem.Click += new System.EventHandler(this.CreateMultigameFileMenuItem_Click); + // // externalToolToolStripMenuItem // this.externalToolToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.dummyExternalTool}); this.externalToolToolStripMenuItem.Name = "externalToolToolStripMenuItem"; - this.externalToolToolStripMenuItem.Size = new System.Drawing.Size(189, 22); + this.externalToolToolStripMenuItem.Size = new System.Drawing.Size(191, 22); this.externalToolToolStripMenuItem.Text = "External Tool"; this.externalToolToolStripMenuItem.DropDownOpening += new System.EventHandler(this.ExternalToolToolStripMenuItem_DropDownOpening); // // dummyExternalTool // this.dummyExternalTool.Name = "dummyExternalTool"; - this.dummyExternalTool.Size = new System.Drawing.Size(103, 22); + this.dummyExternalTool.Size = new System.Drawing.Size(110, 22); this.dummyExternalTool.Text = "None"; // - // toolStripSeparator29 - // - this.toolStripSeparator29.Name = "toolStripSeparator29"; - this.toolStripSeparator29.Size = new System.Drawing.Size(186, 6); - // - // MultiDiskBundlerFileMenuItem - // - this.MultiDiskBundlerFileMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveConfig; - this.MultiDiskBundlerFileMenuItem.Name = "MultiDiskBundlerFileMenuItem"; - this.MultiDiskBundlerFileMenuItem.Size = new System.Drawing.Size(189, 22); - this.MultiDiskBundlerFileMenuItem.Text = "Multi-disk Bundler"; - this.MultiDiskBundlerFileMenuItem.Click += new System.EventHandler(this.CreateMultigameFileMenuItem_Click); - // - // gameSharkConverterToolStripMenuItem - // - this.gameSharkConverterToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("gameSharkConverterToolStripMenuItem.Image"))); - this.gameSharkConverterToolStripMenuItem.Name = "gameSharkConverterToolStripMenuItem"; - this.gameSharkConverterToolStripMenuItem.Size = new System.Drawing.Size(189, 22); - this.gameSharkConverterToolStripMenuItem.Text = "GameShark Converter"; - this.gameSharkConverterToolStripMenuItem.Click += new System.EventHandler(this.gameSharkConverterToolStripMenuItem_Click); - // // batchRunnerToolStripMenuItem // this.batchRunnerToolStripMenuItem.Name = "batchRunnerToolStripMenuItem"; - this.batchRunnerToolStripMenuItem.Size = new System.Drawing.Size(189, 22); + this.batchRunnerToolStripMenuItem.Size = new System.Drawing.Size(191, 22); this.batchRunnerToolStripMenuItem.Text = "Batch Runner"; this.batchRunnerToolStripMenuItem.Visible = false; this.batchRunnerToolStripMenuItem.Click += new System.EventHandler(this.batchRunnerToolStripMenuItem_Click); // + // ExperimentalToolsSubMenu + // + this.ExperimentalToolsSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.AutoHawkMenuItem, + this.NewHexEditorMenuItem}); + this.ExperimentalToolsSubMenu.Name = "ExperimentalToolsSubMenu"; + this.ExperimentalToolsSubMenu.Size = new System.Drawing.Size(191, 22); + this.ExperimentalToolsSubMenu.Text = "Experimental Tools"; + this.ExperimentalToolsSubMenu.DropDownOpened += new System.EventHandler(this.ExperimentalToolsSubMenu_DropDownOpened); + // + // AutoHawkMenuItem + // + this.AutoHawkMenuItem.Name = "AutoHawkMenuItem"; + this.AutoHawkMenuItem.Size = new System.Drawing.Size(159, 22); + this.AutoHawkMenuItem.Text = "AutoHawk"; + // + // NewHexEditorMenuItem + // + this.NewHexEditorMenuItem.Name = "NewHexEditorMenuItem"; + this.NewHexEditorMenuItem.Size = new System.Drawing.Size(159, 22); + this.NewHexEditorMenuItem.Text = "New Hex Editor"; + this.NewHexEditorMenuItem.Click += new System.EventHandler(this.NewHexEditorMenuItem_Click); + // // NESSubMenu // this.NESSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -2038,7 +2095,7 @@ this.FDSControlsMenuItem, this.barcodeReaderToolStripMenuItem}); this.NESSubMenu.Name = "NESSubMenu"; - this.NESSubMenu.Size = new System.Drawing.Size(40, 19); + this.NESSubMenu.Size = new System.Drawing.Size(38, 17); this.NESSubMenu.Text = "&NES"; this.NESSubMenu.DropDownOpened += new System.EventHandler(this.NESSubMenu_DropDownOpened); // @@ -2048,67 +2105,67 @@ this.quickNESToolStripMenuItem, this.nesHawkToolStripMenuItem}); this.coreToolStripMenuItem.Name = "coreToolStripMenuItem"; - this.coreToolStripMenuItem.Size = new System.Drawing.Size(233, 22); + this.coreToolStripMenuItem.Size = new System.Drawing.Size(228, 22); this.coreToolStripMenuItem.Text = "&Core"; this.coreToolStripMenuItem.DropDownOpened += new System.EventHandler(this.coreToolStripMenuItem_DropDownOpened); // // quickNESToolStripMenuItem // this.quickNESToolStripMenuItem.Name = "quickNESToolStripMenuItem"; - this.quickNESToolStripMenuItem.Size = new System.Drawing.Size(125, 22); + this.quickNESToolStripMenuItem.Size = new System.Drawing.Size(129, 22); this.quickNESToolStripMenuItem.Text = "&QuickNes"; this.quickNESToolStripMenuItem.Click += new System.EventHandler(this.quickNESToolStripMenuItem_Click); // // nesHawkToolStripMenuItem // this.nesHawkToolStripMenuItem.Name = "nesHawkToolStripMenuItem"; - this.nesHawkToolStripMenuItem.Size = new System.Drawing.Size(125, 22); + this.nesHawkToolStripMenuItem.Size = new System.Drawing.Size(129, 22); this.nesHawkToolStripMenuItem.Text = "&NesHawk"; this.nesHawkToolStripMenuItem.Click += new System.EventHandler(this.nesHawkToolStripMenuItem_Click); // // toolStripSeparator34 // this.toolStripSeparator34.Name = "toolStripSeparator34"; - this.toolStripSeparator34.Size = new System.Drawing.Size(230, 6); + this.toolStripSeparator34.Size = new System.Drawing.Size(225, 6); // // NESPPUViewerMenuItem // this.NESPPUViewerMenuItem.Name = "NESPPUViewerMenuItem"; - this.NESPPUViewerMenuItem.Size = new System.Drawing.Size(233, 22); + this.NESPPUViewerMenuItem.Size = new System.Drawing.Size(228, 22); this.NESPPUViewerMenuItem.Text = "&PPU Viewer"; this.NESPPUViewerMenuItem.Click += new System.EventHandler(this.NESPPUViewerMenuItem_Click); // // NESNametableViewerMenuItem // this.NESNametableViewerMenuItem.Name = "NESNametableViewerMenuItem"; - this.NESNametableViewerMenuItem.Size = new System.Drawing.Size(233, 22); + this.NESNametableViewerMenuItem.Size = new System.Drawing.Size(228, 22); this.NESNametableViewerMenuItem.Text = "&Nametable Viewer"; this.NESNametableViewerMenuItem.Click += new System.EventHandler(this.NESNametableViewerMenuItem_Click); // // NESGameGenieCodesMenuItem // this.NESGameGenieCodesMenuItem.Name = "NESGameGenieCodesMenuItem"; - this.NESGameGenieCodesMenuItem.Size = new System.Drawing.Size(233, 22); + this.NESGameGenieCodesMenuItem.Size = new System.Drawing.Size(228, 22); this.NESGameGenieCodesMenuItem.Text = "&Game Genie Encoder/Decoder"; this.NESGameGenieCodesMenuItem.Click += new System.EventHandler(this.NESGameGenieCodesMenuItem_Click); // // musicRipperToolStripMenuItem // this.musicRipperToolStripMenuItem.Name = "musicRipperToolStripMenuItem"; - this.musicRipperToolStripMenuItem.Size = new System.Drawing.Size(233, 22); + this.musicRipperToolStripMenuItem.Size = new System.Drawing.Size(228, 22); this.musicRipperToolStripMenuItem.Text = "Music Ripper"; this.musicRipperToolStripMenuItem.Click += new System.EventHandler(this.musicRipperToolStripMenuItem_Click); // // toolStripSeparator17 // this.toolStripSeparator17.Name = "toolStripSeparator17"; - this.toolStripSeparator17.Size = new System.Drawing.Size(230, 6); + this.toolStripSeparator17.Size = new System.Drawing.Size(225, 6); // // NesControllerSettingsMenuItem // this.NesControllerSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; this.NesControllerSettingsMenuItem.Name = "NesControllerSettingsMenuItem"; - this.NesControllerSettingsMenuItem.Size = new System.Drawing.Size(233, 22); + this.NesControllerSettingsMenuItem.Size = new System.Drawing.Size(228, 22); this.NesControllerSettingsMenuItem.Text = "Controller Settings..."; this.NesControllerSettingsMenuItem.Click += new System.EventHandler(this.NesControllerSettingsMenuItem_Click); // @@ -2116,7 +2173,7 @@ // this.NESGraphicSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.tvIcon; this.NESGraphicSettingsMenuItem.Name = "NESGraphicSettingsMenuItem"; - this.NESGraphicSettingsMenuItem.Size = new System.Drawing.Size(233, 22); + this.NESGraphicSettingsMenuItem.Size = new System.Drawing.Size(228, 22); this.NESGraphicSettingsMenuItem.Text = "Graphics Settings..."; this.NESGraphicSettingsMenuItem.Click += new System.EventHandler(this.NESGraphicSettingsMenuItem_Click); // @@ -2124,42 +2181,42 @@ // this.NESSoundChannelsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.AudioHS; this.NESSoundChannelsMenuItem.Name = "NESSoundChannelsMenuItem"; - this.NESSoundChannelsMenuItem.Size = new System.Drawing.Size(233, 22); + this.NESSoundChannelsMenuItem.Size = new System.Drawing.Size(228, 22); this.NESSoundChannelsMenuItem.Text = "Sound Channels..."; this.NESSoundChannelsMenuItem.Click += new System.EventHandler(this.NESSoundChannelsMenuItem_Click); // // MovieSettingsMenuItem // this.MovieSettingsMenuItem.Name = "MovieSettingsMenuItem"; - this.MovieSettingsMenuItem.Size = new System.Drawing.Size(233, 22); + this.MovieSettingsMenuItem.Size = new System.Drawing.Size(228, 22); this.MovieSettingsMenuItem.Text = "Advanced Settings..."; this.MovieSettingsMenuItem.Click += new System.EventHandler(this.MovieSettingsMenuItem_Click); // // toolStripSeparator22 // this.toolStripSeparator22.Name = "toolStripSeparator22"; - this.toolStripSeparator22.Size = new System.Drawing.Size(230, 6); + this.toolStripSeparator22.Size = new System.Drawing.Size(225, 6); // // FDSControlsMenuItem // this.FDSControlsMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.FdsEjectDiskMenuItem}); this.FDSControlsMenuItem.Name = "FDSControlsMenuItem"; - this.FDSControlsMenuItem.Size = new System.Drawing.Size(233, 22); + this.FDSControlsMenuItem.Size = new System.Drawing.Size(228, 22); this.FDSControlsMenuItem.Text = "FDS Controls"; this.FDSControlsMenuItem.DropDownOpened += new System.EventHandler(this.FdsControlsMenuItem_DropDownOpened); // // FdsEjectDiskMenuItem // this.FdsEjectDiskMenuItem.Name = "FdsEjectDiskMenuItem"; - this.FdsEjectDiskMenuItem.Size = new System.Drawing.Size(124, 22); + this.FdsEjectDiskMenuItem.Size = new System.Drawing.Size(131, 22); this.FdsEjectDiskMenuItem.Text = "&Eject Disk"; this.FdsEjectDiskMenuItem.Click += new System.EventHandler(this.FdsEjectDiskMenuItem_Click); // // barcodeReaderToolStripMenuItem // this.barcodeReaderToolStripMenuItem.Name = "barcodeReaderToolStripMenuItem"; - this.barcodeReaderToolStripMenuItem.Size = new System.Drawing.Size(233, 22); + this.barcodeReaderToolStripMenuItem.Size = new System.Drawing.Size(228, 22); this.barcodeReaderToolStripMenuItem.Text = "Barcode Reader"; this.barcodeReaderToolStripMenuItem.Click += new System.EventHandler(this.barcodeReaderToolStripMenuItem_Click); // @@ -2177,7 +2234,7 @@ this.PCEAlwaysEqualizeVolumesMenuItem, this.PCEArcadeCardRewindEnableMenuItem}); this.PCESubMenu.Name = "PCESubMenu"; - this.PCESubMenu.Size = new System.Drawing.Size(40, 19); + this.PCESubMenu.Size = new System.Drawing.Size(38, 17); this.PCESubMenu.Text = "&PCE"; this.PCESubMenu.DropDownOpened += new System.EventHandler(this.PCESubMenu_DropDownOpened); // @@ -2185,7 +2242,7 @@ // this.PceControllerSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; this.PceControllerSettingsMenuItem.Name = "PceControllerSettingsMenuItem"; - this.PceControllerSettingsMenuItem.Size = new System.Drawing.Size(258, 22); + this.PceControllerSettingsMenuItem.Size = new System.Drawing.Size(251, 22); this.PceControllerSettingsMenuItem.Text = "Controller Settings"; this.PceControllerSettingsMenuItem.Click += new System.EventHandler(this.PceControllerSettingsMenuItem_Click); // @@ -2193,59 +2250,59 @@ // this.PCEGraphicsSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.tvIcon; this.PCEGraphicsSettingsMenuItem.Name = "PCEGraphicsSettingsMenuItem"; - this.PCEGraphicsSettingsMenuItem.Size = new System.Drawing.Size(258, 22); + this.PCEGraphicsSettingsMenuItem.Size = new System.Drawing.Size(251, 22); this.PCEGraphicsSettingsMenuItem.Text = "Graphics Settings"; this.PCEGraphicsSettingsMenuItem.Click += new System.EventHandler(this.PCEGraphicsSettingsMenuItem_Click); // // toolStripSeparator32 // this.toolStripSeparator32.Name = "toolStripSeparator32"; - this.toolStripSeparator32.Size = new System.Drawing.Size(255, 6); + this.toolStripSeparator32.Size = new System.Drawing.Size(248, 6); // // PCEBGViewerMenuItem // this.PCEBGViewerMenuItem.Name = "PCEBGViewerMenuItem"; - this.PCEBGViewerMenuItem.Size = new System.Drawing.Size(258, 22); + this.PCEBGViewerMenuItem.Size = new System.Drawing.Size(251, 22); this.PCEBGViewerMenuItem.Text = "&BG Viewer"; this.PCEBGViewerMenuItem.Click += new System.EventHandler(this.PCEBGViewerMenuItem_Click); // // PCEtileViewerToolStripMenuItem // this.PCEtileViewerToolStripMenuItem.Name = "PCEtileViewerToolStripMenuItem"; - this.PCEtileViewerToolStripMenuItem.Size = new System.Drawing.Size(258, 22); + this.PCEtileViewerToolStripMenuItem.Size = new System.Drawing.Size(251, 22); this.PCEtileViewerToolStripMenuItem.Text = "&Tile Viewer"; this.PCEtileViewerToolStripMenuItem.Click += new System.EventHandler(this.PceTileViewerMenuItem_Click); // // PceSoundDebuggerToolStripMenuItem // this.PceSoundDebuggerToolStripMenuItem.Name = "PceSoundDebuggerToolStripMenuItem"; - this.PceSoundDebuggerToolStripMenuItem.Size = new System.Drawing.Size(258, 22); + this.PceSoundDebuggerToolStripMenuItem.Size = new System.Drawing.Size(251, 22); this.PceSoundDebuggerToolStripMenuItem.Text = "&Sound Debugger"; this.PceSoundDebuggerToolStripMenuItem.Click += new System.EventHandler(this.PceSoundDebuggerToolStripMenuItem_Click); // // toolStripSeparator25 // this.toolStripSeparator25.Name = "toolStripSeparator25"; - this.toolStripSeparator25.Size = new System.Drawing.Size(255, 6); + this.toolStripSeparator25.Size = new System.Drawing.Size(248, 6); // // PCEAlwaysPerformSpriteLimitMenuItem // this.PCEAlwaysPerformSpriteLimitMenuItem.Name = "PCEAlwaysPerformSpriteLimitMenuItem"; - this.PCEAlwaysPerformSpriteLimitMenuItem.Size = new System.Drawing.Size(258, 22); + this.PCEAlwaysPerformSpriteLimitMenuItem.Size = new System.Drawing.Size(251, 22); this.PCEAlwaysPerformSpriteLimitMenuItem.Text = "Always Perform Sprite Limit"; this.PCEAlwaysPerformSpriteLimitMenuItem.Click += new System.EventHandler(this.PCEAlwaysPerformSpriteLimitMenuItem_Click); // // PCEAlwaysEqualizeVolumesMenuItem // this.PCEAlwaysEqualizeVolumesMenuItem.Name = "PCEAlwaysEqualizeVolumesMenuItem"; - this.PCEAlwaysEqualizeVolumesMenuItem.Size = new System.Drawing.Size(258, 22); + this.PCEAlwaysEqualizeVolumesMenuItem.Size = new System.Drawing.Size(251, 22); this.PCEAlwaysEqualizeVolumesMenuItem.Text = "Always Equalize Volumes (PCE-CD)"; this.PCEAlwaysEqualizeVolumesMenuItem.Click += new System.EventHandler(this.PCEAlwaysEqualizeVolumesMenuItem_Click); // // PCEArcadeCardRewindEnableMenuItem // this.PCEArcadeCardRewindEnableMenuItem.Name = "PCEArcadeCardRewindEnableMenuItem"; - this.PCEArcadeCardRewindEnableMenuItem.Size = new System.Drawing.Size(258, 22); + this.PCEArcadeCardRewindEnableMenuItem.Size = new System.Drawing.Size(251, 22); this.PCEArcadeCardRewindEnableMenuItem.Text = "Arcade Card Rewind-Enable Hack"; this.PCEArcadeCardRewindEnableMenuItem.Click += new System.EventHandler(this.PCEArcadeCardRewindEnableMenuItem_Click); // @@ -2268,7 +2325,7 @@ this.SMSVDPViewerToolStripMenuItem, this.GGGameGenieMenuItem}); this.SMSSubMenu.Name = "SMSSubMenu"; - this.SMSSubMenu.Size = new System.Drawing.Size(42, 19); + this.SMSSubMenu.Size = new System.Drawing.Size(39, 17); this.SMSSubMenu.Text = "&SMS"; this.SMSSubMenu.DropDownOpened += new System.EventHandler(this.SMSSubMenu_DropDownOpened); // @@ -2279,27 +2336,27 @@ this.SMSregionJapanToolStripMenuItem, this.SMSregionAutoToolStripMenuItem}); this.SMSregionToolStripMenuItem.Name = "SMSregionToolStripMenuItem"; - this.SMSregionToolStripMenuItem.Size = new System.Drawing.Size(241, 22); + this.SMSregionToolStripMenuItem.Size = new System.Drawing.Size(232, 22); this.SMSregionToolStripMenuItem.Text = "Region"; // // SMSregionExportToolStripMenuItem // this.SMSregionExportToolStripMenuItem.Name = "SMSregionExportToolStripMenuItem"; - this.SMSregionExportToolStripMenuItem.Size = new System.Drawing.Size(107, 22); + this.SMSregionExportToolStripMenuItem.Size = new System.Drawing.Size(117, 22); this.SMSregionExportToolStripMenuItem.Text = "Export"; this.SMSregionExportToolStripMenuItem.Click += new System.EventHandler(this.SMS_RegionExport_Click); // // SMSregionJapanToolStripMenuItem // this.SMSregionJapanToolStripMenuItem.Name = "SMSregionJapanToolStripMenuItem"; - this.SMSregionJapanToolStripMenuItem.Size = new System.Drawing.Size(107, 22); + this.SMSregionJapanToolStripMenuItem.Size = new System.Drawing.Size(117, 22); this.SMSregionJapanToolStripMenuItem.Text = "Japan"; this.SMSregionJapanToolStripMenuItem.Click += new System.EventHandler(this.SMS_RegionJapan_Click); // // SMSregionAutoToolStripMenuItem // this.SMSregionAutoToolStripMenuItem.Name = "SMSregionAutoToolStripMenuItem"; - this.SMSregionAutoToolStripMenuItem.Size = new System.Drawing.Size(107, 22); + this.SMSregionAutoToolStripMenuItem.Size = new System.Drawing.Size(117, 22); this.SMSregionAutoToolStripMenuItem.Text = "Auto"; this.SMSregionAutoToolStripMenuItem.Click += new System.EventHandler(this.SMS_RegionAuto_Click); // @@ -2310,114 +2367,114 @@ this.SMSdisplayPalToolStripMenuItem, this.SMSdisplayAutoToolStripMenuItem}); this.SMSdisplayToolStripMenuItem.Name = "SMSdisplayToolStripMenuItem"; - this.SMSdisplayToolStripMenuItem.Size = new System.Drawing.Size(241, 22); + this.SMSdisplayToolStripMenuItem.Size = new System.Drawing.Size(232, 22); this.SMSdisplayToolStripMenuItem.Text = "Display Type"; // // SMSdisplayNtscToolStripMenuItem // this.SMSdisplayNtscToolStripMenuItem.Name = "SMSdisplayNtscToolStripMenuItem"; - this.SMSdisplayNtscToolStripMenuItem.Size = new System.Drawing.Size(104, 22); + this.SMSdisplayNtscToolStripMenuItem.Size = new System.Drawing.Size(111, 22); this.SMSdisplayNtscToolStripMenuItem.Text = "NTSC"; this.SMSdisplayNtscToolStripMenuItem.Click += new System.EventHandler(this.SMS_DisplayNTSC_Click); // // SMSdisplayPalToolStripMenuItem // this.SMSdisplayPalToolStripMenuItem.Name = "SMSdisplayPalToolStripMenuItem"; - this.SMSdisplayPalToolStripMenuItem.Size = new System.Drawing.Size(104, 22); + this.SMSdisplayPalToolStripMenuItem.Size = new System.Drawing.Size(111, 22); this.SMSdisplayPalToolStripMenuItem.Text = "PAL"; this.SMSdisplayPalToolStripMenuItem.Click += new System.EventHandler(this.SMS_DisplayPAL_Click); // // SMSdisplayAutoToolStripMenuItem // this.SMSdisplayAutoToolStripMenuItem.Name = "SMSdisplayAutoToolStripMenuItem"; - this.SMSdisplayAutoToolStripMenuItem.Size = new System.Drawing.Size(104, 22); + this.SMSdisplayAutoToolStripMenuItem.Size = new System.Drawing.Size(111, 22); this.SMSdisplayAutoToolStripMenuItem.Text = "Auto"; this.SMSdisplayAutoToolStripMenuItem.Click += new System.EventHandler(this.SMS_DisplayAuto_Click); // // SMStoolStripMenuItem2 // this.SMStoolStripMenuItem2.Name = "SMStoolStripMenuItem2"; - this.SMStoolStripMenuItem2.Size = new System.Drawing.Size(238, 6); + this.SMStoolStripMenuItem2.Size = new System.Drawing.Size(229, 6); // // SMSenableBIOSToolStripMenuItem // this.SMSenableBIOSToolStripMenuItem.Name = "SMSenableBIOSToolStripMenuItem"; - this.SMSenableBIOSToolStripMenuItem.Size = new System.Drawing.Size(241, 22); + this.SMSenableBIOSToolStripMenuItem.Size = new System.Drawing.Size(232, 22); this.SMSenableBIOSToolStripMenuItem.Text = "Enable BIOS"; this.SMSenableBIOSToolStripMenuItem.Click += new System.EventHandler(this.SMS_BIOS_Click); // // SMSEnableFMChipMenuItem // this.SMSEnableFMChipMenuItem.Name = "SMSEnableFMChipMenuItem"; - this.SMSEnableFMChipMenuItem.Size = new System.Drawing.Size(241, 22); + this.SMSEnableFMChipMenuItem.Size = new System.Drawing.Size(232, 22); this.SMSEnableFMChipMenuItem.Text = "&Enable FM Chip"; this.SMSEnableFMChipMenuItem.Click += new System.EventHandler(this.SMSEnableFMChipMenuItem_Click); // // SMSOverclockMenuItem // this.SMSOverclockMenuItem.Name = "SMSOverclockMenuItem"; - this.SMSOverclockMenuItem.Size = new System.Drawing.Size(241, 22); + this.SMSOverclockMenuItem.Size = new System.Drawing.Size(232, 22); this.SMSOverclockMenuItem.Text = "&Overclock when Known Safe"; this.SMSOverclockMenuItem.Click += new System.EventHandler(this.SMSOverclockMenuItem_Click); // // SMSForceStereoMenuItem // this.SMSForceStereoMenuItem.Name = "SMSForceStereoMenuItem"; - this.SMSForceStereoMenuItem.Size = new System.Drawing.Size(241, 22); + this.SMSForceStereoMenuItem.Size = new System.Drawing.Size(232, 22); this.SMSForceStereoMenuItem.Text = "&Force Stereo Separation"; this.SMSForceStereoMenuItem.Click += new System.EventHandler(this.SMSForceStereoMenuItem_Click); // // SMSSpriteLimitMenuItem // this.SMSSpriteLimitMenuItem.Name = "SMSSpriteLimitMenuItem"; - this.SMSSpriteLimitMenuItem.Size = new System.Drawing.Size(241, 22); + this.SMSSpriteLimitMenuItem.Size = new System.Drawing.Size(232, 22); this.SMSSpriteLimitMenuItem.Text = "Sprite &Limit"; this.SMSSpriteLimitMenuItem.Click += new System.EventHandler(this.SMSSpriteLimitMenuItem_Click); // // SMSFix3DGameDisplayToolStripMenuItem // this.SMSFix3DGameDisplayToolStripMenuItem.Name = "SMSFix3DGameDisplayToolStripMenuItem"; - this.SMSFix3DGameDisplayToolStripMenuItem.Size = new System.Drawing.Size(241, 22); + this.SMSFix3DGameDisplayToolStripMenuItem.Size = new System.Drawing.Size(232, 22); this.SMSFix3DGameDisplayToolStripMenuItem.Text = "Fix 3D Game Display"; this.SMSFix3DGameDisplayToolStripMenuItem.Click += new System.EventHandler(this.SMSFix3DDisplayMenuItem_Click); // // ShowClippedRegionsMenuItem // this.ShowClippedRegionsMenuItem.Name = "ShowClippedRegionsMenuItem"; - this.ShowClippedRegionsMenuItem.Size = new System.Drawing.Size(241, 22); + this.ShowClippedRegionsMenuItem.Size = new System.Drawing.Size(232, 22); this.ShowClippedRegionsMenuItem.Text = "&Show Clipped Regions"; this.ShowClippedRegionsMenuItem.Click += new System.EventHandler(this.ShowClippedRegionsMenuItem_Click); // // HighlightActiveDisplayRegionMenuItem // this.HighlightActiveDisplayRegionMenuItem.Name = "HighlightActiveDisplayRegionMenuItem"; - this.HighlightActiveDisplayRegionMenuItem.Size = new System.Drawing.Size(241, 22); + this.HighlightActiveDisplayRegionMenuItem.Size = new System.Drawing.Size(232, 22); this.HighlightActiveDisplayRegionMenuItem.Text = "&Highlight Active Display Region"; this.HighlightActiveDisplayRegionMenuItem.Click += new System.EventHandler(this.HighlightActiveDisplayRegionMenuItem_Click); // // SMSGraphicsSettingsMenuItem // this.SMSGraphicsSettingsMenuItem.Name = "SMSGraphicsSettingsMenuItem"; - this.SMSGraphicsSettingsMenuItem.Size = new System.Drawing.Size(241, 22); + this.SMSGraphicsSettingsMenuItem.Size = new System.Drawing.Size(232, 22); this.SMSGraphicsSettingsMenuItem.Text = "&Graphics Settings..."; this.SMSGraphicsSettingsMenuItem.Click += new System.EventHandler(this.SMSGraphicsSettingsMenuItem_Click); // // toolStripSeparator24 // this.toolStripSeparator24.Name = "toolStripSeparator24"; - this.toolStripSeparator24.Size = new System.Drawing.Size(238, 6); + this.toolStripSeparator24.Size = new System.Drawing.Size(229, 6); // // SMSVDPViewerToolStripMenuItem // this.SMSVDPViewerToolStripMenuItem.Name = "SMSVDPViewerToolStripMenuItem"; - this.SMSVDPViewerToolStripMenuItem.Size = new System.Drawing.Size(241, 22); + this.SMSVDPViewerToolStripMenuItem.Size = new System.Drawing.Size(232, 22); this.SMSVDPViewerToolStripMenuItem.Text = "&VDP Viewer"; this.SMSVDPViewerToolStripMenuItem.Click += new System.EventHandler(this.SmsVdpViewerMenuItem_Click); // // GGGameGenieMenuItem // this.GGGameGenieMenuItem.Name = "GGGameGenieMenuItem"; - this.GGGameGenieMenuItem.Size = new System.Drawing.Size(241, 22); + this.GGGameGenieMenuItem.Size = new System.Drawing.Size(232, 22); this.GGGameGenieMenuItem.Text = "&Game Genie Encoder/Decoder"; this.GGGameGenieMenuItem.Click += new System.EventHandler(this.GGGameGenieMenuItem_Click); // @@ -2430,7 +2487,7 @@ this.AutoloadKeypadMenuItem, this.paletteToolStripMenuItem}); this.TI83SubMenu.Name = "TI83SubMenu"; - this.TI83SubMenu.Size = new System.Drawing.Size(41, 19); + this.TI83SubMenu.Size = new System.Drawing.Size(41, 17); this.TI83SubMenu.Text = "TI83"; this.TI83SubMenu.DropDownOpened += new System.EventHandler(this.TI83SubMenu_DropDownOpened); // @@ -2438,35 +2495,35 @@ // this.KeypadMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.calculator; this.KeypadMenuItem.Name = "KeypadMenuItem"; - this.KeypadMenuItem.Size = new System.Drawing.Size(165, 22); + this.KeypadMenuItem.Size = new System.Drawing.Size(168, 22); this.KeypadMenuItem.Text = "Keypad"; this.KeypadMenuItem.Click += new System.EventHandler(this.KeypadMenuItem_Click); // // LoadTIFileMenuItem // this.LoadTIFileMenuItem.Name = "LoadTIFileMenuItem"; - this.LoadTIFileMenuItem.Size = new System.Drawing.Size(165, 22); + this.LoadTIFileMenuItem.Size = new System.Drawing.Size(168, 22); this.LoadTIFileMenuItem.Text = "Load TI-83 File..."; this.LoadTIFileMenuItem.Click += new System.EventHandler(this.LoadTIFileMenuItem_Click); // // toolStripSeparator13 // this.toolStripSeparator13.Name = "toolStripSeparator13"; - this.toolStripSeparator13.Size = new System.Drawing.Size(162, 6); + this.toolStripSeparator13.Size = new System.Drawing.Size(165, 6); // // AutoloadKeypadMenuItem // this.AutoloadKeypadMenuItem.Checked = true; this.AutoloadKeypadMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; this.AutoloadKeypadMenuItem.Name = "AutoloadKeypadMenuItem"; - this.AutoloadKeypadMenuItem.Size = new System.Drawing.Size(165, 22); + this.AutoloadKeypadMenuItem.Size = new System.Drawing.Size(168, 22); this.AutoloadKeypadMenuItem.Text = "Autoload Keypad"; this.AutoloadKeypadMenuItem.Click += new System.EventHandler(this.AutoloadKeypadMenuItem_Click); // // paletteToolStripMenuItem // this.paletteToolStripMenuItem.Name = "paletteToolStripMenuItem"; - this.paletteToolStripMenuItem.Size = new System.Drawing.Size(165, 22); + this.paletteToolStripMenuItem.Size = new System.Drawing.Size(168, 22); this.paletteToolStripMenuItem.Text = "Palette..."; this.paletteToolStripMenuItem.Click += new System.EventHandler(this.TI83PaletteMenuItem_Click); // @@ -2475,14 +2532,14 @@ this.AtariSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.AtariSettingsToolStripMenuItem}); this.AtariSubMenu.Name = "AtariSubMenu"; - this.AtariSubMenu.Size = new System.Drawing.Size(44, 19); + this.AtariSubMenu.Size = new System.Drawing.Size(42, 17); this.AtariSubMenu.Text = "&Atari"; this.AtariSubMenu.DropDownOpened += new System.EventHandler(this.AtariSubMenu_DropDownOpened); // // AtariSettingsToolStripMenuItem // this.AtariSettingsToolStripMenuItem.Name = "AtariSettingsToolStripMenuItem"; - this.AtariSettingsToolStripMenuItem.Size = new System.Drawing.Size(125, 22); + this.AtariSettingsToolStripMenuItem.Size = new System.Drawing.Size(136, 22); this.AtariSettingsToolStripMenuItem.Text = "Settings..."; this.AtariSettingsToolStripMenuItem.Click += new System.EventHandler(this.AtariSettingsToolStripMenuItem_Click); // @@ -2495,40 +2552,40 @@ this.GBGPUViewerMenuItem, this.GBGameGenieMenuItem}); this.GBSubMenu.Name = "GBSubMenu"; - this.GBSubMenu.Size = new System.Drawing.Size(34, 19); + this.GBSubMenu.Size = new System.Drawing.Size(32, 17); this.GBSubMenu.Text = "&GB"; this.GBSubMenu.DropDownOpened += new System.EventHandler(this.GBSubMenu_DropDownOpened); // // GBcoreSettingsToolStripMenuItem // this.GBcoreSettingsToolStripMenuItem.Name = "GBcoreSettingsToolStripMenuItem"; - this.GBcoreSettingsToolStripMenuItem.Size = new System.Drawing.Size(233, 22); + this.GBcoreSettingsToolStripMenuItem.Size = new System.Drawing.Size(228, 22); this.GBcoreSettingsToolStripMenuItem.Text = "Settings..."; this.GBcoreSettingsToolStripMenuItem.Click += new System.EventHandler(this.GBCoreSettingsMenuItem_Click); // // LoadGBInSGBMenuItem // this.LoadGBInSGBMenuItem.Name = "LoadGBInSGBMenuItem"; - this.LoadGBInSGBMenuItem.Size = new System.Drawing.Size(233, 22); + this.LoadGBInSGBMenuItem.Size = new System.Drawing.Size(228, 22); this.LoadGBInSGBMenuItem.Text = "Load GB in SGB"; this.LoadGBInSGBMenuItem.Click += new System.EventHandler(this.LoadGBInSGBMenuItem_Click); // // toolStripSeparator28 // this.toolStripSeparator28.Name = "toolStripSeparator28"; - this.toolStripSeparator28.Size = new System.Drawing.Size(230, 6); + this.toolStripSeparator28.Size = new System.Drawing.Size(225, 6); // // GBGPUViewerMenuItem // this.GBGPUViewerMenuItem.Name = "GBGPUViewerMenuItem"; - this.GBGPUViewerMenuItem.Size = new System.Drawing.Size(233, 22); + this.GBGPUViewerMenuItem.Size = new System.Drawing.Size(228, 22); this.GBGPUViewerMenuItem.Text = "GPU Viewer"; this.GBGPUViewerMenuItem.Click += new System.EventHandler(this.GBGPUViewerMenuItem_Click); // // GBGameGenieMenuItem // this.GBGameGenieMenuItem.Name = "GBGameGenieMenuItem"; - this.GBGameGenieMenuItem.Size = new System.Drawing.Size(233, 22); + this.GBGameGenieMenuItem.Size = new System.Drawing.Size(228, 22); this.GBGameGenieMenuItem.Text = "&Game Genie Encoder/Decoder"; this.GBGameGenieMenuItem.Click += new System.EventHandler(this.GBGameGenieMenuItem_Click); // @@ -2540,7 +2597,7 @@ this.toolStripSeparator33, this.GbaGpuViewerMenuItem}); this.GBASubMenu.Name = "GBASubMenu"; - this.GBASubMenu.Size = new System.Drawing.Size(42, 19); + this.GBASubMenu.Size = new System.Drawing.Size(39, 17); this.GBASubMenu.Text = "GBA"; // // GBACoreSelectionSubMenu @@ -2549,40 +2606,40 @@ this.GBAmGBAMenuItem, this.GBAVBANextMenuItem}); this.GBACoreSelectionSubMenu.Name = "GBACoreSelectionSubMenu"; - this.GBACoreSelectionSubMenu.Size = new System.Drawing.Size(135, 22); + this.GBACoreSelectionSubMenu.Size = new System.Drawing.Size(140, 22); this.GBACoreSelectionSubMenu.Text = "&Core"; this.GBACoreSelectionSubMenu.DropDownOpened += new System.EventHandler(this.GBACoreSelectionSubMenu_DropDownOpened); // // GBAmGBAMenuItem // this.GBAmGBAMenuItem.Name = "GBAmGBAMenuItem"; - this.GBAmGBAMenuItem.Size = new System.Drawing.Size(125, 22); + this.GBAmGBAMenuItem.Size = new System.Drawing.Size(131, 22); this.GBAmGBAMenuItem.Text = "mGBA"; this.GBAmGBAMenuItem.Click += new System.EventHandler(this.GBAmGBAMenuItem_Click); // // GBAVBANextMenuItem // this.GBAVBANextMenuItem.Name = "GBAVBANextMenuItem"; - this.GBAVBANextMenuItem.Size = new System.Drawing.Size(125, 22); + this.GBAVBANextMenuItem.Size = new System.Drawing.Size(131, 22); this.GBAVBANextMenuItem.Text = "&VBA-Next"; this.GBAVBANextMenuItem.Click += new System.EventHandler(this.GBAVBANextMenuItem_Click); // // GBAcoresettingsToolStripMenuItem1 // this.GBAcoresettingsToolStripMenuItem1.Name = "GBAcoresettingsToolStripMenuItem1"; - this.GBAcoresettingsToolStripMenuItem1.Size = new System.Drawing.Size(135, 22); + this.GBAcoresettingsToolStripMenuItem1.Size = new System.Drawing.Size(140, 22); this.GBAcoresettingsToolStripMenuItem1.Text = "&Settings..."; this.GBAcoresettingsToolStripMenuItem1.Click += new System.EventHandler(this.GBAcoresettingsToolStripMenuItem1_Click); // // toolStripSeparator33 // this.toolStripSeparator33.Name = "toolStripSeparator33"; - this.toolStripSeparator33.Size = new System.Drawing.Size(132, 6); + this.toolStripSeparator33.Size = new System.Drawing.Size(137, 6); // // GbaGpuViewerMenuItem // this.GbaGpuViewerMenuItem.Name = "GbaGpuViewerMenuItem"; - this.GbaGpuViewerMenuItem.Size = new System.Drawing.Size(135, 22); + this.GbaGpuViewerMenuItem.Size = new System.Drawing.Size(140, 22); this.GbaGpuViewerMenuItem.Text = "GPU Viewer"; this.GbaGpuViewerMenuItem.Click += new System.EventHandler(this.GbaGpuViewerMenuItem_Click); // @@ -2594,7 +2651,7 @@ this.PSXDiscControlsMenuItem, this.PSXHashDiscsToolStripMenuItem}); this.PSXSubMenu.Name = "PSXSubMenu"; - this.PSXSubMenu.Size = new System.Drawing.Size(39, 19); + this.PSXSubMenu.Size = new System.Drawing.Size(37, 17); this.PSXSubMenu.Text = "PSX"; this.PSXSubMenu.DropDownOpened += new System.EventHandler(this.PSXSubMenu_DropDownOpened); // @@ -2602,28 +2659,28 @@ // this.PSXControllerSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; this.PSXControllerSettingsMenuItem.Name = "PSXControllerSettingsMenuItem"; - this.PSXControllerSettingsMenuItem.Size = new System.Drawing.Size(234, 22); + this.PSXControllerSettingsMenuItem.Size = new System.Drawing.Size(227, 22); this.PSXControllerSettingsMenuItem.Text = "Controller / Memcard Settings"; this.PSXControllerSettingsMenuItem.Click += new System.EventHandler(this.PSXControllerSettingsMenuItem_Click); // // PSXOptionsMenuItem // this.PSXOptionsMenuItem.Name = "PSXOptionsMenuItem"; - this.PSXOptionsMenuItem.Size = new System.Drawing.Size(234, 22); + this.PSXOptionsMenuItem.Size = new System.Drawing.Size(227, 22); this.PSXOptionsMenuItem.Text = "&Options"; this.PSXOptionsMenuItem.Click += new System.EventHandler(this.PSXOptionsMenuItem_Click); // // PSXDiscControlsMenuItem // this.PSXDiscControlsMenuItem.Name = "PSXDiscControlsMenuItem"; - this.PSXDiscControlsMenuItem.Size = new System.Drawing.Size(234, 22); + this.PSXDiscControlsMenuItem.Size = new System.Drawing.Size(227, 22); this.PSXDiscControlsMenuItem.Text = "&Disc Controls"; this.PSXDiscControlsMenuItem.Click += new System.EventHandler(this.PSXDiscControlsMenuItem_Click); // // PSXHashDiscsToolStripMenuItem // this.PSXHashDiscsToolStripMenuItem.Name = "PSXHashDiscsToolStripMenuItem"; - this.PSXHashDiscsToolStripMenuItem.Size = new System.Drawing.Size(234, 22); + this.PSXHashDiscsToolStripMenuItem.Size = new System.Drawing.Size(227, 22); this.PSXHashDiscsToolStripMenuItem.Text = "&Hash Discs"; this.PSXHashDiscsToolStripMenuItem.Click += new System.EventHandler(this.PSXHashDiscsToolStripMenuItem_Click); // @@ -2637,7 +2694,7 @@ this.SnesGameGenieMenuItem, this.SnesOptionsMenuItem}); this.SNESSubMenu.Name = "SNESSubMenu"; - this.SNESSubMenu.Size = new System.Drawing.Size(46, 19); + this.SNESSubMenu.Size = new System.Drawing.Size(44, 17); this.SNESSubMenu.Text = "&SNES"; this.SNESSubMenu.DropDownOpened += new System.EventHandler(this.SNESSubMenu_DropDownOpened); // @@ -2653,97 +2710,97 @@ this.SnesObj3MenuItem, this.SnesObj4MenuItem}); this.SNESDisplayMenuItem.Name = "SNESDisplayMenuItem"; - this.SNESDisplayMenuItem.Size = new System.Drawing.Size(233, 22); + this.SNESDisplayMenuItem.Size = new System.Drawing.Size(228, 22); this.SNESDisplayMenuItem.Text = "Display"; this.SNESDisplayMenuItem.DropDownOpened += new System.EventHandler(this.SNESDisplayMenuItem_DropDownOpened); // // SnesBg1MenuItem // this.SnesBg1MenuItem.Name = "SnesBg1MenuItem"; - this.SnesBg1MenuItem.Size = new System.Drawing.Size(103, 22); + this.SnesBg1MenuItem.Size = new System.Drawing.Size(113, 22); this.SnesBg1MenuItem.Text = "BG 1"; this.SnesBg1MenuItem.Click += new System.EventHandler(this.SnesBg1MenuItem_Click); // // SnesBg2MenuItem // this.SnesBg2MenuItem.Name = "SnesBg2MenuItem"; - this.SnesBg2MenuItem.Size = new System.Drawing.Size(103, 22); + this.SnesBg2MenuItem.Size = new System.Drawing.Size(113, 22); this.SnesBg2MenuItem.Text = "BG 2"; this.SnesBg2MenuItem.Click += new System.EventHandler(this.SnesBg2MenuItem_Click); // // SnesBg3MenuItem // this.SnesBg3MenuItem.Name = "SnesBg3MenuItem"; - this.SnesBg3MenuItem.Size = new System.Drawing.Size(103, 22); + this.SnesBg3MenuItem.Size = new System.Drawing.Size(113, 22); this.SnesBg3MenuItem.Text = "BG 3"; this.SnesBg3MenuItem.Click += new System.EventHandler(this.SnesBg3MenuItem_Click); // // SnesBg4MenuItem // this.SnesBg4MenuItem.Name = "SnesBg4MenuItem"; - this.SnesBg4MenuItem.Size = new System.Drawing.Size(103, 22); + this.SnesBg4MenuItem.Size = new System.Drawing.Size(113, 22); this.SnesBg4MenuItem.Text = "BG 4"; this.SnesBg4MenuItem.Click += new System.EventHandler(this.SnesBg4MenuItem_Click); // // SnesObj1MenuItem // this.SnesObj1MenuItem.Name = "SnesObj1MenuItem"; - this.SnesObj1MenuItem.Size = new System.Drawing.Size(103, 22); + this.SnesObj1MenuItem.Size = new System.Drawing.Size(113, 22); this.SnesObj1MenuItem.Text = "OBJ 1"; this.SnesObj1MenuItem.Click += new System.EventHandler(this.SnesObj1MenuItem_Click); // // SnesObj2MenuItem // this.SnesObj2MenuItem.Name = "SnesObj2MenuItem"; - this.SnesObj2MenuItem.Size = new System.Drawing.Size(103, 22); + this.SnesObj2MenuItem.Size = new System.Drawing.Size(113, 22); this.SnesObj2MenuItem.Text = "OBJ 2"; this.SnesObj2MenuItem.Click += new System.EventHandler(this.SnesObj2MenuItem_Click); // // SnesObj3MenuItem // this.SnesObj3MenuItem.Name = "SnesObj3MenuItem"; - this.SnesObj3MenuItem.Size = new System.Drawing.Size(103, 22); + this.SnesObj3MenuItem.Size = new System.Drawing.Size(113, 22); this.SnesObj3MenuItem.Text = "OBJ 3"; this.SnesObj3MenuItem.Click += new System.EventHandler(this.SnesObj3MenuItem_Click); // // SnesObj4MenuItem // this.SnesObj4MenuItem.Name = "SnesObj4MenuItem"; - this.SnesObj4MenuItem.Size = new System.Drawing.Size(103, 22); + this.SnesObj4MenuItem.Size = new System.Drawing.Size(113, 22); this.SnesObj4MenuItem.Text = "OBJ 4"; this.SnesObj4MenuItem.Click += new System.EventHandler(this.SnesObj4MenuItem_Click); // // toolStripSeparator18 // this.toolStripSeparator18.Name = "toolStripSeparator18"; - this.toolStripSeparator18.Size = new System.Drawing.Size(230, 6); + this.toolStripSeparator18.Size = new System.Drawing.Size(225, 6); // // SnesGfxDebuggerMenuItem // this.SnesGfxDebuggerMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Bug; this.SnesGfxDebuggerMenuItem.Name = "SnesGfxDebuggerMenuItem"; - this.SnesGfxDebuggerMenuItem.Size = new System.Drawing.Size(233, 22); + this.SnesGfxDebuggerMenuItem.Size = new System.Drawing.Size(228, 22); this.SnesGfxDebuggerMenuItem.Text = "Graphics Debugger"; this.SnesGfxDebuggerMenuItem.Click += new System.EventHandler(this.SnesGfxDebuggerMenuItem_Click); // // SnesGBInSGBMenuItem // this.SnesGBInSGBMenuItem.Name = "SnesGBInSGBMenuItem"; - this.SnesGBInSGBMenuItem.Size = new System.Drawing.Size(233, 22); + this.SnesGBInSGBMenuItem.Size = new System.Drawing.Size(228, 22); this.SnesGBInSGBMenuItem.Text = "Load GB in SGB"; this.SnesGBInSGBMenuItem.Click += new System.EventHandler(this.SnesGBInSGBMenuItem_Click); // // SnesGameGenieMenuItem // this.SnesGameGenieMenuItem.Name = "SnesGameGenieMenuItem"; - this.SnesGameGenieMenuItem.Size = new System.Drawing.Size(233, 22); + this.SnesGameGenieMenuItem.Size = new System.Drawing.Size(228, 22); this.SnesGameGenieMenuItem.Text = "&Game Genie Encoder/Decoder"; this.SnesGameGenieMenuItem.Click += new System.EventHandler(this.SnesGameGenieMenuItem_Click); // // SnesOptionsMenuItem // this.SnesOptionsMenuItem.Name = "SnesOptionsMenuItem"; - this.SnesOptionsMenuItem.Size = new System.Drawing.Size(233, 22); + this.SnesOptionsMenuItem.Size = new System.Drawing.Size(228, 22); this.SnesOptionsMenuItem.Text = "&Options"; this.SnesOptionsMenuItem.Click += new System.EventHandler(this.SnesOptionsMenuItem_Click); // @@ -2752,14 +2809,14 @@ this.ColecoSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.ColecoSkipBiosMenuItem}); this.ColecoSubMenu.Name = "ColecoSubMenu"; - this.ColecoSubMenu.Size = new System.Drawing.Size(56, 19); + this.ColecoSubMenu.Size = new System.Drawing.Size(51, 17); this.ColecoSubMenu.Text = "&Coleco"; this.ColecoSubMenu.DropDownOpened += new System.EventHandler(this.ColecoSubMenu_DropDownOpened); // // ColecoSkipBiosMenuItem // this.ColecoSkipBiosMenuItem.Name = "ColecoSkipBiosMenuItem"; - this.ColecoSkipBiosMenuItem.Size = new System.Drawing.Size(152, 22); + this.ColecoSkipBiosMenuItem.Size = new System.Drawing.Size(156, 22); this.ColecoSkipBiosMenuItem.Text = "&Skip BIOS intro"; this.ColecoSkipBiosMenuItem.Click += new System.EventHandler(this.ColecoSkipBiosMenuItem_Click); // @@ -2773,7 +2830,7 @@ this.MupenStyleLagMenuItem, this.N64ExpansionSlotMenuItem}); this.N64SubMenu.Name = "N64SubMenu"; - this.N64SubMenu.Size = new System.Drawing.Size(40, 19); + this.N64SubMenu.Size = new System.Drawing.Size(38, 17); this.N64SubMenu.Text = "N64"; this.N64SubMenu.DropDownOpened += new System.EventHandler(this.N64SubMenu_DropDownOpened); // @@ -2781,7 +2838,7 @@ // this.N64PluginSettingsMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("N64PluginSettingsMenuItem.Image"))); this.N64PluginSettingsMenuItem.Name = "N64PluginSettingsMenuItem"; - this.N64PluginSettingsMenuItem.Size = new System.Drawing.Size(192, 22); + this.N64PluginSettingsMenuItem.Size = new System.Drawing.Size(191, 22); this.N64PluginSettingsMenuItem.Text = "Plugins"; this.N64PluginSettingsMenuItem.Click += new System.EventHandler(this.N64PluginSettingsMenuItem_Click); // @@ -2789,33 +2846,33 @@ // this.N64ControllerSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; this.N64ControllerSettingsMenuItem.Name = "N64ControllerSettingsMenuItem"; - this.N64ControllerSettingsMenuItem.Size = new System.Drawing.Size(192, 22); + this.N64ControllerSettingsMenuItem.Size = new System.Drawing.Size(191, 22); this.N64ControllerSettingsMenuItem.Text = "Controller Settings..."; this.N64ControllerSettingsMenuItem.Click += new System.EventHandler(this.N64ControllerSettingsMenuItem_Click); // // toolStripSeparator23 // this.toolStripSeparator23.Name = "toolStripSeparator23"; - this.toolStripSeparator23.Size = new System.Drawing.Size(189, 6); + this.toolStripSeparator23.Size = new System.Drawing.Size(188, 6); // // N64CircularAnalogRangeMenuItem // this.N64CircularAnalogRangeMenuItem.Name = "N64CircularAnalogRangeMenuItem"; - this.N64CircularAnalogRangeMenuItem.Size = new System.Drawing.Size(192, 22); + this.N64CircularAnalogRangeMenuItem.Size = new System.Drawing.Size(191, 22); this.N64CircularAnalogRangeMenuItem.Text = "Circular Analog Range"; this.N64CircularAnalogRangeMenuItem.Click += new System.EventHandler(this.N64CircularAnalogRangeMenuItem_Click); // // MupenStyleLagMenuItem // this.MupenStyleLagMenuItem.Name = "MupenStyleLagMenuItem"; - this.MupenStyleLagMenuItem.Size = new System.Drawing.Size(192, 22); + this.MupenStyleLagMenuItem.Size = new System.Drawing.Size(191, 22); this.MupenStyleLagMenuItem.Text = "&Non-VI Lag Frames"; this.MupenStyleLagMenuItem.Click += new System.EventHandler(this.MupenStyleLagMenuItem_Click); // // N64ExpansionSlotMenuItem // this.N64ExpansionSlotMenuItem.Name = "N64ExpansionSlotMenuItem"; - this.N64ExpansionSlotMenuItem.Size = new System.Drawing.Size(192, 22); + this.N64ExpansionSlotMenuItem.Size = new System.Drawing.Size(191, 22); this.N64ExpansionSlotMenuItem.Text = "&Use Expansion Slot"; this.N64ExpansionSlotMenuItem.Click += new System.EventHandler(this.N64ExpansionSlotMenuItem_Click); // @@ -2824,13 +2881,13 @@ this.SaturnSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.SaturnPreferencesMenuItem}); this.SaturnSubMenu.Name = "SaturnSubMenu"; - this.SaturnSubMenu.Size = new System.Drawing.Size(53, 19); + this.SaturnSubMenu.Size = new System.Drawing.Size(51, 17); this.SaturnSubMenu.Text = "&Saturn"; // // SaturnPreferencesMenuItem // this.SaturnPreferencesMenuItem.Name = "SaturnPreferencesMenuItem"; - this.SaturnPreferencesMenuItem.Size = new System.Drawing.Size(144, 22); + this.SaturnPreferencesMenuItem.Size = new System.Drawing.Size(155, 22); this.SaturnPreferencesMenuItem.Text = "Preferences..."; this.SaturnPreferencesMenuItem.Click += new System.EventHandler(this.SaturnPreferencesMenuItem_Click); // @@ -2839,13 +2896,13 @@ this.DGBSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.DGBsettingsToolStripMenuItem}); this.DGBSubMenu.Name = "DGBSubMenu"; - this.DGBSubMenu.Size = new System.Drawing.Size(59, 19); + this.DGBSubMenu.Size = new System.Drawing.Size(53, 17); this.DGBSubMenu.Text = "&GB Link"; // // DGBsettingsToolStripMenuItem // this.DGBsettingsToolStripMenuItem.Name = "DGBsettingsToolStripMenuItem"; - this.DGBsettingsToolStripMenuItem.Size = new System.Drawing.Size(125, 22); + this.DGBsettingsToolStripMenuItem.Size = new System.Drawing.Size(136, 22); this.DGBsettingsToolStripMenuItem.Text = "Settings..."; this.DGBsettingsToolStripMenuItem.Click += new System.EventHandler(this.DGBsettingsToolStripMenuItem_Click); // @@ -2857,32 +2914,32 @@ this.toolStripSeparator26, this.GenesisSettingsToolStripMenuItem}); this.GenesisSubMenu.Name = "GenesisSubMenu"; - this.GenesisSubMenu.Size = new System.Drawing.Size(59, 19); + this.GenesisSubMenu.Size = new System.Drawing.Size(56, 17); this.GenesisSubMenu.Text = "&Genesis"; // // vDPViewerToolStripMenuItem // this.vDPViewerToolStripMenuItem.Name = "vDPViewerToolStripMenuItem"; - this.vDPViewerToolStripMenuItem.Size = new System.Drawing.Size(233, 22); + this.vDPViewerToolStripMenuItem.Size = new System.Drawing.Size(228, 22); this.vDPViewerToolStripMenuItem.Text = "&VDP Viewer"; this.vDPViewerToolStripMenuItem.Click += new System.EventHandler(this.GenVdpViewerMenuItem_Click); // // GenesisGameGenieECDC // this.GenesisGameGenieECDC.Name = "GenesisGameGenieECDC"; - this.GenesisGameGenieECDC.Size = new System.Drawing.Size(233, 22); + this.GenesisGameGenieECDC.Size = new System.Drawing.Size(228, 22); this.GenesisGameGenieECDC.Text = "&Game Genie Encoder/Decoder"; this.GenesisGameGenieECDC.Click += new System.EventHandler(this.GenesisGameGenieECDC_Click); // // toolStripSeparator26 // this.toolStripSeparator26.Name = "toolStripSeparator26"; - this.toolStripSeparator26.Size = new System.Drawing.Size(230, 6); + this.toolStripSeparator26.Size = new System.Drawing.Size(225, 6); // // GenesisSettingsToolStripMenuItem // this.GenesisSettingsToolStripMenuItem.Name = "GenesisSettingsToolStripMenuItem"; - this.GenesisSettingsToolStripMenuItem.Size = new System.Drawing.Size(233, 22); + this.GenesisSettingsToolStripMenuItem.Size = new System.Drawing.Size(228, 22); this.GenesisSettingsToolStripMenuItem.Text = "&Settings..."; this.GenesisSettingsToolStripMenuItem.Click += new System.EventHandler(this.GenesisSettingsMenuItem_Click); // @@ -2891,13 +2948,13 @@ this.wonderSwanToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.settingsToolStripMenuItem}); this.wonderSwanToolStripMenuItem.Name = "wonderSwanToolStripMenuItem"; - this.wonderSwanToolStripMenuItem.Size = new System.Drawing.Size(89, 19); + this.wonderSwanToolStripMenuItem.Size = new System.Drawing.Size(83, 17); this.wonderSwanToolStripMenuItem.Text = "&WonderSwan"; // // settingsToolStripMenuItem // this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem"; - this.settingsToolStripMenuItem.Size = new System.Drawing.Size(125, 22); + this.settingsToolStripMenuItem.Size = new System.Drawing.Size(136, 22); this.settingsToolStripMenuItem.Text = "&Settings..."; this.settingsToolStripMenuItem.Click += new System.EventHandler(this.WondersawnSettingsMenuItem_Click); // @@ -2907,7 +2964,7 @@ this.AppleDisksSubMenu, this.settingsToolStripMenuItem1}); this.AppleSubMenu.Name = "AppleSubMenu"; - this.AppleSubMenu.Size = new System.Drawing.Size(50, 19); + this.AppleSubMenu.Size = new System.Drawing.Size(46, 17); this.AppleSubMenu.Text = "Apple"; this.AppleSubMenu.DropDownOpened += new System.EventHandler(this.AppleSubMenu_DropDownOpened); // @@ -2916,7 +2973,7 @@ this.AppleDisksSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripSeparator31}); this.AppleDisksSubMenu.Name = "AppleDisksSubMenu"; - this.AppleDisksSubMenu.Size = new System.Drawing.Size(125, 22); + this.AppleDisksSubMenu.Size = new System.Drawing.Size(136, 22); this.AppleDisksSubMenu.Text = "Disks"; this.AppleDisksSubMenu.DropDownOpened += new System.EventHandler(this.AppleDisksSubMenu_DropDownOpened); // @@ -2928,7 +2985,7 @@ // settingsToolStripMenuItem1 // this.settingsToolStripMenuItem1.Name = "settingsToolStripMenuItem1"; - this.settingsToolStripMenuItem1.Size = new System.Drawing.Size(125, 22); + this.settingsToolStripMenuItem1.Size = new System.Drawing.Size(136, 22); this.settingsToolStripMenuItem1.Text = "&Settings..."; this.settingsToolStripMenuItem1.Click += new System.EventHandler(this.settingsToolStripMenuItem1_Click_1); // @@ -2937,13 +2994,13 @@ this.C64SubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.C64SettingsMenuItem}); this.C64SubMenu.Name = "C64SubMenu"; - this.C64SubMenu.Size = new System.Drawing.Size(39, 19); + this.C64SubMenu.Size = new System.Drawing.Size(38, 17); this.C64SubMenu.Text = "&C64"; // // C64SettingsMenuItem // this.C64SettingsMenuItem.Name = "C64SettingsMenuItem"; - this.C64SettingsMenuItem.Size = new System.Drawing.Size(125, 22); + this.C64SettingsMenuItem.Size = new System.Drawing.Size(136, 22); this.C64SettingsMenuItem.Text = "&Settings..."; this.C64SettingsMenuItem.Click += new System.EventHandler(this.C64SettingsMenuItem_Click); // @@ -2955,7 +3012,7 @@ this.FeaturesMenuItem, this.AboutMenuItem}); this.HelpSubMenu.Name = "HelpSubMenu"; - this.HelpSubMenu.Size = new System.Drawing.Size(44, 19); + this.HelpSubMenu.Size = new System.Drawing.Size(40, 17); this.HelpSubMenu.Text = "&Help"; this.HelpSubMenu.DropDownOpened += new System.EventHandler(this.HelpSubMenu_DropDownOpened); // @@ -2963,7 +3020,7 @@ // this.OnlineHelpMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Help; this.OnlineHelpMenuItem.Name = "OnlineHelpMenuItem"; - this.OnlineHelpMenuItem.Size = new System.Drawing.Size(146, 22); + this.OnlineHelpMenuItem.Size = new System.Drawing.Size(151, 22); this.OnlineHelpMenuItem.Text = "&Online Help..."; this.OnlineHelpMenuItem.Click += new System.EventHandler(this.OnlineHelpMenuItem_Click); // @@ -2971,7 +3028,7 @@ // this.ForumsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.TAStudio; this.ForumsMenuItem.Name = "ForumsMenuItem"; - this.ForumsMenuItem.Size = new System.Drawing.Size(146, 22); + this.ForumsMenuItem.Size = new System.Drawing.Size(151, 22); this.ForumsMenuItem.Text = "Forums..."; this.ForumsMenuItem.Click += new System.EventHandler(this.ForumsMenuItem_Click); // @@ -2979,7 +3036,7 @@ // this.FeaturesMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.kitchensink; this.FeaturesMenuItem.Name = "FeaturesMenuItem"; - this.FeaturesMenuItem.Size = new System.Drawing.Size(146, 22); + this.FeaturesMenuItem.Size = new System.Drawing.Size(151, 22); this.FeaturesMenuItem.Text = "&Features"; this.FeaturesMenuItem.Click += new System.EventHandler(this.FeaturesMenuItem_Click); // @@ -2987,7 +3044,7 @@ // this.AboutMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.CorpHawkSmall; this.AboutMenuItem.Name = "AboutMenuItem"; - this.AboutMenuItem.Size = new System.Drawing.Size(146, 22); + this.AboutMenuItem.Size = new System.Drawing.Size(151, 22); this.AboutMenuItem.Text = "&About"; this.AboutMenuItem.Click += new System.EventHandler(this.AboutMenuItem_Click); // @@ -3096,7 +3153,7 @@ // this.SaveSlotsStatusLabel.BackColor = System.Drawing.SystemColors.Control; this.SaveSlotsStatusLabel.Name = "SaveSlotsStatusLabel"; - this.SaveSlotsStatusLabel.Size = new System.Drawing.Size(58, 17); + this.SaveSlotsStatusLabel.Size = new System.Drawing.Size(56, 17); this.SaveSlotsStatusLabel.Text = "Save slots"; // // Slot1StatusButton @@ -3199,7 +3256,7 @@ // this.CoreNameStatusBarButton.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.CorpHawkSmall; this.CoreNameStatusBarButton.Name = "CoreNameStatusBarButton"; - this.CoreNameStatusBarButton.Size = new System.Drawing.Size(71, 17); + this.CoreNameStatusBarButton.Size = new System.Drawing.Size(66, 17); this.CoreNameStatusBarButton.Text = "Neshawk"; // // ProfileFirstBootLabel @@ -3229,7 +3286,7 @@ this.UpdateNotification.IsLink = true; this.UpdateNotification.LinkColor = System.Drawing.Color.Red; this.UpdateNotification.Name = "UpdateNotification"; - this.UpdateNotification.Size = new System.Drawing.Size(46, 17); + this.UpdateNotification.Size = new System.Drawing.Size(53, 17); this.UpdateNotification.Spring = true; this.UpdateNotification.Text = "New version available!"; this.UpdateNotification.TextAlign = System.Drawing.ContentAlignment.MiddleRight; @@ -3253,6 +3310,7 @@ this.AddSubtitleContextMenuItem, this.ViewCommentsContextMenuItem, this.SaveMovieContextMenuItem, + this.SaveMovieAsContextMenuItem, this.ContextSeparator_AfterMovie, this.UndoSavestateContextMenuItem, this.ContextSeparator_AfterUndo, @@ -3263,7 +3321,7 @@ this.ShowMenuContextMenuSeparator, this.ShowMenuContextMenuItem}); this.MainFormContextMenu.Name = "contextMenuStrip1"; - this.MainFormContextMenu.Size = new System.Drawing.Size(217, 468); + this.MainFormContextMenu.Size = new System.Drawing.Size(213, 512); this.MainFormContextMenu.Closing += new System.Windows.Forms.ToolStripDropDownClosingEventHandler(this.MainFormContextMenu_Closing); this.MainFormContextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.MainFormContextMenu_Opening); // @@ -3271,7 +3329,7 @@ // this.OpenRomContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.OpenFile; this.OpenRomContextMenuItem.Name = "OpenRomContextMenuItem"; - this.OpenRomContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.OpenRomContextMenuItem.Size = new System.Drawing.Size(212, 22); this.OpenRomContextMenuItem.Text = "Open Rom"; this.OpenRomContextMenuItem.Click += new System.EventHandler(this.OpenRomMenuItem_Click); // @@ -3279,7 +3337,7 @@ // this.LoadLastRomContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Recent; this.LoadLastRomContextMenuItem.Name = "LoadLastRomContextMenuItem"; - this.LoadLastRomContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.LoadLastRomContextMenuItem.Size = new System.Drawing.Size(212, 22); this.LoadLastRomContextMenuItem.Text = "Load Last ROM"; this.LoadLastRomContextMenuItem.Click += new System.EventHandler(this.LoadLastRomContextMenuItem_Click); // @@ -3287,20 +3345,20 @@ // this.StopAVContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; this.StopAVContextMenuItem.Name = "StopAVContextMenuItem"; - this.StopAVContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.StopAVContextMenuItem.Size = new System.Drawing.Size(212, 22); this.StopAVContextMenuItem.Text = "Stop AVI/WAV"; this.StopAVContextMenuItem.Click += new System.EventHandler(this.StopAVMenuItem_Click); // // ContextSeparator_AfterROM // this.ContextSeparator_AfterROM.Name = "ContextSeparator_AfterROM"; - this.ContextSeparator_AfterROM.Size = new System.Drawing.Size(213, 6); + this.ContextSeparator_AfterROM.Size = new System.Drawing.Size(209, 6); // // RecordMovieContextMenuItem // this.RecordMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.RecordHS; this.RecordMovieContextMenuItem.Name = "RecordMovieContextMenuItem"; - this.RecordMovieContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.RecordMovieContextMenuItem.Size = new System.Drawing.Size(212, 22); this.RecordMovieContextMenuItem.Text = "Record Movie"; this.RecordMovieContextMenuItem.Click += new System.EventHandler(this.RecordMovieMenuItem_Click); // @@ -3308,7 +3366,7 @@ // this.PlayMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Play; this.PlayMovieContextMenuItem.Name = "PlayMovieContextMenuItem"; - this.PlayMovieContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.PlayMovieContextMenuItem.Size = new System.Drawing.Size(212, 22); this.PlayMovieContextMenuItem.Text = "Play Movie"; this.PlayMovieContextMenuItem.Click += new System.EventHandler(this.PlayMovieMenuItem_Click); // @@ -3316,7 +3374,7 @@ // this.RestartMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.restart; this.RestartMovieContextMenuItem.Name = "RestartMovieContextMenuItem"; - this.RestartMovieContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.RestartMovieContextMenuItem.Size = new System.Drawing.Size(212, 22); this.RestartMovieContextMenuItem.Text = "Restart Movie"; this.RestartMovieContextMenuItem.Click += new System.EventHandler(this.PlayFromBeginningMenuItem_Click); // @@ -3324,7 +3382,7 @@ // this.StopMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; this.StopMovieContextMenuItem.Name = "StopMovieContextMenuItem"; - this.StopMovieContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.StopMovieContextMenuItem.Size = new System.Drawing.Size(212, 22); this.StopMovieContextMenuItem.Text = "Stop Movie"; this.StopMovieContextMenuItem.Click += new System.EventHandler(this.StopMovieMenuItem_Click); // @@ -3332,14 +3390,14 @@ // this.LoadLastMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Recent; this.LoadLastMovieContextMenuItem.Name = "LoadLastMovieContextMenuItem"; - this.LoadLastMovieContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.LoadLastMovieContextMenuItem.Size = new System.Drawing.Size(212, 22); this.LoadLastMovieContextMenuItem.Text = "Load Last Movie"; this.LoadLastMovieContextMenuItem.Click += new System.EventHandler(this.LoadLastMovieContextMenuItem_Click); // // BackupMovieContextMenuItem // this.BackupMovieContextMenuItem.Name = "BackupMovieContextMenuItem"; - this.BackupMovieContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.BackupMovieContextMenuItem.Size = new System.Drawing.Size(212, 22); this.BackupMovieContextMenuItem.Text = "Backup Movie"; this.BackupMovieContextMenuItem.Click += new System.EventHandler(this.BackupMovieContextMenuItem_Click); // @@ -3347,28 +3405,28 @@ // this.StopNoSaveContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; this.StopNoSaveContextMenuItem.Name = "StopNoSaveContextMenuItem"; - this.StopNoSaveContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.StopNoSaveContextMenuItem.Size = new System.Drawing.Size(212, 22); this.StopNoSaveContextMenuItem.Text = "Stop Movie without Saving"; this.StopNoSaveContextMenuItem.Click += new System.EventHandler(this.StopMovieWithoutSavingMenuItem_Click); // // ViewSubtitlesContextMenuItem // this.ViewSubtitlesContextMenuItem.Name = "ViewSubtitlesContextMenuItem"; - this.ViewSubtitlesContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.ViewSubtitlesContextMenuItem.Size = new System.Drawing.Size(212, 22); this.ViewSubtitlesContextMenuItem.Text = "View Subtitles"; this.ViewSubtitlesContextMenuItem.Click += new System.EventHandler(this.ViewSubtitlesContextMenuItem_Click); // // AddSubtitleContextMenuItem // this.AddSubtitleContextMenuItem.Name = "AddSubtitleContextMenuItem"; - this.AddSubtitleContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.AddSubtitleContextMenuItem.Size = new System.Drawing.Size(212, 22); this.AddSubtitleContextMenuItem.Text = "Add Subtitle"; this.AddSubtitleContextMenuItem.Click += new System.EventHandler(this.AddSubtitleContextMenuItem_Click); // // ViewCommentsContextMenuItem // this.ViewCommentsContextMenuItem.Name = "ViewCommentsContextMenuItem"; - this.ViewCommentsContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.ViewCommentsContextMenuItem.Size = new System.Drawing.Size(212, 22); this.ViewCommentsContextMenuItem.Text = "View Comments"; this.ViewCommentsContextMenuItem.Click += new System.EventHandler(this.ViewCommentsContextMenuItem_Click); // @@ -3376,27 +3434,27 @@ // this.SaveMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveAs; this.SaveMovieContextMenuItem.Name = "SaveMovieContextMenuItem"; - this.SaveMovieContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.SaveMovieContextMenuItem.Size = new System.Drawing.Size(212, 22); this.SaveMovieContextMenuItem.Text = "Save Movie"; this.SaveMovieContextMenuItem.Click += new System.EventHandler(this.SaveMovieMenuItem_Click); // // ContextSeparator_AfterMovie // this.ContextSeparator_AfterMovie.Name = "ContextSeparator_AfterMovie"; - this.ContextSeparator_AfterMovie.Size = new System.Drawing.Size(213, 6); + this.ContextSeparator_AfterMovie.Size = new System.Drawing.Size(209, 6); // // UndoSavestateContextMenuItem // this.UndoSavestateContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.undo; this.UndoSavestateContextMenuItem.Name = "UndoSavestateContextMenuItem"; - this.UndoSavestateContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.UndoSavestateContextMenuItem.Size = new System.Drawing.Size(212, 22); this.UndoSavestateContextMenuItem.Text = "Undo Savestate"; this.UndoSavestateContextMenuItem.Click += new System.EventHandler(this.UndoSavestateContextMenuItem_Click); // // ContextSeparator_AfterUndo // this.ContextSeparator_AfterUndo.Name = "ContextSeparator_AfterUndo"; - this.ContextSeparator_AfterUndo.Size = new System.Drawing.Size(213, 6); + this.ContextSeparator_AfterUndo.Size = new System.Drawing.Size(209, 6); // // ConfigContextMenuItem // @@ -3419,14 +3477,14 @@ this.toolStripMenuItem66, this.toolStripMenuItem67}); this.ConfigContextMenuItem.Name = "ConfigContextMenuItem"; - this.ConfigContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.ConfigContextMenuItem.Size = new System.Drawing.Size(212, 22); this.ConfigContextMenuItem.Text = "Config"; // // toolStripMenuItem6 // this.toolStripMenuItem6.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; this.toolStripMenuItem6.Name = "toolStripMenuItem6"; - this.toolStripMenuItem6.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem6.Size = new System.Drawing.Size(168, 22); this.toolStripMenuItem6.Text = "&Controllers..."; this.toolStripMenuItem6.Click += new System.EventHandler(this.ControllersMenuItem_Click); // @@ -3434,7 +3492,7 @@ // this.toolStripMenuItem7.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.HotKeys; this.toolStripMenuItem7.Name = "toolStripMenuItem7"; - this.toolStripMenuItem7.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem7.Size = new System.Drawing.Size(168, 22); this.toolStripMenuItem7.Text = "&Hotkeys..."; this.toolStripMenuItem7.Click += new System.EventHandler(this.HotkeysMenuItem_Click); // @@ -3442,7 +3500,7 @@ // this.toolStripMenuItem8.Image = ((System.Drawing.Image)(resources.GetObject("toolStripMenuItem8.Image"))); this.toolStripMenuItem8.Name = "toolStripMenuItem8"; - this.toolStripMenuItem8.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem8.Size = new System.Drawing.Size(168, 22); this.toolStripMenuItem8.Text = "Display..."; this.toolStripMenuItem8.Click += new System.EventHandler(this.DisplayConfigMenuItem_Click); // @@ -3450,7 +3508,7 @@ // this.toolStripMenuItem9.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.AudioHS; this.toolStripMenuItem9.Name = "toolStripMenuItem9"; - this.toolStripMenuItem9.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem9.Size = new System.Drawing.Size(168, 22); this.toolStripMenuItem9.Text = "&Sound..."; this.toolStripMenuItem9.Click += new System.EventHandler(this.SoundMenuItem_Click); // @@ -3458,7 +3516,7 @@ // this.toolStripMenuItem10.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.CopyFolderHS; this.toolStripMenuItem10.Name = "toolStripMenuItem10"; - this.toolStripMenuItem10.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem10.Size = new System.Drawing.Size(168, 22); this.toolStripMenuItem10.Text = "Paths..."; this.toolStripMenuItem10.Click += new System.EventHandler(this.PathsMenuItem_Click); // @@ -3466,7 +3524,7 @@ // this.toolStripMenuItem11.Image = ((System.Drawing.Image)(resources.GetObject("toolStripMenuItem11.Image"))); this.toolStripMenuItem11.Name = "toolStripMenuItem11"; - this.toolStripMenuItem11.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem11.Size = new System.Drawing.Size(168, 22); this.toolStripMenuItem11.Text = "&Firmwares..."; this.toolStripMenuItem11.Click += new System.EventHandler(this.FirmwaresMenuItem_Click); // @@ -3474,7 +3532,7 @@ // this.toolStripMenuItem12.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.MessageConfig; this.toolStripMenuItem12.Name = "toolStripMenuItem12"; - this.toolStripMenuItem12.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem12.Size = new System.Drawing.Size(168, 22); this.toolStripMenuItem12.Text = "&Messages..."; this.toolStripMenuItem12.Click += new System.EventHandler(this.MessagesMenuItem_Click); // @@ -3482,7 +3540,7 @@ // this.toolStripMenuItem13.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Lightning; this.toolStripMenuItem13.Name = "toolStripMenuItem13"; - this.toolStripMenuItem13.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem13.Size = new System.Drawing.Size(168, 22); this.toolStripMenuItem13.Text = "&Autofire..."; this.toolStripMenuItem13.Click += new System.EventHandler(this.AutofireMenuItem_Click); // @@ -3490,28 +3548,28 @@ // this.toolStripMenuItem14.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Previous; this.toolStripMenuItem14.Name = "toolStripMenuItem14"; - this.toolStripMenuItem14.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem14.Size = new System.Drawing.Size(168, 22); this.toolStripMenuItem14.Text = "&Rewind..."; this.toolStripMenuItem14.Click += new System.EventHandler(this.RewindOptionsMenuItem_Click); // // toolStripMenuItem15 // this.toolStripMenuItem15.Name = "toolStripMenuItem15"; - this.toolStripMenuItem15.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem15.Size = new System.Drawing.Size(168, 22); this.toolStripMenuItem15.Text = "File Extensions..."; this.toolStripMenuItem15.Click += new System.EventHandler(this.FileExtensionsMenuItem_Click); // // customizeToolStripMenuItem // this.customizeToolStripMenuItem.Name = "customizeToolStripMenuItem"; - this.customizeToolStripMenuItem.Size = new System.Drawing.Size(159, 22); + this.customizeToolStripMenuItem.Size = new System.Drawing.Size(168, 22); this.customizeToolStripMenuItem.Text = "Customize..."; this.customizeToolStripMenuItem.Click += new System.EventHandler(this.CustomizeMenuItem_Click); // // toolStripSeparator30 // this.toolStripSeparator30.Name = "toolStripSeparator30"; - this.toolStripSeparator30.Size = new System.Drawing.Size(156, 6); + this.toolStripSeparator30.Size = new System.Drawing.Size(165, 6); // // SavestateTypeContextSubMenu // @@ -3520,26 +3578,26 @@ this.SavestateBinaryContextMenuItem, this.SavestateTextContextMenuItem}); this.SavestateTypeContextSubMenu.Name = "SavestateTypeContextSubMenu"; - this.SavestateTypeContextSubMenu.Size = new System.Drawing.Size(159, 22); + this.SavestateTypeContextSubMenu.Size = new System.Drawing.Size(168, 22); this.SavestateTypeContextSubMenu.Text = "Savestate Type"; this.SavestateTypeContextSubMenu.DropDownOpened += new System.EventHandler(this.SavestateTypeContextSubMenu_DropDownOpened); // // SavestateTypeDefaultContextMenuItem // this.SavestateTypeDefaultContextMenuItem.Name = "SavestateTypeDefaultContextMenuItem"; - this.SavestateTypeDefaultContextMenuItem.Size = new System.Drawing.Size(112, 22); + this.SavestateTypeDefaultContextMenuItem.Size = new System.Drawing.Size(120, 22); this.SavestateTypeDefaultContextMenuItem.Text = "&Default"; // // SavestateBinaryContextMenuItem // this.SavestateBinaryContextMenuItem.Name = "SavestateBinaryContextMenuItem"; - this.SavestateBinaryContextMenuItem.Size = new System.Drawing.Size(112, 22); + this.SavestateBinaryContextMenuItem.Size = new System.Drawing.Size(120, 22); this.SavestateBinaryContextMenuItem.Text = "&Binary"; // // SavestateTextContextMenuItem // this.SavestateTextContextMenuItem.Name = "SavestateTextContextMenuItem"; - this.SavestateTextContextMenuItem.Size = new System.Drawing.Size(112, 22); + this.SavestateTextContextMenuItem.Size = new System.Drawing.Size(120, 22); this.SavestateTextContextMenuItem.Text = "&Text"; // // CoreSelectionContextSubMenu @@ -3548,7 +3606,7 @@ this.GBInSGBContextMenuItem, this.NesInQuickNESContextMenuItem}); this.CoreSelectionContextSubMenu.Name = "CoreSelectionContextSubMenu"; - this.CoreSelectionContextSubMenu.Size = new System.Drawing.Size(159, 22); + this.CoreSelectionContextSubMenu.Size = new System.Drawing.Size(168, 22); this.CoreSelectionContextSubMenu.Text = "Core Selection"; this.CoreSelectionContextSubMenu.DropDownOpened += new System.EventHandler(this.CoreSelectionContextSubMenu_DropDownOpened); // @@ -3569,13 +3627,13 @@ // toolStripSeparator37 // this.toolStripSeparator37.Name = "toolStripSeparator37"; - this.toolStripSeparator37.Size = new System.Drawing.Size(156, 6); + this.toolStripSeparator37.Size = new System.Drawing.Size(165, 6); // // toolStripMenuItem66 // this.toolStripMenuItem66.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Save; this.toolStripMenuItem66.Name = "toolStripMenuItem66"; - this.toolStripMenuItem66.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem66.Size = new System.Drawing.Size(168, 22); this.toolStripMenuItem66.Text = "Save Config"; this.toolStripMenuItem66.Click += new System.EventHandler(this.SaveConfigMenuItem_Click); // @@ -3583,7 +3641,7 @@ // this.toolStripMenuItem67.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.LoadConfig; this.toolStripMenuItem67.Name = "toolStripMenuItem67"; - this.toolStripMenuItem67.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem67.Size = new System.Drawing.Size(168, 22); this.toolStripMenuItem67.Text = "Load Config"; this.toolStripMenuItem67.Click += new System.EventHandler(this.LoadConfigMenuItem_Click); // @@ -3591,7 +3649,7 @@ // this.ScreenshotContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.camera; this.ScreenshotContextMenuItem.Name = "ScreenshotContextMenuItem"; - this.ScreenshotContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.ScreenshotContextMenuItem.Size = new System.Drawing.Size(212, 22); this.ScreenshotContextMenuItem.Text = "Screenshot"; this.ScreenshotContextMenuItem.Click += new System.EventHandler(this.ScreenshotMenuItem_Click); // @@ -3599,26 +3657,26 @@ // this.CloseRomContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Close; this.CloseRomContextMenuItem.Name = "CloseRomContextMenuItem"; - this.CloseRomContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.CloseRomContextMenuItem.Size = new System.Drawing.Size(212, 22); this.CloseRomContextMenuItem.Text = "Close ROM"; this.CloseRomContextMenuItem.Click += new System.EventHandler(this.CloseRomMenuItem_Click); // // ClearSRAMContextMenuItem // this.ClearSRAMContextMenuItem.Name = "ClearSRAMContextMenuItem"; - this.ClearSRAMContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.ClearSRAMContextMenuItem.Size = new System.Drawing.Size(212, 22); this.ClearSRAMContextMenuItem.Text = "Close and Clear SRAM"; this.ClearSRAMContextMenuItem.Click += new System.EventHandler(this.ClearSRAMContextMenuItem_Click); // // ShowMenuContextMenuSeparator // this.ShowMenuContextMenuSeparator.Name = "ShowMenuContextMenuSeparator"; - this.ShowMenuContextMenuSeparator.Size = new System.Drawing.Size(213, 6); + this.ShowMenuContextMenuSeparator.Size = new System.Drawing.Size(209, 6); // // ShowMenuContextMenuItem // this.ShowMenuContextMenuItem.Name = "ShowMenuContextMenuItem"; - this.ShowMenuContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.ShowMenuContextMenuItem.Size = new System.Drawing.Size(212, 22); this.ShowMenuContextMenuItem.Text = "Show Menu"; this.ShowMenuContextMenuItem.Click += new System.EventHandler(this.ShowMenuContextMenuItem_Click); // @@ -3628,6 +3686,14 @@ this.timerMouseIdle.Interval = 2000; this.timerMouseIdle.Tick += new System.EventHandler(this.timerMouseIdle_Tick); // + // SaveMovieAsContextMenuItem + // + this.SaveMovieAsContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveAs; + this.SaveMovieAsContextMenuItem.Name = "SaveMovieAsContextMenuItem"; + this.SaveMovieAsContextMenuItem.Size = new System.Drawing.Size(212, 22); + this.SaveMovieAsContextMenuItem.Text = "Save Movie As..."; + this.SaveMovieAsContextMenuItem.Click += new System.EventHandler(this.SaveMovieAsMenuItem_Click); + // // MainForm // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; @@ -3827,7 +3893,7 @@ private System.Windows.Forms.ToolStripMenuItem DisplayLogWindowMenuItem; private System.Windows.Forms.ToolStripMenuItem DisplaySubtitlesMenuItem; private System.Windows.Forms.ToolStripMenuItem AVSubMenu; - private System.Windows.Forms.ToolStripMenuItem RecordAVMenuItem; + private System.Windows.Forms.ToolStripMenuItem ConfigAndRecordAVMenuItem; private System.Windows.Forms.ToolStripMenuItem StopAVIMenuItem; private System.Windows.Forms.ToolStripStatusLabel AVIStatusLabel; private System.Windows.Forms.ToolStripMenuItem RestartMovieContextMenuItem; @@ -4023,7 +4089,6 @@ private System.Windows.Forms.ToolStripMenuItem GBAmGBAMenuItem; private System.Windows.Forms.ToolStripMenuItem GBAVBANextMenuItem; private System.Windows.Forms.ToolStripMenuItem gBAWithMGBAToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem AutoHawkMenuItem; private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem1; private System.Windows.Forms.ToolStripMenuItem PSXHashDiscsToolStripMenuItem; private System.Windows.Forms.Timer timerMouseIdle; @@ -4049,5 +4114,13 @@ private System.Windows.Forms.ToolStripMenuItem OpenAdvancedMenuItem; private System.Windows.Forms.ToolStripMenuItem gameSharkConverterToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem dummyExternalTool; + private System.Windows.Forms.ToolStripMenuItem RecordAVMenuItem; + private System.Windows.Forms.ToolStripMenuItem ExperimentalToolsSubMenu; + private System.Windows.Forms.ToolStripMenuItem AutoHawkMenuItem; + private System.Windows.Forms.ToolStripMenuItem NewHexEditorMenuItem; + private System.Windows.Forms.ToolStripMenuItem SaveConfigAsMenuItem; + private System.Windows.Forms.ToolStripMenuItem LoadConfigFromMenuItem; + private System.Windows.Forms.ToolStripMenuItem SaveMovieAsMenuItem; + private System.Windows.Forms.ToolStripMenuItem SaveMovieAsContextMenuItem; } } diff --git a/BizHawk.Client.EmuHawk/MainForm.Events.cs b/BizHawk.Client.EmuHawk/MainForm.Events.cs index cd096ea1d9..e6d325e048 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Events.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Events.cs @@ -23,6 +23,7 @@ using BizHawk.Client.EmuHawk.CustomControls; using BizHawk.Client.EmuHawk.WinFormExtensions; using BizHawk.Client.EmuHawk.ToolExtensions; using BizHawk.Emulation.Cores.Computers.AppleII; +using BizHawk.Client.ApiHawk; namespace BizHawk.Client.EmuHawk { @@ -237,6 +238,7 @@ namespace BizHawk.Client.EmuHawk StopMovieMenuItem.Enabled = PlayFromBeginningMenuItem.Enabled = SaveMovieMenuItem.Enabled + = SaveMovieAsMenuItem.Enabled = Global.MovieSession.Movie.IsActive; ReadonlyMenuItem.Checked = Global.MovieSession.ReadOnly; @@ -275,18 +277,20 @@ namespace BizHawk.Client.EmuHawk private void AVSubMenu_DropDownOpened(object sender, EventArgs e) { - RecordAVMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Record A/V"].Bindings; + ConfigAndRecordAVMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Record A/V"].Bindings; StopAVIMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Stop A/V"].Bindings; CaptureOSDMenuItem.Checked = Global.Config.AVI_CaptureOSD; + RecordAVMenuItem.Enabled = !string.IsNullOrEmpty(Global.Config.VideoWriter) && _currAviWriter == null; + if (_currAviWriter == null) { - RecordAVMenuItem.Enabled = true; + ConfigAndRecordAVMenuItem.Enabled = true; StopAVIMenuItem.Enabled = false; } else { - RecordAVMenuItem.Enabled = false; + ConfigAndRecordAVMenuItem.Enabled = false; StopAVIMenuItem.Enabled = true; } } @@ -548,8 +552,32 @@ namespace BizHawk.Client.EmuHawk SaveMovie(); } + private void SaveMovieAsMenuItem_Click(object sender, EventArgs e) + { + var filename = Global.MovieSession.Movie.Filename; + if (string.IsNullOrWhiteSpace(filename)) + { + filename = PathManager.FilesystemSafeName(Global.Game); + } + + var file = ToolHelpers.SaveFileDialog( + filename, + PathManager.MakeAbsolutePath(Global.Config.PathEntries.MoviesPathFragment, null), + "Movie Files", + Global.MovieSession.Movie.PreferredExtension); + + if (file != null) + { + Global.MovieSession.Movie.Filename = file.FullName; + Global.Config.RecentMovies.Add(Global.MovieSession.Movie.Filename); + SaveMovie(); + } + } + private void StopMovieWithoutSavingMenuItem_Click(object sender, EventArgs e) { + if (Global.Config.EnableBackupMovies) + Global.MovieSession.Movie.SaveBackup(); StopMovie(saveChanges: false); } @@ -583,11 +611,16 @@ namespace BizHawk.Client.EmuHawk Global.Config.MovieEndAction = MovieEndAction.Pause; } - private void RecordAVMenuItem_Click(object sender, EventArgs e) + private void ConfigAndRecordAVMenuItem_Click(object sender, EventArgs e) { RecordAv(); } + private void RecordAVMenuItem_Click(object sender, EventArgs e) + { + RecordAv(null, null); // force unattended, but allow tradtional setup + } + private void StopAVMenuItem_Click(object sender, EventArgs e) { StopAv(); @@ -661,6 +694,12 @@ namespace BizHawk.Client.EmuHawk _exit = true; } + public void CloseEmulator(int exitCode) + { + _exit = true; + _exitCode = exitCode; + } + #endregion #region Emulation Menu @@ -1174,6 +1213,24 @@ namespace BizHawk.Client.EmuHawk GlobalWin.OSD.AddMessage("Saved settings"); } + private void SaveConfigAsMenuItem_Click(object sender, EventArgs e) + { + var path = PathManager.DefaultIniPath; + var sfd = new SaveFileDialog + { + InitialDirectory = Path.GetDirectoryName(path), + FileName = Path.GetFileName(path), + Filter = "Config File (*.ini)|*.ini" + }; + + var result = sfd.ShowHawkDialog(); + if (result == DialogResult.OK) + { + SaveConfig(sfd.FileName); + GlobalWin.OSD.AddMessage("Copied settings"); + } + } + private void LoadConfigMenuItem_Click(object sender, EventArgs e) { Global.Config = ConfigService.Load(PathManager.DefaultIniPath); @@ -1181,6 +1238,25 @@ namespace BizHawk.Client.EmuHawk GlobalWin.OSD.AddMessage("Config file loaded"); } + private void LoadConfigFromMenuItem_Click(object sender, EventArgs e) + { + var path = PathManager.DefaultIniPath; + var ofd = new OpenFileDialog + { + InitialDirectory = Path.GetDirectoryName(path), + FileName = Path.GetFileName(path), + Filter = "Config File (*.ini)|*.ini" + }; + + var result = ofd.ShowHawkDialog(); + if (result == DialogResult.OK) + { + Global.Config = ConfigService.Load(ofd.FileName); + Global.Config.ResolveDefaults(); + GlobalWin.OSD.AddMessage("Config file loaded"); + } + } + private void miUnthrottled_Click(object sender, EventArgs e) { _unthrottled ^= true; @@ -1246,82 +1322,45 @@ namespace BizHawk.Client.EmuHawk batchRunnerToolStripMenuItem.Visible = VersionInfo.DeveloperBuild; - AutoHawkMenuItem.Enabled = GlobalWin.Tools.IsAvailable(); - AutoHawkMenuItem.Visible = VersionInfo.DeveloperBuild; - BasicBotMenuItem.Enabled = GlobalWin.Tools.IsAvailable(); gameSharkConverterToolStripMenuItem.Enabled = GlobalWin.Tools.IsAvailable(); + + ExperimentalToolsSubMenu.Visible = VersionInfo.DeveloperBuild; } private void ExternalToolToolStripMenuItem_DropDownOpening(object sender, EventArgs e) { externalToolToolStripMenuItem.DropDownItems.Clear(); - string path = Path.Combine(Global.Config.PathEntries["Global", "External Tools"].Path); - if (Directory.Exists(path)) + + foreach(ToolStripMenuItem item in ExternalToolManager.ToolStripMenu) { - DirectoryInfo dInfo = new DirectoryInfo(path); - Type[] assemblyTypes; - Assembly externalToolFile; - foreach (FileInfo fi in dInfo.GetFiles("*.dll")) + if(item.Enabled) { - try + item.Click += delegate { - //externalToolFile = Assembly.ReflectionOnlyLoadFrom(fi.FullName); - externalToolFile = Assembly.LoadFrom(fi.FullName); - } - catch (BadImageFormatException) - { - ToolStripMenuItem item = new ToolStripMenuItem(fi.Name, Properties.Resources.ExclamationRed); - item.ToolTipText = "This is not an assembly"; - item.ForeColor = Color.Gray; - externalToolToolStripMenuItem.DropDownItems.Add(item); - continue; - } - - ToolStripMenuItem externalToolMenu = new ToolStripMenuItem(externalToolFile.GetName().Name); - - /* - The reason of using this ugly try catch is due to the use of ReflectionOnlyLoadFrom methods - When the assembly is loaded this way, referenced assemblies are not loaded and so, as soon as a type - existing in another assembly, it raises the exception. - - But the advantage of this is that memory footprint is reduced - - EDIT: In fact, I have some trouble when loading Reflection only... moved to regular load - */ - try - { - assemblyTypes = externalToolFile.GetTypes().Where(t => t != null && t.FullName == "BizHawk.Client.EmuHawk.CustomMainForm").ToArray(); - } - catch (ReflectionTypeLoadException ex) - { - assemblyTypes = ex.Types.Where(t => t != null && t.FullName.Contains("BizHawk.Client.EmuHawk.CustomMainForm")).ToArray(); - } - - if (assemblyTypes.Count() == 1) - { - externalToolMenu.Image = Properties.Resources.Debugger; - externalToolMenu.Tag = fi.FullName; - externalToolMenu.Click += delegate (object sender2, EventArgs e2) - { - GlobalWin.Tools.Load(fi.FullName); - }; - } - else - { - externalToolMenu.Image = Properties.Resources.ExclamationRed; - externalToolMenu.ForeColor = Color.Gray; - } - externalToolToolStripMenuItem.DropDownItems.Add(externalToolMenu); + GlobalWin.Tools.Load((string)item.Tag); + }; } + else + { + item.Image = Properties.Resources.ExclamationRed; + } + externalToolToolStripMenuItem.DropDownItems.Add(item); } + if (externalToolToolStripMenuItem.DropDownItems.Count == 0) { externalToolToolStripMenuItem.DropDownItems.Add("None"); } } + private void ExperimentalToolsSubMenu_DropDownOpened(object sender, EventArgs e) + { + AutoHawkMenuItem.Enabled = GlobalWin.Tools.IsAvailable(); + NewHexEditorMenuItem.Enabled = GlobalWin.Tools.IsAvailable(); + } + private void AutoHawkMenuItem_Click(object sender, EventArgs e) { GlobalWin.Tools.Load(); @@ -1392,6 +1431,11 @@ namespace BizHawk.Client.EmuHawk new BatchRun().ShowDialog(); } + private void NewHexEditorMenuItem_Click(object sender, EventArgs e) + { + GlobalWin.Tools.Load(); + } + #endregion #region NES @@ -2301,6 +2345,7 @@ namespace BizHawk.Client.EmuHawk ViewSubtitlesContextMenuItem.Visible = ViewCommentsContextMenuItem.Visible = SaveMovieContextMenuItem.Visible = + SaveMovieAsContextMenuItem.Visible = Global.MovieSession.Movie.IsActive; BackupMovieContextMenuItem.Visible = Global.MovieSession.Movie.IsActive; diff --git a/BizHawk.Client.EmuHawk/MainForm.Hotkey.cs b/BizHawk.Client.EmuHawk/MainForm.Hotkey.cs index 9ad188dee1..4bf55b1360 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Hotkey.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Hotkey.cs @@ -343,10 +343,10 @@ namespace BizHawk.Client.EmuHawk //TAStudio case "Add Branch": - GlobalWin.Tools.TAStudio.BookMarkControl.AddBranchExternal(); + GlobalWin.Tools.TAStudio.AddBranchExternal(); break; case "Delete Branch": - GlobalWin.Tools.TAStudio.BookMarkControl.RemoveBranchExtrenal(); + GlobalWin.Tools.TAStudio.RemoveBranchExtrenal(); break; // SNES diff --git a/BizHawk.Client.EmuHawk/MainForm.cs b/BizHawk.Client.EmuHawk/MainForm.cs index 4267e8ce9f..9d224d2a07 100644 --- a/BizHawk.Client.EmuHawk/MainForm.cs +++ b/BizHawk.Client.EmuHawk/MainForm.cs @@ -405,7 +405,7 @@ namespace BizHawk.Client.EmuHawk if (startFullscreen || Global.Config.StartFullscreen) { - ToggleFullscreen(); + _needsFullscreenOnLoad = true; } if (!Global.Game.IsNullInstance) @@ -462,11 +462,25 @@ namespace BizHawk.Client.EmuHawk private bool _supressSyncSettingsWarning = false; - public void ProgramRunLoop() + public int ProgramRunLoop() { - CheckMessages(); + CheckMessages(); //can someone leave a note about why this is needed? LogConsole.PositionConsole(); + //needs to be done late, after the log console snaps on top + //fullscreen should snap on top even harder! + if (_needsFullscreenOnLoad) + { + _needsFullscreenOnLoad = false; + ToggleFullscreen(); + } + + //incantation required to get the program reliably on top of the console window + //we might want it in ToggleFullscreen later, but here, it needs to happen regardless + BringToFront(); + Activate(); + BringToFront(); + for (;;) { Input.Instance.Update(); @@ -531,6 +545,7 @@ namespace BizHawk.Client.EmuHawk } Shutdown(); + return _exitCode; } /// @@ -1308,6 +1323,7 @@ namespace BizHawk.Client.EmuHawk private bool _avwriterpad; private bool _exit; + private int _exitCode; private bool _exitRequestPending; private bool _runloopFrameProgress; private long _frameAdvanceTimestamp; @@ -1330,6 +1346,7 @@ namespace BizHawk.Client.EmuHawk private bool _cursorHidden; private bool _inFullscreen; private Point _windowedLocation; + private bool _needsFullscreenOnLoad; private int _autoDumpLength; private readonly bool _autoCloseOnDump; @@ -1570,22 +1587,6 @@ namespace BizHawk.Client.EmuHawk } } - private void SelectSlot(int num) - { - if (Global.Emulator.HasSavestates()) - { - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.TAStudio.BookMarkControl.SelectBranchExternal(num); - return; - } - - Global.Config.SaveSlot = num; - SaveSlotSelectedMessage(); - UpdateStatusSlots(); - } - } - private void RewireSound() { if (_dumpProxy != null) @@ -1888,75 +1889,6 @@ namespace BizHawk.Client.EmuHawk return bb; } - private void SaveStateAs() - { - if (!Global.Emulator.HasSavestates()) - { - return; - } - - if (GlobalWin.Tools.Has()) - { - return; - } - - var path = PathManager.GetSaveStatePath(Global.Game); - - var file = new FileInfo(path); - if (file.Directory != null && file.Directory.Exists == false) - { - file.Directory.Create(); - } - - var sfd = new SaveFileDialog - { - AddExtension = true, - DefaultExt = "State", - Filter = "Save States (*.State)|*.State|All Files|*.*", - InitialDirectory = path, - FileName = PathManager.SaveStatePrefix(Global.Game) + "." + "QuickSave0.State" - }; - - var result = sfd.ShowHawkDialog(); - if (result == DialogResult.OK) - { - SaveState(sfd.FileName, sfd.FileName, false); - } - } - - private void LoadStateAs() - { - if (!Global.Emulator.HasSavestates()) - { - return; - } - - if (GlobalWin.Tools.Has()) - { - return; - } - - var ofd = new OpenFileDialog - { - InitialDirectory = PathManager.GetSaveStatePath(Global.Game), - Filter = "Save States (*.State)|*.State|All Files|*.*", - RestoreDirectory = true - }; - - var result = ofd.ShowHawkDialog(); - if (result != DialogResult.OK) - { - return; - } - - if (File.Exists(ofd.FileName) == false) - { - return; - } - - LoadState(ofd.FileName, Path.GetFileName(ofd.FileName)); - } - private void SaveSlotSelectedMessage() { int slot = Global.Config.SaveSlot; @@ -2168,7 +2100,7 @@ namespace BizHawk.Client.EmuHawk } } - private void SaveConfig() + private void SaveConfig(string path = "") { if (Global.Config.SaveWindowPosition) { @@ -2193,63 +2125,10 @@ namespace BizHawk.Client.EmuHawk LogConsole.SaveConfigSettings(); } - ConfigService.Save(PathManager.DefaultIniPath, Global.Config); - } + if (string.IsNullOrEmpty(path)) + path = PathManager.DefaultIniPath; - private void PreviousSlot() - { - if (Global.Emulator.HasSavestates()) - { - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.TAStudio.BookMarkControl.SelectBranchExternal(false); - return; - } - - if (Global.Config.SaveSlot == 0) - { - Global.Config.SaveSlot = 9; // Wrap to end of slot list - } - else if (Global.Config.SaveSlot > 9) - { - Global.Config.SaveSlot = 9; // Meh, just in case - } - else - { - Global.Config.SaveSlot--; - } - - SaveSlotSelectedMessage(); - UpdateStatusSlots(); - } - } - - private void NextSlot() - { - if (Global.Emulator.HasSavestates()) - { - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.TAStudio.BookMarkControl.SelectBranchExternal(true); - return; - } - - if (Global.Config.SaveSlot >= 9) - { - Global.Config.SaveSlot = 0; // Wrap to beginning of slot list - } - else if (Global.Config.SaveSlot < 0) - { - Global.Config.SaveSlot = 0; // Meh, just in case - } - else - { - Global.Config.SaveSlot++; - } - - SaveSlotSelectedMessage(); - UpdateStatusSlots(); - } + ConfigService.Save(path, Global.Config); } private static void ToggleFPS() @@ -2708,112 +2587,6 @@ namespace BizHawk.Client.EmuHawk }); } - private int SlotToInt(string slot) - { - return int.Parse(slot.Substring(slot.Length - 1, 1)); - } - - public void LoadState(string path, string userFriendlyStateName, bool fromLua = false, bool supressOSD = false) // Move to client.common - { - if (!Global.Emulator.HasSavestates()) - { - return; - } - - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.TAStudio.BookMarkControl.LoadBranchExternal(); - return; - } - - // If from lua, disable counting rerecords - bool wasCountingRerecords = Global.MovieSession.Movie.IsCountingRerecords; - - if (fromLua) - Global.MovieSession.Movie.IsCountingRerecords = false; - - GlobalWin.DisplayManager.NeedsToPaint = true; - - if (SavestateManager.LoadStateFile(path, userFriendlyStateName)) - { - SetMainformMovieInfo(); - GlobalWin.OSD.ClearGUIText(); - GlobalWin.Tools.UpdateToolsBefore(fromLua); - UpdateToolsAfter(fromLua); - UpdateToolsLoadstate(); - Global.AutoFireController.ClearStarts(); - - if (!supressOSD) - { - GlobalWin.OSD.AddMessage("Loaded state: " + userFriendlyStateName); - } - - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.LuaConsole.LuaImp.CallLoadStateEvent(userFriendlyStateName); - } - } - else - { - GlobalWin.OSD.AddMessage("Loadstate error!"); - } - - Global.MovieSession.Movie.IsCountingRerecords = wasCountingRerecords; - } - - public void LoadQuickSave(string quickSlotName, bool fromLua = false, bool supressOSD = false) - { - if (!Global.Emulator.HasSavestates()) - { - return; - } - - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.TAStudio.BookMarkControl.LoadBranchExternal(SlotToInt(quickSlotName)); - return; - } - - var path = PathManager.SaveStatePrefix(Global.Game) + "." + quickSlotName + ".State"; - if (File.Exists(path) == false) - { - GlobalWin.OSD.AddMessage("Unable to load " + quickSlotName + ".State"); - - return; - } - - LoadState(path, quickSlotName, fromLua, supressOSD); - } - - public void SaveState(string path, string userFriendlyStateName, bool fromLua) - { - if (!Global.Emulator.HasSavestates()) - { - return; - } - - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.TAStudio.BookMarkControl.UpdateBranchExternal(); - return; - } - - try - { - SavestateManager.SaveStateFile(path, userFriendlyStateName); - - GlobalWin.OSD.AddMessage("Saved state: " + userFriendlyStateName); - } - catch (IOException) - { - GlobalWin.OSD.AddMessage("Unable to save state " + path); - } - if (!fromLua) - { - UpdateStatusSlots(); - } - } - // Alt key hacks protected override void WndProc(ref Message m) { @@ -3075,6 +2848,10 @@ namespace BizHawk.Client.EmuHawk { PauseEmulator(); PauseOnFrame = null; + if (GlobalWin.Tools.IsLoaded()) + { + GlobalWin.Tools.TAStudio.StopSeeking(); + } } } @@ -3128,10 +2905,12 @@ namespace BizHawk.Client.EmuHawk // select IVideoWriter to use IVideoWriter aw = null; - if (unattended) + if (string.IsNullOrEmpty(videowritername) && !string.IsNullOrEmpty(Global.Config.VideoWriter)) + videowritername = Global.Config.VideoWriter; + + if (unattended && !string.IsNullOrEmpty(videowritername)) { aw = VideoWriterInventory.GetVideoWriter(videowritername); - } else { @@ -3149,6 +2928,8 @@ namespace BizHawk.Client.EmuHawk try { + bool usingAvi = aw is AviWriter; //SO GROSS! + if (_dumpaudiosync) { aw = new VideoStretcher(aw); @@ -3172,12 +2953,17 @@ namespace BizHawk.Client.EmuHawk // select codec token // do this before save dialog because ffmpeg won't know what extension it wants until it's been configured - if (unattended) + if (unattended && !string.IsNullOrEmpty(filename)) { aw.SetDefaultVideoCodecToken(); } else { + //THIS IS REALLY SLOPPY! + //PLEASE REDO ME TO NOT CARE WHICH AVWRITER IS USED! + if(usingAvi && !string.IsNullOrEmpty(Global.Config.AVICodecToken)) + aw.SetDefaultVideoCodecToken(); + var token = aw.AcquireVideoCodecToken(this); if (token == null) { @@ -3190,7 +2976,7 @@ namespace BizHawk.Client.EmuHawk } // select file to save to - if (unattended) + if (unattended && !string.IsNullOrEmpty(filename)) { aw.OpenFile(filename); } @@ -3725,50 +3511,6 @@ namespace BizHawk.Client.EmuHawk } } - // TODO: should backup logic be stuffed in into Client.Common.SaveStateManager? - public void SaveQuickSave(string quickSlotName) - { - if (!Global.Emulator.HasSavestates()) - { - return; - } - - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.TAStudio.BookMarkControl.UpdateBranchExternal(SlotToInt(quickSlotName)); - return; - } - - var path = PathManager.SaveStatePrefix(Global.Game) + "." + quickSlotName + ".State"; - - var file = new FileInfo(path); - if (file.Directory != null && file.Directory.Exists == false) - { - file.Directory.Create(); - } - - - // Make backup first - if (Global.Config.BackupSavestates && file.Exists) - { - var backup = path + ".bak"; - var backupFile = new FileInfo(backup); - if (backupFile.Exists) - { - backupFile.Delete(); - } - - File.Move(path, backup); - } - - SaveState(path, quickSlotName, false); - - if (GlobalWin.Tools.Has()) - { - GlobalWin.Tools.LuaConsole.LuaImp.CallSaveStateEvent(quickSlotName); - } - } - private static void CommitCoreSettingsToConfig() { // save settings object @@ -3894,11 +3636,315 @@ namespace BizHawk.Client.EmuHawk // TODO: move me public IControlMainform master { get; private set; } + public void RelinquishControl(IControlMainform master) { this.master = master; } + private bool IsSlave + { + get { return master != null; } + } + + public void TakeBackControl() + { + master = null; + } + + private int SlotToInt(string slot) + { + return int.Parse(slot.Substring(slot.Length - 1, 1)); + } + + public void LoadState(string path, string userFriendlyStateName, bool fromLua = false, bool supressOSD = false) // Move to client.common + { + if (!Global.Emulator.HasSavestates()) + { + return; + } + + if (IsSlave && master.WantsToControlSavestates) + { + master.LoadState(); + return; + } + + // If from lua, disable counting rerecords + bool wasCountingRerecords = Global.MovieSession.Movie.IsCountingRerecords; + + if (fromLua) + Global.MovieSession.Movie.IsCountingRerecords = false; + + GlobalWin.DisplayManager.NeedsToPaint = true; + + if (SavestateManager.LoadStateFile(path, userFriendlyStateName)) + { + SetMainformMovieInfo(); + GlobalWin.OSD.ClearGUIText(); + GlobalWin.Tools.UpdateToolsBefore(fromLua); + UpdateToolsAfter(fromLua); + UpdateToolsLoadstate(); + Global.AutoFireController.ClearStarts(); + + if (!supressOSD) + { + GlobalWin.OSD.AddMessage("Loaded state: " + userFriendlyStateName); + } + + if (GlobalWin.Tools.Has()) + { + GlobalWin.Tools.LuaConsole.LuaImp.CallLoadStateEvent(userFriendlyStateName); + } + } + else + { + GlobalWin.OSD.AddMessage("Loadstate error!"); + } + + Global.MovieSession.Movie.IsCountingRerecords = wasCountingRerecords; + } + + public void LoadQuickSave(string quickSlotName, bool fromLua = false, bool supressOSD = false) + { + if (!Global.Emulator.HasSavestates()) + { + return; + } + + if (IsSlave && master.WantsToControlSavestates) + { + master.LoadQuickSave(SlotToInt(quickSlotName)); + return; + } + + var path = PathManager.SaveStatePrefix(Global.Game) + "." + quickSlotName + ".State"; + if (File.Exists(path) == false) + { + GlobalWin.OSD.AddMessage("Unable to load " + quickSlotName + ".State"); + + return; + } + + LoadState(path, quickSlotName, fromLua, supressOSD); + } + + public void SaveState(string path, string userFriendlyStateName, bool fromLua) + { + if (!Global.Emulator.HasSavestates()) + { + return; + } + + if (IsSlave && master.WantsToControlSavestates) + { + master.SaveState(); + return; + } + + try + { + SavestateManager.SaveStateFile(path, userFriendlyStateName); + + GlobalWin.OSD.AddMessage("Saved state: " + userFriendlyStateName); + } + catch (IOException) + { + GlobalWin.OSD.AddMessage("Unable to save state " + path); + } + if (!fromLua) + { + UpdateStatusSlots(); + } + } + + // TODO: should backup logic be stuffed in into Client.Common.SaveStateManager? + public void SaveQuickSave(string quickSlotName) + { + if (!Global.Emulator.HasSavestates()) + { + return; + } + + if (IsSlave && master.WantsToControlSavestates) + { + master.SaveQuickSave(SlotToInt(quickSlotName)); + return; + } + + var path = PathManager.SaveStatePrefix(Global.Game) + "." + quickSlotName + ".State"; + + var file = new FileInfo(path); + if (file.Directory != null && file.Directory.Exists == false) + { + file.Directory.Create(); + } + + + // Make backup first + if (Global.Config.BackupSavestates && file.Exists) + { + var backup = path + ".bak"; + var backupFile = new FileInfo(backup); + if (backupFile.Exists) + { + backupFile.Delete(); + } + + File.Move(path, backup); + } + + SaveState(path, quickSlotName, false); + + if (GlobalWin.Tools.Has()) + { + GlobalWin.Tools.LuaConsole.LuaImp.CallSaveStateEvent(quickSlotName); + } + } + + private void SaveStateAs() + { + if (!Global.Emulator.HasSavestates()) + { + return; + } + + if (IsSlave && master.WantsToControlSavestates) + { + master.SaveStateAs(); + return; + } + + var path = PathManager.GetSaveStatePath(Global.Game); + + var file = new FileInfo(path); + if (file.Directory != null && file.Directory.Exists == false) + { + file.Directory.Create(); + } + + var sfd = new SaveFileDialog + { + AddExtension = true, + DefaultExt = "State", + Filter = "Save States (*.State)|*.State|All Files|*.*", + InitialDirectory = path, + FileName = PathManager.SaveStatePrefix(Global.Game) + "." + "QuickSave0.State" + }; + + var result = sfd.ShowHawkDialog(); + if (result == DialogResult.OK) + { + SaveState(sfd.FileName, sfd.FileName, false); + } + } + + private void LoadStateAs() + { + if (!Global.Emulator.HasSavestates()) + { + return; + } + + if (IsSlave && master.WantsToControlSavestates) + { + master.LoadStateAs(); + return; + } + + var ofd = new OpenFileDialog + { + InitialDirectory = PathManager.GetSaveStatePath(Global.Game), + Filter = "Save States (*.State)|*.State|All Files|*.*", + RestoreDirectory = true + }; + + var result = ofd.ShowHawkDialog(); + if (result != DialogResult.OK) + { + return; + } + + if (File.Exists(ofd.FileName) == false) + { + return; + } + + LoadState(ofd.FileName, Path.GetFileName(ofd.FileName)); + } + + private void SelectSlot(int slot) + { + if (Global.Emulator.HasSavestates()) + { + if (IsSlave && master.WantsToControlSavestates) + { + master.SelectSlot(slot); + return; + } + + Global.Config.SaveSlot = slot; + SaveSlotSelectedMessage(); + UpdateStatusSlots(); + } + } + + private void PreviousSlot() + { + if (Global.Emulator.HasSavestates()) + { + if (IsSlave && master.WantsToControlSavestates) + { + master.PreviousSlot(); + return; + } + + if (Global.Config.SaveSlot == 0) + { + Global.Config.SaveSlot = 9; // Wrap to end of slot list + } + else if (Global.Config.SaveSlot > 9) + { + Global.Config.SaveSlot = 9; // Meh, just in case + } + else + { + Global.Config.SaveSlot--; + } + + SaveSlotSelectedMessage(); + UpdateStatusSlots(); + } + } + + private void NextSlot() + { + if (Global.Emulator.HasSavestates()) + { + if (IsSlave && master.WantsToControlSavestates) + { + master.NextSlot(); + return; + } + + if (Global.Config.SaveSlot >= 9) + { + Global.Config.SaveSlot = 0; // Wrap to beginning of slot list + } + else if (Global.Config.SaveSlot < 0) + { + Global.Config.SaveSlot = 0; // Meh, just in case + } + else + { + Global.Config.SaveSlot++; + } + + SaveSlotSelectedMessage(); + UpdateStatusSlots(); + } + } + private void ToggleReadOnly() { if (IsSlave && master.WantsToControlReadOnly) @@ -3933,16 +3979,6 @@ namespace BizHawk.Client.EmuHawk } } - private bool IsSlave - { - get { return master != null; } - } - - public void TakeBackControl() - { - master = null; - } - private void GBAcoresettingsToolStripMenuItem1_Click(object sender, EventArgs e) { GenericCoreConfig.DoDialog(this, "Gameboy Advance Settings"); @@ -3967,7 +4003,7 @@ namespace BizHawk.Client.EmuHawk { if (Global.ClientControls["Rewind"] || PressRewind) { - runFrame = false; // TODO: the master should be deciding this! + runFrame = true; // TODO: the master should be deciding this! return master.Rewind(); } } @@ -4061,6 +4097,5 @@ namespace BizHawk.Client.EmuHawk quickNESToolStripMenuItem.Checked = Global.Config.NES_InQuickNES == true; nesHawkToolStripMenuItem.Checked = Global.Config.NES_InQuickNES == false; } - } } diff --git a/BizHawk.Client.EmuHawk/MainForm.resx b/BizHawk.Client.EmuHawk/MainForm.resx index f1fca9c6e8..633bacee68 100644 --- a/BizHawk.Client.EmuHawk/MainForm.resx +++ b/BizHawk.Client.EmuHawk/MainForm.resx @@ -123,453 +123,463 @@ - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTFH80I3AAABpElEQVQ4T52T - QUsCURSF33+SDAUxRAyEwQiEksiFUJEMhGEDOcQgRi2UGJBgCkFIZDDbGEGWEsTMItBNrdu3ad3y1Hmk - VNosvHC4l3u+A2/ezIi/5fP58D1OlJf3qzRNmwCn7TzrZ8AzfGk3kM1mkcvlUCgUUCqVUKlUUK1WwSDF - mTt6ZMgyw6zIZDIYDAYziVmRTqfhui5WDhoI7VxAMa6xdvKIDWsgxZk7emTIRiIR2ZkVqVQKvV4Pc1vn - +OI9RYas4ziyMyuSySQ6nQ7mt2s4unuH6XxMFT0yZHkCdmZFIpFAs9lEUK1Drb9g82wIrfWK4s2bFGfu - 6JEh2+12ZWdWxONxWJYln3HddBDVWlNFjwxZnoCdWRGNRlEul7Gw20Tm9Amr5YepokeGbLvdlp1ZEQ6H - YRgGInl7fPP/iQzZkZgVwWAQ+XweS3s1LO5fyVe2fHiL5PG9FGfu6JEhOxKzwu/3Q1VV6LoO0zRh2zb6 - /f74Y+HMHT0yZEdiVhQNXQ6BQAChUEheUCwWkxekKIoUZ+7okSHLDLPyf3geuphFQgjxCdiQMGrYYwVf - AAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAOuAAA + DrgBakH1WwAAAa9JREFUOE+dk0FrGlEUhd9/kloUxCBiQRBLQUglxIXQlspAMdiBKmEIlmahhAEJmBII + NMiQ2I0hEBOlUMZFwWzadffZdN3lab8HE1pjXEQ43Os539HxzWjMwisWi2nRi96vyv7ruK5750OWefd9 + kfX/LawsnwbHqtVqqtfrajabarfb6na76vV6oojY8chgYOnQNdVqVfP5/EGiayqVimazmda3j5V680kF + 70wbe1/1oj+3Yscjg4HNZDJ20jXlclmTyUSPXn3UX36lYGDDMLSTrimVShqNRnr8+lAfLn/JD38vFRkM + LFfApGuKxaIGg4GSzpGcox96eXAt9+Snds5vrNjxyGBgx+OxnXRNPp9Xv9+3v3HTD5V1T5aKDAaWK2DS + NdlsVp1OR2tbA1X3v+l558tSkcHADodDO+madDotz/OUaQS3Jx/dgcUJAxuJrkkmk2o0Gnr69lBP3n22 + t+zZ+wuVdq+s2PHIYGAj0TXxeFyO46jVasn3fQVBoOl0evtgseORwcBGomt2vJZYEomEUqmUPaBcLmcP + qFAoWLHjkcHA0qFr/zjfr2d6iOj+AdiQMGoJxWWRAAAAAElFTkSuQmCC - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAQ - SgAAEEoBNcinnwAAAHBJREFUOE/NkOEKACEIg330e/NOA2PqTqL+XPBpbcMokUfGFUy0xTrFitogNHgG - qUJDzs58ERpydua1/OwJiv967hQr4QkfaHJSPDzYICR4OwOOsOK3+c2Oh/I5QMUEDijD1gbMEiKZpaF5 - BBW3kfECg6SiSi9TP3UAAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAQRgAA + EEYB7r8o6AAAAHVJREFUOE/NkuEKwCAIhN2b781bGsZlarH9aIEEcX2eVxfdVOjTYoCpUhef2d3qWnMR + AoTEkV9OMwEMdQTwsxGc9PU19l7BS5qhNVyuOXS4wFlgoXgL4FoMHHUtfqTIgZ6HGaw6I2CCDXMmGagu + BaycvB4hAz9wYIvatCqJLwAAAABJRU5ErkJggg== - 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 - AAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAOwQAA + DsEBuJFr7QAABitJREFUSEu1VmlQk1cUFZ3RH/6BCkWoHZeCUrS1TEDCpIAsASECA4qtIMSCSJDNEBAJ + JRYGkKCETdsCCZt0CglhwACyhT3siwo6BAsu4D467vvSAxkTiWHxh2/eZD4+3nvnu/ece+5Te//+/aIv + OgDwWePdu3fPnz9/+PDhgwcP8Pvo0aOnT5++fv16tkMWLfz0Z8+e3bx587/pMT4+fuXKlatXr05OTt64 + cQPv7969iwWfnrYggMePH+PEixcv1tTUREdH29jYrlu3TltHV/fb1d/p6Xl4eIjF4uHh4YGBgb6+vv7+ + fjwjUBnYPACvXr3C0YODg+np6aZbTNW/WWPoSt0al+2UL/arOscR95c1tDQ1NTU0NNTW1lZXV5eVlRUV + FYWEhCCyWQHevn2LnL558+b+/ftnz57NycnZtGnTqp+IZFamZ2nvnrKBiKr+4pYeSUdHe1u7SCTC52PI + AU6dOkWlUuW5mhHBy5cvkcrr169PTEwgv2NjY93d3S473ClHMveWSKglnYHCzuKWXozurq4OALS3JyUl + paamfgwQHh7O5/NBvooIbt++ffToUWRQBoDkgM/RUWnr4BCrXMKu7OjqH5QluusDQEvLVIrkAEKh0MLB + 6fLE5Pnz51WnCMnJzMysr6//CGB0ZGTkwoUL2IOMqQSQc8BkMrfT/6jtG66rq5PxrEwyUlRSUrLewLBC + VPkhgikASGhoaGg2gNLS0oqKisrKSqK1PS1LmFPTLm4UQ77KAKggIK/fYLAj7AiVdfxMbd10ilQAgBtw + 0NrayuPxGhsb93h5Q0KhoaFuB1m0jKJjxdVY0NnZqQwAOTo6OpJ3+wYkZ9GSsyKST6gEQA6dnV2Ki4tB + r52DI/Juud21TCg0trDFLsyEPIFEIgExMwDAcGJioiGB6B+XihmSdKJn8JwSAPbYksnGVvZRx0+aksyD + 6Yyd+4J2e3gGxSbvdN/lyWBh44H4NE5uUVVVFTAUACCkubnZwHAjNSxmHzMRs7alXYkDlGhkZGQCJyP+ + BNePmbDDL8TZ0yeAxbZ39zzAYls7u8em/c0r/IeTmrpvvz8KHjJRANy6dSsiIoJEpuylMzHTeYVKKlIi + WdzUzDqWTj14GIvxG8iMKyoRVFefSWIn6W34vqqmLjAwEAWrAAAhxiZbfvELogaFh7ESpNLRuQFQBxJJ + h39YpId/6H4G87SoEpUMSvQNDH8LDh8bGw8ICFDUAbSfm5tLZ0R09/bBQ+SVPLdMfX19TUhbd3r7/csX + gBtYEMTt4rH3L14Bl8sVCAQKgHv37kmlUhyNr4bxzguA47Zt2/aDkbGD666IaJbM7Eikn20cXVx/9RqR + Sp2cnF68eKEAQIlaWlquXKmjo7uKRguYDQDLYNdwytWr1xC2mFna2NvaU0r4AgDEx8dv/NEIb7K4vIKC + gpSUlBlmh20UynZjEyLBhJjCSVMJEBcXt3nzZk2tr/X01hOMTcn2DoeZv58WiWReFBwcjL27Pb0uXbpk + bW395MmTGQDQn6ubG3ZiZmdnqwQoLRWmpaVzOKknT/5ZXl4OksGqj48PXAsAXC7PyIjQ09NLo9HgGR/3 + tSkvQuxeXl4aGl9hotzn5QAmcejQoRUrVixfvpxCoYCS+voGPl+Qn58PSHkvU3Bw7dq1mJiYxYsXq6mp + aWhowEZm2rXCi9AAGAyGjo4O7iFYL9sCSuFgeXl55ubmaK5KbXkqAvQZyFRXV1d2fcEDdHZ5esisAglh + s9mwqWXLlildcTQ1NQsLC+l0emxsrKx0VQDgFcKEPPA58v1aWlpWVlZkMllfX3/JkiWfXp2w2MzMDIYK + 1yMQCGjad+7cmRUA7Rcxurm5LfAOpq2tDWdEF4qKirKwsJBZv8qhaDjQhuxCoK6uPgfM2rVrYXk9PT24 + QCACPMtrah4ArEOioQRUeVhYGIlEAplI+tKlS5EuJMHb2xtRouNjgbOzs62tLZrzbB+u+laBW1BGRgaM + ENUIYUzrrx6/bW1tMHeECLERiURIE+9lZjnvUO7JUDFMCaHge/GNdnZ24BmpwLmQI5iEAyopfW6MWW92 + OAUuC2EAD+rGn591rlKKcL+QzTnH1P8XsGzmGf8DfkBfS0tQ1cQAAAAASUVORK5CYII= - iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 - JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AABbV0lEQVR4Xu29B1RVab7mfe+E77vfvTPf - TKcqc845R0xIRiRJRkRUzBkBMyhBQQUEJeecURADmMCcy1jJqrKqurq6q6u7p291VVfQ/zzPu/c+HNCa - vneaO6vnLt+1nvXuEzhh/55/eM/e5/B3r8fr8Xq8Hq/H6/F6vB6vx/+V4+9DQkL+KS6uoktmZubQvLy8 - 6cXFZW5lZZVLU1JSrPX7vB7/t4/g4OD/HBMT87OKioq+tbW144uLy23Ly8v9S0vLQ0qLK+NLSysLcflU - WVn57dKS8g/Lyyt/W1RU8iAqKspdf4jX429w/D2A/pf09PSuBQUFQ7FtAbmWl1etAMCIysqq1IqK6hrM - LRUVVY8rKio/Ky+v+ArzC1wnhirKX1ZxcancuHFDvvzySzl16tT5rVu3OujP+Xr8Ww9GK0D+lNFaVlY9 - rqqqzra29pg/tLmu7nh8XV1dAXSqtrbhFq77oKqq5suq6prvsC01tXVSU1Mn1dW1UI0SbhfcrubKqmpN - f8EABQVFz+/fv//9N998I9Tnn38ux48fP71+/fqJ+st8Pf61g7U2Pb2wa1VV/ZCmpiaL+vqTridOnFx+ - 8uTp3Y2Np1IbGk5WQy0nTpx63NBw4rP6+oavoBcnTjQKLivhMlQvx4/VS10ddVwIvhbgKcKvqSH8NgNQ - NUrVUg0T1NZUSx2266qrpLaqEnMljFApyBomFRcX//DBBx/88Kc//Un+x//4H2LMyDah+tt5PTiwQ1S0 - oq72AZhxjY1nbc6cOe/f3Ny8+ezZ8/FNTecKzp07d+r06XO3z5xp+uD06aYvMX/b3HxWmpqa5cwZqglp - ljojJ09Sp6Sx8aQSDALRAJoJ6uthBGUC6BhVLycaGuRE/XE5cbxOGqATx2ulobZGgSXkqvJyKSoqlsLi - MsnOL5WktDxJyCqV/Wmlsv1QnoQlVkhOcbVU6SZAH0BDfI+of/7VV1/JH//4R2WATz755HlGRsZ8/a3/ - +x7x8fH/VFhY2PX06dOI1vMWFy5ccL106dLyy5cv77506UrqpdYr1bjc0tJy6dHFiy2fQV+1tLS+aG29 - JLgOahVcp3T+/EU5d446LzAFdE5oAJjEZALOyArSBDM0m3RKmk9RJ6WpsVFONRyXRoAmZMJC4yZFpVWS - nlMsh7NKJDG7QiIPF8i2xBIJT66SVfuKZVlshSyNPya+UdXiHVsvnrEnxTXqhLhEnxbXfWfFJeacOOxs - lENpBcgQVcoApaVlcuxY/Xe///3vXxgGYBl4/Pjx7yMiIobpu+j/vmFE68mTJ/tcvHhx7JUrV2wvX77m - f+vWrc03btyKv37tVj7mU7h8+8b1mx9cvXr9y2vXrn+H69AQ3ZTr16kbcu0adV2uXoGuXpPLl6/KpUvU - ZTEMwLm1lZdbpRVmuIzLsItcungRM3Txglw42yTnmk4r0Cca6lXqrqqtl4KSKknNLZUj+TWyD1G6M7FQ - th+plg0Hy2X5vhJZfuCYLIqpEe+9EIB6RDcC6klxiz0rrrHnxBVQXWPPi9u+i0ru+y6Ix4FWcY+7IO77 - z4lHPC5je8G+c9BFWRB5XLJyi9AjaAYoKSmlOb9j1BO+YYCrV6/eDw8P/4m+O/92BqMV0LpCQyCL69dv - u6KBCb57+63dt27dS719+1717dtvtd65c/cR9Bn01d27917cu3dfqLt331K6c+ee0u1bd6E7cvPmHYAn - fE03b0KYb928Cd2WO9CtG9fl1nXqmty4fEmutF6UywB8HhF+Eqm7vuEkoDZIbjEitbhWknJrZE9Ksew6 - UilhiNKViNLguGoJ2n9MfPZWiXd0g4pSt70nxC2mCfAI9CxAngfAVlmg1AKIreJJxV1U8uIMuObyQIR7 - Ql4AvmD/WSWPOFzPGUbxgFHcYy+K985SKSws1tN/JRvAFwiO777++ut2Bjh79my9vsv/7QejFdHzE6Tg - vngxYwHS5t69e/7Q5gcPHhx48OBx/oMHD0/dv//49oMHjz54+PDx73Ddd48fP0GqeiKPHlGPoUfy8OEj - eXCfeqj01luYHzxQ1z3Ur3v08KE8xv0eP3wgj+8/kCcP35JHb92Ve7dvyN2b1+XGtaty8fw5pOhmaWhs - kuLyOskrq5OM0nqJzyqXPanlsjOtFlFaJiviEakHj8nCmCrxia4V732NsiDmhLhGAyyAMPUyUt0B0hyo - 14FLgIU5vkW8TQJcChFLqcv6tqGO4E0ifAI30wJc5wFDKUWfE7fo87J4T5FUlJWo2k9hSWlaARgGoBlK - S0vjdTydN5CS/x+CvX//YSQApkLVANcKoBhPPnvy5O2v3n77nRfvvPOeaHrXpCdPNL3z5B3tOmy/+y71 - nrwHvf/e+/L0fcy4TumdJ/L2I4B+8JY8vHcXUK8hXbfI2XMtcuzEKSmqOCY5ZQ2opdWy+1CBhAPm2qgi - CdyWLf7bS8Q9rFgcNhSIY0iluO2uRxSdRBQiyg4gjTKtHmoRz4OXIECEvBMuiU8C5oMACflwxn01AaZp - GwJY0/wKGbC9VbS/Gr4R8SapiNdE8Atim3XwbXKJPCtronKlprLCZACsAL7/8MMPf6AB2AMYK4C8vLxg - HVvnjbt37/oSLKG11/vyHgC+//5Tefr0Q/kQ+uijZ/Lso4/kYzN99BT3efeJvPfksdy/d0+uA2oravHp - pvNSidRbWNEgaUW1su9osUSmlEp4Qqms2pslS/bky6LIYlmwNU/cwovEZXulOISVieP2GrHZXCtz1lbL - 3PXHxHrTCbEJaYROiu2WkzJvexOAtEhA8lWlhYcviV9Si/gltopfQov4UocutpMPpAH/F0pB5wzIav4L - Ud8BvBdBczseEQ/47rFNyEBNgI/rdfALqL3NMn/3Gdkan6uWg4TPBhBB+f2vf/3r5wRPAzD6v/jiCy4B - 5+jYOm+gBh9+guh9+vSpfPbpx/LJM0J9T56+9668/fiR3L1zW66h0Tp3vlWO1SNKy49JekGtxAPo7oO5 - smVfrqzYmSqLtiSLX1i6LNh0VOZvOCrOW3Jk3uZccdycL07hZeIEwPN31IhLRIO4RiAd7zkh7ntPygI0 - T+57T6MROo0dgx0VfQZGqBeHLQ3iGHoCahTH8EZcPiHOO8+IH6I4IPmSLEzS5J8E8Ik0APQK+MoAr4L8 - l0TwHaCbBOiUCbg+ewK8SYS/r1ncAb4NfrOCTrnvwfWY5+2ol5ikbKlBA0gDsAE8duyYWgEYBmAmeO+9 - 974JCQnpq2PrvIFa00z4jNhtUamyKTJdgrceEZ+18eK+6pA4LjsocwNiZc7CgzJrYYJM8z0ks5Yckbmr - s2TuSmhFjlivKRC7DUXiEFIs88MrxHVHlbjtrJEFu+vEc89x8dxbL15RDeIVfQJqFE9DUY3isZdCJw15 - Ar4bjOAQUq/D1wxA+G4RZxRswueshKinCN83AbCpDuANvRJyB3kBmtpWUQ/IFOq2OXRvzmgMCd1QO/C4 - zJTvDvhsIhfA1CbwUWgqKcB3i8R73dMszttr5XBarlRjWaml/xJ+LvEtodMA1Lfffou+6a1nwcHB/6hj - 65yBVPNf7t9/8Ozjjz6UdTtTZITTPpnklSRTfFNkmv9RsViYJjMDM2X2kiyxXJotcyGr4FyxW5uH6C6U - +VuKxXFToczbVCTzAd85rFRct1aIOwzgsatGPCNrAR8GiKpX3bU3GjHvmEYlrxgCpwkAPwrRD3lihznv - IHCz6N8Cg2CHBRwm/FakfDPwiHg/1HgTfMjnUBv0f4kBFGRdWsrnDCnw+sxo1w1gAm8O3RA7fcB3Q8p3 - g5ndo8zA69DdI3X4kEtks7iGF0t2br76JJAGKCgoxArg6neEbhjgu+++wxL3UouOrfPGuXOXhrNzf++d - x+K5Kk6m+h2RWYvSZHZgmsxZnC5zgjLEckkmwCPSl2WLNRWcI/YwgFNIobiElQA84G8qFheYwTW8XNy3 - VQJ+tYLvjej3BnwfgPeJbRRfyCf2tG6CkzDBaWSGMzAB4GOH0QDzwgleMwAj3xPRQ/ABh1uQ8rXIJ3QN - vp72DfA/Ap/qCFxtm102wHsBIKGrSO8IXZcB3IPCa/ZEtDPdu+1rwpIRMot0c+CuEafbifXfd2eRlBYX - S6mq/+Vo9AqeP3hw/zs4oF0GOH78eI6OrfPGjRs33Ni938A62iogWiwC0l8J30oHb7McWpErDusKxDmU - wBHxkHNIibgi+t0Q/QsY/RG14rXnmAk+wfuiY/fdR51WJvDBZW8YwBvgvSg2SnvO6JGvyQsd8yIV9W3w - /Y1aD+jGrNK9YYAOJlDRbAa5I3DjNrWt4ANyB/gd6zuhm6TXedcYAFbwmdrboHcE77L7pDjvalRy3HFK - Fm9Pl+ryUgWfDWBhYeEPXAGYZwA2gSUlJVt1bJ03bt68HfH+++9L/YkzMs0zBvAzfgQ+tDwXBsiDAfJg - AC363bcy4ivEJRTwEf0L0Oh5oPZ7RR4Tn6jjgN+g4PsBvNL+05jhemUCGgAdPaQZoFlcdp40pX8N/iWV - +mkAf3b6Cnpbum9X6w8CIOB7czaDa4BVkPW0bqR2DThmpG5DXlSHaDcHziaVUtt6qneBXDnvxdwBOoGb - Q6fm7zwBNYpteINsiMrECqBCGaCkpEzKyyu+/81vfvOcBiB49gJcAh46dMhVx9Z5g5/QcXl3NLtUJnvs - V+AN+JTVsiwdPqMfBlhZIDarCrAWL1QR776tXDx2VGJbM4IHot9zd634oO77oub7KfiN4g/w/vvRxMWh - i1cGOCM+ygTNbSbAtpH+vWPPSqABX0V+G3zNAABOAbgv1u4q0gGeJvCJ16K4o5jaCdcctrm89je3RTui - uh14HboSIpxdvRsjHqWL0F1wnTNWMi4/EukE7kTt0DRvO2bIelO1bI89qlYANADPAaitO/btH//4xxcE - TwOw/v/yl798vmfPnrE6ts4Z/KTv3r17D7mO34ruf7J3Ujv4cwHfivCR+q2R9m1W5okt4NuuhgHWFyHi - S5HuK8QL9Z51n/LcWa2i3xcdv1/sCfFH1PvvPykLAZ5SBoARNBM0aQZAFPmwhiJqHNH9e+O6QNb8ZKZ9 - RL5a4hE8YBO4rpdTPUAa8AlUn70Btg2ydtkLz6dFurZtAFfQzcATuLsO3h2w3QHaXYFntJ8WZ6xYCN55 - D2B3iHQtygm8AcDrIczbkN22NmCZe1wcYHTbDaUSfzhLrQC09F+MFcAZBL8W/YYB3n777d8FBAT8TEfX - OaOpqanX3bv3/5kN4KINB2Q6uv52qT8YWq5H/0oYYDUMAPh2q4vEcX0x6n25eCLivSJqkParkf4R/ej8 - vVH7Gf3+iH5G/sK40xIQf0YC4pqw3aQyQXsDNCsDOG/DygCN02LAD0TKD1BRb0R+R/h6tBvp3pTOdRmQ - O0iBpvCc6jJmc+iMbCPSCZ7Q3bA8pXiZUW+Anx9xUuYDPGcnHbgp2hV0Dbyjgl4vDuGEDoXVYaWDZTFf - Q2SppGfkSKV+BDAvv+DFtWvXvv3hh+9V6qd++OEHwXVvAdl/1Mh10mhpuTL34cPHcufmDZm3NFYt91T0 - q45fi35lAMJfZcAvFPs1MMBG3QA7q8Qb3b4X0v6C7ej8VfqvFz+s9xn9Cv4BGgDLOIgG0DJAE3oDGkAz - gSfWyoQfiJS/yASf9d2Afk4TgFNttR1iVAO6SuFKeCw8vlqmKeDcRqduRLUO2wBuHukGdAO8ayTgA7ZK - 99FatCvwhL67UdOujpFO6BCgO27VoNuH1IljeJ247cYymO8/oVnLansKJT8vH8s/HgEsk9yc/OcPHj74 - jtDNDYCscEzH1nnj8uVb6548fiJNTWdltt8+fa0PAwC+pR79Vqj71kj9hgEIXxlgAxtApH9EPg3gg+We - xw6t+fOFAfyxzFuI6Cf8RQC/KB5LOd0A/gDkBzBaBkD9BxB/AAzEDqEBApIuij8iXkU9UrvvAQ26z8Gz - qr6rGg+pmh6nQ9dBexgicEhFtA7ZAK4+mQPoV0I3A8907gbgrlipOEeZRTsgzqMAnvDn6eAV9G3HNeiI - dvvQOrHfUitOuOy+B+BR/nwPwfiHkPEOwpR4P4t3Z0hZMZaBiH4aACuA7z/++KMfvv++LQNwu6KiIk7H - 1nnj+tWbWe9iCZhXXC1TvQ/IbET+HGWAbJmLuk/4VqbaX2iKfoe1ZgZA/WfK98Nyz2sXMkEEmj/Uf0Z/ - AN6wgo83uwjAAmACzQBwPw1A+Nj5AQAchHofiFofABMo+Ix2Bf6sCb43/t5bB+6Jx/HEtge38VgEzo7c - JP0jZXOpFK6rI3AFfW+jBh6QCd8V8HnShjNuM0U8gDvuREpHxM+jkObbRTvA2yHaCX4+TOER1YjXjKXu - wTPifQArHWwbckcTvHpvulSVlSr4bABLS8q/+/LLL5+z7rMP4MxlYHZ29jIdW6eNv7927eaV9959R6IO - 5chknyQYIPMlA1hjyceu3xbwWfs1AxTrBqhU9d+HBsByzxvwlQH09N9mgGY9A2gGIHzKB2nVHxCD0y5J - IFK+AV9L9Yx0Roo2t6V4gIcY5SbYpsgGWArQFFhzyLpcFWgz4Hs0uUSgcaPYwBE+wauoB3RcryKd4BHt - DujiORvgVW1HXbcDdIfQWlXfPaKxxMV7VbDRBJvLE6siT8wu6JNCY45IdXmFMkBRUYnU1hz79quvvnph - GIDR/4c//EFiY2Nn69w6Z+Tn5//s1q3bv3778UNZsS1JprABVAZA+qcB0PgZBrDG0q+9AUrQBPJDHxiA - NV83gA8i3zuiHgZg8wcDqNRvpH+tBBjR7wNgfoC3PP2SLE3FUs+IegWcNV2LdiWCx98wpTPSzaPdlMIJ - HVJn5RigzYBTLhSAOhM4UrKCjlTujMgmdMLndS6ANx/mUPBVqjfAN4g9oNsjsh0wqzQP8LabNfAuOwGe - n26ixnuhyfWMPQ2dhFlP4DV3EEzgtKtC9h5MVaeW8QBQfn6hWgEQOuFTrP8ffvhh5x8EwhNNuHXrzvN7 - t26L64o4mY4G0IBvygBI/4YBmAXsWP8R/W0GwApg9zFV/2kAP37Ov0czgKr/pvSvG4DpHyBV8wcDLE1p - kRVZV2RRIqKeqV6Bh3TgbeC1FO+B6KZUSu8Q6QTvAqlZj2zCNmYFPgLNmi4Fnh270bVDailnFvWs846A - SvgEb4cUT9lTCnyNSvXOOngPpPQFAL6A29gHC5ROQA24rgGvt75N2FfzdxRJYkqqWgEwA+Tk5KsVwIsX - L0zpn9sPHjzo/INAFy60LuSpWOfOnZM5C7ECWJKtNYEdDcAGUDeArW4Ae90AruFY88MA3ns0+AuR9rnt - ix1gMoAOf6Ee/Qo+AC5OugD4V2VZWqv4IMopAtega128ZyyjSIeuwDOlczlG6Ix08+jWISOyCfolASaj - Wcno2lnDAdcJqZ113hn12gmPocAj6h0A1gHRbo/GzhbQbcJqxTYc2lKDdF8DgGjuCBnv2x3v2Q2NrzuA - u0e1yW1vA15nPXTcJNe9dSr9O29Jk8ysbKwAtAYwOzv3h4cPH34nGIRPcfybHAS6dOlKPE/FKimvRQO4 - 32QAlQUAnwaYG8wmEPBXFkJFaARLUAaoUnFYVwYD8FO/Oj3qYQBA99l7Qi8BxtKP8I3ar8FfhOYuOOOS - iv6ARCzjcL23SpmaDPge6L4VdD3SCV+DjsjWZQIM8PMjGjTthgjZgA1pNVyr40qo0/MQ1U4AraIej8Wo - d8T9CN4etxtRb4Plm3VojVgDui3medsBEu/RHdHuCuiueO+uAOpK2BSCwA0rIVfsF5dIAN8D4IS+B2UC - co6sgdHQL4UflaL8fJX+2QAWFHAF8PH3jHrDANxuaGjI1rF13rhy5crJxw8fSnxyrkz0TpCZQVkya4lR - BnJgglwYIA99QCHKAAUDrCw2mcB+bZm4hPGDnzrxxJv0gdtpAML3QST5Ix2qT/4Y+YSPxo1N30JEOKN+ - eeYVWYqZ8L0UeB4K1qSBRyqF3PFYKtoVcOxoSNVvXYSsBBM4AbySCbgW3ebQHQFPCVHNbKDBx32xTRG+ - HW5nxNsCPKOe4K1CqlH365Tp3PBaeW6hC0/tRt/jDNjOAErY5nKOqNOEZbJzZDVeY5scsHxeGHZQKkpL - FHw2gMgC3/3ud797zrpP+OwF9CVguI6tc0Z6evo/Xr585emjB/dk/a5kmeSbIjOCMmGALGSBbJmzBAZY - ahigQIkm0LKAZgIawDmsWjx2wgBo/GgAP0Bn+vemAbCT1Me+hA95A7IvtPRIiwQDPuWfwFOjCB0105AO - 3RDBG/BdEFnmad2IcAUbkWySEeEd5ACwhEjNZ6kgfMzzYBot6lHjFXwDfK1YbULko8Hj7Qo65IzXQs3H - 65mPKGc0z4/EY0Zg6YelsCGnnYj0ncZchddVBdNVYq5EVimVVbsSsALQln8FhUVYAdTxJJAXNADBc+ZH - weDloqPrnHHs2MnBly9f/fPd2zfEe80BmbIwXWYszpSZi7NlVlAOTJCDTAADLMuDCWiAQqgIJiiBCahS - ZIEymb+lWtxhAI/d9eKN1McjfPyI1xs7lrDVJ36A74OZh32DDl9QqX8ZtCStRUvzSO2UingFXYt2npLN - U8ZUV66AG+m9LeqZvk3RDUBKgGiKciUNOGW3FSBxeT6eZz4ylVMkuns8hinqkRVsAN86DNBDGPVI+fg7 - e7y/+Xh/5uCdIgEemrf7uMwDeA0yyoOhHdUmOW6vgirRTFbg+cvxfBViuSlHQiMPShUaQBogL69QTp8+ - 860Bn+LgUcHo6OgxOrrOGadPX3DiOfYt58+LdeB+mRqQJTMWZcIEWWYmyEUWKIAKYQQouAgmKEZPUKwZ - AX2AU0iVuO2okwXYQZ6ARciEzgzgoxvAl0siXL/o0FkFnlqajmVfIk+I1M8HNITLbmjCeL6ggg7IhljX - 24AbsDU5KgE2ZB7l9ttq0bHXih0bN0S0A253htGc8PocAd/BBB8dPe5vg/updI+ot+G6nrftQuagAVS0 - a+AVdArlbx4CYN6OGh1ymxy2VXZQOV5PKV4PsufWMpmzNk1iDiRjBaAdAUQD+OLq1avfErq5AZ4+ffpl - px8Eaj53btvtm3ekqqZepnrtl2kwgEUADBCoGWDm4lyYIBcmyEMmyFNGmLsMBgiGAZaXKNmsKpN5MIAr - dviCncfFA8B4iheBe2Mne6MEqG2WAjSBywBdwUfdD0pF9OO+7oh0yg3m0cBr0e4C2M6Q1syxjuvA8TyM - cENGlBO6vQKuS4dugLdFCmekO+M5nVCqHADfHpe1lA/wetRbIaNZsdFDJiB4WzyfLQw+DwZwMoBDjkjr - lIMCXwO47A/aYNtvrdAUXtamsFK8lhK8FmTSkCKZtTRekrEE5ClgRcUlkpWdwxWAMgCzAMVx69atzj8I - dP58S+ndO3fkcHqRjHM/CANkynTIQmWCHBiAyoXyYIQCmb20CEYoggmK0RyWIBuUYHlYKo4bq8QFO9wN - cBYgPfPcPjZ7zASMen5limVhKYCz5jPyg1JbVe13w/0JXp0djG0XRLmKeoLCzndSQqNG8CrStXRuLhXl - hG2ucAAETIK3AUwbdO1OLCUw4jykb8InXDs8nhH1VrjPXDR51jSNGXib7cggjHC8DkfMjgBO6PbbqzVt - q8LzI9q3AroZbDvAVgoF9FBCR8BsQeYEeKsNCK61uWITvE9ys3OkVP8EMC+34IdPPvlEhb25AbBM79yD - QB4eHv/xwoUL9+7duS1b9hyRsQsOy7SFmSoLTGcmWKSZYEZgnmaAxQUwQaGSYYQ5S1kKsBTcAANgp7sB - kBuilZ97+7DbR/pnhNMAiw9jyZd5SdX+IDSAiyF+SOKCqGKka/CRYrHjlQDciZGudrg5bEScLvPUroAz - 0iE2bgROWQMoZ67tXfA6NPhaSldw8feM+rmI+rmMelxnDt4az2GzDRGOyw647IBIJ3Q7pHdbAFcKr8Dz - Q2GUEeEabEMKOrW5AGkf5XUl9vHKbJm/fI+UFBWq6Oc5AJi5AlDUzQ1QWVm5X0fXOQNLiu7nz1/8A79H - 57c2XsZ5pcrUhRlK0xZmwQg5MEIOjJALE1A0AkywWDPBrCVIX0HFMnc56tn6KpmPpZILUrArIpend/Mj - UB+IZlh4qFnBX54F+Gj6AgGftd8ZEcUoVzN2OoEbmqegI8VypxvAAct+KwBAbaldi3QFHdLW6YhiAt1Y - qbIBwRvw7SOY1nXAJvhVYo1tDTwaQGQEa5QDKzzPXBoLBrCH7LYCPGQbrsG3AXTrsDI8LxQKbaHaotx6 - M4Gjb9qE0kltRNSvRoldniEzV2TK1KXp4rc+WirKtOVfQX4Rfz/gz1wBcN1P+MZnAYWFhUt1dJ0zTpw4 - MZPf2mk5f05sFkXLeJ8MmewHA/jjhflnQdkwAk2Qq2lRHsyQDyPkwwiFupAFUAZs12FZg53vjDWzK5qz - BajjXki1qutH6l+W0SorspH6MS9KvSiBKAX8eNQJGWM+djrlBCDz2qX1NvAOCnx74Aq6gt0G3JAVehLL - Dai9LEtYgjrva4t8QrbBcxGuVSijHhkCz8frrTFbETyeZy4e3xK3W4WbQYdswioBXQNPWSG9WwE6ZR2C - eTOyohl0y43onQB+zvpsmbEyQ6YvS5fpweliARNMCkyWVaFR6hgADZCbm88VwJ8Z8QRPcfALIXFxcbN0 - dJ0zmpqaVvKr1PxVi8ke0TLRN1Mm+cIEmKf4wQAUTDAVJpi2MBcZgUbIgxHyxSKwUFeRzF5WKjZrsaYF - CCee4bKdZeCESv2+8U0SlHJBVuRekeU5l2RxeosygF/SWXFCtnDCfTmbwPMYOqAZwJXMIt0GQMxlwDY0 - d3OlkuV6NKaIcvdDTeLMyFcNH9M+4COjWCGqLRH1VmF4HEY8ZI3nnYvnI3gFH7fPgWwIHtAJnrJClGsq - hXnQB4UgCwK60ib0R5DlRoDfgMZ5PYUmeg0y6rI0mbZUF0wwLThDxi88IDuiDqgVAA2QlZXD7wG8ZAD0 - BF+Hh4f30dF1zjh1qin1+rXrkpZdJKOd42Sid6ZMRBagCSbBBJP9smEEGIAmUEaACRbmwQj5StMXFco0 - aNZSOH8Nut7NWPOG1okTILqyD4ABApM1+CvzEP1ZiP60i1CLuAGIIyJbgTeLcgUecCjWdDsAsm0HHKla - l1UIYAA2NXdjBQBUyBxE/RzAd8Za3TOhWYt8wt8D+Ogl2uDDOMgARtQTvCWvx/MZ4Gfj8eeGatCtQytM - 4OeGAPxmgAdwS6R4pU2FgE6hvm9Aswzws9cB/Dr0UKuQUZekyZSgNMxH27QsQyb6xUjcoUQp5woABsjM - zP7hwYMHagVgboAnT558hJ7t/9PRdc44fbqphd/I3RGbKiPmJ8oErwwoHUbAC/NhNshS0oyQA+XCCHlK - 0xbCBLpmwgBzV2NtuwlLIGQBnu7Eus6zXoIQ8SsAnyYIykD0wwB+qP0O2PkacM4QoWPnE7gh21BE30vA - NdBKgM40P3cD1tIby7CzMa+rENfYRvFGhnFB6THg2+rwjbRujW1GvRWiXoGH5uA5CX4Onmc2Hn/2ZqZ3 - RjyMEALwCnoJgEObivGcyH4AP5vQIUKfBc0E+BlrsXpak61S/eTFR5VoAG37CLaPyCQawme3pKdnqGMA - bADzcgq+/+STT9UKwNwAly9fvqhj65yRkJDw38+caf7l9atIy5sOyXDnZBnvmaoMoBkBJqARVFbIhhGo - HJkEI0yGEagpvnkQeoIl2CGrysUGS0E7fk6OXsAFBghIPqdS/nLUfs0ArRKIy+z07QHBHrWVsgvD3wG2 - AdwGO5yy1oETvAK+CRAoALckdMA2NHN1KQBUyIID6DvwvK77T4tTdEf4qPcsI2z+AH8uar0JPHqJOcgK - szdXyawNlTIDhpqjnptmI/xSBd0EfgPAQ7PWoylW0PMAPVcs1qBpplajfALwxICjqPOAbVKKTNS3xy9K - kzn+O6UgN1f7CBgNIEzAL4Kqtt/cAJ1+EKisrGz0mTNNP7RcOCv2i2NkpOtRGeuRKuM80mEEMxN4ZWny - prKxnQPlyiSvPJnknSeTIQusBOasLJe56wBuE9bD2Jk8oBOIaKcBlmWh/sMAS7AC8EVatgVcO6RVO0SX - rS4DuDV2OKUinWmdYpQjrVuqCNc0e22ZzFpTqjRjFQyI+3jyHLsj59D0nZb5MY1a2t+lw4fR5iLTEL6R - 8jXwgE7wMO4slJKZeBwLPNfM9QAO8JabMG8sAXRoQzFga9BnrjNE8NBqwF9N8Gia0d1PDjwqExcegQF0 - cXsh4AckmzTG77DMC9ou5SXFUliE6M/Ll6qq6j9/++23zxV1fdAE5eXlYTq6zhnHjjV484eS+BNnk92j - ZLR7uoxdkKpMoBkhQ2m8J42QpckTBvCAATzbNMkbjSFWAjOXY2ehEbRaj2YQkcU0r7r99FbUfqz99QzA - em8NuCrKAZzS6jigG8CNKEdEs5mbs7ZUabYuQp+pVCIWK9B4YannBWMRvvtBdPxo+hzRA9hFGDUf9Z7P - i0ygpXwNPsHPQuM4k+DxGIx6i3WlMn1ticzayIjXwM8m+HVY8gL+zLWFAF6gaTXMT63CPlgJ8NC0YGRM - RP14/xSZ0EHj/ZBl/ds0wjNB/NfsVqeBMf3n5OTJqVOnVQNoPrgE7PSDQMePN0bzF7Oycotl5LxoGCBV - xrgjCyjRDG0atyBTxrlnKY2nPHRhe6J3jkxdVCQzggFpNcAhHbth3e9/+JwywGIYYAnX//lX1TlxjGRr - 7GwrXXORbufCNHMBm7cRuBHpBvDZBALYTPMzV5dgx2uavpydd5V4JTaLz+Gz4oEM4KKaPsLnel6Db43Z - Bt3/XES+Svl61BvwZ2zSot4CzzUNz0MDzIYBNPDFiHIYfI0OfnUBoFNYDUHTAJ+ajsifsgT7yv+IjPOD - OAPyOEDXdFjG+iXJWN8ktc3rhrnFytqwKPVNYBogEyuAy1euvGQAnhja6QeB6usbj/NXsiLjUmWw3X4Z - 5XZERrulQEdljBvNQMEAbhlQJkxhrixcly1jXWECZIHJAVgOLgOgFfzIs0Y84prEH3WYa31lACz/GP2M - ekJWsI0Ih2EsEXWW2PlGlBupXUFX4AEcad6QxcpiRBqWWwDokdCEhq9ZzW2pX4ePtbsN4SPyFXyUAMKf - hXTfBr5cpq+DUFKm4TmnriqWGYA+awOeF/OMtTA3ZAEDTAd4Q9NWET4aYhoAkT8pMA1wCR+wfZOx3aYx - PtRhKKlNvodluMse2R0Vr1YANEBGZtZzYwVgPj766KMvlyxZ8lMd3V8/7O3t/9/6+pPv8OfRlm2Ol0H2 - CTLKNQU6Ah3VBCOMdk2F0mWMa4ZpVnLJVBoNjWMp4GoAjeBsNII8rOp5sBkGuCABR1kCWmQpVgE8YWIW - IbeLcAg73Rw6o1yBVtABACJwpvrp0LTlRTJlWSE68yqs8c+IZ2KTLMDsjuaP0e+4V2v6rLfVaJFvBn+2 - gl+lgUetNwc/Dc9H+FNXE7omizUAv5oC/FWErmkqtZIzDLA8G2t5BI1Xiozxhnwowj4so72TXtIoLyoR - 28kycv42SUhKVqeAFcAA2dn5PAtIO/fLbNzDALb/oNHrhJGXV9a/oeHkn843n0ETslcGz4MbnVNkhPMR - GalrlHOqJhdD6VCGJmdsO6fJqPlpygAT/LAj0AjyTBnn6EbxUgY4JwEoAWz8FsII/HCGBpjF5k1JB44I - 12Ab0a1FuMXKIgAvUsCpqVRwoUxZmo+lWZW4AfgCpPwFqPnc1lL/Cb3us9lDzeenfTr8WYCvop7gzaJ+ - Kgw3Bc87Bc85ic8HA1hQq/D8uqatLNSAQ1N00QSTlyITAvhor+SXNMrrsIzy1GBrQpCh5hsagdsmuodL - dmaG6RyAwsKib40VgPk4f/58nY6uc0ZFRY3dyVNnpKG+TqYu2CtD5qXI8PlUsj4flRFObRo5PxVKw3Zq - e+H6sZ65Mh4rgRlM/1haucScFK9DzeKHhowGCIIB7HfWo56i0TKi2yTuaMLWoltTG3gCV9AR8dTkJYCP - 5s01/qRq9ihuE77R9TP1M/IJfy4aP9b8Waj3MwC/Y9Qb8Cfj+Sbh+WiA6Xg905Tw/DChoSkwgSYaIQ9L - OQSBJ0B7QJw9deAebRq5wJgTdSXISA/qkAx1S5BZHpukpLBART8/Aq6orHppBcBRW1vbuQeBKitrQvh7 - uPmFJTLCPkqG0gBOh2UYMsEwJ25DvG7eEegolKrNjoaOyDAH3AYDjMbKYDwygCU/BMLa3xUdODtyPzSB - gaj77nFnUEuR8rHzZ6jINoAboJnWkXpR001ahh2+lNGuaRLAU4RP2ITOqDfgOwO+1vgh9QO+FZd9KAFz - 0AC2g98RPLLNJDw34U/E804BaMJnKeA2NXkFobfNU5bnos4jKBYAuMdhwISMbQA3YI9wR5RTarvt8nB9 - HjQ/XlyCtqrzALn+z87Ok8bGU9+At7bw1wcPBhUUFCzR0XXOqKqqKzjb3Cz7DqXLAKsYGeKYLEMdD0Oc - U9Q8TClFgR7mwFnTUHvcBxpih7LBzICGcMoSpH8srRx5SHf/aZUBfNED+ECzubyCAWYRgKrhuoIJHQJs - cxE4I52aFFQoE4PyZeLifJmLFD4/5gSAN5rAM9uo07eR+u0j61XaV1HPZg9mMcHH0lKle8CfAvgEP3mF - Bp/gJyC7UFNgSIoZoU0wIGdE/8Sl2YhylEo3wsYyzv0wlAQZkDUR8nC3Q+3lerDd5f4O0RK4epv64Wga - ICMz+8Wly5dpgHaDXwXr7INA/6G2tuHWueYmWRN+UPrO3S9DHJKgwxDAwgimbfsUiLAhW1wHDbZN0mST - BAOkyRj0ADPWlKtj5g40wD7UZvQAhG+1tVY1VxbY+TQBwU9ZaoBu02RqCXY0gGvSoE+AOPOz+XnRDTI/ - mgbQDuuy15gP8E6IfKZ+rdmrAfxqHT6aPSwRCX8qnnsK4E9eVQqY0PISgC8B9GKZgOcevwTpH69pMsuA - XgrMRROMC8gEOC7dNPDDYYLhbtgHJuC6XHX4rjp0Mw1zjZehmIfSAHa7Zcv2GLUCoAHSMtQK4KUl4Kef - ftq5B4ESExPfrKqu+23zGezIJXthgAMy2B5A2wmgAX2wAg4B9iBD1oky0ErbHu6cIRN4MGhDlcoADjzb - BgbwQAawx/ZU7PDpawB+dZmap2LHEzSBTyJwHboR5RMDAV3X+EUQ5jno2h3Q2RM0DcB0z9lpb4OSCb55 - 5LPTR+ZhszcV5pvMqFfwAR6vYQLgjwf88Xgd4/D84/k6VCnoIBoguEBGeafKUJckAESJpABeyTVRVwJ0 - CCJkAObsghka4hKvNNQlTt/GjPsOtA2TmNh4dRZQHgyQlZn9/bNnz15aAbz99tudexCooqJi6vFjDdJw - HNHptkv6EaZtotJAW9QmtU3AuEzYhqwSlAbMTZQBlriPDeteNmoiOnkYYC5LwF4tQp2Qmqdhh09FtE1d - 2aYpSPkTCRw73IhwBVvXOECnxgbkIeLyZRYg2kceb2cAzvNweR7A8/Au074V6r0l6v1srA5mAr4FlnnT - N5rBx3Mz8icGlyLqGfklMg5la2xQkYxZjAwAI0zkawN0QywTE4JyEc3IgvNRHl2oJLM5oZ2GuBwCWABH - lBvQ24sGQLbFPBj3HW6/WY4cOaqfA1DIL4J8+7vf/U47+9NsXLlypXMPAsEAS/hPDoqKimSYzS7pj0ge - YAO40ABrCoCtKMKmDkp/S+qANs85KP1mH0CJOCrjA5DOsfa3WIcMsK1OffzqhAidvrYSKRXRzog30yRE - nYJswAZkA7ihMQtzoTz1mbztrjplAEfAnofHphwBnXIwPukjfBX5VSryLfTIn6Lgl8kkwJ8IkzLqCX78 - UnP4hUrKFLwdmsgSgV5ljG+mDEFjPBjwhzgbQql0TjQToLcTDOAcL4OdAfmV2q80EPeb6LxR8nOyTR8B - V1RU/hnjpRXA6dOns3R0nTNKS6uSGk80ysGkVOk7OxIGSJT+1qhJSgnSH9D7G9DnAPqceOlHAXrfWVS8 - mke656Ap4vq5TCzW0wAoAajJMzdXI8KRPrEzJyGq1IwdPJFaih1vwAbksTpsQ6P9c2W0Xy4MhZ4CcE0G - MINO8ZQuFfkAbxzNY803hz8J8CcC/gTCX1aqgaeC8BoQ9WMCAR/laywuG/An4b1MRC8w3P2oDHJIVJ+P - DFYmQFlUwnXzE8x0CDrYJifAnw/Q8wGaAvRBBK+2tcvMAP0do8TSY52UFhdp6T8rRxpONL60AtAPAnXu - v4SB086eamyUzTsPSc8Z0dLfCpDRB/S3QmQDfD+A7wfwfZUAe3YcROjx0gfqbQEH2yQDHlIlgE5egQYP - JYDr7tmhNaqhmoDrlWAEmoSzpiIFfgxBd9AovxwZ5ZujlmnqqN32OhjguFra2UMKPA2hH90zztVTkc+G - D/Cnseaj4dPglyn44wB/LF7D2CUlMgawmfLHBBbJKMCnePuE5eUyaVUZjJmjoA9EHzTIEWVuHmYlbDsZ - Qpl0OmSm+PYC7I4abGSF+dEw1m7pNWeTuAeul8oy1P+8QsnIyHpx8WLLSysAHgRKSUlx1tH99SM0NPS/ - ogQ8O3WiXrxWREkPi1gAj4MQ4UjxCrgSocdJH2qWrplx0nvGfmWA4Vj6jV+MJgqajJ03c1MNai/gI62O - Y03F3Cbcz+zyaH+AJmwduJK3pmlYm7OOs55rJ2zwPL1asTMTP+IleO2gTpXM3qJ9pk/4bZFfJuPN4Gvg - i2U0wUMjF2kazehfUa6MMsIzQwag/xlgj34Hq6KByAADHVAaaQRHQJ9nroNmAvR5iHRDTvs0zYeMtO8U - jf5qJ8prOMptuPSasUaC129VKwAaIDUt8/lbb7310mlgX3zxBX8ObrSO768fGRkZw8vLK7+rrwOwBbuk - B4D2tYR04Ar6rP2AvU+p94xYTTBKr+nQ1BhVIkb7I3UGIHoC2SyhB1hfrbrpMaznSK3mGoN6r2Z1W74C - PtI7W2mEF+QJoZmcjMaLIGeFVKrTsqy2IqvwYA6AG+IxfUKfE1opcwB+1uYKpH2sMrjMI3g0nhNQw8eh - 2WsDD9Aq4gEdr7lNMCTMOw49wKB5ydKPPZAdDGBnNtujWzfkcMBM8VCcmgc5IsrNNQ9yAniawHEvgG/H - PgtDhg2DAbbCZNukz4yVsn3nXvVbgGwAMzKyv//gww9fOg3sgw8+6NyDQHmFhe5V1bVSXFwsw622womA - PYuwNei9Z+jQCdwiBtCjpdc0aGqU9JwCTY2WIW6ZMABA+qGBW4zmbmUlwGIH+6OGs46jvqu5o/TbRxL6 - giyl4Quwtoa4KpjKw7DrStWpWDwlyxKQ5/IETF28rJ2mBZNsLkPWwdJyPVYXan3P5k2r46zzJvBM84S9 - UBeMOwIaGVAso5ARhntmqb6nH8rfAPRCbIb726AXggZQtvFtsgN0k1AGKXuaYJ+SBh/gHWNxWyQecxtK - apgS4fe3Ctdks036zwySgwcS1PcAcnLz+UWQbxHtL50Gdvv27c49CFSYXxxRW1MnSSkZ0md6uA4cgBVs - aJqmngZwqMfkvdAe6T4pAm8mAVGbJyN8ULN9YICgUhmDHTwC6Xukb64m3qbPJnlrGoXtER5ZWEOna3JN - QxbJ0z5xW1mE1UMxun/tZIzZADwHoOeElMksbM8AbJ6lMxMmMU7a4Me57NgnoNnkup7dfXvw+YAO+eE1 - ++bLcF9ct6hYRsC8Ax1SkPEOaH0PeiCKfVB/q/g2WaNhs9kPafMA2zhd+zTRBA6MfJjAPgr334lsulX6 - zAlDZgV8y3BlAM0EmgH6QiOslkhmerpaAfAj4NKy8m+++uqr5wRv/kWQTj8IVFBUVn2srk7Cdx2QrhOR - ASwAf3oUoO9V6jkVmqxDn7RHekyEJkVK94kRuH4P1sMZMhzpmhqNnUkTDGckI5JGQJw14T4UYL8k90wZ - 6pyKx0qVMX7ZaBbz0BzmypQVPM5eJDPWwAQ0gumYfIlY4DpqOsSjdZRxAGcCunY2nmO5pEOpGY2lZRv0 - PBnuowuvd4R/MTJYlvSzPoz+xmh0IfRBmtD/zN0PYBR6I6t9gNpBNhr8gZRdDNJ6JIyEtD4rHI8ZBviA - THUwgKHelqEyxSFIivMLVP3PzMyR48frvwF08G9vgE79JhD//WlRUfEjfgDkvyJC3hy/Q3pMA+CpkW2a - EgH4ESralQC++4Rd0m3cDrwpfoSZBWUCdg6UJ0NdMxHJSOOAamiYe0Y7qetwHyVcHuqSiohJkZFousYu - ykYvARMszpHJy3Jl6oo8mU4jrCwQi1U8Bo/SsMJMywtlcnAhlpUFWF3ko6lEX7E4X/UXLD2jWGKwjGSG - Go6MM4zyxDbgD/fOlwEORwAoETqo9TpGg8syOBu9EGW5z6R+c9Ek6zLBt0EfZLUHy+IdqOXIohaAilkZ - YBYifzbgQ/2QBfrRBAp8qD6HSc+Zm8Tea7WUlRRLLgyQnp754vz5C18TuPE7ADQCVwCdehAoPT29V2FR - yT/zP1daLtgqbwJsj6kAPmW3dJ9M7QR0aOIOQN8u3WGQ7uO3S9cx25AJIrE8QtQ6AyhMMNw9G9tpiOQ0 - GcbZRdMwFwLWL6vbU7VoN9PgeSlI/Uex3s9EBsnEkjBTxi/KkklBaASX5MiUpdAyKlcm4fIkZIeJhoI0 - TVici9KRC/DaEnIkVhQjKJ8cGe6VA+jZMhRZapgX4PsUymAYta8lwM8E+NkJ0hs9T28Ls55npqY+s6DZ - MVAsDB8NxWjwrdj87sVSeKf0nr5Vek4LVeo1nfAR9TMBfyZmkwE4AzhNQCkDaCboMW2t+C3ZgCWg1gCm - pmY8R61XS0Djq+A0AH8RvFMPAmVl5c0t4W/QF6NhmxsiXWGA7pMAmcAV9B3SDeC7jd8mXcdBY7cCfrh0 - GYM3gzQ52ElL28NcMwDxiAI52Amz01F9NpNxG+cOGuZyFNGfiiYwFQ1huozx4Xl06TIhIEMmLuLZtDAD - ND6AyjabqRylsQuzYRwuIdFQ+qD8eMOUKD3DUGKGwpxDUZYY+VR/22TAjQeoAwB0ANtxgKf3O2xyUQZ7 - z4hR6jMzWqnvbMKPAvC90scC6/apgD4J8CZvQV+EKCZ8qDcM0KedAUJVGdAMEKqkZQJsW27RDDB1uWwI - 3SllpWWqAUzPyPr+3Xfff+m3AJ49e9a5B4FycvLW8Tdoj6ZmSu9JGwAaUT5hG+atCnq3cZgJfWw4wIdp - 8EduUSVhoH0y0rYGd6C99kHJQIfDMsgB1ytx+0fED1V4f7sk/D2Pph2FCVKQSY7IyAXIBF5HZaxPqozz - TZXxfmgK/TRTjPHJaJMvhWyBrMF5NKCP9GYpYk+CUrMAmQflhSsUDX4O1uFpCngvC35+oQvwe02LVc1t - L/Q7vaZhRg/U2yIKIHVZ7JHe03YAeDgyYBiEfTAB4Cch6icDPAzQeyrgT8NMA6AE0AR9KZhASWUCzQBK - c2iAEPQXYXjeINkbFaNOA8vJyWcT+OfPP/+83Y9BcTx69OjDTj0IlJuXl1VVWSW79hySN0et14CPCwf0 - MF2hgA+NgUZvkS6jkCWwzQ+GNOjJapmkjhuoA0c/IiyntJnHF7SZxxgGYW09dD4zQzJmnoKWLCNck2WU - e4qM9kiRMZ5HZDQ0CqagRnuktgkZYzSyxWhPnoWTLiMBfcQCfSUBDXVFdsKKYqh7ljJBfzR5vabvB3xd - 0/eZ1BMNLhvanlP2qMa3NxtglMJekxAQ47gftkAh2N4C+KEofwBPdTQAZRgA6jsD+0rJMMEWwKdwndIW - ZIdQGTh9kSQfTtZXALlcCn7zhz/84Tkj39wAra2tF3R0nTL+Hg3HVf4z4iWrI+TnwzZq0BHpCvyYLZpG - hyjwXUZuljdHbMJOilTwuEZWHxejS1bHCaywVlbi0kmbB2AewJn36yBeP9ghEZkgEXOSDHGEGeYlyvD5 - PKScBCMkyUhXmIKZgcbAPMIVjSLlRiFbIHOMdEPpwDwcPQRLyVDno+grKBogEyY9gkiPx2omFnABHNHO - D6+UjM8zJkdC6H0mot9BxusGs3cdtVkT3j8N0H1cqFIPRH/PCW0G6D0Z8Kfo8FUGQMrXDaCZAMANI8zE - Nk1gpt64fbTlIsnNzpK8fKwAsnKkru7Y1/wqOMEbvwjKbHD8+PHOOwi0devWn+XkFv66urJCbD1C5OdD - N7XB1oFr2qTAvzkcBkEJYFdM4NrHw1gaYanU/1+qOVhG4W+4PdD2ADKBoUMyCJcH2x+SIQ4JMszxkAyb - l6AMMdQxCdsUT02DIQzp5yoOc4awzUzC09gGO/FQLRvLVLy+BAA2gAP2FF3cVsLyFo1t11Gh0mUEDD6c - 73WjdKUM+GMQ+Sr6AR8ZwAR/4hZkCEQ/MoDJAFAf9AF9YIK+yAR9OVsANKVMgHkm0j5FA2DuMXWTzJi3 - RErQh7EBTMMKoKmp+WtGP38J3DAAVVJS0nkHgZKTkyfk5hU8Ly0ulLFzViMDbFKwu+DNcye8OWJDm4av - V2bohRSpPhpGp9wHHXJfdMh9sVzqR83WZzPxNnUf3pdCd00NwJq6P2WpmWEAsshAqzgZZB0ng23iZYht - vAymISi7Q0pDKPsEZZAhyBxDIXXWEgzCM5YGo7cYjN5jMPqSATZJiETU9cmo5/zwirMSUv0kpHosZXuM - 3wm4WPkMxfuDugzfoIGH2bvivdIA3WGA7soAqPmArwyAEkAT9JpkGABRPAUyN4CuvtR0gDaXBeBbbNY0 - A489aa04e6+Q8rJSdRLo0dS05zdu3OBnAKafg2cm4P8GPnToUOcdBEpLyw7giQf8FmqfccvlDUS4OXCl - YdDQtTDFJkTANuxUdMdIm73RKFF90CwpsWHCbS/JuJ+aUVsRcf2UadrEy/1hngFzYmWgZawMmrsP2i8D - Ic6DaAyreE3WmgYjayjZwhzoJ9QJK3ZoLm0Pw2ho6nTwJuhYshJ497FY0QB6t9HoczB3HY5MNxTmBnzD - AN3wXrvBAN10A/RAGdTgh0hPZQCAN6JflQDA103Qx1zKDJinhZhkmKDP9M3YZ5uUAbqOWyZLVmzCCqBc - NYDIAN+j2fvz999/p34D0DCA/j+BOvMgUE48u86oWDSAQ4M12MPWaQJ0pcFrsGPQHKIm9sCSsNcUNEeo - l1Rv9AImTe1wmbcb90Ft7TUlQs19YIK+yiwUtjEr4br+M/dK/1mYZ0XDEFhjz4qRAZhpDGUOZZB9yhhK - LCOWB2ASlBCeszAbSzqaE8B7TyJ0RPk4LGUJHCm+68hQNZuryzCAhwG6Yu7KEocS0A1ZsDvg90AZ7IHo - 74H031OH34saHyK9sQLojTLQG1mA8PsYM2VugKmYzQzQXjDBdJaWxRK2bZdaAWTDAFlZOX/mF0GY8o3/ - CcRy8Pbbb/+2U38OLjMz91R5WZms3hgpP+0HAxD4EGqNpsGrlRm6Yod0w87oOWEndupOuF7XZKyFqUlm - sxJu4/3aaQd20G7sEM0QNEcfmMMkXN93mqZ+0/dowtKrn8Vek/pjOdYf6/H+M2EOlJP+KC8D0FNQ/Syw - Zkdq78WPp8ehc0ev0o3AR6KGGxphtq0uo78ZgvcH43dD9HdT0b9RuuP99hgFjYYJxqDpHYvSBwOYRAMg - C9AEfSYCpCGYoM9kzJQpE3AboKmpL0uVjXG+EhcXr/0SCFYAhYVF33zxxRfqv4Ib/xOQBrhy5cpdYOuc - g0DBwen/mJmZ95R1x9l3i/ykLwwA4G8MXgWtlDcGrVSGYEpkauyOpV8P7Fiq5wRovDb3QlZQ2+bifUza - pgnXv9oYOwFO1xQYZPJO7CzMuvpiKaYEk/TFGr0fMkg/ZIz+AN5/JvoMlpmJu9Vz9ECkd0dUdx+JJZsO - WKVzRrW5WM5wG8F3xXvsphugO+Gj/HUfCY3aCANoJug5BhprGAHQYILe4zGP3yR9JgAkpQyA2TCAmfpO - RqqfjNsMI0zB3ynh8XD7kCn+knb0qDoLiMcAqqpqvua/hDPgUywBp0+frtXx/fVj//7EwZlZeX9m5zl5 - 7gr5KQzwxqAVEHqBgcuRAVar1E8TaAYI04RlYo92CteEiOuB218WjINZmWCsbgaTtmoaz23NPL0noM+g - JmLb0KQd2LkwxCSUEGSOfjBCX6zZe+FveozG449CeQLw7hShK8hM5xQi2yQAphRoNHvIdt2GroMB1kl3 - Cu+3+4j10gMm6Dlyo/SECXqOhsZAYzdKL5iABug1bhPgb2xvAKj3RFwP9ZmIyzTDJMMUGyFcb1Lb5R4T - NsqEOb5SmJ8nWJFJWlrmi5MnT331DdI+fwDKELNBUVFR5x0EOpKW5sSjTlmZmTJgbKD8jAYYoImZoIsq - BygB2GZNZAlQHTF6ge5oiijVHLE3oHh7O6GBQiPFbc0EEGFRxmXdHJp5YATMvXBZCabqBXP0glF60xhY - qvVGCerDrIHrCLwHYBvqDugKLKGjnquoRm1X4jbUnVKQYWiWNry/bkPXYHutpuHr8FgwwMj1MAA0ChoN - M0C9YILeFIzQe9wGiAbQTGASYBomaC9cPwl/M8mYDeG1jl4j1s5L1EEgNoBHj6Y9v3TpEj8DUF0/RQPw - GEBaWlpnHgTK3MZfn94flyhvDvSTn/dfCvjLpAvSfxeUgTcxv4mM0AW9gDKA6oyxkwnVEHe8LpVu26VZ - Rp/Z/c3u2/YYMJIhpO4eSjQUMgbMYEgzBWcYhX8PwCqSDfEy4SrgiGjU9W6Mbr52CpAVaJjagN2N8Glu - /fbuw6Dha/H4ayDMI9dpJtDVC2boNXo9TKBrLADSDCZD6FKmMBNNoYyB2ybg7yboMy/DGF1GLBMv/5Xq - 52BpAKzIvrt//z4SwNcmA7AE/OY3v5F9+/bN1PH99SM9M6uM/4N+UygawF6+Cv6bg1doAvg3UQqotgaJ - AlRzMdr01KpmFXlmUtf/iIbRMJq6D0e9Hg4TjAB8Hmeg0LAxynvCKD2ZRWgmgh2MVD0EsE0yAz6YAlCC - hbrCyF31bQVcGULb7or32A0m74b7dBuyCuZYrdQDRugxXDfBCGSEkWvxGjT1GrVOE4xgSDNDB5kbwmQM - CrdNWIcZUmZAGRq+SNZuDFf/Eo4rgIzM7D+///773xI6o57i9jvvvPP15s2be+v4/rrBn4LNyMi6V1pS - It4BIfKTngGAjdQ/EKIRoDeQEbpgJ3VlqlTiUqktnZrEiIO6sps2l7qet79C/Mh5GLKEEiMaRsC2SuO4 - TYvoDQCBRoxGGgRwgwBqEOBxm5DVtiHeZq6VAAy4hKxAG7BXSnc169frJuB13WGCHjCGZgJdw1dLT5ih - J7JCz5FrpBdNoAQTUMoM0JhX6yVjKHPg+nFrNcEU3Yf7SETkXvVVcK4A8vMLvv7sV7/8gZFvGIDZ4Pbt - 2513ECgqKqp7enrWH4qLCmWWw2pkgCAFvKO6qCjCSgDRpckAjG1er6vLIGoNdvoaNatt3mbMSoxSmGgI - 1ttKMAJmXqfE23UZ0U24XQcgCw0AqAEAN1CXOWzjuoG4D9QVDWxHdTOkQ+8Ko6vr9cvdYQjNBLqGroQB - YAhdPXUjKEPQDJDJDKOwPQrz6A4aY4hmMGYzjUVWgSH6jvGUpKQk9VVwLMulrLziKywBXxA8/xUcRQM0 - NTV13kGglJS0mUw3OdnZMnzSYvmZMsASTf2gvkHIAsEAiWYQO1kzAmEagHm9uXCfgYbQQ7S7jffXDNB1 - kLloEE3dlBjVberaf7l0gQm79l8GAZghZQhz8bpXCX9nSAFfBhNoc9cBeFyoG69D5us+mFoO+BTMAPWg - CXT1pAkMQ8AESiOgkTCEEg3RJl7uCWP0RINHc2jbujHM1B1ZZMRkT8nJylRnAXEFUN9w4ivC//3vf28S - m8CKiorOOwiUnp6+kp85JyYmI+35ys/7LAZ4Q4Fq7oJo6oI0qjWFunhZibdBvI8hwOiCSNVMAPBmIuQu - AwFVCZfbCVGsopvRjMv98Rh9l2iCGbv0A6y+upQhoH6ASNEcpm2z22Hkl6RD53YX4/JAzQTdB1EwgTID - TKCkGUHTK8wwHJeVsD3CTDQEzKGMMcpsVjIzB9QFjzfV0kf9IjgbwCNYAZw7d+FPTP9ffvmlgm9kgeLi - 4s77OTg4LbUwv0i274iRn/fyQsQDet9FJr2JndgGV4feDrYhRimFtAqICv4AQB+gzwBqMgGu04T6bMz8 - O/y9ae6L/qNPoFKXPkFtRuggZQaYoyu3OSsF6Vpsth0k3SgAN6SuM12GAZgJkCVUNlAZwTADTfByZtC0 - HGZgltDUcxiNATNQhjFGUK82B2fqjYFLxNE1UMpKS1UDmH40/bubt259zQxAAxgm+Pzzz7kC6LyDQKlp - mS3FRcUSuCxMftLNW97ADn+jD+ArAQBSrQJrDtrYVsDbwHchSCPqFXhNhKzm/jrofgDcj6BxWW2bCeC7 - 9AFcZKI3ey/CTNEEhpCRqL7/Mr3KCB1lbop2RjDMYJ4VVGbQzaAMgW0l3RzKCO1N0WMYjAK1ZYoOghF+ - 0c9XApesVUtAZYCMrG8eP378LSP+t7/9rTIAt58+ffp8586dnXMQKDBww3/PyMj8ZUlxodg5r5X//w0f - +RlWAT+HOP8CkfcGgLzRF8tAwCFozpp0Y6iINyJahw2wlGkbsLvw7/k3fVF7FWgK23h8Q4z0N3troFX0 - wwCG2pvgXyAaQN/uSiN0kGGOLq80AwxgSJlhqXQ3ywxamTBkGELXS2ZoLxqho9hHvDHAQ7aEbtMOAmEF - kJOT96ePPvroe4KnAShmg7t373be/wSKi0sYk5ae+UN+QZ54+G+VfiMXSf+RAdJn6ELpNThAeg1bhr4A - bwhvlPXyTTSEb/ReLD/vHSS/6L0MBlkuv+gVjNKxDIaBeiyTn1LdtZmXf9ZjiUk/N9QTzSWbTehNJfQb - vZBxegUomYN/lbqYb6sMoV9+KVu0V1eUtzZ1MEUHI3Tt/+NmUFI9A4zRzgy62pnBzBAdRUNA3fi5wyAX - pnYpLCyRzKxcGuGrzz777AXBYyWgRAPwv7cAXeccBEpJSfXmKUdUdjbmzAw5mpoqKUdS5XBKmiSnZEpC - UpocOJgiMfsOS+TeBNkZmSTbdx+WbbuPyJbth2Xd5ngJXhMrgcujxW9ptHgvjhbPRbHi6hMpdq7bZLZD - qFhYh8iUOSEycVaITJixSUZPXitDxq6QgaOCpe+wpTDbYuk5cDGiLFC69YUBevnLGz385OfdfOVnXXV1 - 8ZWfvkn5aHrDuAzxti5+uB/UjfJX+nl3f/lFj4Xyi54LTeZ6ozcNZphMN4e5IV5phA5lYoCZdCOYDGFu - isFt6mYyg7kptG1+FjFgpJuk6geBuAKoran7Z3P4FEvAsWPHOu+bQEePpsUYBqD44UN2jko/6mwUnpPG - ExOLS0r41ST1c6XV1dVSW1Mj/PZQQ0O9nGw8IadOnZTmpjNy7myTnL9wVlounpPWlgtKLS0XMVMtSi0Q - ///wmTPNcqLxjByrPynVtY1SWd0gJWXH8JzVkppWKgnJhRJ3MF+i9+dKZFSmbN2VKptCk2XFugMStHy/ - +AfFik9glLj5Rsg89x1iPW+rzILRplpulkmzNsr46etk1KRVMnTcchhtmfSD0foMWQKzBQESjNaP2YLG - 0AyijALRND/rvtBkop8Zl3Hbz3g/mOgXyFa/gIGoN2CiN9ivwDxvwjBcVRgyrTb0PsIkGsLMFG9iBTN6 - sqs6CMTTwI4cyXje1NT8FdM/P/Y1xMt5eXmdcxCInwCmpaUfT8/IRsORzW+fthMPRdIQygx5NEOxFCA9 - FRWVwhDlMESlVFRWS2VVrVTXHJO6uno5fuwETHFSGk+ckpOnmhTkpuZz0nz2IqC3yIXzrXKx5ZK0tl6W - S5euCv8TyeWr1+Qqde2aXIP4zyluXL8hN25ouqmE66CbN7GtxMvXlK5fv4q/uyxXLl/CY7Yqw128eFHO - nj0LYzbBZKfkeH2jVNU0YP18DK+9VrLzKiQ1vVQSUwrlQEK+xMbnyp6YbNkekSqbw5NlzcZDsmx1PLJa - nPgv3S9eAdHi4h0hdm47xNIxTGbYbpFpVltkiiUy2syNMnrKWhk6cbUMGrtS+o9eIX1HrpA+I7AiIODB - NAEMMQClDpmEJnlD1y8olNX/DqNZ2vljBVCiloBYmn939erVP5kbgBngV7/6lSQnJ3fOQSB+AlhcXPa0 - orwa9aYcO6ZMiopLpbCI/5WqRMHmzMs8OYHgi4rL1P1KSivRrVYJ/5YGqKquk5raY1Jb16BMUI8d3gAT - NDY2wQjNcvrMOWlqghGaCaZFztIMF1v/smAY6tx5ZA3o/Dlut12mqfhYZ8/xcS8qo509d17f5nzeNJ89 - SyOeU/NZmFLNyETafBYz1Ww2Q81NeM3QmVMw80k5dbIR5qbJG6ShHu/1+HGYvxb7oQr7pVIK8sskJ69U - snJKJD2rSJJScpHFsiRqf5rsjkqVHZFHkMmOyOZth2X1pgOydM1+WRiMkhkYKdGxidjfRcoA6Mu+uX// - /p9ZArjso2gANIWyZ8+ezvkm0MaNG4fn5Rb8urqqGqCQwpubVWpuaWlFJF1GZDKyEGGMwJs35c6dO/w9 - Wv5venn48JE8fPRIHj16LI8eP5HHup48eUeevPMu9J42P3lXHuM63ufhI+qxPHgI3X8kb0H33rovd++9 - Jbfv3JPbt+7KjZt38Hy3oJty7fpNuXrlBrLEdWlFtmDWaGm5DGNcMhnE3ADNzeeRbSjNbGdgujNnzsKA - FIx4skkaT57Bez2jsgIN2nDiJGBqcz0yV31Do8oWNHGdUoMydS2ymzJ4LWZkO2a8apieX6OvhjgrVdVo - UpmxSpsrMattqlKVUf7vn8pKqLzMJAYZvwWUjYybnZ33p3ffffd7Rr5hAJqBRwY3bNjQad8E+vvNm7cO - wZoyOMA/4Jq7+wLx8vQWHx9fWei/UBYHLpZlS5fJyhUrZe3adbJx4yYJ3RIq27dvl4iICImOiub30iQx - MVH9klVWZhbrk5SWlqo3zOhobGwEBPQGiMrW1lZlqNu3b5uM9AgmevLkieDNcn2rHP7pp5/yhEf5FPrl - Lz/T9Nln8tlnv0IK/Fx+9flv1MzLv/zkM9z/l/Ls40/l2bOP5cOPnsmHHz6T99//UN5776ky4ePH78Cw - j+Wttx7iee/Lnbv35OZtzWjXrtFg15S5LsJYzCrMHjSRZh7NNCeUQTRjKBNANAEzXxUyIEshs2EZMkFJ - KYRswDJZXMz/8VOGLIrMWsB/+FyiSin2veSi2cvLK0J51U7/JnyWW/Zi6Lv++MknHz8neKZ9iga4dOlS - 5/9PIGP8wz/8w5y5c23yraysnlla2vzOco7Vn+bMsnpuZWkjcy2tBZehuTJntiHLHxfuN9fSSqytbCBb - sbWxEzs7B7G3dxBHR0eZN2++uLi4ipvbAvHw8ILpfMQfplu0KFCCgpZI8LJgWblylaxfv142bdosoaFh - MN4OidgdKVEw3v59+3lKNOphiqRi1ZKVlS35aFhLYD5mtDrVoLI5PYU0fhZ9R4vqN9hTYB0NM7yFTPRQ - ZbB33nkHBnwPpnkKA32kjPTs2TOYkfoIhvpQ6elT6qkS789sx7/n49xDFrsLY92+dQf9Co11XT1fK/qd - 88xOKEFo6lRP0sjso8yEzIKsojIJsoYyEBptvI8XeP3/bA6fYj+AoOrcn4N71XjzzTf/afz48T8fM2ZM - n8mTZ4yaMWPOdEt9zJkzx9bS0trHxsZmlY2VTbiNlV0EZW1tu9/GxjbDzsau0s7W7pSdjf1ZW1vbc7ju - mq213SNbW/tn0Bc2NnZfQr+ztbH/E+Yf7O0dYQpddo7KJCbZarMtZwh/r7Y5G/dRf+fgKA5K82AuJyWn - ec4yf74LTOYmrjCZu7uHMponMpyXt6/4+i2UhQGLJDAwSJYsWSrLYLgVyHSrVq1R2W4Dsl1IyBYJCwuX - bdu2y65dEai9eyU6OgZr9f1yIP6AJCQksiGTo0dT0TRnSA6W0flolvmpKg+tlyPNVyMTGiumE+gbTp5A - RoQpm5AVm5ua5CxMcQ49x3n0IReRJVvQvF48j36lufl7o+n7TGW/z1QPUFJS0rn/E+j/0PhPNJWFhcVP - evTo8VPDXNOmTRsxe/bsKbNnW82muWbPnmsHU3hbWzusANwtdnbzdgNqBLTfxcUl3cnJuczZ2eWEi4vH - WWdnt3MuLgtQtjweurt7fujh4f25h4fPl15evr/z8vL7k7eP//f+CxfJwoWBEhCwWInb/tBCtQ1x/hGp - ++E+nA35+S8SPz/IPwAGMpPvQmQwyl/J29tPybhsyNeXWojHgPnwWAEBgch4i2Xx4iBkvaWydMkyGHG5 - BAevUEasqqp+wSzAPsAwAozWuf8T6N/B+E8w1D+ibP234cOH/3Ts2LG/gKn6IPsMR62cBM2CMSydXBbY - rFmzIS9i116Ukt2yddtORPZOCQ/fgfKyTTaHhKHUhKLP2aK0YcNmWb9uk6xdt1HWrN2gac0GWb1mvdKq - 1etk5aq1ALXOpJUr1yqtWLFGXV69Gvc1u33Vyvb3oZYvXw3gq5SWLVspS5eugJbDEMG4bqUkJR1+wRLF - g0Aff/wxyl+Uq/6+X49/7dgffcA6+XCqJB8+2k6HqSRzHZGkxBRJPJQsCQeT5dDBw3LoQJIchOLiEmT/ - /kMSGxsvMTFxStFR+2VvZKxE7o5GjxIlkZF7XwB+WkBA0L6gpctTAbVo6bIVdYB9BtvnAfYaovw+5vcB - /lPoC9z2++Dg1V9h+zvDPDQKDbF16w714RmbZTTsY/W383r8a8fWrRFD4vYf+p4gCfTVImxdAJ/QTjBE - QrIyhiaaBIJZaBiK5snKypL4+Pi/dLiW/9//H6ZPn/5ffX19f4Ke6g0HB7ferq5eQ72Cg8eh1EwPDg6e - 4+cXYO/js8gT20vR9G5ERvsv2p+/Hv/qwZ0XE33g07j9CfKSENmvUvxLSvxfKg46knKEn+QV60/7evwt - jb17Yi/tQ/p+WQde1r4f1/4fER8rMfEwDfAMUfuP+tO+Hn8rIyoqOjs2Ng41/N9I6Ani4g7RACgXCdP1 - p309/lZGRMSeTa8E18k6cuQItVt/2tfjb2Xs2BFh9ypgnamYmP1cvsnRo0cv6U/7evytjDVrQvpGRcV+ - /SpwnSUaID7+ED+i/joiIqLzfsLt9fjrB5Zb/xQdHfPJq8B1pvbti2MG4Jc8FutP/Xr8LQx05j+PiIj6 - PbKA/O9pn1J09P9avC/LAPqAcv2pX4+/hVFZWTetrq7uOQ9V19bWSU01j99XS3k5T3Apl5KSUuGXZIsK - i9XRRf6v/tzcPMnJzlX/siUzk2dLZfKnWxHh6QCcKikpRyU5+YgcPpwC6MmSlMgPjJLUkUpkgY9eLwf/ - hsaXX/4m9w9/4Pn1r9Dv+cWL3yp9+SX02y/kt7/9jdIXX/xafvMb6lfy+a8/k1/96pfy2Wc8b+Fj+fTT - Z/Lxx8/k2Ucfyocf8XDx+/IRZp6mlpyc/PX27ds751u8r8dfN9CYeZaXVn5fWVkj1VW1UltzTI7X1UtD - /Ql1wsfJxjNy5lSTNDfxlLDzcv78RWm52CqtrZfUsX2ezMJzFdXZUbfutJ1XwDOkHj2Sx48fyzvq5JZ3 - 1PkDl1pb2QP8cdu2bV31l/B6/B8c/+Hv/q7PP3hYefw3Gxv3IT5ei/cH+C/7YfGiFRIUuFJpyeJVsjRo - lSxbshpaI8FL18ryZWtlRfA6Wbl8g6xasUFWr9ooa1ZtlrVreHRwi2xYHyobN4TJpo3hErJ5q2wJ2SZh - W3ZIeNhO2Rq+S7Zti5Qd2/fIzh17VTl4XQL+98Z/4k6LjY39SWhoRLeIiJhBsXtixx7Yl24Ru/eQXfSe - eM+9e+OXxUQdDNmzJy4yYmdUwq4dUTm7dkZV7dwR2xQeHnF5a2jEW2Ghu94PC93xeWjIjm/DQncC1nZA - 2y6bN21TADduCAfQMIANlfVrt8ja1SGyFrBXr9wkq1dsUgagEVYEr4cx1snypeskeMlaZZZlQWtk6eLV - ykRBgdCilUJzUYsWBstKmCglJYVN4An9Pb0ePzZKSo4PL8grPn74cPq5lMNp19FMPTx4IOnD+LiEL/bF - HvxjTHTcn6Oj4l7ERsdLjK7YGO3z+/37tAM0B+O1o3WJh9CMqUO6POybJinJVIbSkZQ2pRjSb2tTmvo7 - JTwGHycp4agkUnjshINUihw6kIznpA7j+akkJR4M4kEkniPJs4QSExNX6W/z9fixce7cRTeeDXz71j3U - 1bfUyZs8iZNnHj+4/1Du4bobN26p8+v4PQOeS8dT0nNziyT1aKY6REsz8Hj8tq27JHQLo5wRvgXRHdKm - 9SGI/FCVunmf8LAdWtreutuk7duoSJXCIyNiJGrvPomB2fbvOygHDyTCCIdhihTV+R89ko7VQDp/x0eJ - qwOK364ifET/h53637z+vY6KioruFy60/PLmzbty5849dco4z+R97z1008+eqTOEjVOjeF4cz441vjJl - nC7FEzl5FvCjR0/QpN2VFpjl1KlmLPOOSWF+CUBlqWP8ETDJpk1hSO3rJChouQQGLJOgxTwfcA1MEwoT - 7UXUJimQOTn8uly2OrDDE0/T0ykC/8tC+n984MCBifpbfD3+0mhtbe3X3Hx5amvrFbtr1274o8Pe8PDh - w72PHz89+t5771U8ffr0LHQLeh/6zQcffPDVBx88fa6dtfuRfsauJuOU8HdhoCdP3oMp3oGpHiO73JeL - Fy9LBVYBSUlH1Klh69ZtlNWr18EUW3gmj1rL88sZ1dVV6itwZeoHm3NVRBtw0dj9M/Qplnh3EOVncF0e - gEcnJCSs5o83x8fHT37d+P0bjYiIiH+4f//+T2CCXrdv3x716NGjGW+//fb8R4/eDkLZCMNSbP+DB4+z - 799/dAz3a7l9+/5bt27dfXb16q3fXbly/Rt+kYTLwOTkVNm9ay/KwmZ1vh7PAdy2bcf3Bw4c/H1WVvYH - RUVF18rKyo4XFBQcTUtL2wG4QajntnFxcePwGnoEBQX9V7ycv9de1evxNzkQmf8Z5eWnTU1NvU6dOje8 - qem8RUPDyfm5uRWBcfsSQrZs2bpt9eq125YuXbll+fK1AZs3b7bet2/fSO1Hs9JfR/Dr8Xq8Hq/H6/F6 - vB6vx+vxerwer8fr8e9j/N3f/U/BhVqJcPQKNQAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAXXRJREFUeF7tvQd0 + HdeVpjs94b1+3TNvxklizhnMOYAZmQEAQZAACeaccybFHMGcQQAEGEAwAMxJjGKSqEiJoigrWZJtyVF2 + T7csW3G/7z9VdXFJyq97dcM9tptY61+nbt2LG+r/dzj77Kr6T//p8d/jI/D4CDw+Ao+PwOMj8PgIPD4C + j4/AX+IR+Jvp06f//Zo1h8tkZ2fXzc/Pb1dQcLDXwYNHhm/dujX6L/EHPf7O33IERo4c+d9WrFjxvcOH + D1c9duxYs4KCQ7GHDh3KKCw8NL2w4EhmYeGRfTw+f/DgoZcLDxx6/9ChI7/ev//A68uWLUt5fED/fI/A + 30Dof8/Kyiq7d+/eumxHguRDh4pGQ+CiI0eKdhw+XHyU8frhw0X3Dx8+8vGhQ4c/ZfyGfRbg8KEiexgF + BYX2wgsv2CeffGLnz5+/OmfOnIQ/38PwV/bNZK0Q+V1Z68GDxU2Lio7HHjt2IgNMO378ZObx48f3gvPH + jp1+iX0/Kio6+klR8dEv2Lajx47b0aPHrbj4GDjqwPPG8248UlTs4Z8RwN69+7++e/ful7///e9N+PnP + f24nT558etKkSS3+yg73v9/PUazNytpXtqjoVJ2LFy9Gnjp1LvnMmXOjzp17euHZs+d3nD59rhhcP3Pm + /P3Tp898fOrU6U/BN2fOnDUeO/AYnLKTJ07Z8ePCSRPxxyBeEPlHj4r8EgFIBEcdiq0YERw7WmzH2T5e + XGTHio4wHkEQRwyvEUJBQcFXP/rRj7763e9+Z//7f/9vC0a8zcx/vyP2F/BJHBBnrcTVKhDT9OzZyzEX + LlzNuHTp0rTLl69mXrx4Ze+VK1fOP/30lZcvXLj4o6efvvgJ4+eXLl22ixcv2YULwkXcrHDBzp0TztvZ + s+ccEAiQADwRnDqFEJwIwAnhlJ05fdrOnDppZ04et9PgzMljdvrYUUesSC46dMj27y+wfQUHLXdPoW3a + mW8bcgpt9c5Cm7c+32ZtPGy7C4qtyBcBeYAE8SVW//Wnn35q//iP/+gE8JOf/OTrXbt29fwLoOXf/hUz + MzP/ft++fWWffvpprPVq5DPPPJN88+bNUbdu3Vp48+azO27eeLaYx9evX7/5xrVr1z8Gn16/fuObGzdu + GvvADWOfw9Wr1+zKFeGqIQpwxSQARBISgcSAV7CLiOFSCOft0nnhnF08e9bOnz5pZyFaJIssEjfbX1hk + WbsLbHPOAduYe9gWb95rczcesNlbimzsqgIbsfKwDc88Yf2WFVvaylPWZ+U5S152xpKWP23Jqy5b0oor + lrDgrK3fuRcPUeQ8QGHhQTtx4tQXv/3tb78JBKAwcP/+/d8uWrSo3r/96P4feofAWs+dO1fl2rVrTZ59 + 9tnYW7duZ7z00kvTXnjhpcznb7+0h/E8j19+4fkXf/Tcc89/cvv281+wj4ToRXv+eeEFu31beN6eexY8 + d9tu3XrObt4UblkgAI03bujxDbuBGG7xGLnYzWvXGMG1Z+yZyxftysWnIfw8VnzKue6iY6ds74Ei25FX + aNv2HLVVWOmCjfts3rZim7zukI1adcBGrT1hg1YctbSlAEJTl5+F1HPWa+VlS155xZIhNXnlVeu16ppD + yqpnLHXtDUtZ84ylrL5iqZk8Zrv3qivgmvVefNJy8vaTI3gCOHCgUOL8QlYv6xckgOeee+7u7Nmzv/N/ + iL4//rGyVkgrC+qAyOeffzmZBGbknZdfW/jSS6/uePnlV4tffvm1G6+8cucN8DH49M6dV7959dW7Jty5 + 85rDK6+86vDyS3fAK/bii69AvMj38OKLgPGlF18EL9sr4KUXnreXnhdu2wu3btqzN67ZLQi+ioWfw3Wf + On0OUk9bXgGWWnDMNuUdtSVbC+ypbUdsFlY6BisduabYhq4+YelLiyxt+Wlnpb2WnrFeKy5Cngi9DJFX + IfCG9Xa4Dok3rI+w5ppDX42QG45ULLwP6AvhvVdfdkhdgwA0IpRUhJKy8pqlLSi0ffsKHPnM/40E8BuM + 44vPPvvsAQFcvnz51L8b+bJWrOc7uOCqfJkmEBnz6quvZoBpr7/++trXX7+/5/XX752/e/f+y6+//saP + 7t27/xv2fXH//pu4qjftjTeE++ANu3fvDXv9rnDP4bXXGF9/3e275+974949u8/r7t973e7ffd3evPea + vfHaHXv15RfszovP2wu3n7NrV6/goi/Z6bMXreDQccs/eNx2FZ6yzJxDtmTHIVuw8xhWetBGZ2Kp607Y + gBVFlr78mKWtOmu9V5yx5OUQCyFyvbLUFIgMJ7Tv2puQdQNct7QQIDdTBD/jkBa2Hex7mPjQY5EvwsPQ + m32pCMph+RXrtfyqDVmy3w4fPAD5hxyYUoZmAIEHkBgKCwszS10AJFD/l4i9e/feYgjcAYoh7gaE8vfm + x2+++cNPf/jDt7556613zMPbIbz55tsmvPXmW94+tt9+W3jH3gHvvvOuvfcuI/sc3nrTfvgGRL/+mt17 + 9Q6k3iZWX7fLV67biTPnbf/hE7b74GliabEtXL/XZkPmhGX7bfDcXMuYd8BSZhVYwuS91m36Eeu18BRW + dA4rxMrW4kblVtdftz7rbgJIBGkbblr6BsZ1EArSNfJaD5AZ2uYxxLrHGr8FIQE4a/fEIHybxcvqHZzF + exDxvVde8okX+R6SFl+28cvy7OiRwyEBMAP48v333/9Kbl85QDADoEo4stQFcOfOnX4iVqQ9iHftHQh8 + 99337L333rf3wQcffGgffvCB/TgMH7zHa95+0955877dffVVex5SbxCLn7541Y7gevcdPm079x+zVdsL + bPHWQpu9odDGLs2xYUv22KDFBdZ7Tr71mr3fkuYdsYRZB63bvKMWM+2YdZ5QbF0nnbDoqWcsZvpZcM5i + Z5yz7vMuOuscuOU5hwGbb1r/Tdet/8Yb1n/DdesnrL/2ANJ57BH+L4QTgKwdkt34IOkPEx8iPHD5Ilrb + mcR4yE9ZeREPdBHy2e8T35ux99JL1nPhBZuTmeemg7J+JYAY5Ze/+MUvvhbxEoCs/1e/+pXhlTuXugCI + wZvfxHrfe+89+/inP7affPiBffDeO/beO2/bD++/YXdeedluk2hduXrDTpzCSg+dsKy9xywTQheuy7MZ + q/Js9IIdNmjGFus/K8t6T91uPSdvt8QZu637tDzrNm2P9Zh90HpAcM/5Ry1p0WlLXoQ7XnLGUpaes94k + TylLnyYRepqDw4FafgEhnLKEGaet28wz4Kx1m32Wx2csccEF648VD9xy0wZs8pCxCeI3SgDgW8iXGNL/ + pcSHv07Eh1l6uNX3JdYLAfF9A4uH+D4BRP6qS5YC8SXkX3KkCylL2M/Yff4pW7Ep146SAEoASgBPnDjh + ZgCBAOQJ3nnnnd9Tx6ha6gIgWbsk8mWxc5ftsKmLs2zknG2WPiHTUsaut24j1lnXgSut84B11nHABmvb + b711HLbNuo7Lsa5jwOjdFj1+r8VN3m8J0wus5+zDljy/yHotOGq9Fx63PktOWp+lp6zvstPWd/kZcNb6 + BFh21lKXCmTSoA/k90IICdNP+eR7AhD5vRZdcGSLfI0OWL0g8vttwOqFMOsX8QH+JdbfF9Lc65zVQ7JA + /Hbk+6SnaSQxFOkBQqSLfMV4WT3kK4nsjahTl/vELyOpFCC/12J+65JLljjvmG3emWfFTCslgIKCA6pL + fC7SJQDh888/J2967UMqlH9XqgJQHfvu3dc//PEH79vEBVutfo9V1rLvJmvdb6u1zdhukQN2WofB2dZp + WI51GZ5rXUHUyDyLm5CPde+znjMKrNvUfdZ96n7rCfmJswotec5hS0EAqU8dtT6Lj0E+Alh2ymXXaSRi + aSvOOvRdIcIRAx4gdRnWD/pwwBLni/Aw65+BQDhgAzeL/Bu4/DDisfj+xPgQ+QggfX0J6f8SATiSfXgu + HxEIjnh/9LN7J4KA+HBrD7aV6UN+L1x+L8ScsiyMeJ/0lMU++QggafElS55dYLl5e1wl0EsA9zEDeO4L + kR4I4IsvvmCKe/N6qZKvN7ty5WaEMvd33rpvfcausTb9t1nHQTut0+Cd1nlIlnUeusu6DMuGeCx9RK5F + CyN3WzwC6DF9nyXNOgDxkD+1wJIQQ/LsQ5Yy9wjkFzvy07D+NMhPh/j0lWetH0hf+bQvgnOI4Gk8wwVE + APkcMAmg+2xZvScAWX4frEfED9x8HZfvWb5Il7sPIAE44v8I+eEhIEQ2lt5XeEAAIv2yI99ZeoAwa3fu + 3ic81SV1F7F6iJbFr7rIlBGEWXo44cmLKP6EQfG/34L9VlhQYIUu/h+y/Py9X7/++t0vUMADHoB1gN2l + LgBWm3ope3+BeXTUwOUWOTDrW8mP8omPGbXbYkbnWcLEvZY4U4Rj8SBx+gFLxvp7Yf29Zf2LjlnfJSdC + 5Iv4fmTs/VYJTzsRpPM4DQGkQXxfQYnSkgthrp9wwVRpkLP6EvIzglgP6V7S57n9kAAeEoGz5jCSHyY8 + eM6zepGPa3+IfBfrwyxepIfgx/nkFRd88uXaS6xcrj6c9KSF5yzxqbMO3eaftyHzsqz4UKEjXwkg1c+v + NAMI9wBKAg8cODCn1AXw4osvL3r33Xft1JkL1rbPCsjf9Yjle+SDUXkWMyofAeQjAM/6U+bI4g9b0kzI + x/p7k+ilEvv7Lqaosuwkln/aWX1/iHdY/TQjqncikADI6IEngEuWtOBcyP175N90rl8CyFCm70j3Y31Y + vHeufh0EQn6axsCNh9y5ijElbj1w7R7hsnZGH30ZH47v4YQrSRW0r7fv6pN4nAySljIqtoeRLsLDSRfx + PRecAWctdvZpm7wsmxnAYSeAAwcOUgw6/OUvf/nLryUAEa9cQItB69evTy51AahCp+nd9txCa5W62rn8 + wO3L9UeNyPHJx/IlgDF7LWbsXubi+5zFp8w9ZKnzj7DtCSEV6++z8BgVtZPWj5jf35F/1jIgPmM1Sdwa + sngngAuW7kRwqUQEbAfuP42S6uCAfOf2S8j3BADhAoT3Y+7uXDzESwTp1AUCSw4f5dpFbjjZDxJ/yRHv + ZfZeNh8i3ifdkU/IUlbfSxZP6BLpSexLZCaTFObew0kX4T2E+R66z2ME0VOLbd7K7W4GIAGoB+DY8ROf + U/z5RsRLAIr/H3300ddLlixpUqoCUKWPAtA9zePnkP23Stv0APldIT9Klk/Mj8btx4zJt1jIjx2HACbt + x+ILcfeHrS/xXnFf6LOg2Fl/PzL+/ivPWAZWn7H6nA2AeMEJACF4IrjoCQArSlcMxWq6kf2nsW+wYv4W + uX0s303xZPmQLcJ9PBzv00R8QL6sWNbtCOczwqxbj/vyeZ6le9sB4Y70MOJFeIpPfgpkp0B0iiNe1v60 + JTJjEfGJS3DrD1m6Z+Ui/DSEnwKMc8lt5pxmmnvSEshzYicXWubmHDcD8Nx/ATOACxi/Z/2BAH74wx/+ + ZuDAgd8rVQGw8lXpzp27/6QEcNDktdaOrD886YsaiQBGyfVj/WMQwDgEAPlx4/Zbt0kFxPtD1geL77vo + KG6/GPeP9ZP5pxH7Zf0ZWL8sf8Cap21g5gUbuOYi2xedJ3hQAJecABLnMjMgeRoC+YNx+QOd1QeW/zD5 + vrUH7t5l62GWH5DsE/wA0b51O+IfSuZk2YGLF/EivRfTU0GPZfUB8T0XnbOeEK+xh+/WA/fuke4R382R + Tl1jtkgHs44z02FazGf3XVxoWbt22xF/BTB/z95vbt++/flXX33pXL/w1VdfsfB1+zXI/y+lKoDr15/t + SrmXBZUXrPvwlW66J7ffxWX8nvU7AYj8sQH5+yx+PAKY4gtgAYsnZPt9cfu955H5O/d/yvoz35f1O/LX + SgBM44AE4HmAi+QG8gCeF+jDXFnkDybeDwqRr+QuIP4K2wDChVCMD+K3c++yaoH34v11gJ1lu20ydT9x + 88qxXhLnFWg80h3hPukB8cmLIR8rd+6e5VtZuyNepC886+Gphy1dpANI7zbHIz1++nGKWccpXzMN1u/f + cMnzakv22Z78PW4BSPE/b/eer1+/9/oXIj1cAHiFE6VKvt7s1q2XJr7Jos3Fi5etU/9V/lwfAUB+F9/6 + o4j70bj+QAAi3wlgshJA3D+WLwGkM91Lpcrn3D8CyGCePwDrF/mDIH5QJlM5XwAZENQfYrwQQBIIIRkQ + OJgDIgEM3HTNMnD3zuUT2/ut9UhPX3fZxXcX44GL6Wt80n2iU3lPBxHul18DkgPCXWUucOsPk+5bvIhX + DO8F4cnMVBKpVYSsHRK7CxAv8rv7Lt6RPvekRzrWHj/zuMXPOGY9eJxC1TON8NdvPcJfj8dbhyj5PUMW + 7rKDBUwDcf8SADOAL3/84w+++vLLEg+gbeo1a0pdAM8/92LO20wB8+lEaZO21jph+Z2HSwAUfIj7Ij8q + FPv34fo960+YECYA4r9cfn/m+n2fwhMsIvkj/sv6B/KDHfn82EEQNhAReCEA9UsAIh8CBkLwUOL9YGL9 + QETgyJe1O+Ivh8hP4//TfML78D592E7lvWTlIlwZeQh+STkgOrBwFWe8Ao3iOZYd5uKTqUg64rFukZ+s + pM5ZfZjFQ3i3Bbh0Ynt3ATf/gLVDfBzWLuJ74v5TqXSm4QXT1l2gwshMh+0AKSTB45ZmWdHBQke+EkC6 + gb+gCfRrJX7KAzSqGJSbmzuitAXwN7dvv/jsO2+/ZcvW77ZW6ZsQQPYjAohmyqesPxbyFfs9AVD9cx7g + iIv/6RIA0700yHcC8N1/iQAu+R7AE4DIF9JxqxmQOHLnTRtMvA/I91y9LF2W4o3e3Nxz732ArDxEtu/K + lZw5QJojNpxk/3EyZAqK6Y7wJR6SFjEvFzQ/F/ki3lk9Lp79ztJFPNaeQBavMSDexXbiehykJ8w85uJ7 + KsvOafxWRzZJcDj6MCvqw74k8qSZK7ZRAzjsBEALOL2CJz5n8eebQACy/n/4h3+wlStXdipVAezZs+d7 + NN384of379nouZR+lQA6AeD+5QFI/Jz7RwDRTP0eFMABkkAVfRCAYr4vgHQsP23RKQSg5A8P4Fx/4P69 + EBBYfzqk9cdiR2XdtOE7mOcHVu+7eVl6CH5CJ5cuSw+39lDcFulqsVJXDmQ7ooPRJz2JMQlCE0U4LtmR + jitPJI6LdJGvfUmQ1xNxOPKdqw+IP23xuPl4LDuB0bl5iI9l5VLEJy2AeMrbfYnxfZnl9KHYpcaS1FVn + +M4PARH0eOqwLV23w7WWaQFoz559bgYg0mX9gnIBikKlvwjEBzV/6aVXvn71pZctefQaa0cCGJAfCgG4 + /0AA8gJxiv9Yf8KEQADMABZS8CH+ywP0V51/iScAF/9D7l/kA7l/3/VLAMO3XrfROc/aoI3Eebn60BTO + m5oF0zVvaqZkTcUXrwjT+yFLF/FJwI2+ZYtsZ90+ElmB7OnDEa/M3c/eNUd3U7kwq1ec7wapsnYRH0cs + F+IFR/xR5+oTfeJTcem9Ibw3IlCLWG+HM+A0+07jmU6VgGPVc/5+27h1h5sByAPs3r3HzQC++eabkPvX + No0zpb8I9MwzNwaoFYtuWVb5mAEMy/WSQKz/AQEoAfSLP7G+AOJ9ASTPZs6PANKWeOQPIO5rux8HICQA + l/zh+n3rd5k/BA7Z9AzkP2cjdt6wdKxd8ObrIt/L4vuslBX5pDviFbc1HZN7l6V77lwQ6Z51QyQkPwLI + lDU7BFm7Yjjk9sC1K84nEq978B6OeKw+AWITsPZ4ErtYSI+ZdYzKHZhxFHd/FAJJ7kQyvzuF39yLxDcF + wlNo+AzQa+lpvucpcDKE5KXHnftPnLHTsnNymQF4CWBubt5X9+7d+8L4UwgQ9PcnWQSiqzZTrVgHDh0j + AVwdEoDzAiSASgK7suoXNZrK35h9YD9FoAPkAUIhpeCDrAGo6nfct3oEgNWn00fnhYBg6ifyg9jvkT+I + 5G7krpvO+gduZEoH2WnOZXoIyE8l+3ak+zFd5HukY9k+QkRDfE/6DBwWApEckB1k6y5xY24uEKe7Y9U9 + INpZPe+nWN+N14r4eJ4PrD6G6Vv0zKMWDemxjN3nQSa/MUXdvZCeDOnJEJossgWMoBczoWS8YRLNnslL + IFykLyFMgMTFRxEa+dLs7bZ/zx7n/pUAsgrIDODHX8rqAwFo+/Tp07mlGv/1ZvT4nbtPD17mljxrkbbB + OgzNYY0/CAO7EUEeAsgnD9hHGBAQwJiCkAjiJxxkLUCFH9b7+ZHpqF4CEPnpWFIG7tBV/mT5bu4P+Vjx + ACxcVj8q+1kbzijy+zritRTswSMeVwpSeC9n7Y5wDjRw8duHSHbA6ntAvEOIcM+6w0nvBnkOWLW8gUe+ + P63jsciP43lZfCzEy+pFfNT0YuL+cSe8XnxX9RYmqbWbvCcRshMhVGSHI3ERBR+BaXLi4mK+YwkSmD4P + mLXODhcecOQrAcQLfPGb3/zma8V9CUC5gD8FnF2qAqAE/He3bj373huvv2qTntpiLVn7bz80GwHkEAZy + rfMwBDA8EMBeRLDXicDzAp4IJIDEWcVUABEAiZ8E0B/S5f7TJAAOkiv7inyQBsn9wPBt120k5AsZG9QT + J9KJmQF80kW8I18H3Cc/CcsKd+2BhbsMHUsOIbBwWXkYEiBWJAo9FSpcvBf5nruPx6V75AfEH7OoqVg+ + CZ6ed6SDRAQj9OT79MTKZc09F/OerID2ZCocoAeLYj0WUAdwYxFCLEJ0RxiPWAxl9LFPbWAG4E3/9u7b + zwzguJpAvpEARLxGlYLhK6lUBXDixLna9NH/4Q7dtmnj11rrAVnWfki2dRiSax2H7kYEu0kIEcCIfLyA + BLAP7EcEBxCBUEgYOEgzCGsACCCV5sw0XJ9W+FTiTePAimxX8YP8dEYt+w7d/Ixz/SPAsJ00byq++40g + zuId6Z61qyVbLWMuK3cxPXDvvsU79x5m3RDUXYDEkJU7a/cIF+LmQCSPe/I5PfFUPRaT3fux3hGPV4iB + /OhZkD5dVo/L5//i+X09+X3hxPdYDPGg+8KT1h3iPZIJDwHmF/NdPHSjRN6NVdJurJskzDuEmA5bl6m7 + bebidZwxdMQJID9/nz399AVKwB75gv60Krh8+fLGpSqAp59+pod67K9fvWrRg1dbm4E51n5QNiLICRNB + Hl5gL9iHEMDI/YiggJygwBMCeUCP6bR9zT9O2xdnu6jSBckiXR4g3RdAP02J2D9o/WVHvDA8i2nfRjVE + +v2ASuxcXyDkK3OHcEe6m6J5UFwvITwg27Pwbg6QDcKtPH7uMTL2YxanxA1XnsDziQitB9+vG+QnhMgn + o4foGF7n3D1WH6N5vcLBUySCEoCzdr5DQLqIJ/x1xwC6UwH1SC5BAgtjD+IQOUUh3wfvOecgDa87bcXa + LcwAvBVAEsBvOOnjc5EeLgBa9T4p9UWgS1euzH2ZEy6Kjp6yNn1XW1sEEDkQAQz2BNBhSB6eIA9PkI8n + yHdC6DoCAYxEAKMOOMSMPWjdEUAyltN7AWVgCFOLlwhPUxGEEOC2FQpIAkdAuiOfuD90B9bPa1OwdKEX + 4vGI96w9CbITlci5ZE5x3Cecz5GFBwgsXaTHy1ID+KQHxMfiwmXpiXxmD0JVAuTH89hz+RDvW30UHi1K + iR6eQMTH8nmxCLw7AugREA7p3XDrQoIj/ihEKz8oITyeErkDjbAhsHQeS/9E7Ew8KR1UHYdn2hamgGoB + 208PYE7ubs0AnADkBQT9cZJN6S8CXb16vfDOK6/Y5qz91jRlHQLItnYg0nmC3QhAyAP5CGEvFcL9CGE/ + IiggOTyANzhAcaiQBaEiS+Kg94Kg3rho9fYp2ZMnkNXrlCmFheEQrpgvyx9K0UexvxevF/GuO5jtJKzc + Wb2I4uD3cCBRc249cO0cfAgLILfuLDwcsyEQFy6Lj4HMGLL2HgolCLE7YUXki9w4yA+sPorXdCXJi8YD + hBMfQ7NmvCyc79GNsRuEi/R4Fr0c5hbx+UWWQEEsnOw4yHagSSZ2pkjHYGiXE/FRkzGuCSyujVxlebm7 + Kf16FcD8vL1fceKn8/vhAmCaXrqLQKmpqf+FkyxffZVW7xlLtlmT3put7YBs5wXayRMM8kTQfnC+J4Ah + exHBPodACJ2HKxQwFZyMADj4vSCoF9aqune6sn1l9UoGEcCQzUz5sm+62D+UBHAIUJEkCauSpXvk42Ih + xQHCe8jS3QEPJxuLw6UL4a49ToTLxQNl7CJciIZQjZrbJ/E9PPI9ly6rjuF7K9Z3xeq7yurZF1i8iI/m + c2LmYuHsT+BxApYu0uNw87EQ7kD3c5wwSwgs3CM7gCNdmLYXt0+ORRd15Jhc6zlqiR3Yv89Zv3oAGDUD + cGYfLgAaRVeXavxnVak8Z8r+g86j60/bd9O+O6zNgF0ObQfkIITdCGE3QshDBIKEgAiGeCLoOAz3NbSA + UjHxbFIRLeDMb3HByViu2rtVAk0HEsMAVr1E/qgcyCfpGwz5iv2JWJSs3I2QLcIDdHek42J10APCISt+ + DgQAuXXPtXuW7kjXVM3N07FiETrliPMKIj4gP541ijg+70Hyiyya13nEkwDiUaIJB1F8TlcJCwHEg7g5 + EA9iqXuI+BhIj+YElhhhJpghlFh59DQRTt40ldApTMHqxxFiR+2yDqOzrc3wLOs/aTmngnnTv7179usi + En/QDEDzfgkgqAWwOji8VAVw5syZDjpr5zrn2MUMWm7N0ndZq/4IIIMvlpEDchGCRJDnYVA+YtiDEPYg + hH0+CAmEgdiJTGs4+InMmZOZevUmjvdVs6diP65/xK4bNjoX1884aAdLvYQClUd74DF6ctCFHoqxD7j1 + EuITHPEPEu5I94syAeHBGEVO0mUysVdhiSloIhW6wPJFcgyfJXKjZsrq8RB8rvZHM0aJeITVlffvwvNR + VDlDpEN8zKwjkO4RL0Th3qMgXYimITZqGl4xjPQuU8idIL7zpFxrP2aXtRuRZe1GZlkkImg5eIuNnbnM + rQFIAHm0hDMD+IOsX8QL+tMZQWvWrOlYqgKgC2iMTqXWVS1apS63Fv2yqQMgAsbW/RGAgAjaIIK2A/Lw + CBJCPkLYY5GD9/nYb51GFFrMBOa0uM8e6nChZKpmB7n+fhR/hm6l1Jv3rI3afdOGZF13Aui/6TJ9cJDO + azWGiNcauqZqPuEiPT7M0mMgJBwiXGQH6DrtiAldJpGYYuUprLknyu27hE9uH/LxKFFYdZcZ/B/1ixhZ + PIjmc7vyeSLekc/znUGMrB3SRbwQhZV7KEQ85EGcA9EV0h04J0LoMoVZ02QS50kCSfR4POqIndZ2uA9E + 0HbkLms2YK3NX7bWzQAkgJyc3ToP4BEBkBN8xqngVUpVAFwFY8fznFe/M3e/NUpcQxUw21rgBSSCloig + Vf9chIAAJAInBEQwIB8h7HFoN2iftQUdh6P88WS+LIh0p/GhByQmKw9AAIO3eOSPycf6c7D+ndfAdSp6 + 1Nhx6454372LdEc85AiK6XEQFBtGejSEBIjipNAoyBa6TjkMAYetM1bfGfITmav3odPGWb7Ip0gTRy5R + Qj7CwQMEVi/iu0gUfF5AfCfev+tMj/TomYdDxHedDvHTIB7Cu+DiHTghpssUgfjOCaudIL7TRIifSA41 + Fo86bKe1HrqTcXsJRuyyFv1X2Jr1G+2QZgAIIDs79ysWfNwMINwDvPnmmx+Qs/0/pSoALo9yXWfkzl+5 + w+r33GjN++4CWQiBL5Yub5Dj4AlhN8hDCPkObQcgAh8dEEDXccxt6WpNwAuo3UlxXV0vQ7H40ZAvEQzd + hfUjgP7E/gQOvke4RiDSOfgiPEDsTKzvEcI9oh0gXW6+62Tm0lMOcrAZJ3IqGv2HaXiYJEJPQH6sT37g + 1qPxArL6KKzeEQ8689my+M4Q34n37zRN7l0WjxCmH/RJPwDhgJNfOk/B+0F8J5EORHpH0AHi209g9jQ+ + 17n6VkO2O0gA3vY2trdZSwkifSHVvV1uDUAJYP7uvV/+5Cc/dTOAcAFwJZRrpUr+hg0b/hfXw/no+edw + y1PXW0TiFmvWZ4cTgCcERCAhOK+QixCE3dYSIbRCCELrfvmAnGAYB2TsIYthKhinOjm5QBICGLjlinP5 + o4j9ngBo8OSxMv14rDqe2CrEsY4QB9kB4TEccCHaWTiWJ0sU4VMhQYDwLiIdsgN0oBjVaRInotB2ls7n + JrMW0YOFGVl+CfnEe+UNyvwhvyuxPkQ8uURnwkmnaUXWcfIRa4+gOrvPlthEfqEjPUQ8rfCdQMdJJMWO + 9HxIz7PI8STNAudKtoHgFgO3E+chO4St1sLfbsZZV50zFtjevDyvBEwCiAh0IqibAYQLoNQXgVh2bMRJ + h19df+ayxQ9ZYQ2St1uT1B3WNDULIYSJoG+OtRDShFy2d4M8zhnMt5Zp+bSPkxgyE+g85pB1nQhxU5kP + czC1oDMYa5cARrDSNwoBDGMG0A+3HAu5cbjVOKwr1kdAeDQHXBDxzq0LsnLcehdn4R46sf7QcXyhQ3vW + I+QJ+qjHbhsXWaDzpicrc87tU6yR2++K0LriaUS+Ej25fGfxCLGTiEe4HQklHXifSD6rA00uXSC+y1TG + KQewcDC5ALI90jtwNpQHEQ/GQf44EU/STHbfavB2azFgGwLwoe0BkD9wSwiN+2+27kPn2aEDXDCKi0bl + 0xBaVFT8B5o/vnaZn/8nIXDRyFml6gFOnDidpgsl6RJnrVKWWaOULOoAO5wIPCHscmjWR94gx0MfBJCK + APqUoGUaieGQ/dZhFAeLRDBqEskgliU377J9Cj7DIX6k7wEU76Mh11k5li14cRzSA8IDK8eilcx1nlDo + 0MmHSO/gcMAiKUdrqtcXYYn8FPrtlPR1IweIY/XNi/nEe30uYcBz+R75Ir4jCWQHEc97yOojJxZaO3oc + Ok6RxXvEdxLxE5nyQn6HCfsgfK8HWuMjhbEcgzEQD9qOxGNi9c0ytlrzh9CsP142owT1+2ywjPELXRuY + 3P/u3flcmexplwCG/2k1sNQXgU6ePLtcV8zKySuwBt2XI4Ad1jgFL+AgMZSgae9sqoQ5Ds2EVB9st0jb + bW0G7bf2IyGJRaGuuOVeWgGk6CMBDEEAwzT/3/Oc64mTJUdzsKN8dMXddkU0XSHbWXmYpQeEdxIhkC03 + 34EehPY+2rEe0RWX3XcjTSSbWU3EAyS5pE/kaz7vkR/NGEP23xXLdy7ft/qA/PZTPauPRGBt+RwJoBMC + 8IgvwMoR+HifeM6FiHRgNgTaQr7QDstvPSzLmmZss6acVOtGyG4K6R42W5P+m6xJv01uW/vq9VppE2Yt + c2cCSwDZzABuPfvsIwJQY2ipLwKdOnX2pK6StXjNDqsdt9oa9tpmjXptBdutcS+JQUAEvXaBbEQRjhz2 + 5VqTZISAN2g1kCnhCAiiIhiH+09VuxdxWHN9JwCmf4r/snqR7MhWHJeFI5guWF2XMCsPXLsj3REP6bj5 + AJH0IrRlQaor1pu6gXLzJtrEGEtcv08+BZsYkY/lO/IJASK/I+5eVu8Rf8jaTQSElLZ4lTYscbeH9I40 + unZgbE/XsxCJANpBfIC2nBshtJEAsPyWnEHdpJ/Ih+x+W9guQeP0LdY4fTPYVIJ+my0iaYktXJbpZgAS + wK7sHM4E9mYA4X8ffPDBJ8OGDftuqYWA+Pj4/5urYr6ly6ONmJZpteI3WMPkrWAb2O4BITRK3gGyrHHy + rtCo7cZJ2Q6NQFOFA80GSAQ7kQhqWbXPOnr7mf4N3K4QcN2GMwtQw0RHkfyAhRPLOeiy9IB0Wbkj2pEO + AUCEy9W3A21Zim7NimQU2XrKesrMG+kIZkwh+ZP1d6MhQ0lfNFU7Z/lh5Hdy5Bd5xBPrw4lvy+eJ/Dbj + RLqHSNreIul+jqQLuh19kG19tGFsQ2tcGwmAk2WaDcBo+m61xmkgXRDZm60Rp9c9jIZcb6Fh343s32IN + es61DZu2uBawvQggN3ePuoC83q+wP07ZexXy/3OpCSA//2B1LoH6u6uXLpCELLXa3VFjIheESNxmDXw0 + TNxhDkkBstje5SGR7cSd1rDnTieA5v05ECSC6pRJpLrX1wngig0kBCjxG4AQVJyRADoqeXPwSJeFe2R7 + iKTHwBFOw0k7Oo9EuNBGGLnPWg/fw9SMpWcI743L703M17bn+s/4cV/JHjFf1T7f8jtCvrN6ER9m9W0Q + XGs+tzWf2VKfhwAihbF8vo+2tME5wkFrHxJBK1rmmkB4o75bHkHDvputYR+PbA8YGTE/QH2ea5Ey23Kz + d4V6APbt2/95MAMIF8DVq1ePlxr5eqPDh4/GneMyqKdPHbc2vZdane5bLaKnsMUft3N1kBI06LkDte5k + H/WCcLC/SZ88a8ZMoL3cP1OrJLVCU/fvT0ImAQxFAPEs6nQi1oesO+TOdaA9C5d1eyghXoQ70rF4odUw + yCd5S85k+RjiBW2L/CDrV9yX5Yv8riR+ivkdSfbaQ/7DVh+Q34rPbInAJIB2fJ+2DggOEQZojQg8SAj5 + TOUwgj5brGEq0NjHJzwV0n006O1tN+i90ccGa5AqrLe6vTZYx9SpdmDfXmf9KgEfPlL0yAxAQuCyt6W7 + CHTkyNHpuh7unn0HrH78MqsrAfTYbPXwBPV6aBtoX/dtYDvY4Y3dAmyzegk8hwAaMTNohgfooiIQc/9k + MnBl5P1JAgcT91MoBnXQ1A3La+8sOyA8IFpuHddLTA+BfoPWNJ8EaAnxgsgX2SJdVh+Qn8iUz0v8cP1K + /DTtIwR0JgF8gPwgzvtW3wpv05LPFvkt+PzWEC7yFQq0LbSi/S18bM35EU37b4dQCE/dDJkg2IbwgOz6 + KRvMAfLrpwje4wh/rNUz05KGznF9gJr/5+bmcy3i87/X9D/c+rUYxHUCh5WqB+By53svc13cVeuzrEbU + CqvTbYvV7bYZaNzqxnoOWx3R9RI0eqgbz2tAnTjChjwDM4HWw3D/TK26aUmXAow8QD9ygHTQSdMrBNBR + rtfFcB80lLQRIDscIl2WLrRkxbHF0D3WYsgeSrI0UdJunsRJFAHx8jaufRvXH0+dX27fWb2SPcQSIp/p + pZK8NoSc1pAv4lvRySTyRXxzvIvQGg8gyCOUYJ/zDK2w/hZcE6lhH0JlL5G+BUI3g00+wQHRGx3JEb0o + roUjed0Dj6snLLfB4+a6C0dLALuyc7+5eeuWBPDAn04FK+1FoP+s69pfuXTRxs9eZ1W7rrY6CZvAZgCx + CCG0Hb/V6jiyQSz7Qe3YTR5iNiGAndaYHKD9+ENuzTxBAtAJEeQAIj+KYouSq0gOvkQg8lvTTCLCNQZo + xXarYRxoCPfgkd4caFRtvjut1j2p7MkDaFlXuUZPiO+B5avg4yV7lHTJ/D3ySfaYIkZCfhs+uzXktxpb + CJmALqYWrGA2p6mlOZ/djGXtlnynVgoDfigQ6QHkBZrSJBPRS1M3j/gIRBDRi2OAdXuE+0j2yU9GACI9 + DPWSM60uj+sijOpxC23GvBVuBiAB7NzlZgCPTAF/+tOflu4i0MaNG58sKj7+60sXOJDDliKAtVY7HkIf + AERDem1HOIDsWgGiN1rNKO9xRCJFIi0G0QwiD5CgbhsEkIoHiGe7DQe83XiIpz6gsQ0HXkSL8JYi3Cc9 + sPIWLDM399GMFcdmbHcma08gsxfREoDcvcYeFHqEEPnhlq9MH8+jZK8N4mslq3fkQzzfoTnkN4P8ZnyP + pgiumb6HCwUPQSKgEbZh2g6rm7TJ6iUTIgWId0je6GMD43qwzkEk10tiBHWSMh3qJq3xtxl5bc3YWbZi + ZabrAspHADnZuV9++OGHj8wAuBhE6S4C0QTS5iTXtT/NNezb9nrKqonM2I0ONWM3+NsimMciO0DUBojf + YDW6brQaXXh9jGIgi0Q0g3RAAF0VAtSnj4X2wDW35YC3wdra0C4WoDUuv4XcOgc8sHARLqKFppAuNGHJ + uSmrjR0hMZ7++nABSAjdEUR3rF7Lu3L7UcT7LsT7TswOOkB+JNO8dlPCyOc7yPJbUKxqTr1CaErYajJ0 + vzWmiikhtNB3U0jwoTDRnF7ICGojdXoSHpOETWHjBrZLUCdpPcRCOFYekP7gKAHgbRFCbV4bET/Ntm3j + ZBDXA7BPJ4J8TheQ1/4b9sc5G6W7CIQAhukmB/v377d6MU9ZdSy5RgzkghrRAgRHCSJbWGfVuwhrvbHz + OqvWaS1hgnLnQNw5c/9ImkFUYlX5tQcW2o6ScEsOcitZfBhaYnWO5IBsSA4IF+lCY5acG7PkrJp8LHV8 + CaAbZHfnvYVukC4kBJU+ke9iPos4It+3/NbO8g9aS8hvgUhl9SK+GSuXJeTvQwCK/55XEFooRJCrNGY5 + vA6JcW3Ir5MYgFCZuDEMkJ4YDgSQmGm1WVr/dqxm/2qrmbjOWiROsT27c0MlYO4b9Af+HlgDkA64OHdO + qSaAhYVFm85y2fR1m3ZY1U6LEcBGqx5NTHLYYNUhvXpAemdI75xp1QRIr9pRyHRjgxQKQBzM1mMoodIO + plp7AjG5w7RiLBxXysFsiVW5kQPcQqB/MCC6CSQ38ckW4UKjjDxrxCpjJJU5ZfMhAYSRLuLV0uUsH+KD + 1TzF/HDyW0J+C8hvLvJpWHHEC9QrmmD1jWloaUz4asLjgPyW/JYW5AIRlMNrJWx09ZHaTgSESAf29dwQ + hvVsrytBD8jvCfk9IVpACLUkBrftPZYHqN5tmXVJncj1APd77j9nt50+c/aRGYC/CFS6t4RBaZfPc7eL + aQvWW8X2y616FCSTB1SPwrIhvhpWXg3iqzpAdqc1QKRnWhVQORIFx1DmHIC7hNBWo0nwCAGad3eiDKyE + qjn7HRCCRKLRw37+D7JF9ENoyDJzQ5abVY51q3Zq0aJ+r6ldPHDEyyP4q3tBr56zfCV8WH5bxXwSPo/8 + g478ppDfhO/QhEplY8iWy288eL81hHxBzzcfdcha0trehP5HkV6TfKhWN8Jcd0YHtnsEIEz2WB8GKqkQ + HwJk13oItQOv0HM5wlpolTpPtZTBk+wIJ4LqJJBdu3K+YV3mkRmAFoG4V2BiqXmAmTNn/g9CwIfnz3AF + j9HLrELkSghfA7BwXLwj3EGkr7EqQkcfHdZY5farnQAitCA0hCQKtOLgdeDkiQ6cOdOMmNpUMZWxBLwu + 7HGjDIgW2T7hIr0hC0pCWwpEiuOK517Dhvr06AMMg0q8atL0FnWKWNHzavoiX24/IL9ZGPke8QXWSMSD + BixeCY1k/aMPOaHUZ9WzBnlQjXjyHmZFNfEANRMIjRJCN0jvHo51PA4A+d2x9ABcXreW0BO4UIDl91hO + frWA8DqbcDvbKrUfbyMnzXEzAAlgx87sr7n27yNtYFwRXJeDa1RqAuAGQxHcheKLU8chrPdTVgFCq3YB + PuGO9I6rrUqHVQ6V26/0gFAqtQNtVrgQ0SgD18kCUNPBCIA+gMhJxS6bbqwEDtcajsbEez32ntvjrLwB + fQVC/b6AQlJ9kslWJF8isiPLw2rLiqLHPlqLORAeQGv6Ir0zPQSdIb4jS8iRLOG21TRPVk/i2ZwY3pRk + T1YfWLwjXqTznUuASBFvU3KAWt23WDXlQHEIIC5sjCdbD5CwFkEEyGR7DYD8blh8OLrzuAfESwTdlkL4 + PI7ZLDzsLAQwB5HNtSrtx9i8BUvdtQCVAO7alfvlj95//5E2MO4SVrqLQPn79qUUcfsybkBgEVFzUCJk + dxTZHumV2/uki/DIFZC+3Cq1BW2WWcXWoM1yq8PKYKMMiOxPAjeEJG/MEYjlANMm1khxnETOjQ/Df76B + SO+d4xDBMrOgWUEbLcOyKqhWLLVkdYHkrmrA9KHHXpsWIqFRowM9A+1o2lBxpxWeowVTPMVyxfkQ8XLz + In2AD4RbHzQYWGAN8QgRfXJc3lON8FeDXEjJcPUYciFQQ4jNLEEcpIdAGGQFtWa8RLDKwYkAL1C720qe + W8x7ziWkznIQ+dWjZnuImWvVOwy1dWs3uPMAdlMC5kSQz7H2R9rAXubKnaW6CLRvT8Eizjq1TVt3WZV2 + s33CIdiRDdp6qBgQDukVWi0FS6x8y0X8GMqZdALVT8+zhukIYGihNeYA18d9N+iX50HP+aO2HWgaERqy + XZ9egnq9sjwks5jEuQau6qbFH1bgOrAMq2aMThDcGaI704vXke32kK0unQ6IJGja0CKOMvbmJJua1yu7 + V4xvFCJ+jzVArA0oVdendS2iH+QPKrD6iLcmVc2qJLYu7yEHEpQHVY/KLEE0CVvMauCNNWLX+FjFCCSC + BHkAREBJvXr0ArzpHKvSeRaeFfK7zA4TgSeAqqB+1DDLzspyMwCVgLkw9O9p+/46OA8gOBWs1BeB9u4/ + WHzi+HGb/dRaK9sCDxAJ+e2WQfpSh4ptQCuf9JZLrEIL0HKxlW+xiP1LmA/vsgjctdCIgykRRMiSsaT6 + QKMHXiNA9iOgr6Auq4x1KCM3ptm0OecbNh9GfyEXn2jH0mv78YhAQgityVNJZJ/QDmi1TggWcJqTtSvx + bIIrV2bfiKllCen5FpHug+9bP6MAD5Zj1aI3k98EiS4jeZAH8h8qo9UcyI2iVkHqQ4jxyK8pxK3ArS9G + SLj1jrN5z1mQD8nCQwIIvEHlLjOtdcJQK9iz18X/7Ozd3AH01O8hPXQiSCCAUj0TSLc/5WaFb6gAlDF6 + kT3ZbL5VaAvBbRaXoPUirH2Rs3YHiC/f/Ckr13Q+P0olzByQDdm7QT4Vr2wsGTcOqQHqpeyycGi/XuPA + c3VZXq7FGkMDkq4mg2gqGYgIOP+w1Qg6jrkIVTsJgRW3yLFagyc0UIYNgVPTW7E62HLEXmYXFI8oGTeh + VKz8QqGnIWGnAdNIeagIPE49gdVKWX5E2h6rwbpGlc4bwTov1wkSXIXBTuRCQpdVIVTrSpLswwlB5MeQ + B0UtYVo8n1iOF42chSeFfAmgI5bfCfJBNbxANYnAhYGZIU9QscNUi+87zg7SB5iHALKysr+5evWZzzTn + D64DEJwJVKqLQPSUVdq3/8A/6c6VXXrPsSchtkIbCG+90Mq3EhZAOmgxH9LnWXkEUr7ZPCvbeC6eYDHT + I6yW0m8EIohIyWV7J5a80+ppTPJQj16BYFvPydKdtYehNquM9Wg4adQ/Gw9CYwlnITXjHMSWQ0kEuRZB + 6+FghEDjKY9b4h1aBKAy1wI052TVppyq1phT1jSdbMCMor6QvtsiaFqth/epi5eqR/NqRPo+q41Qq1K9 + rNIB4jttsMrkPJUjw3KeDiS6oEpH0GkFWIngl4MVTgDVWTCr3pWyeccFVrndHKvYdqZDpXYiH6vvAPkd + GEMCkBAgXiIQnAA8EVRoO8H6D5vMFNBLAHfs2PU1sd5NAYNTwSUAXRG8VBeBcnLyux7QNegpPjTsOt3K + IoDyLSFZhDvS51s5iC/XbK6VbQqazIH82VamMT+GmkBt+gDktuvREVSbZWIRWbsHI30D3hiG4DmND6Fe + EkuptJ/XpwG1AS3ojdPVR0cX8kBa0LkuQStOS28JmnFyajO8Q8mo7d0OTQbkIhzVDUgo0wk/dCwr9NQj + 5NRFnHUJS7J8oXrsFsilftF+LQStZXsN5Pn5jpJcwmDl9iscqnRY7lC1k8hfBuFLrUok8/Y2kN4S8lrN + IBme5ZEPKiOAKg8IYKYLAyK/aqeZDp4nYLvLDE8AbUbZ5JkL7CBXA1UCmLUr58u33373kWsBsC5QuotA + dJxO1DVot+/ItsotJ0M0Vt58LuMcR3q5powivclsiJ/lkd9ghgsJNVkRrNXNI7hmvFcoqcnqYS1WDz1o + +49ARRW9Po5KWg+tpm3HU9BrQA9ig954gr40oabThdxvB30FJIX9PVE05gylEDhTSaXZxngNjY0gvQHn + K2juHkHncr3eeB7Ci2YoHvm7mYfvdIRXilT9wgfkV2q70s1oKpHvVGrLSA5UOXIZRPqIXGKV286H8Nl4 + wFmAY9Ac4lti9a0gHgFUbgP5bRklAEKARFBVwAs4OE/gCcChswQwnfxiFp871JYuWxFcCk5J4B+4J/AD + F4OSN+D+iu+X6plAefn5OUXcovypJevtyYaTPMKbzob0WT5mQj5oDBrNsDIN8RJsqzDkkb7FTZPcuoFb + OPoj0CKSnnPrC96oNYZazLHr0nUkEdSlvq4TUeon00mTQktVKn10fWhKBQ0RhdCI1vQQ8BiN8BaNOF+h + IWgA6fXpWg5mE3XpXazDjKIuBSqJoDpJXqV2qyHfR7tVPPZQkVmNEtqKrZe4xLeyEmBCYaWWGERTHYsZ + YDrbMyB/JuEP4oWHBSARBAJABFXbc6wcAhHMgHwhEMIMvMNMq9lukG3ZvMWfAeRpKvh7rv75tdx/+OXg + uEnnM6VWAOKN/oaE4zndjHjYuEX2/XpTPNKx9HKO9BkeGk13xJdpMM2erD+Vg7TYWyDSeoGmSWTJbp0g + irmyg6ZO3liDsYZGve4haH9tKmu1qLLVVu8B1bW6lFcjqK9HJNJQkUwnDcusEfIMEgZjfZpUGwisxjWQ + t8BzNKBbuT5jBDmEQkndxO3kF4IEkI1It2HtmcxmqGO0hXCsXcUrh6Ce0WoxAiD3aUG+g8crh9jLNpzm + gd8vAZRvOtOhAtZfsXmJACq3wupbQ3zIA+Dy5QF8VG0P4YEQOrDd8UFU5vlGXQZxMYgc1gCYAbAGcPz4 + ic90KnhwOVhdEVQ5APcEKr1FoDlz5nxvd96+XxRzN8rY1On2/bpTS8j2CRfpZRpMdcQ/GYFACAHKikW4 + Vx5masRUqfq/FFQXq/E/en3NWCpoMQGoo/O4NhW2OpRa63VjHZ0yqwRRtxtr7NTevdY0BBHA71WsR+Nq + PbblSdTGVpvWNeUlSlCrdt4A0QHhxPbWPiheVXJgektiW7bhTCtTH4FH6LdOsbJCQH5jLN9ZP+TjAULk + t5iBh8D9EwJCAkAEVcgDqrTDwvEEVTVGQrjgRMDYAbcvSAiMFdpMtfbdh9kB8jAlgDuZAXCX8s+Cq4EH + l4TVyD2BSm8RaMuWLc3zuPtUYQFl2s7j8ABTHdll+PE6CE/Wn1yCiEnOA1TCRbrSMNXBKmTIVcmQqzJd + qiZ08sfgMaOec6/RawVKyEIN5tTVBUrOEkMNvEjNKGrnFFlqx7B2TrWttgQhxLG6BuoItKpLIHXwHHWB + 61pCIOpYqk2+UZvcozZ5SQ2WsytTplb9opKqlRodcPXUMioyla3QbAGCZuZTl98JykRM9ohH7GX5rRJA + eay/vBMAMR/ynQAIARJBpZaBAGYgACAPEAhAIgBVhXYQHY5IyI+c5qE9791ygiWmjWYNoNA1gW7fsfNr + btSlGkDofgDyBLo/MPcEKr1FoJ07cweq8UBnoVZpOsqewMJDpEP4k0I9UHcCopiKBczloJId4zYrkygJ + VUiWHJQw8dwjCF7nRmIrFlfNiaYEelwd8dToTLm0y0qr1ZUSKuKoCTTWkjCoxDlEe6iN53CIRRzkE655 + hX7EWnQqVVVS5xMfIp0pqwgv34QZDaSXa0Sew1g2gtBWF3FDfiCAcvzWcgignC+ACoRBj/zpVtEJAOID + 68cDVGYW4IAIqoTDiYF9baeHEAihSrtpHLOpTgBlm46wYaOnMgM4pGsBywN8SbL3hy+//CJ0Q6iwewKV + 5iLQ7kydfLBsJQlg3ZEe2fUmeoB0h9rjOTAkh8TECkwJK7UmOSJeCpXJBUKgcPTAYz0fvIbYWoliUmXG + KoigqhOLwDajA/uqd1hq1TsydmQ5mnl39Y5U1BglDCcOJxAqbb44aiqMsFpZi9yipnoWqOJVkTix8sot + sXRZOcWq8iIcF1+2wUw3hqNMPYhHAGUZyyrEEQLK4QXLQ34FwmAFrL8C7r+iT34lBFCp2XSrzAygMklg + ZbyAyK8SjNoORCABtHlQAOFiqNIWEbRTaBlis+Y+5V0LGAHQB/AHnQgSfk8ghQPawH5dqpeDy87OO3+I + tedxUxbbd6shABFeRxjvofY4J4ayHJByHIyKzRdwUBfg+nxQKKoktAwbta3n9boHMJ8DtZADImFIDIs5 + UGFgf9W2Hqq1o6ImMPWqFrk0hOpMyaozH6/eAXEQTqoTXmqQUwjVWLeojGuvpPJ0UzJ3cpVyIrwBCVyA + +mHb2kfML1OH34fwy+EByuH+hfL83goNQSNE0JiktwmhDwGEIAHgBSSCKi2w7gCIoEorHgshT6BtiBba + PAoXNpr2o7iT6V0JJDePmcD+37MI5O4KHtwVVAKgDexOqS0CjRyZ9XfZ2fnvKe4k9pth36mKACD8idpj + wRh7otYYJwjFRLnG8kz9KnBghYoUhipSL9BYCa/gtsOh14Qwl23A898uDKpoCMaB6mMVKo9VNPqoylTM + AbFUZY5eDQ9SDY9RHcKrs1JZTWGnxUL3GRWw9PJYeHnqFI50CHbuXFYdDoUznhPxZfmN5XwBlBf55D3l + G4CGUxCAJ4KKjUGTQAjTIEwCYGw21ao0h1RBImjJGAggbKzaClffyheBEwP/54CweF2d1hm2c/t21wWk + NYCioqOf6ZZwAfkaFQJoAztWalPA1as31s7Oyf+DMs9WXUfbdxHAE7VGA3KBmqPwAOOc63fx3wmA4ofA + NLHCA5jNY4DFVeD5R4Fw2O9E0MQXg7YdqKQJFJycYBBJZYpQDi3YDkBlsgqepQrrEFXwHNUQQlXm7JUk + yEa8f0PCE4SXF0S6yJY1O5eOZYcAwezziCbZw9uVqzsRAUy08gK/t3z9SVYBEVRsMMUqIoKKjUBj0GSK + VUIElZrKG0yF/CkPCgARVG7BflClBSRLDC0DUUzhe7M/hJLHFZpPsead+9m+PflUAJkB7Mz+5ty585/+ + nuv/6gJQAeQN6NcsvTOBtu3c2UOrTjnZ2VajyWD7ngRQw4M8QRkXDggBbCsmKgS4jJhcoDxJkeCSI+UG + gp5/AGTQJFLaV0HeQxBZQvDYjRKNxIMQGCvx2AFRVUIclZR4ShhM1SoTgqoorMjaIbsCZAcoD+mOWJFO + PHdWTWx30DYoLziSEbRCG7+vXN3xbE/wEDGR90MADSYhAEBhrGIjxAAqIYLKAkKo3HQykAA8EYQAmYEI + HhzZT5W1cstg1Lb3uFyj8RadOMwtAikB3L5959dc+181AJf1CxKB1gB27txZemcCsdo0V1efXr1moz1Z + s799v/pwyB9hZXD/ZQgDTzI+iUcoQy7gBOAyYw6ySA0AAbI4Z3WB5QWu1llg2OvDXlvyHggJd+2A667g + IEHhMRBDAE8UEgdC0ftAsLPkAHosch3hWDRxvZysW99dgGRHNKIOyC4n8iVu//ny9Xg+YgLvPx4wNpjo + icBHJcRQqdEkROCjCQRKDCFBSBTAiSIMEoUTBs8153+b+6MetyC81h9hfTPGuMvBSgDMyL64e/cuDuCz + kAAUArggtK1atapDqYWArOycg7oH/dSZJICV+jnyn6w92gPEP0koEEoSpJIkKUiWSlys72qd5YXBueA/ + gnpy1R7KMxUrF4EI6suV+yBhk5VXRGwV5UUkJhFbG1ddB7JDCCO8NqQza3HEgrIIuay/7Qh3gtDIc/zG + coi8HK8pV2cs4hjnUAEhVIjwRVAfj9BgAt/BQ6WGEz0ghABOEE0egvMQD6GZxCEBTGQETgyEoYhBNmHK + bHdLOM0AOBXsD9yn+XORLqsXtP3WW299Nm3atMqlIgBdCpaO01cLDxywtIHT7TsVB0I2rr8mkBDAE3iE + MhyksnKVDpoqlbjTwK06iwNllU2Hw+0Pc8Ph2yo5U3TyIItGCGw7N85zzsJBBcRTQYKqBXG1IKoW5Glb + JLvtAHouHGMgGHJFsiM6IHuMlXek+/t9EWhfeURQAWF4IvARMc4qIoaKeIWKDcZbJYnAAREITgyg8bfj + EWFIKE0hv+kED4iifES6LVq81J0KrhnAnj17P/v4Zx99JdcfCEDegKXh0lsEWrZsWfmsrJx/KOA6tB0T + xuEBhjrCH0YZZ0XMBHCnHgKS2dZ+H2VqkShCTFmg0W3ruWB0r5OlIqI6zLcdEAej9jnoeR+BdYvgsjXw + QjUgrAbE1fQRTnawryavAWVJYB9GOfY5+IIoi9D1muBxeQThicBH3TGIAEH4qOgLoYJGiQGExNCQ7YaI + otFDaMxjB4kjGMOE0gSvgiCqNu5jmzZtcqeCMy23g4cOf8oU8BuRr1vBCRIAF+8svUWgrVt3dpC72Z1L + e1bLIfY9J4BhHqqBqkPxAiMhkmSQg+0JQaQGBGt/OHhNzQDkEA88p//xBFC2VjgkEA/lHGTVJShbfZSV + QZRlq48AEBbACSIcPMd3fRT8H57MwRE+AhF4Y9kavC8op314vvK1hVEIQEAMoIJE4KMiQhCcIBCBQ33Q + AEE4SBAl0OOKCKMiCZ7E4W0/KpLyeJH6rfrY7pxs1wWkGcCp02c+FflcECIEJYG07ZfeIhBdQGNUc964 + cQtur599v8oQiA8w2G2XwZrK4Ea9pNCHHjvoOaDXBICUMliqJwTEEQaRXKYmAnJATA8A1+2sm1H7q/Me + VYd5QIxlqkFWVR9OEKAaJAoSR2jbf869Ztij8EnXc2X0vB7X9ERQvpaACJwYEIGDJwQP3yKGCPY5IIr6 + YZAgEIcTRsOwUdsSQiAOtssgsDZd0t0VwZUAbmMGcOXKM7+T++cCUE4AgRegY7v0LgeH0nbso+gwb/4K + +36lvlg8pFcdFMKTiv8hcn3SHyAbkkS2SHeWiuuFREd+Dciv4Y/hImBfWQficzDq//h/ke7GquQfVQY7 + lKkytEQIgSD80QkCcZTlsRsdhvoYErY91MqxvxyEB9DrSh4jAHkCvITzBs4jBGKQCB71DJ4gRuEd5CU8 + VKw3xqGCEAijPtvhwtC2Lw6NwhM1h1m35MGsAXA3EM0Atmd98eJLL30mDyABBCKgMUQzgNJbBOKMk+sF + XIBw8IhZ9p1yafYEB/yJKgjAAQJwt45YR7JPdLDtCC8hvowIDazeEe9BJLuxOs+L4GoQXE1E89hthwHi + y1TBMvFET1YexChIBAHwSDxXpuq/DJ4YHhRCiUA8oYSLohyCDwkhEEO4VwgPEy5UIAwHP2w4ITwoigr1 + EAoICSLkMXyR4CV+UK2fDR42wU0BnQB25fz+/v37n8vqf/3rXzsBaJtbwny9YMGC0lkEGjx48v/atSv7 + owMsAcclTrD/94l0+x6zgO8DjT/A8p6AkCeqMg2EJJGt0YMvDGfxgUX7ZENsGZEr4rUN2WX0//ofikyO + cN6zrLZ5/wCy9Ccre0Q760cAAR4UQbgg/si2BOKLpizbD0MCEvllQt4iXAyIQEIIiWG4lQ/zDF6YCAsX + zjv4eEQMJd5BHkJCeBjKI56okWozZs4NbgipC0L+jku/fSniJQBB3uDOnTuld0+gNWs2NGa58as9e/Mt + NWOOVWswyKo3GGhV6g6wSrUHWqV6I8gLFA8VY4fZkySET1QeYt+vPNR+UHkEAhllP6g0ktAxAsGACiPs + u0J5b9Tj71UYFsL32XaoSHKpZBM86UDOUQmPU2mgQzjx37Zd5gFheF7Cve4Rb/GgOMoS3krwkCgeEkLZ + 6oFneFQMzkO4nAFhPCAGXxQPiCHMOwReIsxblEcU5VR3qJUk187iD1cDz8mTED79+OOPvxHxzAQcJADd + vaXUFoG2bt2RppYjIZf70WRzObLtO3bY1m07bPPWndykKJtr1O20teu22opVm23x0g22YPEmm7dws81d + uI3Ll2y2iVxDcOT4lTZ41HLrP3y5pQ1Zbn0GrbTk9MUWlzzXOiXMtMjo6da683Rr0XG6NW8/1Rq1mmB1 + moy2mg1HWtV6wxHbEKtYcwhWNtjKVUUAlTLsiQpUJMv1s++V9VGmn333SSHdwxPBY0Y9V6Y/rwXlhAyH + 75fPsB9UGGA/qDggJK4nKktggch8gThh+IL4ViE8FCZqkEcE8IUQEkS4KGojCB/lQqEiPGR426pF1GjQ + y3b4i0CaAXB21j+Fky8BKAScOHGi9C4HR615RSAAjSo+5O7Oc9ej1cxAPWk6NamAIhGnJrnLlRYXF3PD + wqOms4dOnz5l586e4dq15+zSxQt25fJFu8qFpa9fu2I3rj/jcJ0LTd5wuO5wHej+w1yF3M6cvWAnTp2z + 4mNn7UjxaTtw8ASfWcyZsIW2Ycs+W7Nujy1fnWeLl2XbnKd2UKncYqMnrrWho1ZbxtCVlj54mfXqt8i6 + p8y36O5zrCNCa9NlmrXsOMWatZtoDVuOtbo0t9RsOMKqIbQqdYYhtqFWviZCqybPIWF4AnFCARLN98oP + CInoe8FjnvueXoeH+gHe6gd4HOEJQtYTylcQ0JMKKf7MIjS7cDMML6EMAVGUE3xRPMkMplGrZLcIpDaw + bdt2fU0b2Kdy/yr7BtDj/Pz80lkEUgVw586sk1m7ckk4cnX26QPQUqQE4cTAFarz9xRQoDjAKhT3rT3A + uQO0jx8+UmxHio5Z8dETNC6espMnziCKc3b2zHk7d/6iI/nipSt26fI1SL9uz1y9Ydeu37QbN25xg+Pn + THciufXcbXtO4J4E3AnbdHOKF55/wWiDcnjRgX3gxRfZdtDj2w7PP/8c/3fLnr11k/e84QR37do1u3z5 + MsK8iMjO28lTZ7nl3Wnmzyf47scsN/+w7cgq5E7c+2zthj22MjPPlqzItXmLdti02Vts/JT1NmJcJl5t + jWUMX219By63pLRFFtdrvnXpNsvax86wtlEzrDVt3M07TLFGrSdY3RbjrFaTMVa90Wir2mC0VanPjEAE + 11adgaS2BqGOsCKRPOHjB4w/IKz+L7xVl7gMZgCcCOrWALK+4J6AvwsXgDzAz372M6N1r3QWgVQBLCg4 + +N7hQ8XEG25GqNuRUYLkzCAXh0S2Rj1Wc4KI31/AbUt53YHCI2SrRab/lQC4oJQdPXbCjh0/7UTANYa5 + msV5rml3ESFcsqcvXKF6hRAuiZjrdlliuHbjnweCkWiuXMVrgKtXtF3yWKLSe13miuaXEZmEdvnKVX9b + 41X2eePlyxLiFTdeRpRuxBN542UnmMuXL4WNbHOVtEvChfOI+ZydP3cWcUvkXD/pFL/15EnEf4zjUMRx + OcKVvDiRI58y7m5a63L2c4JtHl4sx5at3sn1fnfY/MXb8GTbbNrczTZu6lobPn61DRhJyBy82Jav3Kjm + j6AN7PcsAv1BIUDTPkECICk0rgVQOvcEmjJlSgSnHP+iuKgYonDhXBNQrvn69RtY0i0sU5aFhckCX3zR + XuG+gVyOVvemt3v33rB7b7zBiQn37Y37b9p9H2+++Za9+dbb4B1vfPNtu88+vebeG8J9e/0euPuGvQZe + fe2u3Xn1NXv5lVft5Zfu2AvcnPJ57lD6/Asv2u3nX7Tnnn0BL/G83cBbyGtcv34L0dwMCSdcAJcuXcXb + CJ7YLiC6CxcuI0ABIZ67aGfPXeC3XnBeQQI9feYcZHrjKTzXqdNnnbeQiI87nHaiPoZ3cwI/xoi3k8cr + RvQ6jb4YaHQoOurBecYib+Q8iyK3LRxxYVT3/jlyBHAf4AAyMp0FlIvH5USQ37399ttfyvUHApAYtDI4 + efLkUrsn0N9MmzanDnPKkQMzBt5OSeltffukWXp6PxuQMcCGDB5iI4aPsDGjx9iECRNtypSpNnPGTJs3 + b54tWrTIli9brvPSqCBudFeyysmmjz2f05gpZOgHyzrOcpmZCxfIDbBKTmJwgmIhIyQkmh0RyZvGj9X8 + 1imca97ZRx99ZD8FH330sYePP7aPP/4ZLvDn9rOf/9KNevzRTz7m9R/Zhz/+qX344Y/t/Q8+tPff/9De + ffd9e+ed95wI799/C8Het9deu8fn3rVX7rxqL77sCe32bQnsthPXNYQlLyNPIhF54vFEc8YJxBOGEwGQ + COT5ivCACoXyhgfxBAcKAd5AYbKgQPf4OYgXxbPu1Q2fueEjoZQs3vIovuXn0/otEPdFvsKtcjHyrn/8 + yU9+/LXIl9sXJAB6A0r3cnDhy4l/+7d/27lr15g9UVFRH3bpEvObLp2jfte5Y9TXUV1irGuXaOMx6Gqd + OwXowvYfAa/r2iXKoqNiQKzFxsRZXFyCxccnWLdu3ax7956WlJRsvXr1ttTUvogu3TIQ3aBBg23o0GE2 + csRIGzNmrE2aNMmmTp1mM2fOQnjzbdHCxbYM4a1etVot0cTDrZw4uYPGyVxWzvZx8AtNHu24S1CVnJ7H + jV8m77ju8g3lFMyjEcNreKJ7zoOxtIoA30E07yGgD5yQOOcOMQofIKj3Hd57T3jPQa+Xt9P/631exYvd + QVgvv/QK+YqE9bz7vBvkO1cJTwpDJHUuJ+FSr3w3iQnPgldxngSv4QREos3v+Ibv/0/h5EsAygcwqtK9 + HNy3rSc/+eSTf9+sWbPvN27cuEqrVu0btm/fuV0X/69z586xXbpEp8fExIyNiYqZHRMVt0iIjo5dHRMT + uysuJu5IXGzc+biY+MuxsbFX2Hc7NjrujdjY+A/Br2Ji4j4Bv4mNif8d41fx8d0QhY+4bk4kIcR627Ea + Af/vtjUGr3H/m9DNEhy6I64eDj26J1rPnkmIrJclI7KUlFQntD54uL5p/axf/wE2YOAgGzx4qA0bNtxG + ILjReLqxY8c7bzcZbzd9+gybNWu2zZ07z556ahGxd6ktX76CufpqW5u51jZs2KiEjK6dHSTPu1hM2217 + SJZVVdXSOrdvQYxFoRnTGfKGc1x57QKivIhXvHTxol1GFFfIPa6Sh1zDS14neb3GDbq5RO+XQdJHLQBv + 97HLATgRJLdUegD+nd/kv0pUkZGR36lQocJ3A3G1bdu2fqdOnVp36hTVSfrq1KlrHKJIi45OGA3BM+Li + ui+E1EVgdVJSUlaPHokHExOTziQlpV5OTOx1JSmpN2Er9V5KSh/WxtN+npqa/knfvv1+07dv/9+lpWd8 + mTFgkA0YMNgGDhzioO0MMMBtA41/BO51vEZjgP4Zg6x/f5AxEAGFod8APJiQ4ZCW1t8heByM/fplWD9e + 21/i470GDhyMxxtiQ4YMxesNt+HDRiDEUTZy5GgnRO4L9I28gPIAeQCJAKGV3iLQv7MI/lQf918R1N8R + tv5nRETEd5s0afIDRFUF7xPBNLcl6IgwuvRI6h0zfvzk/EVPLSWULLQ5cxdg2Qts9uz5hJe5Nm36LELN + TPKcGQ6TJ0+zSROn2oSJU2z8hMkexk+2ceMnOYwdN9HGjJ0AURNDGDNmAmFrAp5kvNs3bhyvDXt+7Bj+ + J+w1et2oUeMgfKzDiBFjbPjw0WAUghjJvjH0Bmz+RiFKK4GcG0D4W5b8pzqQf/Xvu3r52ugtm3dw1u32 + B7CZx5s3hWObbdq41Tau32Ib1m2x9es22/q1m7hg0yaS3g22evV6W8n1e1esWOOwfNlqW7p4pS1euJwc + ZZktXrz0G8jfOXDg0FVDh4/aAan7h48YfRyyL7B9FWJvY+V3Gd+F+J+CX/Hcb0eOHPcp218E4pFYJIg5 + c+a74pmSZRL2Jn/1RP2pfuCcOYvqrFm9/ksRKUK/HSLbB8RveAAIYsMWJwwPEglALBKMsHnTNhLSHMvM + zPznlmv/C7/zb9u1a/c/+vXr9x1yqicSEnpVTk7uW7fvyJFNCTXtuFxP5/79B8anpw/qw/Zwkt4peLT/ + /qc6Pn/176uDt2L52p+uWb3BHgGWLet+GJnsexAbefzHsYbntm3dpkpewV/9Af1L/IFLl6y8uQr3/SjW + su8hrOLxH8Fq9n8b9L4bN26WAD7Eav/uL/EY/VV/Z2oIuStXriGG/4lATrBmzXoJgHCxod1f9cH8S/xx + ixYtmfonIz9MVNu2baM6um3hX+Ix+qv+zvPnL4r7UwtgxYrVmr5RINp+86/6YP4l/rjx46dXXbZs5Wd/ + ShFIAJmZ61Wi/ow1k1JbuPlLPN5/dt+Z6dbfU879yZ9SAHrvVavWyAPoJI8hf3YH4T/yFyIz//6iRct+ + ixegqvavwSr+bxVrAv//0HsrDJAHHPqPfLz/7H77kSPH27LS9rWWqo8do4mlWOv3xSzcqMHlEIstdDtx + kux+2uC0upjP4k5eHufq0xmlW7ZkZ6trKluXbsXCsyCY/smtVBa3bLPNmykGcY/fTZxgs2HDJrdSiRf4 + 4PF08M9IBp988su8f/gH9dd/C36rs29+7fDJJ+DXv2IN/pcOv/rVL1iUEX5mP//FxyzOfMTijPoWfkw/ + wofU6T+0Dz9g2fgDLRe/yzLye65NjdXCz+ifKJ2zeP+MjuNf5FchMetzqPDIl9wSl2XaYyzTnrCTdPqc + 5u5oavg4R6fQBdbrL11Ua9hVu3r1GsuzN2gWuenW9tXMol5F1x3Fun+or0AdUjS2cBKHveWaW95y/QM3 + aYAhB/jHuXPnlv2LPGB/4V+a26hX+dvUqNT/GROTUie975DVAzNGfDVk0GgbOniMw7AhY234UFbhho0D + 3J9n+AQbNYLVvJGs2o2abGNHs/o3ltXAsdNswnitDrJKOIkVw8msHHIO//Rpc2zG9Lk2a8Z8mz1rgc2Z + /RQrjItt/rwltmD+UhcOHoeAf52K/qvi5sqVK78zc+aicosWrai1csnKJmtXZUWuXLo+bvmSzD5Ll2aO + WLFs3fQlS9YsXrRg2Yan5i/b/dSCZUUL5q+8OHv2oltzZi56bdbMp96dNXP+z2dOn//5LK68PWP6PEib + Z9OmznUETpk8G0JnQexMmzRhhk0YN90mQPa4MVNtHNfpkwAkhNEjJyGMiTZq+EQbyalbEsuIoeNt+JBx + TkRDB4NBY0ziEgYNoJsJEXEnLyWBZ/51h+A/0H8dOHAyYm9+wcnNm7OubN2883mSqXus2L3PIsyvVq1c + 948rlq/5w/Jla75ZuZwlWB8rV6ier3q8Fms22rpMrdxphY5kzC3tatl3p23dIuxy2MYtcAJsZdvBf65k + 5GQY/s+B99D7bNqw3TYKvPeGdcJWVgy38JnCZj5f2OSgxSAtKKlHUl1C9EuO/Q9E5b/up165cq2XuoFf + fulV4uprrnlTTZzqPH79Lv127HuBPjv11+k8A/XSqSU9L28/Z9Jw5hJLtBKD1uPnznmKxlVZuSx8BtY9 + vQSTpmP5M53r1mtmz5rvue05C0OYN3ehzcONy4UvXrTCli1dxZp/JkJbRz/ARoSwGVFsdZn/9m1ZzAay + 3JVVBc0OBJ1dJfKx/veHDRv23X/dUfkP9F9c7KD8M89c/+jFF+/Qek7bOe3i6uR95x2yaZoz1SEctEap + Ly44UVLbQbuUGjnVBfwGred6n+uI5TznIxwtPsHZNgcgKset8y9CJFOnzsK1T6TrZpQNHjjChg5RP+B4 + RDMTES3Fajc5Infv1ulynDTDwo4aT7OyBBH+zwP3f3/t2rUt/gPR+G/7qbSMV7t06VabGzeejaNVO4MM + e/K9e/eW3r//3vZ33nnnMJ24l8FL4F3wS+6V9+mPfvTe117X7gd+x67XuRu0hL+NgN588x1E8Raiuo93 + uUvr9y1auI+SoG1zrWETafkaR3vX1Kkz1Mnj5vI6OaOYS+brFLiD7oLNec6iA+JJ7P4J/JQp3itY+QX2 + 50P4clb/xunizTSDtHo89/+36eGP/je19b/l5IjvIIJKnF/QkPMK2nPN3J5vvPHDoYSNWUzFVr/++v3c + u3ffOMHrrr/88t3XXnrpzofPPffSb5599vnf60QSTQO3bNlhC+kPnDRpmuvfUw/g3Lnzv1y7dt1vaTH/ + ERdhvH3w4MGT3JBpO9fjmw+5Q4nnsZwH0ZTvUGHo0KH/gy/5N3+in/n4bUvjCGCZ/43w8l0uqFTp/Pkr + ERcvXo3kvMWeeXmHB69ZtWH6jBlz5o4bN2Hu8OFjZowaNWEgl12L5vTsBt5Fs7IeN3OUBgmP3+PxEXh8 + BB4fgcdH4PEReHwEHh+Bx0fg8RF4fAQeH4HHR+DP4Qj8f8GFWomFxJiTAAAAAElFTkSuQmCC @@ -580,24 +590,25 @@ - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - vAAADrwBlbxySQAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTFH80I3AAABpElEQVQ4T52T - QUsCURSF33+SDAUxRAyEwQiEksiFUJEMhGEDOcQgRi2UGJBgCkFIZDDbGEGWEsTMItBNrdu3ad3y1Hmk - VNosvHC4l3u+A2/ezIi/5fP58D1OlJf3qzRNmwCn7TzrZ8AzfGk3kM1mkcvlUCgUUCqVUKlUUK1WwSDF - mTt6ZMgyw6zIZDIYDAYziVmRTqfhui5WDhoI7VxAMa6xdvKIDWsgxZk7emTIRiIR2ZkVqVQKvV4Pc1vn - +OI9RYas4ziyMyuSySQ6nQ7mt2s4unuH6XxMFT0yZHkCdmZFIpFAs9lEUK1Drb9g82wIrfWK4s2bFGfu - 6JEh2+12ZWdWxONxWJYln3HddBDVWlNFjwxZnoCdWRGNRlEul7Gw20Tm9Amr5YepokeGbLvdlp1ZEQ6H - YRgGInl7fPP/iQzZkZgVwWAQ+XweS3s1LO5fyVe2fHiL5PG9FGfu6JEhOxKzwu/3Q1VV6LoO0zRh2zb6 - /f74Y+HMHT0yZEdiVhQNXQ6BQAChUEheUCwWkxekKIoUZ+7okSHLDLPyf3geuphFQgjxCdiQMGrYYwVf - AAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAOuAAA + DrgBakH1WwAAAa9JREFUOE+dk0FrGlEUhd9/kloUxCBiQRBLQUglxIXQlspAMdiBKmEIlmahhAEJmBII + NMiQ2I0hEBOlUMZFwWzadffZdN3lab8HE1pjXEQ43Os539HxzWjMwisWi2nRi96vyv7ruK5750OWefd9 + kfX/LawsnwbHqtVqqtfrajabarfb6na76vV6oojY8chgYOnQNdVqVfP5/EGiayqVimazmda3j5V680kF + 70wbe1/1oj+3Yscjg4HNZDJ20jXlclmTyUSPXn3UX36lYGDDMLSTrimVShqNRnr8+lAfLn/JD38vFRkM + LFfApGuKxaIGg4GSzpGcox96eXAt9+Snds5vrNjxyGBgx+OxnXRNPp9Xv9+3v3HTD5V1T5aKDAaWK2DS + NdlsVp1OR2tbA1X3v+l558tSkcHADodDO+madDotz/OUaQS3Jx/dgcUJAxuJrkkmk2o0Gnr69lBP3n22 + t+zZ+wuVdq+s2PHIYGAj0TXxeFyO46jVasn3fQVBoOl0evtgseORwcBGomt2vJZYEomEUqmUPaBcLmcP + qFAoWLHjkcHA0qFr/zjfr2d6iOj+AdiQMGoJxWWRAAAAAElFTkSuQmCC - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAQ - SgAAEEoBNcinnwAAAHBJREFUOE/NkOEKACEIg330e/NOA2PqTqL+XPBpbcMokUfGFUy0xTrFitogNHgG - qUJDzs58ERpydua1/OwJiv967hQr4QkfaHJSPDzYICR4OwOOsOK3+c2Oh/I5QMUEDijD1gbMEiKZpaF5 - BBW3kfECg6SiSi9TP3UAAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAQRgAA + EEYB7r8o6AAAAHVJREFUOE/NkuEKwCAIhN2b781bGsZlarH9aIEEcX2eVxfdVOjTYoCpUhef2d3qWnMR + AoTEkV9OMwEMdQTwsxGc9PU19l7BS5qhNVyuOXS4wFlgoXgL4FoMHHUtfqTIgZ6HGaw6I2CCDXMmGagu + BaycvB4hAz9wYIvatCqJLwAAAABJRU5ErkJggg== diff --git a/BizHawk.Client.EmuHawk/Program.cs b/BizHawk.Client.EmuHawk/Program.cs index 96c37c97c6..3160d4e98b 100644 --- a/BizHawk.Client.EmuHawk/Program.cs +++ b/BizHawk.Client.EmuHawk/Program.cs @@ -19,6 +19,37 @@ namespace BizHawk.Client.EmuHawk { //http://www.codeproject.com/Articles/310675/AppDomain-AssemblyResolve-Event-Tips #if WINDOWS + //try loading libraries we know we'll need + //something in the winforms, etc. code below will cause .net to popup a missing msvcr100.dll in case that one's missing + //but oddly it lets us proceed and we'll then catch it here + var d3dx9 = Win32.LoadLibrary("d3dx9_43.dll"); + var vc2015 = Win32.LoadLibrary("vcruntime140.dll"); + var vc2010 = Win32.LoadLibrary("msvcr100.dll"); //TODO - check version? + var vc2010p = Win32.LoadLibrary("msvcp100.dll"); + bool fail = false; + fail |= d3dx9 == IntPtr.Zero; + fail |= vc2015 == IntPtr.Zero; + fail |= vc2010 == IntPtr.Zero; + fail |= vc2010p == IntPtr.Zero; + if (fail) + { + var sw = new System.IO.StringWriter(); + sw.WriteLine("[ OK ] .Net 4.0 (You couldn't even get here without it)"); + sw.WriteLine("[{0}] Direct3d 9", d3dx9 == IntPtr.Zero ? "FAIL" : " OK "); + sw.WriteLine("[{0}] Visual C++ 2010 SP1 Runtime", (vc2010 == IntPtr.Zero || vc2010p == IntPtr.Zero) ? "FAIL" : " OK "); + sw.WriteLine("[{0}] Visual C++ 2015 Runtime", (vc2015 == IntPtr.Zero) ? "FAIL" : " OK "); + var str = sw.ToString(); + var box = new BizHawk.Client.EmuHawk.CustomControls.PrereqsAlert(); + box.textBox1.Text = str; + box.ShowDialog(); + System.Diagnostics.Process.GetCurrentProcess().Kill(); + } + + Win32.FreeLibrary(d3dx9); + Win32.FreeLibrary(vc2015); + Win32.FreeLibrary(vc2010); + Win32.FreeLibrary(vc2010p); + // this will look in subdirectory "dll" to load pinvoked stuff string dllDir = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "dll"); SetDllDirectory(dllDir); @@ -30,18 +61,29 @@ namespace BizHawk.Client.EmuHawk //in case assembly resolution fails, such as if we moved them into the dll subdiretory, this event handler can reroute to them AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); + #endif } [STAThread] - static void Main(string[] args) + static int Main(string[] args) { - SubMain(args); + return SubMain(args); + } + + private static class Win32 + { + [DllImport("kernel32.dll")] + public static extern IntPtr LoadLibrary(string dllToLoad); + [DllImport("kernel32.dll")] + public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName); + [DllImport("kernel32.dll")] + public static extern bool FreeLibrary(IntPtr hModule); } //NoInlining should keep this code from getting jammed into Main() which would create dependencies on types which havent been setup by the resolver yet... or something like that [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)] - static void SubMain(string[] args) + static int SubMain(string[] args) { // this check has to be done VERY early. i stepped through a debug build with wrong .dll versions purposely used, // and there was a TypeLoadException before the first line of SubMain was reached (some static ColorType init?) @@ -55,7 +97,7 @@ namespace BizHawk.Client.EmuHawk if (thisversion != utilversion || thisversion != emulversion) { MessageBox.Show("Conflicting revisions found! Don't mix .dll versions!"); - return; + return -1; } } @@ -138,7 +180,7 @@ namespace BizHawk.Client.EmuHawk mf.Show(); mf.Text = title; - mf.ProgramRunLoop(); + GlobalWin.ExitCode = mf.ProgramRunLoop(); } } } @@ -169,13 +211,13 @@ namespace BizHawk.Client.EmuHawk if (System.Diagnostics.Debugger.IsAttached) { - mf.ProgramRunLoop(); + GlobalWin.ExitCode = mf.ProgramRunLoop(); } else { try { - mf.ProgramRunLoop(); + GlobalWin.ExitCode = mf.ProgramRunLoop(); } catch (Exception e) { @@ -227,6 +269,8 @@ namespace BizHawk.Client.EmuHawk // GlobalWin.GL.Dispose(); //((IDisposable)GlobalWin.IGL_GL).Dispose(); + //return 0 assuming things have gone well, non-zero values could be used as error codes or for scripting purposes + return GlobalWin.ExitCode; } //SubMain //declared here instead of a more usual place to avoid dependencies on the more usual place @@ -241,25 +285,6 @@ namespace BizHawk.Client.EmuHawk DeleteFileW(path + ":Zone.Identifier"); } - //for debugging purposes, this is provided. when we're satisfied everyone understands whats going on, we'll get rid of this - [DllImportAttribute("kernel32.dll", EntryPoint = "CreateFileW")] - public static extern IntPtr CreateFileW([InAttribute()] [MarshalAsAttribute(UnmanagedType.LPWStr)] string lpFileName, int dwDesiredAccess, int dwShareMode, [InAttribute()] int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, [InAttribute()] int hTemplateFile); - static void ApplyMOTW(string path) - { - int generic_write = 0x40000000; - int file_share_write = 2; - int create_always = 2; - var adsHandle = CreateFileW(path + ":Zone.Identifier", generic_write, file_share_write, 0, create_always, 0, 0); - using (var sfh = new Microsoft.Win32.SafeHandles.SafeFileHandle(adsHandle, true)) - { - var adsStream = new FileStream(sfh, FileAccess.Write); - StreamWriter sw = new StreamWriter(adsStream); - sw.Write("[ZoneTransfer]\r\nZoneId=3"); - sw.Flush(); - adsStream.Close(); - } - } - static void WhackAllMOTW(string dllDir) { var todo = new Queue(new[] { new DirectoryInfo(dllDir) }); @@ -319,7 +344,7 @@ namespace BizHawk.Client.EmuHawk var title = MainForm.Text; MainForm.Show(); MainForm.Text = title; - (MainForm as MainForm).ProgramRunLoop(); + GlobalWin.ExitCode = (MainForm as MainForm).ProgramRunLoop(); } } diff --git a/BizHawk.Client.EmuHawk/Throttle.cs b/BizHawk.Client.EmuHawk/Throttle.cs index ccc688004b..8ae8117998 100644 --- a/BizHawk.Client.EmuHawk/Throttle.cs +++ b/BizHawk.Client.EmuHawk/Throttle.cs @@ -58,7 +58,7 @@ namespace BizHawk.Client.EmuHawk //notably, if we're frame-advancing, we should be paused. if (signal_paused && !signal_continuousframeAdvancing) { - Console.WriteLine("THE THING: {0} {1}", signal_paused ,signal_continuousframeAdvancing); + //Console.WriteLine("THE THING: {0} {1}", signal_paused ,signal_continuousframeAdvancing); skipnextframe = false; framesskipped = 0; framestoskip = 0; diff --git a/BizHawk.Client.EmuHawk/config/PSX/PSXOptions.Designer.cs b/BizHawk.Client.EmuHawk/config/PSX/PSXOptions.Designer.cs index c4ea108b5c..873f3d9a5d 100644 --- a/BizHawk.Client.EmuHawk/config/PSX/PSXOptions.Designer.cs +++ b/BizHawk.Client.EmuHawk/config/PSX/PSXOptions.Designer.cs @@ -64,6 +64,8 @@ this.groupBox4 = new System.Windows.Forms.GroupBox(); this.groupBox5 = new System.Windows.Forms.GroupBox(); this.cbLEC = new System.Windows.Forms.CheckBox(); + this.cbGpuLag = new System.Windows.Forms.CheckBox(); + this.groupBox6 = new System.Windows.Forms.GroupBox(); this.groupBox1.SuspendLayout(); this.groupBox2.SuspendLayout(); this.groupBox3.SuspendLayout(); @@ -73,6 +75,7 @@ ((System.ComponentModel.ISupportInitialize)(this.NTSC_FirstLineNumeric)).BeginInit(); this.groupBox4.SuspendLayout(); this.groupBox5.SuspendLayout(); + this.groupBox6.SuspendLayout(); this.SuspendLayout(); // // btnCancel @@ -454,10 +457,10 @@ this.groupBox5.Controls.Add(this.cbLEC); this.groupBox5.Location = new System.Drawing.Point(12, 306); this.groupBox5.Name = "groupBox5"; - this.groupBox5.Size = new System.Drawing.Size(299, 85); + this.groupBox5.Size = new System.Drawing.Size(238, 85); this.groupBox5.TabIndex = 47; this.groupBox5.TabStop = false; - this.groupBox5.Text = "Emulation"; + this.groupBox5.Text = "Emulation Sync Settings"; // // cbLEC // @@ -469,6 +472,28 @@ this.cbLEC.Text = "Emulate Sector Error Correction\r\n(usually unneeded; breaks some patches)"; this.cbLEC.UseVisualStyleBackColor = true; // + // cbGpuLag + // + this.cbGpuLag.AutoSize = true; + this.cbGpuLag.Location = new System.Drawing.Point(16, 19); + this.cbGpuLag.Name = "cbGpuLag"; + this.cbGpuLag.Size = new System.Drawing.Size(181, 17); + this.cbGpuLag.TabIndex = 1; + this.cbGpuLag.Text = "Determine Lag from GPU Frames"; + this.cbGpuLag.UseVisualStyleBackColor = true; + // + // groupBox6 + // + this.groupBox6.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBox6.Controls.Add(this.cbGpuLag); + this.groupBox6.Location = new System.Drawing.Point(264, 308); + this.groupBox6.Name = "groupBox6"; + this.groupBox6.Size = new System.Drawing.Size(238, 85); + this.groupBox6.TabIndex = 48; + this.groupBox6.TabStop = false; + this.groupBox6.Text = "Emulation User Settings"; + // // PSXOptions // this.AcceptButton = this.btnOk; @@ -476,6 +501,7 @@ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.btnCancel; this.ClientSize = new System.Drawing.Size(713, 405); + this.Controls.Add(this.groupBox6); this.Controls.Add(this.groupBox5); this.Controls.Add(this.groupBox4); this.Controls.Add(this.groupBox2); @@ -501,6 +527,8 @@ this.groupBox4.PerformLayout(); this.groupBox5.ResumeLayout(false); this.groupBox5.PerformLayout(); + this.groupBox6.ResumeLayout(false); + this.groupBox6.PerformLayout(); this.ResumeLayout(false); } @@ -541,5 +569,7 @@ private System.Windows.Forms.RadioButton rbBob; private System.Windows.Forms.GroupBox groupBox5; private System.Windows.Forms.CheckBox cbLEC; + private System.Windows.Forms.CheckBox cbGpuLag; + private System.Windows.Forms.GroupBox groupBox6; } } \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/PSX/PSXOptions.cs b/BizHawk.Client.EmuHawk/config/PSX/PSXOptions.cs index fea6e3a3b9..5650ac92b5 100644 --- a/BizHawk.Client.EmuHawk/config/PSX/PSXOptions.cs +++ b/BizHawk.Client.EmuHawk/config/PSX/PSXOptions.cs @@ -42,6 +42,7 @@ namespace BizHawk.Client.EmuHawk rbClipToFramebuffer.Checked = _settings.HorizontalClipping == Octoshock.eHorizontalClipping.Framebuffer; cbLEC.Checked = _syncSettings.EnableLEC; + cbGpuLag.Checked = _settings.GPULag; rbWeave.Checked = _settings.DeinterlaceMode == Octoshock.eDeinterlaceMode.Weave; rbBob.Checked = _settings.DeinterlaceMode == Octoshock.eDeinterlaceMode.Bob; @@ -98,6 +99,8 @@ namespace BizHawk.Client.EmuHawk settings.ScanlineStart_PAL = (int)PAL_FirstLineNumeric.Value; settings.ScanlineEnd_PAL = (int)PAL_LastLineNumeric.Value; + settings.GPULag = cbGpuLag.Checked; + syncSettings.EnableLEC = cbLEC.Checked; } diff --git a/BizHawk.Client.EmuHawk/config/PathConfig.Designer.cs b/BizHawk.Client.EmuHawk/config/PathConfig.Designer.cs index 9c32d716cf..a6eb35f5ad 100644 --- a/BizHawk.Client.EmuHawk/config/PathConfig.Designer.cs +++ b/BizHawk.Client.EmuHawk/config/PathConfig.Designer.cs @@ -41,7 +41,7 @@ // Ok // this.Ok.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.Ok.Location = new System.Drawing.Point(471, 411); + this.Ok.Location = new System.Drawing.Point(616, 505); this.Ok.Name = "Ok"; this.Ok.Size = new System.Drawing.Size(75, 23); this.Ok.TabIndex = 0; @@ -53,7 +53,7 @@ // this.Cancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.Cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.Cancel.Location = new System.Drawing.Point(552, 411); + this.Cancel.Location = new System.Drawing.Point(697, 505); this.Cancel.Name = "Cancel"; this.Cancel.Size = new System.Drawing.Size(75, 23); this.Cancel.TabIndex = 1; @@ -70,13 +70,13 @@ this.PathTabControl.Multiline = true; this.PathTabControl.Name = "PathTabControl"; this.PathTabControl.SelectedIndex = 0; - this.PathTabControl.Size = new System.Drawing.Size(615, 364); + this.PathTabControl.Size = new System.Drawing.Size(760, 458); this.PathTabControl.TabIndex = 2; // // SaveBtn // this.SaveBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.SaveBtn.Location = new System.Drawing.Point(12, 411); + this.SaveBtn.Location = new System.Drawing.Point(12, 505); this.SaveBtn.Name = "SaveBtn"; this.SaveBtn.Size = new System.Drawing.Size(75, 23); this.SaveBtn.TabIndex = 3; @@ -88,7 +88,7 @@ // this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(527, 19); + this.label1.Location = new System.Drawing.Point(672, 19); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(97, 13); this.label1.TabIndex = 210; @@ -98,7 +98,7 @@ // this.SpecialCommandsBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.SpecialCommandsBtn.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Help; - this.SpecialCommandsBtn.Location = new System.Drawing.Point(496, 14); + this.SpecialCommandsBtn.Location = new System.Drawing.Point(641, 14); this.SpecialCommandsBtn.Name = "SpecialCommandsBtn"; this.SpecialCommandsBtn.Size = new System.Drawing.Size(26, 23); this.SpecialCommandsBtn.TabIndex = 209; @@ -119,7 +119,7 @@ // DefaultsBtn // this.DefaultsBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.DefaultsBtn.Location = new System.Drawing.Point(93, 411); + this.DefaultsBtn.Location = new System.Drawing.Point(93, 505); this.DefaultsBtn.Name = "DefaultsBtn"; this.DefaultsBtn.Size = new System.Drawing.Size(75, 23); this.DefaultsBtn.TabIndex = 211; @@ -133,7 +133,7 @@ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.Cancel; - this.ClientSize = new System.Drawing.Size(639, 446); + this.ClientSize = new System.Drawing.Size(784, 540); this.Controls.Add(this.DefaultsBtn); this.Controls.Add(this.label1); this.Controls.Add(this.SpecialCommandsBtn); diff --git a/BizHawk.Client.EmuHawk/config/SNES/SNESOptions.Designer.cs b/BizHawk.Client.EmuHawk/config/SNES/SNESOptions.Designer.cs index 72a0cdf142..5db62f8058 100644 --- a/BizHawk.Client.EmuHawk/config/SNES/SNESOptions.Designer.cs +++ b/BizHawk.Client.EmuHawk/config/SNES/SNESOptions.Designer.cs @@ -32,20 +32,22 @@ this.btnCancel = new System.Windows.Forms.Button(); this.rbCompatibility = new System.Windows.Forms.RadioButton(); this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.label2 = new System.Windows.Forms.Label(); this.rbAccuracy = new System.Windows.Forms.RadioButton(); this.rbPerformance = new System.Windows.Forms.RadioButton(); this.cbRingbuf = new System.Windows.Forms.CheckBox(); this.label1 = new System.Windows.Forms.Label(); this.cbDoubleSize = new System.Windows.Forms.CheckBox(); this.lblDoubleSize = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); + this.cbForceDeterminism = new System.Windows.Forms.CheckBox(); + this.label3 = new System.Windows.Forms.Label(); this.groupBox1.SuspendLayout(); this.SuspendLayout(); // // btnOk // this.btnOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnOk.Location = new System.Drawing.Point(136, 277); + this.btnOk.Location = new System.Drawing.Point(136, 344); this.btnOk.Name = "btnOk"; this.btnOk.Size = new System.Drawing.Size(75, 23); this.btnOk.TabIndex = 0; @@ -57,7 +59,7 @@ // this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.btnCancel.Location = new System.Drawing.Point(217, 277); + this.btnCancel.Location = new System.Drawing.Point(217, 344); this.btnCancel.Name = "btnCancel"; this.btnCancel.Size = new System.Drawing.Size(75, 23); this.btnCancel.TabIndex = 1; @@ -89,6 +91,14 @@ this.groupBox1.TabStop = false; this.groupBox1.Text = "Core Selection"; // + // label2 + // + this.label2.Location = new System.Drawing.Point(72, 85); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(136, 21); + this.label2.TabIndex = 8; + this.label2.Text = "NOT SUPPORTED YET!"; + // // rbAccuracy // this.rbAccuracy.AutoSize = true; @@ -152,13 +162,25 @@ "orce the SNES output to stay double-size always. NOTE: The Accuracy core runs as" + " if this is selected.\r\n"; // - // label2 + // cbForceDeterminism // - this.label2.Location = new System.Drawing.Point(72, 85); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(136, 21); - this.label2.TabIndex = 8; - this.label2.Text = "NOT SUPPORTED YET!"; + this.cbForceDeterminism.AutoSize = true; + this.cbForceDeterminism.Location = new System.Drawing.Point(19, 271); + this.cbForceDeterminism.Name = "cbForceDeterminism"; + this.cbForceDeterminism.Size = new System.Drawing.Size(113, 17); + this.cbForceDeterminism.TabIndex = 8; + this.cbForceDeterminism.Text = "Force Determinism"; + this.cbForceDeterminism.UseVisualStyleBackColor = true; + this.cbForceDeterminism.CheckedChanged += new System.EventHandler(this.cbForceDeterminism_CheckedChanged); + // + // label3 + // + this.label3.Location = new System.Drawing.Point(38, 295); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(251, 41); + this.label3.TabIndex = 9; + this.label3.Text = "Guarantee deterministic emulation by savestating every frame. Don\'t TAS without i" + + "t! Only ~75% of runs sync without it, but speed boost is ~30%."; // // SNESOptions // @@ -166,7 +188,9 @@ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.btnCancel; - this.ClientSize = new System.Drawing.Size(304, 312); + this.ClientSize = new System.Drawing.Size(304, 379); + this.Controls.Add(this.label3); + this.Controls.Add(this.cbForceDeterminism); this.Controls.Add(this.lblDoubleSize); this.Controls.Add(this.cbDoubleSize); this.Controls.Add(this.label1); @@ -202,5 +226,7 @@ private System.Windows.Forms.Label lblDoubleSize; private System.Windows.Forms.RadioButton rbAccuracy; private System.Windows.Forms.Label label2; + private System.Windows.Forms.CheckBox cbForceDeterminism; + private System.Windows.Forms.Label label3; } } \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/SNES/SNESOptions.cs b/BizHawk.Client.EmuHawk/config/SNES/SNESOptions.cs index 4377e2a537..28eca0c90f 100644 --- a/BizHawk.Client.EmuHawk/config/SNES/SNESOptions.cs +++ b/BizHawk.Client.EmuHawk/config/SNES/SNESOptions.cs @@ -15,6 +15,35 @@ namespace BizHawk.Client.EmuHawk bool SuppressDoubleSize; bool UserDoubleSizeOption; + public static void DoSettingsDialog(IWin32Window owner) + { + var s = ((LibsnesCore)Global.Emulator).GetSettings(); + var ss = ((LibsnesCore)Global.Emulator).GetSyncSettings(); + var dlg = new SNESOptions + { + UseRingBuffer = s.UseRingBuffer, + AlwaysDoubleSize = s.AlwaysDoubleSize, + ForceDeterminism = s.ForceDeterminism, + Profile = ss.Profile + }; + + var result = dlg.ShowDialog(owner); + if (result == DialogResult.OK) + { + s.UseRingBuffer = dlg.UseRingBuffer; + s.AlwaysDoubleSize = dlg.AlwaysDoubleSize; + s.ForceDeterminism = dlg.ForceDeterminism; + ss.Profile = dlg.Profile; + GlobalWin.MainForm.PutCoreSettings(s); + GlobalWin.MainForm.PutCoreSyncSettings(ss); + } + } + + private void SNESOptions_Load(object sender, EventArgs e) + { + rbAccuracy.Visible = VersionInfo.DeveloperBuild; + } + public string Profile { get @@ -45,6 +74,39 @@ namespace BizHawk.Client.EmuHawk set { UserDoubleSizeOption = value; RefreshDoubleSizeOption(); } } + public bool ForceDeterminism + { + get { return cbForceDeterminism.Checked; } + set { cbForceDeterminism.Checked = value; } + } + + void RefreshDoubleSizeOption() + { + SuppressDoubleSize = true; + if (cbDoubleSize.Enabled) + cbDoubleSize.Checked = UserDoubleSizeOption; + else cbDoubleSize.Checked = true; + SuppressDoubleSize = false; + } + + private void rbAccuracy_CheckedChanged(object sender, EventArgs e) + { + cbDoubleSize.Enabled = !rbAccuracy.Checked; + lblDoubleSize.ForeColor = cbDoubleSize.Enabled ? System.Drawing.SystemColors.ControlText : System.Drawing.SystemColors.GrayText; + RefreshDoubleSizeOption(); + } + + private void cbDoubleSize_CheckedChanged(object sender, EventArgs e) + { + if (SuppressDoubleSize) return; + UserDoubleSizeOption = cbDoubleSize.Checked; + } + + private void cbForceDeterminism_CheckedChanged(object sender, EventArgs e) + { + + } + private void btnOk_Click(object sender, EventArgs e) { DialogResult = DialogResult.OK; @@ -57,54 +119,5 @@ namespace BizHawk.Client.EmuHawk Close(); } - public static void DoSettingsDialog(IWin32Window owner) - { - var s = ((LibsnesCore)Global.Emulator).GetSettings(); - var ss = ((LibsnesCore)Global.Emulator).GetSyncSettings(); - var dlg = new SNESOptions - { - UseRingBuffer = s.UseRingBuffer, - AlwaysDoubleSize = s.AlwaysDoubleSize, - Profile = ss.Profile - }; - - var result = dlg.ShowDialog(owner); - if (result == DialogResult.OK) - { - s.UseRingBuffer = dlg.UseRingBuffer; - s.AlwaysDoubleSize = dlg.AlwaysDoubleSize; - ss.Profile = dlg.Profile; - GlobalWin.MainForm.PutCoreSettings(s); - GlobalWin.MainForm.PutCoreSyncSettings(ss); - } - } - - private void rbAccuracy_CheckedChanged(object sender, EventArgs e) - { - cbDoubleSize.Enabled = !rbAccuracy.Checked; - lblDoubleSize.ForeColor = cbDoubleSize.Enabled ? System.Drawing.SystemColors.ControlText : System.Drawing.SystemColors.GrayText; - RefreshDoubleSizeOption(); - } - - void RefreshDoubleSizeOption() - { - SuppressDoubleSize = true; - if (cbDoubleSize.Enabled) - cbDoubleSize.Checked = UserDoubleSizeOption; - else cbDoubleSize.Checked = true; - SuppressDoubleSize = false; - } - - private void cbDoubleSize_CheckedChanged(object sender, EventArgs e) - { - if (SuppressDoubleSize) return; - UserDoubleSizeOption = cbDoubleSize.Checked; - } - - private void SNESOptions_Load(object sender, EventArgs e) - { - rbAccuracy.Visible = VersionInfo.DeveloperBuild; - } - } } diff --git a/BizHawk.Client.EmuHawk/movie/RecordMovie.cs b/BizHawk.Client.EmuHawk/movie/RecordMovie.cs index fb8fdfc849..20a9ea91f2 100644 --- a/BizHawk.Client.EmuHawk/movie/RecordMovie.cs +++ b/BizHawk.Client.EmuHawk/movie/RecordMovie.cs @@ -150,10 +150,32 @@ namespace BizHawk.Client.EmuHawk } private void BrowseBtn_Click(object sender, EventArgs e) - { + { + string movieFolderPath = PathManager.MakeAbsolutePath(Global.Config.PathEntries.MoviesPathFragment, null); + + // Create movie folder if it doesn't already exist + try + { + if (!Directory.Exists(movieFolderPath)) + { + Directory.CreateDirectory(movieFolderPath); + } + } + catch (Exception movieDirException) + { + if (movieDirException is IOException || + movieDirException is UnauthorizedAccessException || + movieDirException is PathTooLongException + ) + { + //TO DO : Pass error to user? + } + else throw; + } + var sfd = new SaveFileDialog { - InitialDirectory = PathManager.MakeAbsolutePath(Global.Config.PathEntries.MoviesPathFragment, null), + InitialDirectory = movieFolderPath, DefaultExt = "." + Global.MovieSession.Movie.PreferredExtension, FileName = RecordBox.Text, OverwritePrompt = false, diff --git a/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.Designer.cs b/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.Designer.cs index 9fb14f3aa9..b8c88e3e8a 100644 --- a/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.Designer.cs +++ b/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.Designer.cs @@ -28,107 +28,131 @@ /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(BasicBot)); - this.BotMenu = new MenuStripEx(); - this.FileSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.NewMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.OpenMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveAsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.RecentSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.ExitMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.OptionsSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.MemoryDomainsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); - this.DataSizeMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this._1ByteMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this._2ByteMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this._4ByteMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.BigEndianMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); - this.TurboWhileBottingMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.RunBtn = new System.Windows.Forms.Button(); - this.BotStatusStrip = new System.Windows.Forms.StatusStrip(); - this.BotStatusButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.MessageLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.ControlsBox = new System.Windows.Forms.GroupBox(); - this.ControlProbabilityPanel = new System.Windows.Forms.Panel(); - this.BestGroupBox = new System.Windows.Forms.GroupBox(); - this.PlayBestButton = new System.Windows.Forms.Button(); - this.ClearBestButton = new System.Windows.Forms.Button(); - this.BestAttemptNumberLabel = new System.Windows.Forms.Label(); - this.label17 = new System.Windows.Forms.Label(); - this.panel1 = new System.Windows.Forms.Panel(); - this.BestAttemptLogLabel = new System.Windows.Forms.Label(); - this.BestTieBreak3Box = new System.Windows.Forms.TextBox(); - this.BestTieBreak2Box = new System.Windows.Forms.TextBox(); - this.BestTieBreak1Box = new System.Windows.Forms.TextBox(); - this.BestMaximizeBox = new System.Windows.Forms.TextBox(); - this.label16 = new System.Windows.Forms.Label(); - this.label15 = new System.Windows.Forms.Label(); - this.label14 = new System.Windows.Forms.Label(); - this.label13 = new System.Windows.Forms.Label(); - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.AttemptsLabel = new System.Windows.Forms.Label(); - this.FramesLabel = new System.Windows.Forms.Label(); - this.GoalGroupBox = new System.Windows.Forms.GroupBox(); - this.Tiebreak3Operator = new System.Windows.Forms.ComboBox(); - this.Tiebreak2Operator = new System.Windows.Forms.ComboBox(); - this.Tiebreak1Operator = new System.Windows.Forms.ComboBox(); - this.mainOperator = new System.Windows.Forms.ComboBox(); - this.label12 = new System.Windows.Forms.Label(); - this.label11 = new System.Windows.Forms.Label(); - this.label10 = new System.Windows.Forms.Label(); - this.label9 = new System.Windows.Forms.Label(); - this.label7 = new System.Windows.Forms.Label(); - this.label6 = new System.Windows.Forms.Label(); - this.TieBreaker1Box = new BizHawk.Client.EmuHawk.HexTextBox(); - this.TieBreaker2Box = new BizHawk.Client.EmuHawk.HexTextBox(); - this.TieBreaker3Box = new BizHawk.Client.EmuHawk.HexTextBox(); - this.label5 = new System.Windows.Forms.Label(); - this.MaximizeAddressBox = new BizHawk.Client.EmuHawk.HexTextBox(); - this.maximizeLabeltext = new System.Windows.Forms.Label(); - this.label4 = new System.Windows.Forms.Label(); - this.FrameLengthNumeric = new System.Windows.Forms.NumericUpDown(); - this.label3 = new System.Windows.Forms.Label(); - this.StopBtn = new System.Windows.Forms.Button(); - this.label8 = new System.Windows.Forms.Label(); - this.StartFromSlotBox = new System.Windows.Forms.ComboBox(); - this.ControlGroupBox = new System.Windows.Forms.GroupBox(); - this.panel2 = new System.Windows.Forms.Panel(); - this.StatsContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components); - this.ClearStatsContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.BotMenu.SuspendLayout(); - this.BotStatusStrip.SuspendLayout(); - this.ControlsBox.SuspendLayout(); - this.BestGroupBox.SuspendLayout(); - this.panel1.SuspendLayout(); - this.GoalGroupBox.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.FrameLengthNumeric)).BeginInit(); - this.ControlGroupBox.SuspendLayout(); - this.panel2.SuspendLayout(); - this.StatsContextMenu.SuspendLayout(); - this.SuspendLayout(); - // - // BotMenu - // - this.BotMenu.ClickThrough = true; - this.BotMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(BasicBot)); + this.BotMenu = new MenuStripEx(); + this.FileSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.NewMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.OpenMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SaveMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SaveAsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.RecentSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.ExitMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.OptionsSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.MemoryDomainsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.DataSizeMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this._1ByteMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this._2ByteMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this._4ByteMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.BigEndianMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.TurboWhileBottingMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.RunBtn = new System.Windows.Forms.Button(); + this.BotStatusStrip = new System.Windows.Forms.StatusStrip(); + this.BotStatusButton = new System.Windows.Forms.ToolStripStatusLabel(); + this.MessageLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.ControlsBox = new System.Windows.Forms.GroupBox(); + this.ControlProbabilityPanel = new System.Windows.Forms.Panel(); + this.BestGroupBox = new System.Windows.Forms.GroupBox(); + this.PlayBestButton = new System.Windows.Forms.Button(); + this.ClearBestButton = new System.Windows.Forms.Button(); + this.BestAttemptNumberLabel = new System.Windows.Forms.Label(); + this.label17 = new System.Windows.Forms.Label(); + this.panel1 = new System.Windows.Forms.Panel(); + this.BestAttemptLogLabel = new System.Windows.Forms.Label(); + this.BestTieBreak3Box = new System.Windows.Forms.TextBox(); + this.BestTieBreak2Box = new System.Windows.Forms.TextBox(); + this.BestTieBreak1Box = new System.Windows.Forms.TextBox(); + this.BestMaximizeBox = new System.Windows.Forms.TextBox(); + this.label16 = new System.Windows.Forms.Label(); + this.label15 = new System.Windows.Forms.Label(); + this.label14 = new System.Windows.Forms.Label(); + this.label13 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.AttemptsLabel = new System.Windows.Forms.Label(); + this.FramesLabel = new System.Windows.Forms.Label(); + this.GoalGroupBox = new System.Windows.Forms.GroupBox(); + this.label4 = new System.Windows.Forms.Label(); + this.FrameLengthNumeric = new System.Windows.Forms.NumericUpDown(); + this.label3 = new System.Windows.Forms.Label(); + this.panel3 = new System.Windows.Forms.Panel(); + this.MainValueNumeric = new System.Windows.Forms.NumericUpDown(); + this.MainValueRadio = new System.Windows.Forms.RadioButton(); + this.MainBestRadio = new System.Windows.Forms.RadioButton(); + this.MainOperator = new System.Windows.Forms.ComboBox(); + this.label9 = new System.Windows.Forms.Label(); + this.MaximizeAddressBox = new BizHawk.Client.EmuHawk.HexTextBox(); + this.maximizeLabeltext = new System.Windows.Forms.Label(); + this.panel4 = new System.Windows.Forms.Panel(); + this.TieBreak1Numeric = new System.Windows.Forms.NumericUpDown(); + this.TieBreak1ValueRadio = new System.Windows.Forms.RadioButton(); + this.Tiebreak1Operator = new System.Windows.Forms.ComboBox(); + this.TieBreak1BestRadio = new System.Windows.Forms.RadioButton(); + this.label5 = new System.Windows.Forms.Label(); + this.TieBreaker1Box = new BizHawk.Client.EmuHawk.HexTextBox(); + this.label10 = new System.Windows.Forms.Label(); + this.panel5 = new System.Windows.Forms.Panel(); + this.TieBreak2Numeric = new System.Windows.Forms.NumericUpDown(); + this.Tiebreak2Operator = new System.Windows.Forms.ComboBox(); + this.TieBreak2ValueRadio = new System.Windows.Forms.RadioButton(); + this.TieBreak2BestRadio = new System.Windows.Forms.RadioButton(); + this.label11 = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.TieBreaker2Box = new BizHawk.Client.EmuHawk.HexTextBox(); + this.panel6 = new System.Windows.Forms.Panel(); + this.label12 = new System.Windows.Forms.Label(); + this.label7 = new System.Windows.Forms.Label(); + this.TieBreaker3Box = new BizHawk.Client.EmuHawk.HexTextBox(); + this.TieBreak3Numeric = new System.Windows.Forms.NumericUpDown(); + this.TieBreak3ValueRadio = new System.Windows.Forms.RadioButton(); + this.TieBreak3BestRadio = new System.Windows.Forms.RadioButton(); + this.Tiebreak3Operator = new System.Windows.Forms.ComboBox(); + this.StopBtn = new System.Windows.Forms.Button(); + this.label8 = new System.Windows.Forms.Label(); + this.StartFromSlotBox = new System.Windows.Forms.ComboBox(); + this.ControlGroupBox = new System.Windows.Forms.GroupBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.StatsContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components); + this.ClearStatsContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.BotMenu.SuspendLayout(); + this.BotStatusStrip.SuspendLayout(); + this.ControlsBox.SuspendLayout(); + this.BestGroupBox.SuspendLayout(); + this.panel1.SuspendLayout(); + this.GoalGroupBox.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.FrameLengthNumeric)).BeginInit(); + this.panel3.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.MainValueNumeric)).BeginInit(); + this.panel4.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.TieBreak1Numeric)).BeginInit(); + this.panel5.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.TieBreak2Numeric)).BeginInit(); + this.panel6.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.TieBreak3Numeric)).BeginInit(); + this.ControlGroupBox.SuspendLayout(); + this.panel2.SuspendLayout(); + this.StatsContextMenu.SuspendLayout(); + this.SuspendLayout(); + // + // BotMenu + // + this.BotMenu.ClickThrough = true; + this.BotMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.FileSubMenu, this.OptionsSubMenu}); - this.BotMenu.Location = new System.Drawing.Point(0, 0); - this.BotMenu.Name = "BotMenu"; - this.BotMenu.Size = new System.Drawing.Size(587, 24); - this.BotMenu.TabIndex = 0; - this.BotMenu.Text = "menuStrip1"; - // - // FileSubMenu - // - this.FileSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.BotMenu.Location = new System.Drawing.Point(0, 0); + this.BotMenu.Name = "BotMenu"; + this.BotMenu.Size = new System.Drawing.Size(687, 24); + this.BotMenu.TabIndex = 0; + this.BotMenu.Text = "menuStrip1"; + // + // FileSubMenu + // + this.FileSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.NewMenuItem, this.OpenMenuItem, this.SaveMenuItem, @@ -136,694 +160,905 @@ this.RecentSubMenu, this.toolStripSeparator1, this.ExitMenuItem}); - this.FileSubMenu.Name = "FileSubMenu"; - this.FileSubMenu.Size = new System.Drawing.Size(37, 20); - this.FileSubMenu.Text = "&File"; - this.FileSubMenu.DropDownOpened += new System.EventHandler(this.FileSubMenu_DropDownOpened); - // - // NewMenuItem - // - this.NewMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.NewFile; - this.NewMenuItem.Name = "NewMenuItem"; - this.NewMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); - this.NewMenuItem.Size = new System.Drawing.Size(195, 22); - this.NewMenuItem.Text = "&New"; - this.NewMenuItem.Click += new System.EventHandler(this.NewMenuItem_Click); - // - // OpenMenuItem - // - this.OpenMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.OpenFile; - this.OpenMenuItem.Name = "OpenMenuItem"; - this.OpenMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); - this.OpenMenuItem.Size = new System.Drawing.Size(195, 22); - this.OpenMenuItem.Text = "&Open..."; - this.OpenMenuItem.Click += new System.EventHandler(this.OpenMenuItem_Click); - // - // SaveMenuItem - // - this.SaveMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveAs; - this.SaveMenuItem.Name = "SaveMenuItem"; - this.SaveMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); - this.SaveMenuItem.Size = new System.Drawing.Size(195, 22); - this.SaveMenuItem.Text = "&Save"; - this.SaveMenuItem.Click += new System.EventHandler(this.SaveMenuItem_Click); - // - // SaveAsMenuItem - // - this.SaveAsMenuItem.Name = "SaveAsMenuItem"; - this.SaveAsMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + this.FileSubMenu.Name = "FileSubMenu"; + this.FileSubMenu.Size = new System.Drawing.Size(37, 20); + this.FileSubMenu.Text = "&File"; + this.FileSubMenu.DropDownOpened += new System.EventHandler(this.FileSubMenu_DropDownOpened); + // + // NewMenuItem + // + this.NewMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.NewFile; + this.NewMenuItem.Name = "NewMenuItem"; + this.NewMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); + this.NewMenuItem.Size = new System.Drawing.Size(195, 22); + this.NewMenuItem.Text = "&New"; + this.NewMenuItem.Click += new System.EventHandler(this.NewMenuItem_Click); + // + // OpenMenuItem + // + this.OpenMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.OpenFile; + this.OpenMenuItem.Name = "OpenMenuItem"; + this.OpenMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); + this.OpenMenuItem.Size = new System.Drawing.Size(195, 22); + this.OpenMenuItem.Text = "&Open..."; + this.OpenMenuItem.Click += new System.EventHandler(this.OpenMenuItem_Click); + // + // SaveMenuItem + // + this.SaveMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveAs; + this.SaveMenuItem.Name = "SaveMenuItem"; + this.SaveMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); + this.SaveMenuItem.Size = new System.Drawing.Size(195, 22); + this.SaveMenuItem.Text = "&Save"; + this.SaveMenuItem.Click += new System.EventHandler(this.SaveMenuItem_Click); + // + // SaveAsMenuItem + // + this.SaveAsMenuItem.Name = "SaveAsMenuItem"; + this.SaveAsMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) | System.Windows.Forms.Keys.S))); - this.SaveAsMenuItem.Size = new System.Drawing.Size(195, 22); - this.SaveAsMenuItem.Text = "Save &As..."; - this.SaveAsMenuItem.Click += new System.EventHandler(this.SaveAsMenuItem_Click); - // - // RecentSubMenu - // - this.RecentSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.SaveAsMenuItem.Size = new System.Drawing.Size(195, 22); + this.SaveAsMenuItem.Text = "Save &As..."; + this.SaveAsMenuItem.Click += new System.EventHandler(this.SaveAsMenuItem_Click); + // + // RecentSubMenu + // + this.RecentSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripSeparator2}); - this.RecentSubMenu.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Recent; - this.RecentSubMenu.Name = "RecentSubMenu"; - this.RecentSubMenu.Size = new System.Drawing.Size(195, 22); - this.RecentSubMenu.Text = "Recent"; - this.RecentSubMenu.DropDownOpened += new System.EventHandler(this.RecentSubMenu_DropDownOpened); - // - // toolStripSeparator2 - // - this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(57, 6); - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(192, 6); - // - // ExitMenuItem - // - this.ExitMenuItem.Name = "ExitMenuItem"; - this.ExitMenuItem.ShortcutKeyDisplayString = "Alt+F4"; - this.ExitMenuItem.Size = new System.Drawing.Size(195, 22); - this.ExitMenuItem.Text = "E&xit"; - this.ExitMenuItem.Click += new System.EventHandler(this.ExitMenuItem_Click); - // - // OptionsSubMenu - // - this.OptionsSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.RecentSubMenu.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Recent; + this.RecentSubMenu.Name = "RecentSubMenu"; + this.RecentSubMenu.Size = new System.Drawing.Size(195, 22); + this.RecentSubMenu.Text = "Recent"; + this.RecentSubMenu.DropDownOpened += new System.EventHandler(this.RecentSubMenu_DropDownOpened); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(57, 6); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(192, 6); + // + // ExitMenuItem + // + this.ExitMenuItem.Name = "ExitMenuItem"; + this.ExitMenuItem.ShortcutKeyDisplayString = "Alt+F4"; + this.ExitMenuItem.Size = new System.Drawing.Size(195, 22); + this.ExitMenuItem.Text = "E&xit"; + this.ExitMenuItem.Click += new System.EventHandler(this.ExitMenuItem_Click); + // + // OptionsSubMenu + // + this.OptionsSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.MemoryDomainsMenuItem, this.DataSizeMenuItem, this.BigEndianMenuItem, this.toolStripSeparator4, this.TurboWhileBottingMenuItem}); - this.OptionsSubMenu.Name = "OptionsSubMenu"; - this.OptionsSubMenu.Size = new System.Drawing.Size(61, 20); - this.OptionsSubMenu.Text = "&Options"; - this.OptionsSubMenu.DropDownOpened += new System.EventHandler(this.OptionsSubMenu_DropDownOpened); - // - // MemoryDomainsMenuItem - // - this.MemoryDomainsMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.OptionsSubMenu.Name = "OptionsSubMenu"; + this.OptionsSubMenu.Size = new System.Drawing.Size(61, 20); + this.OptionsSubMenu.Text = "&Options"; + this.OptionsSubMenu.DropDownOpened += new System.EventHandler(this.OptionsSubMenu_DropDownOpened); + // + // MemoryDomainsMenuItem + // + this.MemoryDomainsMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripSeparator3}); - this.MemoryDomainsMenuItem.Name = "MemoryDomainsMenuItem"; - this.MemoryDomainsMenuItem.Size = new System.Drawing.Size(181, 22); - this.MemoryDomainsMenuItem.Text = "Memory Domains"; - this.MemoryDomainsMenuItem.DropDownOpened += new System.EventHandler(this.MemoryDomainsMenuItem_DropDownOpened); - // - // toolStripSeparator3 - // - this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(57, 6); - // - // DataSizeMenuItem - // - this.DataSizeMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.MemoryDomainsMenuItem.Name = "MemoryDomainsMenuItem"; + this.MemoryDomainsMenuItem.Size = new System.Drawing.Size(181, 22); + this.MemoryDomainsMenuItem.Text = "Memory Domains"; + this.MemoryDomainsMenuItem.DropDownOpened += new System.EventHandler(this.MemoryDomainsMenuItem_DropDownOpened); + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(57, 6); + // + // DataSizeMenuItem + // + this.DataSizeMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this._1ByteMenuItem, this._2ByteMenuItem, this._4ByteMenuItem}); - this.DataSizeMenuItem.Name = "DataSizeMenuItem"; - this.DataSizeMenuItem.Size = new System.Drawing.Size(181, 22); - this.DataSizeMenuItem.Text = "Data Size"; - this.DataSizeMenuItem.DropDownOpened += new System.EventHandler(this.DataSizeMenuItem_DropDownOpened); - // - // _1ByteMenuItem - // - this._1ByteMenuItem.Name = "_1ByteMenuItem"; - this._1ByteMenuItem.Size = new System.Drawing.Size(111, 22); - this._1ByteMenuItem.Text = "1 Byte"; - this._1ByteMenuItem.Click += new System.EventHandler(this._1ByteMenuItem_Click); - // - // _2ByteMenuItem - // - this._2ByteMenuItem.Name = "_2ByteMenuItem"; - this._2ByteMenuItem.Size = new System.Drawing.Size(111, 22); - this._2ByteMenuItem.Text = "2 Bytes"; - this._2ByteMenuItem.Click += new System.EventHandler(this._2ByteMenuItem_Click); - // - // _4ByteMenuItem - // - this._4ByteMenuItem.Name = "_4ByteMenuItem"; - this._4ByteMenuItem.Size = new System.Drawing.Size(111, 22); - this._4ByteMenuItem.Text = "4 Bytes"; - this._4ByteMenuItem.Click += new System.EventHandler(this._4ByteMenuItem_Click); - // - // BigEndianMenuItem - // - this.BigEndianMenuItem.Name = "BigEndianMenuItem"; - this.BigEndianMenuItem.Size = new System.Drawing.Size(181, 22); - this.BigEndianMenuItem.Text = "Big Endian"; - this.BigEndianMenuItem.Click += new System.EventHandler(this.BigEndianMenuItem_Click); - // - // toolStripSeparator4 - // - this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(178, 6); - // - // TurboWhileBottingMenuItem - // - this.TurboWhileBottingMenuItem.Name = "TurboWhileBottingMenuItem"; - this.TurboWhileBottingMenuItem.Size = new System.Drawing.Size(181, 22); - this.TurboWhileBottingMenuItem.Text = "Turbo While Botting"; - this.TurboWhileBottingMenuItem.Click += new System.EventHandler(this.TurboWhileBottingMenuItem_Click); - // - // RunBtn - // - this.RunBtn.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Play; - this.RunBtn.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; - this.RunBtn.Location = new System.Drawing.Point(6, 56); - this.RunBtn.Name = "RunBtn"; - this.RunBtn.Size = new System.Drawing.Size(75, 23); - this.RunBtn.TabIndex = 2001; - this.RunBtn.Text = "&Run"; - this.RunBtn.UseVisualStyleBackColor = true; - this.RunBtn.Click += new System.EventHandler(this.RunBtn_Click); - // - // BotStatusStrip - // - this.BotStatusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.DataSizeMenuItem.Name = "DataSizeMenuItem"; + this.DataSizeMenuItem.Size = new System.Drawing.Size(181, 22); + this.DataSizeMenuItem.Text = "Data Size"; + this.DataSizeMenuItem.DropDownOpened += new System.EventHandler(this.DataSizeMenuItem_DropDownOpened); + // + // _1ByteMenuItem + // + this._1ByteMenuItem.Name = "_1ByteMenuItem"; + this._1ByteMenuItem.Size = new System.Drawing.Size(111, 22); + this._1ByteMenuItem.Text = "1 Byte"; + this._1ByteMenuItem.Click += new System.EventHandler(this._1ByteMenuItem_Click); + // + // _2ByteMenuItem + // + this._2ByteMenuItem.Name = "_2ByteMenuItem"; + this._2ByteMenuItem.Size = new System.Drawing.Size(111, 22); + this._2ByteMenuItem.Text = "2 Bytes"; + this._2ByteMenuItem.Click += new System.EventHandler(this._2ByteMenuItem_Click); + // + // _4ByteMenuItem + // + this._4ByteMenuItem.Name = "_4ByteMenuItem"; + this._4ByteMenuItem.Size = new System.Drawing.Size(111, 22); + this._4ByteMenuItem.Text = "4 Bytes"; + this._4ByteMenuItem.Click += new System.EventHandler(this._4ByteMenuItem_Click); + // + // BigEndianMenuItem + // + this.BigEndianMenuItem.Name = "BigEndianMenuItem"; + this.BigEndianMenuItem.Size = new System.Drawing.Size(181, 22); + this.BigEndianMenuItem.Text = "Big Endian"; + this.BigEndianMenuItem.Click += new System.EventHandler(this.BigEndianMenuItem_Click); + // + // toolStripSeparator4 + // + this.toolStripSeparator4.Name = "toolStripSeparator4"; + this.toolStripSeparator4.Size = new System.Drawing.Size(178, 6); + // + // TurboWhileBottingMenuItem + // + this.TurboWhileBottingMenuItem.Name = "TurboWhileBottingMenuItem"; + this.TurboWhileBottingMenuItem.Size = new System.Drawing.Size(181, 22); + this.TurboWhileBottingMenuItem.Text = "Turbo While Botting"; + this.TurboWhileBottingMenuItem.Click += new System.EventHandler(this.TurboWhileBottingMenuItem_Click); + // + // RunBtn + // + this.RunBtn.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Play; + this.RunBtn.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.RunBtn.Location = new System.Drawing.Point(6, 56); + this.RunBtn.Name = "RunBtn"; + this.RunBtn.Size = new System.Drawing.Size(75, 23); + this.RunBtn.TabIndex = 2001; + this.RunBtn.Text = "&Run"; + this.RunBtn.UseVisualStyleBackColor = true; + this.RunBtn.Click += new System.EventHandler(this.RunBtn_Click); + // + // BotStatusStrip + // + this.BotStatusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.BotStatusButton, this.MessageLabel}); - this.BotStatusStrip.Location = new System.Drawing.Point(0, 565); - this.BotStatusStrip.Name = "BotStatusStrip"; - this.BotStatusStrip.Size = new System.Drawing.Size(587, 22); - this.BotStatusStrip.TabIndex = 2; - this.BotStatusStrip.Text = "statusStrip1"; - // - // BotStatusButton - // - this.BotStatusButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.BotStatusButton.Image = ((System.Drawing.Image)(resources.GetObject("BotStatusButton.Image"))); - this.BotStatusButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.BotStatusButton.Name = "BotStatusButton"; - this.BotStatusButton.RightToLeftAutoMirrorImage = true; - this.BotStatusButton.Size = new System.Drawing.Size(16, 17); - this.BotStatusButton.Text = " "; - this.BotStatusButton.ToolTipText = " "; - // - // MessageLabel - // - this.MessageLabel.Name = "MessageLabel"; - this.MessageLabel.Size = new System.Drawing.Size(109, 17); - this.MessageLabel.Text = " "; - // - // ControlsBox - // - this.ControlsBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.BotStatusStrip.Location = new System.Drawing.Point(0, 565); + this.BotStatusStrip.Name = "BotStatusStrip"; + this.BotStatusStrip.Size = new System.Drawing.Size(687, 22); + this.BotStatusStrip.TabIndex = 2; + this.BotStatusStrip.Text = "statusStrip1"; + // + // BotStatusButton + // + this.BotStatusButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.BotStatusButton.Image = ((System.Drawing.Image)(resources.GetObject("BotStatusButton.Image"))); + this.BotStatusButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.BotStatusButton.Name = "BotStatusButton"; + this.BotStatusButton.RightToLeftAutoMirrorImage = true; + this.BotStatusButton.Size = new System.Drawing.Size(16, 17); + this.BotStatusButton.Text = " "; + this.BotStatusButton.ToolTipText = " "; + // + // MessageLabel + // + this.MessageLabel.Name = "MessageLabel"; + this.MessageLabel.Size = new System.Drawing.Size(109, 17); + this.MessageLabel.Text = " "; + // + // ControlsBox + // + this.ControlsBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.ControlsBox.Controls.Add(this.ControlProbabilityPanel); - this.ControlsBox.Location = new System.Drawing.Point(12, 183); - this.ControlsBox.Name = "ControlsBox"; - this.ControlsBox.Size = new System.Drawing.Size(312, 369); - this.ControlsBox.TabIndex = 3; - this.ControlsBox.TabStop = false; - this.ControlsBox.Text = "Controls"; - // - // ControlProbabilityPanel - // - this.ControlProbabilityPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.ControlsBox.Controls.Add(this.ControlProbabilityPanel); + this.ControlsBox.Location = new System.Drawing.Point(12, 183); + this.ControlsBox.Name = "ControlsBox"; + this.ControlsBox.Size = new System.Drawing.Size(422, 369); + this.ControlsBox.TabIndex = 3; + this.ControlsBox.TabStop = false; + this.ControlsBox.Text = "Controls"; + // + // ControlProbabilityPanel + // + this.ControlProbabilityPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.ControlProbabilityPanel.AutoScroll = true; - this.ControlProbabilityPanel.Location = new System.Drawing.Point(6, 19); - this.ControlProbabilityPanel.Name = "ControlProbabilityPanel"; - this.ControlProbabilityPanel.Size = new System.Drawing.Size(299, 344); - this.ControlProbabilityPanel.TabIndex = 0; - // - // BestGroupBox - // - this.BestGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.ControlProbabilityPanel.AutoScroll = true; + this.ControlProbabilityPanel.Location = new System.Drawing.Point(6, 19); + this.ControlProbabilityPanel.Name = "ControlProbabilityPanel"; + this.ControlProbabilityPanel.Size = new System.Drawing.Size(410, 350); + this.ControlProbabilityPanel.TabIndex = 0; + // + // BestGroupBox + // + this.BestGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Right))); - this.BestGroupBox.Controls.Add(this.PlayBestButton); - this.BestGroupBox.Controls.Add(this.ClearBestButton); - this.BestGroupBox.Controls.Add(this.BestAttemptNumberLabel); - this.BestGroupBox.Controls.Add(this.label17); - this.BestGroupBox.Controls.Add(this.panel1); - this.BestGroupBox.Controls.Add(this.BestTieBreak3Box); - this.BestGroupBox.Controls.Add(this.BestTieBreak2Box); - this.BestGroupBox.Controls.Add(this.BestTieBreak1Box); - this.BestGroupBox.Controls.Add(this.BestMaximizeBox); - this.BestGroupBox.Controls.Add(this.label16); - this.BestGroupBox.Controls.Add(this.label15); - this.BestGroupBox.Controls.Add(this.label14); - this.BestGroupBox.Controls.Add(this.label13); - this.BestGroupBox.Location = new System.Drawing.Point(330, 183); - this.BestGroupBox.Name = "BestGroupBox"; - this.BestGroupBox.Size = new System.Drawing.Size(245, 369); - this.BestGroupBox.TabIndex = 4; - this.BestGroupBox.TabStop = false; - this.BestGroupBox.Text = "Best"; - // - // PlayBestButton - // - this.PlayBestButton.Enabled = false; - this.PlayBestButton.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Play; - this.PlayBestButton.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; - this.PlayBestButton.Location = new System.Drawing.Point(12, 46); - this.PlayBestButton.Name = "PlayBestButton"; - this.PlayBestButton.Size = new System.Drawing.Size(75, 23); - this.PlayBestButton.TabIndex = 2004; - this.PlayBestButton.Text = "&Play"; - this.PlayBestButton.UseVisualStyleBackColor = true; - this.PlayBestButton.Click += new System.EventHandler(this.PlayBestButton_Click); - // - // ClearBestButton - // - this.ClearBestButton.Enabled = false; - this.ClearBestButton.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Close; - this.ClearBestButton.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; - this.ClearBestButton.Location = new System.Drawing.Point(12, 70); - this.ClearBestButton.Name = "ClearBestButton"; - this.ClearBestButton.Size = new System.Drawing.Size(75, 23); - this.ClearBestButton.TabIndex = 2003; - this.ClearBestButton.Text = "&Clear"; - this.ClearBestButton.UseVisualStyleBackColor = true; - this.ClearBestButton.Click += new System.EventHandler(this.ClearBestButton_Click); - // - // BestAttemptNumberLabel - // - this.BestAttemptNumberLabel.AutoSize = true; - this.BestAttemptNumberLabel.Location = new System.Drawing.Point(59, 20); - this.BestAttemptNumberLabel.Name = "BestAttemptNumberLabel"; - this.BestAttemptNumberLabel.Size = new System.Drawing.Size(13, 13); - this.BestAttemptNumberLabel.TabIndex = 23; - this.BestAttemptNumberLabel.Text = "0"; - // - // label17 - // - this.label17.AutoSize = true; - this.label17.Location = new System.Drawing.Point(17, 20); - this.label17.Name = "label17"; - this.label17.Size = new System.Drawing.Size(46, 13); - this.label17.TabIndex = 22; - this.label17.Text = "Attempt:"; - // - // panel1 - // - this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.BestGroupBox.Controls.Add(this.PlayBestButton); + this.BestGroupBox.Controls.Add(this.ClearBestButton); + this.BestGroupBox.Controls.Add(this.BestAttemptNumberLabel); + this.BestGroupBox.Controls.Add(this.label17); + this.BestGroupBox.Controls.Add(this.panel1); + this.BestGroupBox.Controls.Add(this.BestTieBreak3Box); + this.BestGroupBox.Controls.Add(this.BestTieBreak2Box); + this.BestGroupBox.Controls.Add(this.BestTieBreak1Box); + this.BestGroupBox.Controls.Add(this.BestMaximizeBox); + this.BestGroupBox.Controls.Add(this.label16); + this.BestGroupBox.Controls.Add(this.label15); + this.BestGroupBox.Controls.Add(this.label14); + this.BestGroupBox.Controls.Add(this.label13); + this.BestGroupBox.Location = new System.Drawing.Point(441, 183); + this.BestGroupBox.Name = "BestGroupBox"; + this.BestGroupBox.Size = new System.Drawing.Size(230, 369); + this.BestGroupBox.TabIndex = 4; + this.BestGroupBox.TabStop = false; + this.BestGroupBox.Text = "Best"; + // + // PlayBestButton + // + this.PlayBestButton.Enabled = false; + this.PlayBestButton.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Play; + this.PlayBestButton.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.PlayBestButton.Location = new System.Drawing.Point(12, 46); + this.PlayBestButton.Name = "PlayBestButton"; + this.PlayBestButton.Size = new System.Drawing.Size(75, 23); + this.PlayBestButton.TabIndex = 2004; + this.PlayBestButton.Text = "&Play"; + this.PlayBestButton.UseVisualStyleBackColor = true; + this.PlayBestButton.Click += new System.EventHandler(this.PlayBestButton_Click); + // + // ClearBestButton + // + this.ClearBestButton.Enabled = false; + this.ClearBestButton.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Close; + this.ClearBestButton.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.ClearBestButton.Location = new System.Drawing.Point(12, 70); + this.ClearBestButton.Name = "ClearBestButton"; + this.ClearBestButton.Size = new System.Drawing.Size(75, 23); + this.ClearBestButton.TabIndex = 2003; + this.ClearBestButton.Text = "&Clear"; + this.ClearBestButton.UseVisualStyleBackColor = true; + this.ClearBestButton.Click += new System.EventHandler(this.ClearBestButton_Click); + // + // BestAttemptNumberLabel + // + this.BestAttemptNumberLabel.AutoSize = true; + this.BestAttemptNumberLabel.Location = new System.Drawing.Point(59, 20); + this.BestAttemptNumberLabel.Name = "BestAttemptNumberLabel"; + this.BestAttemptNumberLabel.Size = new System.Drawing.Size(13, 13); + this.BestAttemptNumberLabel.TabIndex = 23; + this.BestAttemptNumberLabel.Text = "0"; + // + // label17 + // + this.label17.AutoSize = true; + this.label17.Location = new System.Drawing.Point(17, 20); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(46, 13); + this.label17.TabIndex = 22; + this.label17.Text = "Attempt:"; + // + // panel1 + // + this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.panel1.AutoScroll = true; - this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; - this.panel1.Controls.Add(this.BestAttemptLogLabel); - this.panel1.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.panel1.Location = new System.Drawing.Point(12, 112); - this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(227, 251); - this.panel1.TabIndex = 21; - // - // BestAttemptLogLabel - // - this.BestAttemptLogLabel.AutoSize = true; - this.BestAttemptLogLabel.Location = new System.Drawing.Point(8, 8); - this.BestAttemptLogLabel.Name = "BestAttemptLogLabel"; - this.BestAttemptLogLabel.Size = new System.Drawing.Size(294, 14); - this.BestAttemptLogLabel.TabIndex = 0; - this.BestAttemptLogLabel.Text = " "; - // - // BestTieBreak3Box - // - this.BestTieBreak3Box.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.BestTieBreak3Box.Location = new System.Drawing.Point(178, 73); - this.BestTieBreak3Box.Name = "BestTieBreak3Box"; - this.BestTieBreak3Box.ReadOnly = true; - this.BestTieBreak3Box.Size = new System.Drawing.Size(58, 20); - this.BestTieBreak3Box.TabIndex = 20; - this.BestTieBreak3Box.TabStop = false; - // - // BestTieBreak2Box - // - this.BestTieBreak2Box.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.BestTieBreak2Box.Location = new System.Drawing.Point(178, 53); - this.BestTieBreak2Box.Name = "BestTieBreak2Box"; - this.BestTieBreak2Box.ReadOnly = true; - this.BestTieBreak2Box.Size = new System.Drawing.Size(58, 20); - this.BestTieBreak2Box.TabIndex = 19; - this.BestTieBreak2Box.TabStop = false; - // - // BestTieBreak1Box - // - this.BestTieBreak1Box.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.BestTieBreak1Box.Location = new System.Drawing.Point(178, 33); - this.BestTieBreak1Box.Name = "BestTieBreak1Box"; - this.BestTieBreak1Box.ReadOnly = true; - this.BestTieBreak1Box.Size = new System.Drawing.Size(58, 20); - this.BestTieBreak1Box.TabIndex = 18; - this.BestTieBreak1Box.TabStop = false; - // - // BestMaximizeBox - // - this.BestMaximizeBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.BestMaximizeBox.Location = new System.Drawing.Point(178, 13); - this.BestMaximizeBox.Name = "BestMaximizeBox"; - this.BestMaximizeBox.ReadOnly = true; - this.BestMaximizeBox.Size = new System.Drawing.Size(58, 20); - this.BestMaximizeBox.TabIndex = 17; - this.BestMaximizeBox.TabStop = false; - // - // label16 - // - this.label16.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label16.AutoSize = true; - this.label16.Location = new System.Drawing.Point(111, 76); - this.label16.Name = "label16"; - this.label16.Size = new System.Drawing.Size(61, 13); - this.label16.TabIndex = 16; - this.label16.Text = "Tiebreak 3:"; - // - // label15 - // - this.label15.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label15.AutoSize = true; - this.label15.Location = new System.Drawing.Point(111, 56); - this.label15.Name = "label15"; - this.label15.Size = new System.Drawing.Size(61, 13); - this.label15.TabIndex = 15; - this.label15.Text = "Tiebreak 2:"; - // - // label14 - // - this.label14.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label14.AutoSize = true; - this.label14.Location = new System.Drawing.Point(111, 36); - this.label14.Name = "label14"; - this.label14.Size = new System.Drawing.Size(61, 13); - this.label14.TabIndex = 6; - this.label14.Text = "Tiebreak 1:"; - // - // label13 - // - this.label13.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label13.AutoSize = true; - this.label13.Location = new System.Drawing.Point(119, 16); - this.label13.Name = "label13"; - this.label13.Size = new System.Drawing.Size(53, 13); - this.label13.TabIndex = 0; - this.label13.Text = "Main Value:"; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(3, 2); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(51, 13); - this.label1.TabIndex = 5; - this.label1.Text = "Attempts:"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(10, 17); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(44, 13); - this.label2.TabIndex = 6; - this.label2.Text = "Frames:"; - // - // AttemptsLabel - // - this.AttemptsLabel.AutoSize = true; - this.AttemptsLabel.Location = new System.Drawing.Point(61, 2); - this.AttemptsLabel.Name = "AttemptsLabel"; - this.AttemptsLabel.Size = new System.Drawing.Size(13, 13); - this.AttemptsLabel.TabIndex = 7; - this.AttemptsLabel.Text = "0"; - // - // FramesLabel - // - this.FramesLabel.AutoSize = true; - this.FramesLabel.Location = new System.Drawing.Point(61, 17); - this.FramesLabel.Name = "FramesLabel"; - this.FramesLabel.Size = new System.Drawing.Size(13, 13); - this.FramesLabel.TabIndex = 8; - this.FramesLabel.Text = "0"; - // - // GoalGroupBox - // - this.GoalGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + this.panel1.AutoScroll = true; + this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.panel1.Controls.Add(this.BestAttemptLogLabel); + this.panel1.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.panel1.Location = new System.Drawing.Point(12, 112); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(212, 251); + this.panel1.TabIndex = 21; + // + // BestAttemptLogLabel + // + this.BestAttemptLogLabel.AutoSize = true; + this.BestAttemptLogLabel.Location = new System.Drawing.Point(8, 8); + this.BestAttemptLogLabel.Name = "BestAttemptLogLabel"; + this.BestAttemptLogLabel.Size = new System.Drawing.Size(294, 14); + this.BestAttemptLogLabel.TabIndex = 0; + this.BestAttemptLogLabel.Text = " "; + // + // BestTieBreak3Box + // + this.BestTieBreak3Box.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.BestTieBreak3Box.Location = new System.Drawing.Point(163, 73); + this.BestTieBreak3Box.Name = "BestTieBreak3Box"; + this.BestTieBreak3Box.ReadOnly = true; + this.BestTieBreak3Box.Size = new System.Drawing.Size(58, 20); + this.BestTieBreak3Box.TabIndex = 20; + this.BestTieBreak3Box.TabStop = false; + // + // BestTieBreak2Box + // + this.BestTieBreak2Box.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.BestTieBreak2Box.Location = new System.Drawing.Point(163, 53); + this.BestTieBreak2Box.Name = "BestTieBreak2Box"; + this.BestTieBreak2Box.ReadOnly = true; + this.BestTieBreak2Box.Size = new System.Drawing.Size(58, 20); + this.BestTieBreak2Box.TabIndex = 19; + this.BestTieBreak2Box.TabStop = false; + // + // BestTieBreak1Box + // + this.BestTieBreak1Box.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.BestTieBreak1Box.Location = new System.Drawing.Point(163, 33); + this.BestTieBreak1Box.Name = "BestTieBreak1Box"; + this.BestTieBreak1Box.ReadOnly = true; + this.BestTieBreak1Box.Size = new System.Drawing.Size(58, 20); + this.BestTieBreak1Box.TabIndex = 18; + this.BestTieBreak1Box.TabStop = false; + // + // BestMaximizeBox + // + this.BestMaximizeBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.BestMaximizeBox.Location = new System.Drawing.Point(163, 13); + this.BestMaximizeBox.Name = "BestMaximizeBox"; + this.BestMaximizeBox.ReadOnly = true; + this.BestMaximizeBox.Size = new System.Drawing.Size(58, 20); + this.BestMaximizeBox.TabIndex = 17; + this.BestMaximizeBox.TabStop = false; + // + // label16 + // + this.label16.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.label16.AutoSize = true; + this.label16.Location = new System.Drawing.Point(96, 76); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(61, 13); + this.label16.TabIndex = 16; + this.label16.Text = "Tiebreak 3:"; + // + // label15 + // + this.label15.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.label15.AutoSize = true; + this.label15.Location = new System.Drawing.Point(96, 56); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(61, 13); + this.label15.TabIndex = 15; + this.label15.Text = "Tiebreak 2:"; + // + // label14 + // + this.label14.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.label14.AutoSize = true; + this.label14.Location = new System.Drawing.Point(96, 36); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(61, 13); + this.label14.TabIndex = 6; + this.label14.Text = "Tiebreak 1:"; + // + // label13 + // + this.label13.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.label13.AutoSize = true; + this.label13.Location = new System.Drawing.Point(104, 16); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(63, 13); + this.label13.TabIndex = 0; + this.label13.Text = "Main Value:"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(3, 2); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(51, 13); + this.label1.TabIndex = 5; + this.label1.Text = "Attempts:"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(10, 17); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(44, 13); + this.label2.TabIndex = 6; + this.label2.Text = "Frames:"; + // + // AttemptsLabel + // + this.AttemptsLabel.AutoSize = true; + this.AttemptsLabel.Location = new System.Drawing.Point(61, 2); + this.AttemptsLabel.Name = "AttemptsLabel"; + this.AttemptsLabel.Size = new System.Drawing.Size(13, 13); + this.AttemptsLabel.TabIndex = 7; + this.AttemptsLabel.Text = "0"; + // + // FramesLabel + // + this.FramesLabel.AutoSize = true; + this.FramesLabel.Location = new System.Drawing.Point(61, 17); + this.FramesLabel.Name = "FramesLabel"; + this.FramesLabel.Size = new System.Drawing.Size(13, 13); + this.FramesLabel.TabIndex = 8; + this.FramesLabel.Text = "0"; + // + // GoalGroupBox + // + this.GoalGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.GoalGroupBox.Controls.Add(this.Tiebreak3Operator); - this.GoalGroupBox.Controls.Add(this.Tiebreak2Operator); - this.GoalGroupBox.Controls.Add(this.Tiebreak1Operator); - this.GoalGroupBox.Controls.Add(this.mainOperator); - this.GoalGroupBox.Controls.Add(this.label12); - this.GoalGroupBox.Controls.Add(this.label11); - this.GoalGroupBox.Controls.Add(this.label10); - this.GoalGroupBox.Controls.Add(this.label9); - this.GoalGroupBox.Controls.Add(this.label7); - this.GoalGroupBox.Controls.Add(this.label6); - this.GoalGroupBox.Controls.Add(this.TieBreaker1Box); - this.GoalGroupBox.Controls.Add(this.TieBreaker2Box); - this.GoalGroupBox.Controls.Add(this.TieBreaker3Box); - this.GoalGroupBox.Controls.Add(this.label5); - this.GoalGroupBox.Controls.Add(this.MaximizeAddressBox); - this.GoalGroupBox.Controls.Add(this.maximizeLabeltext); - this.GoalGroupBox.Controls.Add(this.label4); - this.GoalGroupBox.Controls.Add(this.FrameLengthNumeric); - this.GoalGroupBox.Controls.Add(this.label3); - this.GoalGroupBox.Location = new System.Drawing.Point(12, 27); - this.GoalGroupBox.Name = "GoalGroupBox"; - this.GoalGroupBox.Size = new System.Drawing.Size(312, 150); - this.GoalGroupBox.TabIndex = 9; - this.GoalGroupBox.TabStop = false; - this.GoalGroupBox.Text = " "; - // - // Tiebreak3Operator - // - this.Tiebreak3Operator.FormattingEnabled = true; - this.Tiebreak3Operator.Items.AddRange(new object[] { - ">", - ">=", - "=", - "<=", - "<"}); - this.Tiebreak3Operator.Location = new System.Drawing.Point(266, 119); - this.Tiebreak3Operator.Name = "Tiebreak3Operator"; - this.Tiebreak3Operator.Size = new System.Drawing.Size(40, 21); - this.Tiebreak3Operator.TabIndex = 1009; - Tiebreak3Operator.SelectedIndex = 0; - // - // Tiebreak2Operator - // - this.Tiebreak2Operator.FormattingEnabled = true; - this.Tiebreak2Operator.Items.AddRange(new object[] { - ">", - ">=", - "=", - "<=", - "<"}); - this.Tiebreak2Operator.Location = new System.Drawing.Point(266, 98); - this.Tiebreak2Operator.Name = "Tiebreak2Operator"; - this.Tiebreak2Operator.Size = new System.Drawing.Size(40, 21); - this.Tiebreak2Operator.TabIndex = 1008; - Tiebreak2Operator.SelectedIndex = 0; - // - // Tiebreak1Operator - // - this.Tiebreak1Operator.FormattingEnabled = true; - this.Tiebreak1Operator.Items.AddRange(new object[] { - ">", - ">=", - "=", - "<=", - "<"}); - this.Tiebreak1Operator.Location = new System.Drawing.Point(266, 76); - this.Tiebreak1Operator.Name = "Tiebreak1Operator"; - this.Tiebreak1Operator.Size = new System.Drawing.Size(40, 21); - this.Tiebreak1Operator.TabIndex = 1007; - Tiebreak1Operator.SelectedIndex = 0; - // - // mainOperator - // - this.mainOperator.FormattingEnabled = true; - this.mainOperator.Items.AddRange(new object[] { - ">", - ">=", - "=", - "<=", - "<"}); - this.mainOperator.Location = new System.Drawing.Point(266, 54); - this.mainOperator.Name = "mainOperator"; - this.mainOperator.Size = new System.Drawing.Size(40, 21); - this.mainOperator.TabIndex = 1006; - mainOperator.SelectedIndex = 0; - // - // label12 - // - this.label12.AutoSize = true; - this.label12.Location = new System.Drawing.Point(74, 122); - this.label12.Name = "label12"; - this.label12.Size = new System.Drawing.Size(59, 13); - this.label12.TabIndex = 14; - this.label12.Text = "Address 0x"; - // - // label11 - // - this.label11.AutoSize = true; - this.label11.Location = new System.Drawing.Point(73, 101); - this.label11.Name = "label11"; - this.label11.Size = new System.Drawing.Size(59, 13); - this.label11.TabIndex = 13; - this.label11.Text = "Address 0x"; - // - // label10 - // - this.label10.AutoSize = true; - this.label10.Location = new System.Drawing.Point(73, 79); - this.label10.Name = "label10"; - this.label10.Size = new System.Drawing.Size(59, 13); - this.label10.TabIndex = 12; - this.label10.Text = "Address 0x"; - // - // label9 - // - this.label9.AutoSize = true; - this.label9.Location = new System.Drawing.Point(73, 57); - this.label9.Name = "label9"; - this.label9.Size = new System.Drawing.Size(59, 13); - this.label9.TabIndex = 11; - this.label9.Text = "Address 0x"; - // - // label7 - // - this.label7.AutoSize = true; - this.label7.Location = new System.Drawing.Point(6, 122); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(61, 13); - this.label7.TabIndex = 10; - this.label7.Text = "Tiebreak 3:"; - // - // label6 - // - this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(6, 101); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(61, 13); - this.label6.TabIndex = 9; - this.label6.Text = "Tiebreak 2:"; - // - // TieBreaker1Box - // - this.TieBreaker1Box.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.TieBreaker1Box.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper; - this.TieBreaker1Box.Location = new System.Drawing.Point(139, 76); - this.TieBreaker1Box.Name = "TieBreaker1Box"; - this.TieBreaker1Box.Nullable = true; - this.TieBreaker1Box.Size = new System.Drawing.Size(121, 20); - this.TieBreaker1Box.TabIndex = 1002; - // - // TieBreaker2Box - // - this.TieBreaker2Box.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.TieBreaker2Box.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper; - this.TieBreaker2Box.Location = new System.Drawing.Point(139, 98); - this.TieBreaker2Box.Name = "TieBreaker2Box"; - this.TieBreaker2Box.Nullable = true; - this.TieBreaker2Box.Size = new System.Drawing.Size(121, 20); - this.TieBreaker2Box.TabIndex = 1003; - // - // TieBreaker3Box - // - this.TieBreaker3Box.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.TieBreaker3Box.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper; - this.TieBreaker3Box.Location = new System.Drawing.Point(139, 119); - this.TieBreaker3Box.Name = "TieBreaker3Box"; - this.TieBreaker3Box.Nullable = true; - this.TieBreaker3Box.Size = new System.Drawing.Size(121, 20); - this.TieBreaker3Box.TabIndex = 1004; - // - // label5 - // - this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(7, 79); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(61, 13); - this.label5.TabIndex = 5; - this.label5.Text = "Tiebreak 1:"; - // - // MaximizeAddressBox - // - this.MaximizeAddressBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.MaximizeAddressBox.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper; - this.MaximizeAddressBox.Location = new System.Drawing.Point(139, 54); - this.MaximizeAddressBox.Name = "MaximizeAddressBox"; - this.MaximizeAddressBox.Nullable = true; - this.MaximizeAddressBox.Size = new System.Drawing.Size(121, 20); - this.MaximizeAddressBox.TabIndex = 1001; - this.MaximizeAddressBox.TextChanged += new System.EventHandler(this.FrameLengthNumeric_ValueChanged); - // - // maximizeLabeltext - // - this.maximizeLabeltext.AutoSize = true; - this.maximizeLabeltext.Location = new System.Drawing.Point(7, 57); - this.maximizeLabeltext.Name = "maximizeLabeltext"; - this.maximizeLabeltext.Size = new System.Drawing.Size(63, 13); - this.maximizeLabeltext.TabIndex = 3; - this.maximizeLabeltext.Text = "Main Value:"; - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(113, 29); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(38, 13); - this.label4.TabIndex = 2; - this.label4.Text = "frames"; - // - // FrameLengthNumeric - // - this.FrameLengthNumeric.Location = new System.Drawing.Point(60, 25); - this.FrameLengthNumeric.Maximum = new decimal(new int[] { + this.GoalGroupBox.Controls.Add(this.label4); + this.GoalGroupBox.Controls.Add(this.FrameLengthNumeric); + this.GoalGroupBox.Controls.Add(this.label3); + this.GoalGroupBox.Controls.Add(this.panel3); + this.GoalGroupBox.Controls.Add(this.panel4); + this.GoalGroupBox.Controls.Add(this.panel5); + this.GoalGroupBox.Controls.Add(this.panel6); + this.GoalGroupBox.Location = new System.Drawing.Point(12, 27); + this.GoalGroupBox.Name = "GoalGroupBox"; + this.GoalGroupBox.Size = new System.Drawing.Size(422, 150); + this.GoalGroupBox.TabIndex = 9; + this.GoalGroupBox.TabStop = false; + this.GoalGroupBox.Text = " "; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(113, 29); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(38, 13); + this.label4.TabIndex = 2; + this.label4.Text = "frames"; + // + // FrameLengthNumeric + // + this.FrameLengthNumeric.Location = new System.Drawing.Point(60, 25); + this.FrameLengthNumeric.Maximum = new decimal(new int[] { 999, 0, 0, 0}); - this.FrameLengthNumeric.Name = "FrameLengthNumeric"; - this.FrameLengthNumeric.Size = new System.Drawing.Size(46, 20); - this.FrameLengthNumeric.TabIndex = 1000; - this.FrameLengthNumeric.Value = new decimal(new int[] { + this.FrameLengthNumeric.Name = "FrameLengthNumeric"; + this.FrameLengthNumeric.Size = new System.Drawing.Size(46, 20); + this.FrameLengthNumeric.TabIndex = 1000; + this.FrameLengthNumeric.Value = new decimal(new int[] { 100, 0, 0, 0}); - this.FrameLengthNumeric.ValueChanged += new System.EventHandler(this.FrameLengthNumeric_ValueChanged); - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(7, 29); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(50, 13); - this.label3.TabIndex = 0; - this.label3.Text = "End after"; - // - // StopBtn - // - this.StopBtn.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; - this.StopBtn.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; - this.StopBtn.Location = new System.Drawing.Point(6, 56); - this.StopBtn.Name = "StopBtn"; - this.StopBtn.Size = new System.Drawing.Size(75, 23); - this.StopBtn.TabIndex = 2002; - this.StopBtn.Text = "&Stop"; - this.StopBtn.UseVisualStyleBackColor = true; - this.StopBtn.Visible = false; - this.StopBtn.Click += new System.EventHandler(this.StopBtn_Click); - // - // label8 - // - this.label8.AutoSize = true; - this.label8.Location = new System.Drawing.Point(7, 29); - this.label8.Name = "label8"; - this.label8.Size = new System.Drawing.Size(58, 13); - this.label8.TabIndex = 11; - this.label8.Text = "Start From:"; - // - // StartFromSlotBox - // - this.StartFromSlotBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.StartFromSlotBox.FormattingEnabled = true; - this.StartFromSlotBox.Items.AddRange(new object[] { + this.FrameLengthNumeric.ValueChanged += new System.EventHandler(this.FrameLengthNumeric_ValueChanged); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(7, 29); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(50, 13); + this.label3.TabIndex = 0; + this.label3.Text = "End after"; + // + // panel3 + // + this.panel3.Controls.Add(this.MainValueNumeric); + this.panel3.Controls.Add(this.MainValueRadio); + this.panel3.Controls.Add(this.MainBestRadio); + this.panel3.Controls.Add(this.MainOperator); + this.panel3.Controls.Add(this.label9); + this.panel3.Controls.Add(this.MaximizeAddressBox); + this.panel3.Controls.Add(this.maximizeLabeltext); + this.panel3.Location = new System.Drawing.Point(9, 51); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(407, 26); + this.panel3.TabIndex = 0; + // + // MainValueNumeric + // + this.MainValueNumeric.Enabled = false; + this.MainValueNumeric.Location = new System.Drawing.Point(336, 4); + this.MainValueNumeric.Maximum = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + this.MainValueNumeric.Minimum = new decimal(new int[] { + 100000, + 0, + 0, + -2147483648}); + this.MainValueNumeric.Name = "MainValueNumeric"; + this.MainValueNumeric.Size = new System.Drawing.Size(61, 20); + this.MainValueNumeric.TabIndex = 1013; + this.MainValueNumeric.ValueChanged += new System.EventHandler(this.MainValueNumeric_ValueChanged); + // + // MainValueRadio + // + this.MainValueRadio.AutoSize = true; + this.MainValueRadio.Location = new System.Drawing.Point(281, 6); + this.MainValueRadio.Name = "MainValueRadio"; + this.MainValueRadio.Size = new System.Drawing.Size(52, 17); + this.MainValueRadio.TabIndex = 1012; + this.MainValueRadio.Text = "Value"; + this.MainValueRadio.UseVisualStyleBackColor = true; + this.MainValueRadio.CheckedChanged += new System.EventHandler(this.MainValueRadio_CheckedChanged); + // + // MainBestRadio + // + this.MainBestRadio.AutoSize = true; + this.MainBestRadio.Checked = true; + this.MainBestRadio.Location = new System.Drawing.Point(235, 6); + this.MainBestRadio.Name = "MainBestRadio"; + this.MainBestRadio.Size = new System.Drawing.Size(46, 17); + this.MainBestRadio.TabIndex = 1011; + this.MainBestRadio.TabStop = true; + this.MainBestRadio.Text = "Best"; + this.MainBestRadio.UseVisualStyleBackColor = true; + this.MainBestRadio.CheckedChanged += new System.EventHandler(this.MainBestRadio_CheckedChanged); + // + // MainOperator + // + this.MainOperator.FormattingEnabled = true; + this.MainOperator.Items.AddRange(new object[] { + ">", + ">=", + "=", + "<=", + "<"}); + this.MainOperator.Location = new System.Drawing.Point(187, 3); + this.MainOperator.Name = "MainOperator"; + this.MainOperator.Size = new System.Drawing.Size(40, 21); + this.MainOperator.TabIndex = 1010; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(67, 7); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(59, 13); + this.label9.TabIndex = 1008; + this.label9.Text = "Address 0x"; + // + // MaximizeAddressBox + // + this.MaximizeAddressBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.MaximizeAddressBox.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper; + this.MaximizeAddressBox.Location = new System.Drawing.Point(133, 4); + this.MaximizeAddressBox.Name = "MaximizeAddressBox"; + this.MaximizeAddressBox.Nullable = true; + this.MaximizeAddressBox.Size = new System.Drawing.Size(47, 20); + this.MaximizeAddressBox.TabIndex = 1009; + // + // maximizeLabeltext + // + this.maximizeLabeltext.AutoSize = true; + this.maximizeLabeltext.Location = new System.Drawing.Point(1, 7); + this.maximizeLabeltext.Name = "maximizeLabeltext"; + this.maximizeLabeltext.Size = new System.Drawing.Size(63, 13); + this.maximizeLabeltext.TabIndex = 1007; + this.maximizeLabeltext.Text = "Main Value:"; + // + // panel4 + // + this.panel4.Controls.Add(this.TieBreak1Numeric); + this.panel4.Controls.Add(this.TieBreak1ValueRadio); + this.panel4.Controls.Add(this.Tiebreak1Operator); + this.panel4.Controls.Add(this.TieBreak1BestRadio); + this.panel4.Controls.Add(this.label5); + this.panel4.Controls.Add(this.TieBreaker1Box); + this.panel4.Controls.Add(this.label10); + this.panel4.Location = new System.Drawing.Point(9, 74); + this.panel4.Name = "panel4"; + this.panel4.Size = new System.Drawing.Size(407, 26); + this.panel4.TabIndex = 1; + // + // TieBreak1Numeric + // + this.TieBreak1Numeric.Enabled = false; + this.TieBreak1Numeric.Location = new System.Drawing.Point(336, 4); + this.TieBreak1Numeric.Maximum = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + this.TieBreak1Numeric.Minimum = new decimal(new int[] { + 100000, + 0, + 0, + -2147483648}); + this.TieBreak1Numeric.Name = "TieBreak1Numeric"; + this.TieBreak1Numeric.Size = new System.Drawing.Size(61, 20); + this.TieBreak1Numeric.TabIndex = 1013; + this.TieBreak1Numeric.ValueChanged += new System.EventHandler(this.TieBreak1Numeric_ValueChanged); + // + // TieBreak1ValueRadio + // + this.TieBreak1ValueRadio.AutoSize = true; + this.TieBreak1ValueRadio.Location = new System.Drawing.Point(281, 6); + this.TieBreak1ValueRadio.Name = "TieBreak1ValueRadio"; + this.TieBreak1ValueRadio.Size = new System.Drawing.Size(52, 17); + this.TieBreak1ValueRadio.TabIndex = 1012; + this.TieBreak1ValueRadio.Text = "Value"; + this.TieBreak1ValueRadio.UseVisualStyleBackColor = true; + this.TieBreak1ValueRadio.CheckedChanged += new System.EventHandler(this.TieBreak1ValueRadio_CheckedChanged); + // + // Tiebreak1Operator + // + this.Tiebreak1Operator.FormattingEnabled = true; + this.Tiebreak1Operator.Items.AddRange(new object[] { + ">", + ">=", + "=", + "<=", + "<"}); + this.Tiebreak1Operator.Location = new System.Drawing.Point(187, 3); + this.Tiebreak1Operator.Name = "Tiebreak1Operator"; + this.Tiebreak1Operator.Size = new System.Drawing.Size(40, 21); + this.Tiebreak1Operator.TabIndex = 1007; + // + // TieBreak1BestRadio + // + this.TieBreak1BestRadio.AutoSize = true; + this.TieBreak1BestRadio.Checked = true; + this.TieBreak1BestRadio.Location = new System.Drawing.Point(235, 6); + this.TieBreak1BestRadio.Name = "TieBreak1BestRadio"; + this.TieBreak1BestRadio.Size = new System.Drawing.Size(46, 17); + this.TieBreak1BestRadio.TabIndex = 1011; + this.TieBreak1BestRadio.TabStop = true; + this.TieBreak1BestRadio.Text = "Best"; + this.TieBreak1BestRadio.UseVisualStyleBackColor = true; + this.TieBreak1BestRadio.CheckedChanged += new System.EventHandler(this.Tiebreak1BestRadio_CheckedChanged); + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(1, 7); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(61, 13); + this.label5.TabIndex = 5; + this.label5.Text = "Tiebreak 1:"; + // + // TieBreaker1Box + // + this.TieBreaker1Box.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.TieBreaker1Box.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper; + this.TieBreaker1Box.Location = new System.Drawing.Point(133, 4); + this.TieBreaker1Box.Name = "TieBreaker1Box"; + this.TieBreaker1Box.Nullable = true; + this.TieBreaker1Box.Size = new System.Drawing.Size(47, 20); + this.TieBreaker1Box.TabIndex = 1002; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(67, 7); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(59, 13); + this.label10.TabIndex = 12; + this.label10.Text = "Address 0x"; + // + // panel5 + // + this.panel5.Controls.Add(this.TieBreak2Numeric); + this.panel5.Controls.Add(this.Tiebreak2Operator); + this.panel5.Controls.Add(this.TieBreak2ValueRadio); + this.panel5.Controls.Add(this.TieBreak2BestRadio); + this.panel5.Controls.Add(this.label11); + this.panel5.Controls.Add(this.label6); + this.panel5.Controls.Add(this.TieBreaker2Box); + this.panel5.Location = new System.Drawing.Point(9, 97); + this.panel5.Name = "panel5"; + this.panel5.Size = new System.Drawing.Size(407, 26); + this.panel5.TabIndex = 2; + // + // TieBreak2Numeric + // + this.TieBreak2Numeric.Enabled = false; + this.TieBreak2Numeric.Location = new System.Drawing.Point(336, 4); + this.TieBreak2Numeric.Maximum = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + this.TieBreak2Numeric.Minimum = new decimal(new int[] { + 100000, + 0, + 0, + -2147483648}); + this.TieBreak2Numeric.Name = "TieBreak2Numeric"; + this.TieBreak2Numeric.Size = new System.Drawing.Size(61, 20); + this.TieBreak2Numeric.TabIndex = 1013; + this.TieBreak2Numeric.ValueChanged += new System.EventHandler(this.TieBreak2Numeric_ValueChanged); + // + // Tiebreak2Operator + // + this.Tiebreak2Operator.FormattingEnabled = true; + this.Tiebreak2Operator.Items.AddRange(new object[] { + ">", + ">=", + "=", + "<=", + "<"}); + this.Tiebreak2Operator.Location = new System.Drawing.Point(187, 3); + this.Tiebreak2Operator.Name = "Tiebreak2Operator"; + this.Tiebreak2Operator.Size = new System.Drawing.Size(40, 21); + this.Tiebreak2Operator.TabIndex = 1008; + // + // TieBreak2ValueRadio + // + this.TieBreak2ValueRadio.AutoSize = true; + this.TieBreak2ValueRadio.Location = new System.Drawing.Point(281, 6); + this.TieBreak2ValueRadio.Name = "TieBreak2ValueRadio"; + this.TieBreak2ValueRadio.Size = new System.Drawing.Size(52, 17); + this.TieBreak2ValueRadio.TabIndex = 1012; + this.TieBreak2ValueRadio.Text = "Value"; + this.TieBreak2ValueRadio.UseVisualStyleBackColor = true; + this.TieBreak2ValueRadio.CheckedChanged += new System.EventHandler(this.TieBreak2ValueRadio_CheckedChanged); + // + // TieBreak2BestRadio + // + this.TieBreak2BestRadio.AutoSize = true; + this.TieBreak2BestRadio.Checked = true; + this.TieBreak2BestRadio.Location = new System.Drawing.Point(235, 6); + this.TieBreak2BestRadio.Name = "TieBreak2BestRadio"; + this.TieBreak2BestRadio.Size = new System.Drawing.Size(46, 17); + this.TieBreak2BestRadio.TabIndex = 1011; + this.TieBreak2BestRadio.TabStop = true; + this.TieBreak2BestRadio.Text = "Best"; + this.TieBreak2BestRadio.UseVisualStyleBackColor = true; + this.TieBreak2BestRadio.CheckedChanged += new System.EventHandler(this.Tiebreak2BestRadio_CheckedChanged); + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Location = new System.Drawing.Point(67, 7); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(59, 13); + this.label11.TabIndex = 13; + this.label11.Text = "Address 0x"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(1, 7); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(61, 13); + this.label6.TabIndex = 9; + this.label6.Text = "Tiebreak 2:"; + // + // TieBreaker2Box + // + this.TieBreaker2Box.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.TieBreaker2Box.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper; + this.TieBreaker2Box.Location = new System.Drawing.Point(133, 4); + this.TieBreaker2Box.Name = "TieBreaker2Box"; + this.TieBreaker2Box.Nullable = true; + this.TieBreaker2Box.Size = new System.Drawing.Size(47, 20); + this.TieBreaker2Box.TabIndex = 1003; + // + // panel6 + // + this.panel6.Controls.Add(this.label12); + this.panel6.Controls.Add(this.label7); + this.panel6.Controls.Add(this.TieBreaker3Box); + this.panel6.Controls.Add(this.TieBreak3Numeric); + this.panel6.Controls.Add(this.TieBreak3ValueRadio); + this.panel6.Controls.Add(this.TieBreak3BestRadio); + this.panel6.Controls.Add(this.Tiebreak3Operator); + this.panel6.Location = new System.Drawing.Point(9, 120); + this.panel6.Name = "panel6"; + this.panel6.Size = new System.Drawing.Size(407, 26); + this.panel6.TabIndex = 3; + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Location = new System.Drawing.Point(67, 7); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(59, 13); + this.label12.TabIndex = 1015; + this.label12.Text = "Address 0x"; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(1, 7); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(61, 13); + this.label7.TabIndex = 1014; + this.label7.Text = "Tiebreak 3:"; + // + // TieBreaker3Box + // + this.TieBreaker3Box.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.TieBreaker3Box.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper; + this.TieBreaker3Box.Location = new System.Drawing.Point(133, 4); + this.TieBreaker3Box.Name = "TieBreaker3Box"; + this.TieBreaker3Box.Nullable = true; + this.TieBreaker3Box.Size = new System.Drawing.Size(47, 20); + this.TieBreaker3Box.TabIndex = 1016; + // + // TieBreak3Numeric + // + this.TieBreak3Numeric.Enabled = false; + this.TieBreak3Numeric.Location = new System.Drawing.Point(336, 4); + this.TieBreak3Numeric.Maximum = new decimal(new int[] { + 100000, + 0, + 0, + 0}); + this.TieBreak3Numeric.Minimum = new decimal(new int[] { + 100000, + 0, + 0, + -2147483648}); + this.TieBreak3Numeric.Name = "TieBreak3Numeric"; + this.TieBreak3Numeric.Size = new System.Drawing.Size(61, 20); + this.TieBreak3Numeric.TabIndex = 1013; + this.TieBreak3Numeric.ValueChanged += new System.EventHandler(this.TieBreak3Numeric_ValueChanged); + // + // TieBreak3ValueRadio + // + this.TieBreak3ValueRadio.AutoSize = true; + this.TieBreak3ValueRadio.Location = new System.Drawing.Point(281, 6); + this.TieBreak3ValueRadio.Name = "TieBreak3ValueRadio"; + this.TieBreak3ValueRadio.Size = new System.Drawing.Size(52, 17); + this.TieBreak3ValueRadio.TabIndex = 1012; + this.TieBreak3ValueRadio.Text = "Value"; + this.TieBreak3ValueRadio.UseVisualStyleBackColor = true; + this.TieBreak3ValueRadio.CheckedChanged += new System.EventHandler(this.TieBreak3ValueRadio_CheckedChanged); + // + // TieBreak3BestRadio + // + this.TieBreak3BestRadio.AutoSize = true; + this.TieBreak3BestRadio.Checked = true; + this.TieBreak3BestRadio.Location = new System.Drawing.Point(235, 6); + this.TieBreak3BestRadio.Name = "TieBreak3BestRadio"; + this.TieBreak3BestRadio.Size = new System.Drawing.Size(46, 17); + this.TieBreak3BestRadio.TabIndex = 1011; + this.TieBreak3BestRadio.TabStop = true; + this.TieBreak3BestRadio.Text = "Best"; + this.TieBreak3BestRadio.UseVisualStyleBackColor = true; + this.TieBreak3BestRadio.CheckedChanged += new System.EventHandler(this.Tiebreak3BestRadio_CheckedChanged); + // + // Tiebreak3Operator + // + this.Tiebreak3Operator.FormattingEnabled = true; + this.Tiebreak3Operator.Items.AddRange(new object[] { + ">", + ">=", + "=", + "<=", + "<"}); + this.Tiebreak3Operator.Location = new System.Drawing.Point(187, 3); + this.Tiebreak3Operator.Name = "Tiebreak3Operator"; + this.Tiebreak3Operator.Size = new System.Drawing.Size(40, 21); + this.Tiebreak3Operator.TabIndex = 1017; + // + // StopBtn + // + this.StopBtn.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; + this.StopBtn.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.StopBtn.Location = new System.Drawing.Point(6, 56); + this.StopBtn.Name = "StopBtn"; + this.StopBtn.Size = new System.Drawing.Size(75, 23); + this.StopBtn.TabIndex = 2002; + this.StopBtn.Text = "&Stop"; + this.StopBtn.UseVisualStyleBackColor = true; + this.StopBtn.Visible = false; + this.StopBtn.Click += new System.EventHandler(this.StopBtn_Click); + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(7, 29); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(58, 13); + this.label8.TabIndex = 11; + this.label8.Text = "Start From:"; + // + // StartFromSlotBox + // + this.StartFromSlotBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.StartFromSlotBox.FormattingEnabled = true; + this.StartFromSlotBox.Items.AddRange(new object[] { "Slot 0", "Slot 1", "Slot 2", @@ -834,88 +1069,102 @@ "Slot 7", "Slot 8", "Slot 9"}); - this.StartFromSlotBox.Location = new System.Drawing.Point(71, 25); - this.StartFromSlotBox.Name = "StartFromSlotBox"; - this.StartFromSlotBox.Size = new System.Drawing.Size(75, 21); - this.StartFromSlotBox.TabIndex = 2000; - // - // ControlGroupBox - // - this.ControlGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.ControlGroupBox.Controls.Add(this.panel2); - this.ControlGroupBox.Controls.Add(this.StopBtn); - this.ControlGroupBox.Controls.Add(this.RunBtn); - this.ControlGroupBox.Controls.Add(this.StartFromSlotBox); - this.ControlGroupBox.Controls.Add(this.label8); - this.ControlGroupBox.Location = new System.Drawing.Point(329, 27); - this.ControlGroupBox.Name = "ControlGroupBox"; - this.ControlGroupBox.Size = new System.Drawing.Size(245, 150); - this.ControlGroupBox.TabIndex = 2004; - this.ControlGroupBox.TabStop = false; - this.ControlGroupBox.Text = "Control"; - // - // panel2 - // - this.panel2.ContextMenuStrip = this.StatsContextMenu; - this.panel2.Controls.Add(this.label1); - this.panel2.Controls.Add(this.label2); - this.panel2.Controls.Add(this.FramesLabel); - this.panel2.Controls.Add(this.AttemptsLabel); - this.panel2.Location = new System.Drawing.Point(6, 85); - this.panel2.Name = "panel2"; - this.panel2.Size = new System.Drawing.Size(140, 33); - this.panel2.TabIndex = 2003; - // - // StatsContextMenu - // - this.StatsContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.StartFromSlotBox.Location = new System.Drawing.Point(71, 25); + this.StartFromSlotBox.Name = "StartFromSlotBox"; + this.StartFromSlotBox.Size = new System.Drawing.Size(75, 21); + this.StartFromSlotBox.TabIndex = 2000; + // + // ControlGroupBox + // + this.ControlGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.ControlGroupBox.Controls.Add(this.panel2); + this.ControlGroupBox.Controls.Add(this.StopBtn); + this.ControlGroupBox.Controls.Add(this.RunBtn); + this.ControlGroupBox.Controls.Add(this.StartFromSlotBox); + this.ControlGroupBox.Controls.Add(this.label8); + this.ControlGroupBox.Location = new System.Drawing.Point(440, 27); + this.ControlGroupBox.Name = "ControlGroupBox"; + this.ControlGroupBox.Size = new System.Drawing.Size(230, 150); + this.ControlGroupBox.TabIndex = 2004; + this.ControlGroupBox.TabStop = false; + this.ControlGroupBox.Text = "Control"; + // + // panel2 + // + this.panel2.ContextMenuStrip = this.StatsContextMenu; + this.panel2.Controls.Add(this.label1); + this.panel2.Controls.Add(this.label2); + this.panel2.Controls.Add(this.FramesLabel); + this.panel2.Controls.Add(this.AttemptsLabel); + this.panel2.Location = new System.Drawing.Point(6, 85); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(140, 33); + this.panel2.TabIndex = 2003; + // + // StatsContextMenu + // + this.StatsContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.ClearStatsContextMenuItem}); - this.StatsContextMenu.Name = "StatsContextMenu"; - this.StatsContextMenu.Size = new System.Drawing.Size(102, 26); - // - // ClearStatsContextMenuItem - // - this.ClearStatsContextMenuItem.Name = "ClearStatsContextMenuItem"; - this.ClearStatsContextMenuItem.Size = new System.Drawing.Size(101, 22); - this.ClearStatsContextMenuItem.Text = "&Clear"; - this.ClearStatsContextMenuItem.Click += new System.EventHandler(this.ClearStatsContextMenuItem_Click); - // - // BasicBot - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(587, 587); - this.Controls.Add(this.ControlGroupBox); - this.Controls.Add(this.GoalGroupBox); - this.Controls.Add(this.BestGroupBox); - this.Controls.Add(this.ControlsBox); - this.Controls.Add(this.BotStatusStrip); - this.Controls.Add(this.BotMenu); - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MainMenuStrip = this.BotMenu; - this.Name = "BasicBot"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Basic Bot"; - this.Load += new System.EventHandler(this.BasicBot_Load); - this.BotMenu.ResumeLayout(false); - this.BotMenu.PerformLayout(); - this.BotStatusStrip.ResumeLayout(false); - this.BotStatusStrip.PerformLayout(); - this.ControlsBox.ResumeLayout(false); - this.BestGroupBox.ResumeLayout(false); - this.BestGroupBox.PerformLayout(); - this.panel1.ResumeLayout(false); - this.panel1.PerformLayout(); - this.GoalGroupBox.ResumeLayout(false); - this.GoalGroupBox.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.FrameLengthNumeric)).EndInit(); - this.ControlGroupBox.ResumeLayout(false); - this.ControlGroupBox.PerformLayout(); - this.panel2.ResumeLayout(false); - this.panel2.PerformLayout(); - this.StatsContextMenu.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); + this.StatsContextMenu.Name = "StatsContextMenu"; + this.StatsContextMenu.Size = new System.Drawing.Size(102, 26); + // + // ClearStatsContextMenuItem + // + this.ClearStatsContextMenuItem.Name = "ClearStatsContextMenuItem"; + this.ClearStatsContextMenuItem.Size = new System.Drawing.Size(101, 22); + this.ClearStatsContextMenuItem.Text = "&Clear"; + this.ClearStatsContextMenuItem.Click += new System.EventHandler(this.ClearStatsContextMenuItem_Click); + // + // BasicBot + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoSize = true; + this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.ClientSize = new System.Drawing.Size(687, 587); + this.Controls.Add(this.ControlGroupBox); + this.Controls.Add(this.GoalGroupBox); + this.Controls.Add(this.BestGroupBox); + this.Controls.Add(this.ControlsBox); + this.Controls.Add(this.BotStatusStrip); + this.Controls.Add(this.BotMenu); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MainMenuStrip = this.BotMenu; + this.Name = "BasicBot"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Basic Bot"; + this.Load += new System.EventHandler(this.BasicBot_Load); + this.BotMenu.ResumeLayout(false); + this.BotMenu.PerformLayout(); + this.BotStatusStrip.ResumeLayout(false); + this.BotStatusStrip.PerformLayout(); + this.ControlsBox.ResumeLayout(false); + this.BestGroupBox.ResumeLayout(false); + this.BestGroupBox.PerformLayout(); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + this.GoalGroupBox.ResumeLayout(false); + this.GoalGroupBox.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.FrameLengthNumeric)).EndInit(); + this.panel3.ResumeLayout(false); + this.panel3.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.MainValueNumeric)).EndInit(); + this.panel4.ResumeLayout(false); + this.panel4.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.TieBreak1Numeric)).EndInit(); + this.panel5.ResumeLayout(false); + this.panel5.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.TieBreak2Numeric)).EndInit(); + this.panel6.ResumeLayout(false); + this.panel6.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.TieBreak3Numeric)).EndInit(); + this.ControlGroupBox.ResumeLayout(false); + this.ControlGroupBox.PerformLayout(); + this.panel2.ResumeLayout(false); + this.panel2.PerformLayout(); + this.StatsContextMenu.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); } @@ -939,24 +1188,18 @@ private System.Windows.Forms.Label FramesLabel; private System.Windows.Forms.ToolStripMenuItem OptionsSubMenu; private System.Windows.Forms.GroupBox GoalGroupBox; - private System.Windows.Forms.Label label7; private System.Windows.Forms.Label label6; private HexTextBox TieBreaker1Box; private HexTextBox TieBreaker2Box; - private HexTextBox TieBreaker3Box; private System.Windows.Forms.Label label5; - private HexTextBox MaximizeAddressBox; - private System.Windows.Forms.Label maximizeLabeltext; private System.Windows.Forms.Label label4; private System.Windows.Forms.NumericUpDown FrameLengthNumeric; private System.Windows.Forms.Label label3; private System.Windows.Forms.Button StopBtn; private System.Windows.Forms.Label label8; private System.Windows.Forms.ComboBox StartFromSlotBox; - private System.Windows.Forms.Label label12; private System.Windows.Forms.Label label11; private System.Windows.Forms.Label label10; - private System.Windows.Forms.Label label9; private System.Windows.Forms.TextBox BestTieBreak3Box; private System.Windows.Forms.TextBox BestTieBreak2Box; private System.Windows.Forms.TextBox BestTieBreak1Box; @@ -989,9 +1232,31 @@ private System.Windows.Forms.ToolStripMenuItem _1ByteMenuItem; private System.Windows.Forms.ToolStripMenuItem _2ByteMenuItem; private System.Windows.Forms.ToolStripMenuItem _4ByteMenuItem; - private System.Windows.Forms.ComboBox Tiebreak3Operator; private System.Windows.Forms.ComboBox Tiebreak2Operator; private System.Windows.Forms.ComboBox Tiebreak1Operator; - private System.Windows.Forms.ComboBox mainOperator; - } + private System.Windows.Forms.Panel panel6; + private System.Windows.Forms.ComboBox Tiebreak3Operator; + private System.Windows.Forms.Label label12; + private System.Windows.Forms.Label label7; + private HexTextBox TieBreaker3Box; + private System.Windows.Forms.NumericUpDown TieBreak3Numeric; + private System.Windows.Forms.RadioButton TieBreak3ValueRadio; + private System.Windows.Forms.RadioButton TieBreak3BestRadio; + private System.Windows.Forms.Panel panel5; + private System.Windows.Forms.NumericUpDown TieBreak2Numeric; + private System.Windows.Forms.RadioButton TieBreak2ValueRadio; + private System.Windows.Forms.RadioButton TieBreak2BestRadio; + private System.Windows.Forms.Panel panel4; + private System.Windows.Forms.NumericUpDown TieBreak1Numeric; + private System.Windows.Forms.RadioButton TieBreak1ValueRadio; + private System.Windows.Forms.RadioButton TieBreak1BestRadio; + private System.Windows.Forms.Panel panel3; + private System.Windows.Forms.NumericUpDown MainValueNumeric; + private System.Windows.Forms.RadioButton MainValueRadio; + private System.Windows.Forms.RadioButton MainBestRadio; + private System.Windows.Forms.ComboBox MainOperator; + private System.Windows.Forms.Label label9; + private HexTextBox MaximizeAddressBox; + private System.Windows.Forms.Label maximizeLabeltext; + } } diff --git a/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.cs b/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.cs index eeaccbe605..7069bc71fb 100644 --- a/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.cs +++ b/BizHawk.Client.EmuHawk/tools/BasicBot/BasicBot.cs @@ -44,6 +44,7 @@ namespace BizHawk.Client.EmuHawk private bool _oldCountingSetting = false; private BotAttempt _currentBotAttempt = null; private BotAttempt _bestBotAttempt = null; + private BotAttempt _comparisonBotAttempt = null; private bool _replayMode = false; private int _startFrame = 0; private string _lastRom = string.Empty; @@ -93,7 +94,9 @@ namespace BizHawk.Client.EmuHawk InitializeComponent(); Text = DialogTitle; Settings = new BasicBotSettings(); - } + + _comparisonBotAttempt = new BotAttempt(); + } private void BasicBot_Load(object sender, EventArgs e) { @@ -288,12 +291,12 @@ namespace BizHawk.Client.EmuHawk { get { - return (byte)mainOperator.SelectedIndex; + return (byte)MainOperator.SelectedIndex; } set { - if (value < 5) mainOperator.SelectedIndex = value; - else mainOperator.SelectedIndex = 0; + if (value < 5) MainOperator.SelectedIndex = value; + else MainOperator.SelectedIndex = 0; } } @@ -444,12 +447,21 @@ namespace BizHawk.Client.EmuHawk TieBreaker2Address = 0; TieBreaker3Address = 0; StartFromSlotBox.SelectedIndex = 0; - mainOperator.SelectedIndex = 0; + MainOperator.SelectedIndex = 0; Tiebreak1Operator.SelectedIndex = 0; Tiebreak2Operator.SelectedIndex = 0; Tiebreak3Operator.SelectedIndex = 0; + MainBestRadio.Checked = true; + MainValueNumeric.Value = 0; + TieBreak1Numeric.Value = 0; + TieBreak2Numeric.Value = 0; + TieBreak3Numeric.Value = 0; + TieBreak1BestRadio.Checked = true; + TieBreak2BestRadio.Checked = true; + TieBreak3BestRadio.Checked = true; UpdateBestAttempt(); + UpdateComparisonBotAttempt(); } private void OpenMenuItem_Click(object sender, EventArgs e) @@ -561,7 +573,10 @@ namespace BizHawk.Client.EmuHawk private void ClearBestButton_Click(object sender, EventArgs e) { _bestBotAttempt = null; + Attempts = 0; + Frames = 0; UpdateBestAttempt(); + UpdateComparisonBotAttempt(); } private void PlayBestButton_Click(object sender, EventArgs e) @@ -615,17 +630,33 @@ namespace BizHawk.Client.EmuHawk private class BotData { + public BotData() + { + MainCompareToBest = true; + TieBreaker1CompareToBest = true; + TieBreaker2CompareToBest = true; + TieBreaker3CompareToBest = true; + } + public BotAttempt Best { get; set; } public Dictionary ControlProbabilities { get; set; } public int Maximize { get; set; } public int TieBreaker1 { get; set; } public int TieBreaker2 { get; set; } public int TieBreaker3 { get; set; } - public byte ComparisonTypeMain { get; set; } - public byte ComparisonTypeTie1 { get; set; } - public byte ComparisonTypeTie2 { get; set; } - public byte ComparisonTypeTie3 { get; set; } - public int FrameLength { get; set; } + public byte ComparisonTypeMain { get; set; } + public byte ComparisonTypeTie1 { get; set; } + public byte ComparisonTypeTie2 { get; set; } + public byte ComparisonTypeTie3 { get; set; } + public bool MainCompareToBest { get; set; } + public bool TieBreaker1CompareToBest { get; set; } + public bool TieBreaker2CompareToBest { get; set; } + public bool TieBreaker3CompareToBest { get; set; } + public int MainCompareToValue { get; set; } + public int TieBreaker1CompareToValue { get; set; } + public int TieBreaker2CompareToValue { get; set; } + public int TieBreaker3CompareToValue { get; set; } + public int FrameLength { get; set; } public string FromSlot { get; set; } public long Attempts { get; set; } public long Frames { get; set; } @@ -661,7 +692,6 @@ namespace BizHawk.Client.EmuHawk _bestBotAttempt = botData.Best; - var probabilityControls = ControlProbabilityPanel.Controls .OfType() .ToList(); @@ -682,14 +712,42 @@ namespace BizHawk.Client.EmuHawk Tie1ComparisonType = botData.ComparisonTypeTie1; Tie2ComparisonType = botData.ComparisonTypeTie2; Tie3ComparisonType = botData.ComparisonTypeTie3; - } + + MainBestRadio.Checked = botData.MainCompareToBest; + TieBreak1BestRadio.Checked = botData.TieBreaker1CompareToBest; + TieBreak2BestRadio.Checked = botData.TieBreaker2CompareToBest; + TieBreak3BestRadio.Checked = botData.TieBreaker3CompareToBest; + MainValueRadio.Checked = !botData.MainCompareToBest; + TieBreak1ValueRadio.Checked = !botData.TieBreaker1CompareToBest; + TieBreak2ValueRadio.Checked = !botData.TieBreaker2CompareToBest; + TieBreak3ValueRadio.Checked = !botData.TieBreaker3CompareToBest; + + MainValueNumeric.Value = botData.MainCompareToValue; + TieBreak1Numeric.Value = botData.TieBreaker1CompareToValue; + TieBreak2Numeric.Value = botData.TieBreaker2CompareToValue; + TieBreak3Numeric.Value = botData.TieBreaker3CompareToValue; + } catch { MainComparisonType = 0; Tie1ComparisonType = 0; Tie2ComparisonType = 0; Tie3ComparisonType = 0; - } + + MainBestRadio.Checked = true; + TieBreak1BestRadio.Checked = true; + TieBreak2BestRadio.Checked = true; + TieBreak3BestRadio.Checked = true; + MainBestRadio.Checked = false; + TieBreak1BestRadio.Checked = false; + TieBreak2BestRadio.Checked = false; + TieBreak3BestRadio.Checked = false; + + MainValueNumeric.Value = 0; + TieBreak1Numeric.Value = 0; + TieBreak2Numeric.Value = 0; + TieBreak3Numeric.Value = 0; + } FrameLength = botData.FrameLength; FromSlot = botData.FromSlot; Attempts = botData.Attempts; @@ -703,6 +761,7 @@ namespace BizHawk.Client.EmuHawk _dataSize = botData.DataSize > 0 ? botData.DataSize : 1; UpdateBestAttempt(); + UpdateComparisonBotAttempt(); if (_bestBotAttempt != null) { @@ -716,20 +775,28 @@ namespace BizHawk.Client.EmuHawk return true; } - private void SaveBotFile(string path) - { - var data = new BotData - { - Best = _bestBotAttempt, - ControlProbabilities = ControlProbabilities, - Maximize = MaximizeAddress, - TieBreaker1 = TieBreaker1Address, - TieBreaker2 = TieBreaker2Address, - TieBreaker3 = TieBreaker3Address, - ComparisonTypeMain = MainComparisonType, - ComparisonTypeTie1 = Tie1ComparisonType, - ComparisonTypeTie2 = Tie2ComparisonType, - ComparisonTypeTie3 = Tie3ComparisonType, + private void SaveBotFile(string path) + { + var data = new BotData + { + Best = _bestBotAttempt, + ControlProbabilities = ControlProbabilities, + Maximize = MaximizeAddress, + TieBreaker1 = TieBreaker1Address, + TieBreaker2 = TieBreaker2Address, + TieBreaker3 = TieBreaker3Address, + ComparisonTypeMain = MainComparisonType, + ComparisonTypeTie1 = Tie1ComparisonType, + ComparisonTypeTie2 = Tie2ComparisonType, + ComparisonTypeTie3 = Tie3ComparisonType, + MainCompareToBest = MainBestRadio.Checked, + TieBreaker1CompareToBest = TieBreak1BestRadio.Checked, + TieBreaker2CompareToBest = TieBreak2BestRadio.Checked, + TieBreaker3CompareToBest = TieBreak3BestRadio.Checked, + MainCompareToValue = (int)MainValueNumeric.Value, + TieBreaker1CompareToValue = (int)TieBreak1Numeric.Value, + TieBreaker2CompareToValue = (int)TieBreak2Numeric.Value, + TieBreaker3CompareToValue = (int)TieBreak3Numeric.Value, FromSlot = FromSlot, FrameLength = FrameLength, Attempts = Attempts, @@ -857,7 +924,7 @@ namespace BizHawk.Client.EmuHawk _currentBotAttempt.TieBreak3 = TieBreaker3Value; PlayBestButton.Enabled = true; - if (_bestBotAttempt == null || IsBetter(_bestBotAttempt, _currentBotAttempt)) + if (IsBetter(_comparisonBotAttempt, _currentBotAttempt)) { _bestBotAttempt = _currentBotAttempt; UpdateBestAttempt(); @@ -880,25 +947,25 @@ namespace BizHawk.Client.EmuHawk MessageLabel.Text = "Replay stopped"; } - private bool IsBetter(BotAttempt best, BotAttempt current) + private bool IsBetter(BotAttempt comparison, BotAttempt current) { - if (!TestValue(MainComparisonType, current.Maximize, best.Maximize)) + if (!TestValue(MainComparisonType, current.Maximize, comparison.Maximize)) { return false; } - else if (current.Maximize == best.Maximize) + else if (current.Maximize == comparison.Maximize) { - if (!TestValue(Tie1ComparisonType, current.TieBreak1, best.TieBreak1)) + if (!TestValue(Tie1ComparisonType, current.TieBreak1, comparison.TieBreak1)) { return false; } - else if (current.TieBreak1 == best.TieBreak1) + else if (current.TieBreak1 == comparison.TieBreak1) { - if (!TestValue(Tie2ComparisonType, current.TieBreak2, best.TieBreak2)) + if (!TestValue(Tie2ComparisonType, current.TieBreak2, comparison.TieBreak2)) { return false; } - else if (current.TieBreak2 == best.TieBreak2) + else if (current.TieBreak2 == comparison.TieBreak2) { if (!TestValue(Tie3ComparisonType, current.TieBreak3, current.TieBreak3)) { @@ -933,8 +1000,6 @@ namespace BizHawk.Client.EmuHawk { if (_bestBotAttempt != null) { - - ClearBestButton.Enabled = true; BestAttemptNumberLabel.Text = _bestBotAttempt.Attempt.ToString(); BestMaximizeBox.Text = _bestBotAttempt.Maximize.ToString(); @@ -1101,5 +1166,161 @@ namespace BizHawk.Client.EmuHawk && !string.IsNullOrWhiteSpace(MaximizeAddressBox.Text) && ControlProbabilities.Any(kvp => kvp.Value > 0); } + + /// + /// Updates comparison bot attempt with current best bot attempt values for values where the "best" radio button is selected + /// + private void UpdateComparisonBotAttempt() + { + if(_bestBotAttempt == null) + { + if (MainBestRadio.Checked) + { + _comparisonBotAttempt.Maximize = 0; + } + + if (TieBreak1BestRadio.Checked) + { + _comparisonBotAttempt.TieBreak1 = 0; + } + + if (TieBreak2BestRadio.Checked) + { + _comparisonBotAttempt.TieBreak2= 0; + } + + if (TieBreak3BestRadio.Checked) + { + _comparisonBotAttempt.TieBreak3 = 0; + } + } + else + { + if (MainBestRadio.Checked && _bestBotAttempt.Maximize != _comparisonBotAttempt.Maximize) + { + _comparisonBotAttempt.Maximize = _bestBotAttempt.Maximize; + } + + if (TieBreak1BestRadio.Checked && _bestBotAttempt.TieBreak1 != _comparisonBotAttempt.TieBreak1) + { + _comparisonBotAttempt.TieBreak1 = _bestBotAttempt.TieBreak1; + } + + if (TieBreak2BestRadio.Checked && _bestBotAttempt.TieBreak2 != _comparisonBotAttempt.TieBreak2) + { + _comparisonBotAttempt.TieBreak2 = _bestBotAttempt.TieBreak2; + } + + if (TieBreak3BestRadio.Checked && _bestBotAttempt.TieBreak3 != _comparisonBotAttempt.TieBreak3) + { + _comparisonBotAttempt.TieBreak3 = _bestBotAttempt.TieBreak3; + } + } + } + + private void MainBestRadio_CheckedChanged(object sender, EventArgs e) + { + RadioButton radioButton = (RadioButton)sender; + if (radioButton.Checked) + { + this.MainValueNumeric.Enabled = false; + _comparisonBotAttempt.Maximize = _bestBotAttempt == null ? 0 : _bestBotAttempt.Maximize; + } + } + + private void Tiebreak1BestRadio_CheckedChanged(object sender, EventArgs e) + { + RadioButton radioButton = (RadioButton)sender; + if (radioButton.Checked) + { + this.TieBreak1Numeric.Enabled = false; + _comparisonBotAttempt.TieBreak1 = _bestBotAttempt == null ? 0 : _bestBotAttempt.TieBreak1; + } + } + + private void Tiebreak2BestRadio_CheckedChanged(object sender, EventArgs e) + { + RadioButton radioButton = (RadioButton)sender; + if (radioButton.Checked) + { + this.TieBreak2Numeric.Enabled = false; + _comparisonBotAttempt.TieBreak2 = _bestBotAttempt == null ? 0 : _bestBotAttempt.TieBreak2; + } + } + + private void Tiebreak3BestRadio_CheckedChanged(object sender, EventArgs e) + { + RadioButton radioButton = (RadioButton)sender; + if (radioButton.Checked) + { + this.TieBreak3Numeric.Enabled = false; + _comparisonBotAttempt.TieBreak3 = _bestBotAttempt == null ? 0 : _bestBotAttempt.TieBreak3; + } + } + + private void MainValueRadio_CheckedChanged(object sender, EventArgs e) + { + RadioButton radioButton = (RadioButton)sender; + if (radioButton.Checked) + { + this.MainValueNumeric.Enabled = true; + _comparisonBotAttempt.Maximize = (int)this.MainValueNumeric.Value; + } + } + + private void TieBreak1ValueRadio_CheckedChanged(object sender, EventArgs e) + { + RadioButton radioButton = (RadioButton)sender; + if (radioButton.Checked) + { + this.TieBreak1Numeric.Enabled = true; + _comparisonBotAttempt.TieBreak1 = (int)this.TieBreak1Numeric.Value; + } + } + + private void TieBreak2ValueRadio_CheckedChanged(object sender, EventArgs e) + { + RadioButton radioButton = (RadioButton)sender; + if (radioButton.Checked) + { + this.TieBreak2Numeric.Enabled = true; + _comparisonBotAttempt.TieBreak2 = (int)this.TieBreak2Numeric.Value; + } + } + + private void TieBreak3ValueRadio_CheckedChanged(object sender, EventArgs e) + { + RadioButton radioButton = (RadioButton)sender; + if (radioButton.Checked) + { + this.TieBreak3Numeric.Enabled = true; + _comparisonBotAttempt.TieBreak3 = (int)this.TieBreak3Numeric.Value; + } + } + + private void MainValueNumeric_ValueChanged(object sender, EventArgs e) + { + NumericUpDown numericUpDown = (NumericUpDown)sender; + this._comparisonBotAttempt.Maximize = (int)numericUpDown.Value; + } + + private void TieBreak1Numeric_ValueChanged(object sender, EventArgs e) + { + NumericUpDown numericUpDown = (NumericUpDown)sender; + this._comparisonBotAttempt.TieBreak1 = (int)numericUpDown.Value; + } + + private void TieBreak2Numeric_ValueChanged(object sender, EventArgs e) + { + NumericUpDown numericUpDown = (NumericUpDown)sender; + this._comparisonBotAttempt.TieBreak2 = (int)numericUpDown.Value; + } + + private void TieBreak3Numeric_ValueChanged(object sender, EventArgs e) + { + NumericUpDown numericUpDown = (NumericUpDown)sender; + this._comparisonBotAttempt.TieBreak3 = (int)numericUpDown.Value; + } + } } diff --git a/BizHawk.Client.EmuHawk/tools/BasicBot/BotControlsRow.Designer.cs b/BizHawk.Client.EmuHawk/tools/BasicBot/BotControlsRow.Designer.cs index 81655e6afe..6343a907c3 100644 --- a/BizHawk.Client.EmuHawk/tools/BasicBot/BotControlsRow.Designer.cs +++ b/BizHawk.Client.EmuHawk/tools/BasicBot/BotControlsRow.Designer.cs @@ -65,7 +65,7 @@ this.ProbabilitySlider.Location = new System.Drawing.Point(147, -2); this.ProbabilitySlider.Maximum = 100; this.ProbabilitySlider.Name = "ProbabilitySlider"; - this.ProbabilitySlider.Size = new System.Drawing.Size(111, 45); + this.ProbabilitySlider.Size = new System.Drawing.Size(203, 45); this.ProbabilitySlider.TabIndex = 2; this.ProbabilitySlider.TickFrequency = 25; this.ProbabilitySlider.ValueChanged += new System.EventHandler(this.ProbabilitySlider_ValueChanged); @@ -78,7 +78,7 @@ this.Controls.Add(this.ProbabilityUpDown); this.Controls.Add(this.ButtonNameLabel); this.Name = "BotControlsRow"; - this.Size = new System.Drawing.Size(258, 29); + this.Size = new System.Drawing.Size(350, 29); this.Load += new System.EventHandler(this.BotControlsRow_Load); ((System.ComponentModel.ISupportInitialize)(this.ProbabilityUpDown)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.ProbabilitySlider)).EndInit(); diff --git a/BizHawk.Client.EmuHawk/tools/Cheats/Cheats.cs b/BizHawk.Client.EmuHawk/tools/Cheats/Cheats.cs index 666e508773..6e6df537e0 100644 --- a/BizHawk.Client.EmuHawk/tools/Cheats/Cheats.cs +++ b/BizHawk.Client.EmuHawk/tools/Cheats/Cheats.cs @@ -7,10 +7,6 @@ using System.Linq; using System.Windows.Forms; using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; -using BizHawk.Emulation.Cores.Nintendo.SNES; -using BizHawk.Emulation.Cores.Sega.Genesis; - using BizHawk.Client.Common; using BizHawk.Client.EmuHawk.ToolExtensions; using BizHawk.Client.EmuHawk.WinFormExtensions; @@ -172,7 +168,7 @@ namespace BizHawk.Client.EmuHawk { GameGenieToolbarSeparator.Visible = LoadGameGenieToolbarItem.Visible = - GlobalWin.Tools.GameGenieAvailable; + GlobalWin.Tools.IsAvailable(); } private void AddCheat() @@ -443,7 +439,7 @@ namespace BizHawk.Client.EmuHawk GameGenieSeparator.Visible = OpenGameGenieEncoderDecoderMenuItem.Visible = - GlobalWin.Tools.GameGenieAvailable; + GlobalWin.Tools.IsAvailable(); } private void RemoveCheatMenuItem_Click(object sender, EventArgs e) diff --git a/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.IControlMainform.cs b/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.IControlMainform.cs index e7a947045e..c7f95fbc04 100644 --- a/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.IControlMainform.cs +++ b/BizHawk.Client.EmuHawk/tools/Debugger/GenericDebugger.IControlMainform.cs @@ -7,6 +7,18 @@ namespace BizHawk.Client.EmuHawk { public partial class GenericDebugger : IControlMainform { + public bool WantsToControlSavestates { get { return false; } } + + public void SaveState() { } + public void LoadState() { } + public void SaveStateAs() { } + public void LoadStateAs() { } + public void SaveQuickSave(int slot) { } + public void LoadQuickSave(int slot) { } + public void SelectSlot(int slot) { } + public void PreviousSlot() { } + public void NextSlot() { } + public bool WantsToControlReadOnly { get { return false; } } public void ToggleReadOnly() { } diff --git a/BizHawk.Client.EmuHawk/tools/GB/GBGameGenie.cs b/BizHawk.Client.EmuHawk/tools/GB/GBGameGenie.cs index 2a35ca3afc..b09573ba1e 100644 --- a/BizHawk.Client.EmuHawk/tools/GB/GBGameGenie.cs +++ b/BizHawk.Client.EmuHawk/tools/GB/GBGameGenie.cs @@ -5,11 +5,11 @@ using System.Text.RegularExpressions; using System.Windows.Forms; using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; using BizHawk.Client.Common; namespace BizHawk.Client.EmuHawk { + [ToolAttributes(false, null)] public partial class GBGameGenie : Form, IToolFormAutoConfig { // TODO: fix the use of Global.Game.System and Emulator.SystemId diff --git a/BizHawk.Client.EmuHawk/tools/GameShark.Designer.cs b/BizHawk.Client.EmuHawk/tools/GameShark.Designer.cs index 8b4309c80e..009fa6cd7f 100644 --- a/BizHawk.Client.EmuHawk/tools/GameShark.Designer.cs +++ b/BizHawk.Client.EmuHawk/tools/GameShark.Designer.cs @@ -42,12 +42,12 @@ // this.mnuGameShark.Location = new System.Drawing.Point(0, 0); this.mnuGameShark.Name = "mnuGameShark"; - this.mnuGameShark.Size = new System.Drawing.Size(284, 24); + this.mnuGameShark.Size = new System.Drawing.Size(281, 24); this.mnuGameShark.TabIndex = 0; // // btnClear // - this.btnClear.Location = new System.Drawing.Point(141, 132); + this.btnClear.Location = new System.Drawing.Point(156, 90); this.btnClear.Name = "btnClear"; this.btnClear.Size = new System.Drawing.Size(75, 23); this.btnClear.TabIndex = 4; @@ -58,7 +58,7 @@ // lblCheat // this.lblCheat.AutoSize = true; - this.lblCheat.Location = new System.Drawing.Point(147, 91); + this.lblCheat.Location = new System.Drawing.Point(162, 49); this.lblCheat.Name = "lblCheat"; this.lblCheat.Size = new System.Drawing.Size(63, 13); this.lblCheat.TabIndex = 11; @@ -66,14 +66,14 @@ // // txtCheat // - this.txtCheat.Location = new System.Drawing.Point(128, 106); + this.txtCheat.Location = new System.Drawing.Point(143, 64); this.txtCheat.Name = "txtCheat"; this.txtCheat.Size = new System.Drawing.Size(100, 20); this.txtCheat.TabIndex = 2; // // btnGo // - this.btnGo.Location = new System.Drawing.Point(35, 131); + this.btnGo.Location = new System.Drawing.Point(50, 89); this.btnGo.Name = "btnGo"; this.btnGo.Size = new System.Drawing.Size(75, 24); this.btnGo.TabIndex = 3; @@ -84,7 +84,7 @@ // lblDescription // this.lblDescription.AutoSize = true; - this.lblDescription.Location = new System.Drawing.Point(42, 90); + this.lblDescription.Location = new System.Drawing.Point(57, 48); this.lblDescription.Name = "lblDescription"; this.lblDescription.Size = new System.Drawing.Size(60, 13); this.lblDescription.TabIndex = 17; @@ -92,7 +92,7 @@ // // txtDescription // - this.txtDescription.Location = new System.Drawing.Point(22, 106); + this.txtDescription.Location = new System.Drawing.Point(37, 64); this.txtDescription.Name = "txtDescription"; this.txtDescription.Size = new System.Drawing.Size(100, 20); this.txtDescription.TabIndex = 1; @@ -101,7 +101,7 @@ // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(284, 261); + this.ClientSize = new System.Drawing.Size(281, 144); this.Controls.Add(this.txtDescription); this.Controls.Add(this.lblDescription); this.Controls.Add(this.btnClear); @@ -113,6 +113,7 @@ this.MainMenuStrip = this.mnuGameShark; this.MaximizeBox = false; this.Name = "GameShark"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "GameShark Converter"; this.Load += new System.EventHandler(this.GameShark_Load); this.ResumeLayout(false); diff --git a/BizHawk.Client.EmuHawk/tools/GameShark.cs b/BizHawk.Client.EmuHawk/tools/GameShark.cs index ca30971a98..b9a75a0507 100644 --- a/BizHawk.Client.EmuHawk/tools/GameShark.cs +++ b/BizHawk.Client.EmuHawk/tools/GameShark.cs @@ -10,9 +10,9 @@ namespace BizHawk.Client.EmuHawk //TODO: //Add Support/Handling for The Following Systems and Devices: - //GBA: Action Replay MAX, Code Breaker (That uses unique Encryption keys) + //GBA: Code Breaker (That uses unique Encryption keys) //NES: Pro Action Rocky (When someone asks) - //SNES: Possible Warning for Game Genie not working? Test fixed behaviors when ready. + //SNES: GoldFinger (Action Replay II) Support? //Clean up the checks to be more robust/less "hacky" //They work but feel bad @@ -210,7 +210,6 @@ namespace BizHawk.Client.EmuHawk SMS(); break; case "SNES": - //Currently only does Action Replay SNES(); break; default: @@ -379,116 +378,1996 @@ namespace BizHawk.Client.EmuHawk //Provided by mGBA and endrift UInt32[] GBAGameSharkSeeds = { UInt32.Parse("09F4FBBD", NumberStyles.HexNumber), UInt32.Parse("9681884A", NumberStyles.HexNumber), UInt32.Parse("352027E9", NumberStyles.HexNumber), UInt32.Parse("F3DEE5A7", NumberStyles.HexNumber) }; UInt32[] GBAProActionReplaySeeds = { UInt32.Parse("7AA9648F", NumberStyles.HexNumber), UInt32.Parse("7FAE6994", NumberStyles.HexNumber), UInt32.Parse("C0EFAAD5", NumberStyles.HexNumber), UInt32.Parse("42712C57", NumberStyles.HexNumber) }; - private void GBA() + private string firstSlide; + private string secondSlide; + Boolean Slider = false; + //blnGameShark means, "This is a Game Shark/Action Replay (Not MAX) code." + Boolean blnGameShark = false; + //blnActionReplayMax means "This is an Action Replay MAX code." + Boolean blnActionReplayMax = false; + //blnCodeBreaker means "This is a CodeBreaker code." + Boolean blnCodeBreaker = false; + //blnUnhandled means "BizHawk can't do this one or the tool can't." + Boolean blnUnhandled = false; + //blnUnneeded means "You don't need this code." + Boolean blnUnneeded = false; + private void GBA() { - Boolean blnNoCode = true; - //TODO: - //Clean the detection methods and improve/optimize code conversion. - testo = null; - //We have a Game Shark or Action Replay. - if (txtCheat.Text.Length == 17 && txtCheat.Text.IndexOf(" ") == 8) + bool blnNoCode = false; + //Super Ultra Mega HD BizHawk GameShark/Action Replay/Code Breaker Final Hyper Edition Arcade Remix EX + α GBA Code detection method. + //Seriously, it's that complex. + + //Check Game Shark/Action Replay (Not Max) Codes + if (txtCheat.Text.Length == 17 && txtCheat.Text.IndexOf(" ") == 8) { - parseString = txtCheat.Text; - UInt32 op1 = 0; - UInt32 op2 = 0; - UInt32 sum = 0xC6EF3720; - op1 = UInt32.Parse(parseString.Remove(8, 9), NumberStyles.HexNumber); - op2 = UInt32.Parse(parseString.Remove(0, 9), NumberStyles.HexNumber); - //Tiny Encryption Algorithm - int i; - for (i = 0; i < 32; ++i) + blnNoCode = true; + //Super Ultra Mega HD BizHawk GameShark/Action Replay/Code Breaker Final Hyper Edition Arcade Remix EX + α GBA Code detection method. + //Seriously, it's that complex. + + //Check Game Shark/Action Replay (Not Max) Codes + if (txtCheat.Text.Length == 17 && txtCheat.Text.IndexOf(" ") == 8) { - op2 -= ((op1 << 4) + GBAGameSharkSeeds[2]) ^ (op1 + sum) ^ ((op1 >> 5) + GBAGameSharkSeeds[3]); - op1 -= ((op2 << 4) + GBAGameSharkSeeds[0]) ^ (op2 + sum) ^ ((op2 >> 5) + GBAGameSharkSeeds[1]); - sum -= 0x9E3779B9; + //These are for the Decyption Values for GameShark and Action Replay MAX. + UInt32 op1 = 0; + UInt32 op2 = 0; + UInt32 sum = 0xC6EF3720; + + //Let's get the stuff seperated. + RAMAddress = txtCheat.Text.Remove(8, 9); + RAMValue = txtCheat.Text.Remove(0, 9); + //Let's see if this code matches the GameShark. + GBAGameShark(); + //We got an Un-Needed code. + if (blnUnneeded == true) + { + return; + } + //We got an Unhandled code. + else if (blnUnhandled == true) + { + return; + } + if (blnGameShark == false) + { + //We don't have a GameShark code, or we have an encrypted code? + //Further testing required. + //GameShark Decryption Method + parseString = txtCheat.Text; + + op1 = UInt32.Parse(parseString.Remove(8, 9), NumberStyles.HexNumber); + op2 = UInt32.Parse(parseString.Remove(0, 9), NumberStyles.HexNumber); + //Tiny Encryption Algorithm + int i; + for (i = 0; i < 32; ++i) + { + op2 -= ((op1 << 4) + GBAGameSharkSeeds[2]) ^ (op1 + sum) ^ ((op1 >> 5) + GBAGameSharkSeeds[3]); + op1 -= ((op2 << 4) + GBAGameSharkSeeds[0]) ^ (op2 + sum) ^ ((op2 >> 5) + GBAGameSharkSeeds[1]); + sum -= 0x9E3779B9; + } + //op1 has the Address + //op2 has the Value + //Sum, is pointless? + RAMAddress = string.Format("{0:X8}", op1); + RAMValue = string.Format("{0:X8}", op2); + GBAGameShark(); + } + //We don't do Else If after the if here because it won't allow us to verify the second code check. + if (blnGameShark == true) + { + //We got a Valid GameShark Code. Hopefully. + //AddGBA(); + return; + } + + //We are going to assume that we got an Action Replay MAX code, or at least try to guess that we did. + GBAActionReplay(); + + if (blnActionReplayMax == false) + { + //Action Replay Max decryption Method + parseString = txtCheat.Text; + op1 = 0; + op2 = 0; + sum = 0xC6EF3720; + op1 = UInt32.Parse(parseString.Remove(8, 9), NumberStyles.HexNumber); + op2 = UInt32.Parse(parseString.Remove(0, 9), NumberStyles.HexNumber); + //Tiny Encryption Algorithm + int j; + for (j = 0; j < 32; ++j) + { + op2 -= ((op1 << 4) + GBAProActionReplaySeeds[2]) ^ (op1 + sum) ^ ((op1 >> 5) + GBAProActionReplaySeeds[3]); + op1 -= ((op2 << 4) + GBAProActionReplaySeeds[0]) ^ (op2 + sum) ^ ((op2 >> 5) + GBAProActionReplaySeeds[1]); + sum -= 0x9E3779B9; + } + //op1 has the Address + //op2 has the Value + //Sum, is pointless? + RAMAddress = string.Format("{0:X8}", op1); + RAMValue = string.Format("{0:X8}", op2); + MessageBox.Show(RAMAddress); + MessageBox.Show(RAMValue); + GBAActionReplay(); + } + MessageBox.Show(blnActionReplayMax.ToString()); + //We don't do Else If after the if here because it won't allow us to verify the second code check. + if (blnActionReplayMax == true) + { + //We got a Valid Action Replay Max Code. Hopefully. + //AddGBA(); + MessageBox.Show("ARM"); + return; + } } - //op1 has the Address - //op2 has the Value - //Sum, is pointless? - RAMAddress = string.Format("{0:X8}", op1); - RAMAddress = RAMAddress.Remove(0, 1); - RAMValue = string.Format("{0:X8}", op2); - if (RAMAddress.StartsWith("D4")) + //Detect CodeBreaker/GameShark SP/Xploder codes + if (txtCheat.Text.Length == 12 && txtCheat.Text.IndexOf(" ") != 8) { - MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + MessageBox.Show("Codebreaker/GameShark SP/Xploder codes are not supported by this tool.", "Tool error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; + + //WARNING!! + //This code is NOT ready yet. + //The GameShark Key + //09F4FBBD + //9681884A + //352027E9 + //F3DEE5A7 + + //The CodeBreaker Key, for Advance Wars 2 (USA) + //911B9B36 + //BC7C46FC + //CE58668D + //5C453661 + //Four sets, and this guy... + //9D6E + + //Sample Code + //Encyped: 6C2A1F51C2C0 + //Decrypted: 82028048 FFFFFFFF + GBACodeBreaker(); + + if (blnCodeBreaker == false) + { + parseString = txtCheat.Text; + UInt32 op1 = 0; + UInt32 op2 = 0; + UInt32 sum = 0xC6EF3720; + string test1; + string test2; + test1 = parseString.Remove(5, 6); + test2 = parseString.Remove(0, 6); + MessageBox.Show(test1.ToString()); + MessageBox.Show(test2.ToString()); + op1 = UInt32.Parse(parseString.Remove(5, 6), NumberStyles.HexNumber); + op2 = UInt32.Parse(parseString.Remove(0, 6), NumberStyles.HexNumber); + + //Tiny Encryption Algorithm + int i; + for (i = 0; i < 32; ++i) + { + op2 -= ((op1 << 4) + GBAGameSharkSeeds[2]) ^ (op1 + sum) ^ ((op1 >> 5) + GBAGameSharkSeeds[3]); + op1 -= ((op2 << 4) + GBAGameSharkSeeds[0]) ^ (op2 + sum) ^ ((op2 >> 5) + GBAGameSharkSeeds[1]); + sum -= 0x9E3779B9; + } + //op1 has the Address + //op2 has the Value + //Sum, is pointless? + RAMAddress = string.Format("{0:X8}", op1); + //RAMAddress = RAMAddress.Remove(0, 1); + RAMValue = string.Format("{0:X8}", op2); + // && RAMAddress[6] == '0' + } + + if (blnCodeBreaker == true) + { + //We got a Valid Code Breaker Code. Hopefully. + //AddGBA(); + return; + } + + if (txtCheat.Text.IndexOf(" ") != 8 && txtCheat.Text.Length != 12) + { + MessageBox.Show("ALL Codes for Action Replay, Action Replay MAX, Codebreaker, GameShark Advance, GameShark SP, Xploder have a Space after the 8th character.", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + //We have a code + if (blnNoCode == false) + { + } + } - parseString = RAMValue.Remove(4, 4); - //Is it a Word or Double Word? - if (parseString == "0000") - { - //We assume. Why not? - byteSize = 16; - RAMValue = RAMValue.Remove(0, 4); - //MessageBox.Show(RAMValue); - } - else if (parseString != "0000") - { - byteSize = 32; - } - blnNoCode = false; - } - if (txtCheat.Text.Length == 12) + } + } + public void GBAGameShark() + { + //This is for the Game Shark/Action Replay (Not Max) + if (RAMAddress.StartsWith("0") == true && RAMValue.StartsWith("000000") == true) { - MessageBox.Show("Encrypted Codebreaker/GameShark SP/Xploder codes are not supported by this tool.", "Tool error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + //0aaaaaaaa 000000xx 1 Byte Constant Write + //1 Byte Size Value + byteSize = 8; + blnGameShark = true; + } + else if (RAMAddress.StartsWith("1") == true && RAMValue.StartsWith("0000") == true) + { + //1aaaaaaaa 0000xxxx 2 Byte Constant Write + //2 Byte Size Value + byteSize = 16; + blnGameShark = true; + } + else if (RAMAddress.StartsWith("2") == true) + { + //2aaaaaaaa xxxxxxxx 4 Byte Constant Write + //4 Byte Size Value + byteSize = 32; + blnGameShark = true; + } + else if (RAMAddress.StartsWith("3000") == true) + { + //3000cccc xxxxxxxx aaaaaaaa 4 Byte Group Write What? Is this like a Slide Code + //4 Byte Size Value + //Sample + //30000004 01010101 03001FF0 03001FF4 03001FF8 00000000 + //write 01010101 to 3 addresses - 01010101, 03001FF0, 03001FF4, and 03001FF8. '00000000' is used for padding, to ensure the last code encrypts correctly. + //Note: The device improperly writes the Value, to the address. We should ignore that. + MessageBox.Show("Sorry, this tool does not support 3000XXXX codes.", "Tool error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + blnUnhandled = true; return; } - if (txtCheat.Text.IndexOf(" ") != 8 && txtCheat.Text.Length != 12) + else if (RAMAddress.StartsWith("6") == true && RAMValue.StartsWith("0000") == true) { - MessageBox.Show("ALL Codes for Action Replay, Action Replay MAX, Codebreaker, GameShark Advance, GameShark SP, Xploder have a Space after the 8th character.", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + //6aaaaaaa 0000xxxx 2 Byte ROM patch + byteSize = 16; + blnGameShark = true; + } + else if (RAMAddress.StartsWith("6") == true && RAMValue.StartsWith("1000") == true) + { + //6aaaaaaa 1000xxxx 4 Byte ROM patch + byteSize = 32; + blnGameShark = true; + } + else if (RAMAddress.StartsWith("6") == true && RAMValue.StartsWith("2000") == true) + { + //6aaaaaaa 2000xxxx 8 Byte ROM patch + byteSize = 32; + blnGameShark = true; + } + else if (RAMAddress.StartsWith("8") == true && RAMAddress[2] == '1' == true && RAMValue.StartsWith("00") == true) + { + //8a1aaaaa 000000xx 1 Byte Write when GS Button Pushed + //Treat as Constant Write. + byteSize = 8; + blnGameShark = true; + } + else if (RAMAddress.StartsWith("8") == true && RAMAddress[2] == '2' == true && RAMValue.StartsWith("00") == true) + { + //8a2aaaaa 000000xx 2 Byte Write when GS Button Pushed + //Treat as Constant Write. + byteSize = 16; + blnGameShark = true; + } + else if (RAMAddress.StartsWith("80F00000") == true) + { + //80F00000 0000xxxx Slow down when GS Button Pushed. + MessageBox.Show("The code you entered is not needed by Bizhawk.", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnneeded = true; + return; + } + else if (RAMAddress.StartsWith("D") == true && RAMAddress.StartsWith("DEADFACE") == false && RAMValue.StartsWith("0000") == true) + { + //Daaaaaaa 0000xxxx 2 Byte If Equal, Activate next code + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("E0") == true) + { + //E0zzxxxx aaaaaaaa 2 Byte if Equal, Activate ZZ Lines. + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("F") == true && RAMValue.StartsWith("0000") == true) + { + //Faaaaaaa 0000xxxx Hook Routine. Probably not necessary? + MessageBox.Show("The code you entered is not needed by Bizhawk.", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnneeded = true; + return; + } + else if (RAMAddress.StartsWith("001DC0DE") == true) + { + //xxxxxxxx 001DC0DE Auto-Detect Game. Useless for Us. + MessageBox.Show("The code you entered is not needed by Bizhawk.", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnneeded = true; + return; + } + else if (RAMAddress.StartsWith("DEADFACE") == true) + { + //DEADFACE 0000xxxx Change Encryption Seeds. Unsure how this works. + MessageBox.Show("Sorry, this tool does not support DEADFACE codes.", "Tool error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + blnUnhandled = true; + return; + } + else + { + blnGameShark = false; + } + //It's not a GameShark/Action Replay (Not MAX) code, so we say False. + + return; + } + public void GBAActionReplay() + { + //These checks are done on the DECYPTED code, not the Encrypted one. + //ARM Code Types + // 1) Normal RAM Write Codes + if (RAMAddress.StartsWith("002") == true) + { + // 0022 Should be Changed to 020 + // Fill area (XXXXXXXX) to (XXXXXXXX+YYYYYY) with Byte ZZ. + // XXXXXXXX + // YYYYYYZZ + //This corrects the value + RAMAddress = RAMAddress.Replace("002", "020"); + blnActionReplayMax = true; + byteSize = 8; + } + else if (RAMAddress.StartsWith("022") == true) + { + // 0222 Should be Changed to 020 + // Fill area (XXXXXXXX) to (XXXXXXXX+YYYY*2) with Halfword ZZZZ. + // XXXXXXXX + // YYYYZZZZ + //This corrects the value + RAMAddress = RAMAddress.Replace("022", "020"); + blnActionReplayMax = true; + byteSize = 16; + } + + else if (RAMAddress.StartsWith("042") == true) + { + // 0422 Should be Changed to 020 + // Write the Word ZZZZZZZZ to address XXXXXXXX. + // XXXXXXXX + // ZZZZZZZZ + //This corrects the value + RAMAddress = RAMAddress.Replace("042", "020"); + blnActionReplayMax = true; + byteSize = 32; + } + // 2) Pointer RAM Write Codes + else if (RAMAddress.StartsWith("402") == true) + { + // 4022 Should be Changed to 020 + // Writes Byte ZZ to ([the address kept in XXXXXXXX]+[YYYYYY]). + // XXXXXXXX + // YYYYYYZZ + //This corrects the value + RAMAddress = RAMAddress.Replace("402", "020"); + blnActionReplayMax = true; + byteSize = 8; + } + else if (RAMAddress.StartsWith("420") == true) + { + // 4202 Should be Changed to 020 + // Writes Halfword ZZZZ ([the address kept in XXXXXXXX]+[YYYY*2]). + // XXXXXXXX + // YYYYZZZZ + //This corrects the value + RAMAddress = RAMAddress.Replace("420", "020"); + blnActionReplayMax = true; + byteSize = 16; + } + else if (RAMAddress.StartsWith("422") == true) + { + // 442 Should be Changed to 020 + // Writes the Word ZZZZZZZZ to [the address kept in XXXXXXXX]. + // XXXXXXXX + // ZZZZZZZZ + RAMAddress = RAMAddress.Replace("422", "020"); + blnActionReplayMax = true; + byteSize = 32; + } + // 3) Add Codes + else if (RAMAddress.StartsWith("802") == true) + { + // 802 Should be Changed to 020 + // Add the Byte ZZ to the Byte stored in XXXXXXXX. + // XXXXXXXX + // 000000ZZ + //RAMAddress = RAMAddress.Replace("8022", "020"); + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("822") == true & RAMAddress.StartsWith("8222") == false) + { + // 822 Should be Changed to 020 + // Add the Halfword ZZZZ to the Halfword stored in XXXXXXXX. + // XXXXXXXX + // 0000ZZZZ + //RAMAddress = RAMAddress.Replace("822", "020"); + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("842") == true) + { + //NOTE! + //This is duplicated below with different function results. + // 842 Should be Changed to 020 + // Add the Word ZZZZ to the Halfword stored in XXXXXXXX. + // XXXXXXXX + // ZZZZZZZZ + //RAMAddress = RAMAddress.Replace("842", "020"); + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; return; } - //Decrypted Codebreaker, GameShark SP, Xploder - //Encypted Codebreaker, GameShark SP, Xploder is not handled, yet. - if (txtCheat.Text.Length == 13 && txtCheat.Text.IndexOf(" ") == 8) + // 4) Write to $4000000 (IO Registers!) + else if (RAMAddress.StartsWith("C6000130") == true) { - //Get the first byte to deterime what kind of code it is. - testo = txtCheat.Text.Remove(1, 12); - switch(testo) - { - case "3": - //8-Bit - byteSize = 8; - break; - case "8": - case "E": - //16-Bit - byteSize = 16; - break; - default: - //What code is this?! It must be bad? - MessageBox.Show("The code you entered is not recognized as a decrypted Codebreaker, GameShark SP or Xploder Code.", "Unrecognized Code", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); - return; - } - blnNoCode = false; - //Now let's do some legit crazy - parseString = txtCheat.Text.Remove(0, 1); - RAMAddress = parseString.Remove(7, 5); - RAMValue = parseString.Remove(0, 8); + // C6000130 Should be Changed to 00000130 + // Write the Halfword ZZZZ to the address $4XXXXXX + // 00XXXXXX + // 0000ZZZZ + RAMAddress = RAMAddress.Replace("C6000130", "00000130"); + blnActionReplayMax = true; + byteSize = 16; } - //We have a code - if (blnNoCode == false) + else if (RAMAddress.StartsWith("C7000130") == true) { - if (byteSize == 8) - { - var watch = Watch.GenerateWatch(MemoryDomains["System Bus"], long.Parse(RAMAddress, NumberStyles.HexNumber), WatchSize.Byte, Client.Common.DisplayType.Hex, false, txtDescription.Text); - Global.CheatList.Add(new Cheat(watch, int.Parse(RAMValue, NumberStyles.HexNumber))); - } - else if (byteSize == 16) - { - var watch = Watch.GenerateWatch(MemoryDomains["System Bus"], long.Parse(RAMAddress, NumberStyles.HexNumber), WatchSize.Word, Client.Common.DisplayType.Hex, false, txtDescription.Text); - Global.CheatList.Add(new Cheat(watch, int.Parse(RAMValue, NumberStyles.HexNumber))); - } - else if (byteSize == 32) - { - var watch = Watch.GenerateWatch(MemoryDomains["System Bus"], long.Parse(RAMAddress, NumberStyles.HexNumber), WatchSize.DWord, Client.Common.DisplayType.Hex, false, txtDescription.Text); - Global.CheatList.Add(new Cheat(watch, int.Parse(RAMValue, NumberStyles.HexNumber))); - } - //Clear old Inputs - txtCheat.Clear(); - txtDescription.Clear(); + // C7000130 Should be Changed to 00000130 + // Write the Word ZZZZZZZZ to the address $4XXXXXX + // 00XXXXXX + // ZZZZZZZZ + RAMAddress = RAMAddress.Replace("C7000130", "00000130"); + blnActionReplayMax = true; + byteSize = 32; } + // 5) If Equal Code (= Joker Code) + else if (RAMAddress.StartsWith("082") == true) + { + // 082 Should be Changed to 020 + // If Byte at XXXXXXXX = ZZ then execute next code. + // XXXXXXXX + // 000000ZZ + RAMAddress = RAMAddress.Replace("082", "020"); + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("482") == true) + { + // 482 Should be Changed to 020 + // If Byte at XXXXXXXX = ZZ then execute next 2 codes. + // XXXXXXXX + // 000000ZZ + RAMAddress = RAMAddress.Replace("482", "020"); + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("882") == true) + { + // 882 Should be Changed to 020 + // If Byte at XXXXXXXX = ZZ execute all the codes below this one in the same row (else execute none of the codes below). + // XXXXXXXX + // 000000ZZ + RAMAddress = RAMAddress.Replace("882", "020"); + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("C82") == true) + { + // C82 Should be Changed to 020 + // While Byte at XXXXXXXX <> ZZ turn off all codes. + // XXXXXXXX + // 000000ZZ + RAMAddress = RAMAddress.Replace("C82", "020"); + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("0A2") == true) + { + // 0A2 Should be Changed to 020 + // If Halfword at XXXXXXXX = ZZZZ then execute next code. + // XXXXXXXX + // 0000ZZZZ + RAMAddress = RAMAddress.Replace("0A2", "020"); + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("4A2") == true) + { + // 4A2 Should be Changed to 020 + // If Halfword at XXXXXXXX = ZZZZ then execute next 2 codes. + // XXXXXXXX + // 0000ZZZZ + RAMAddress = RAMAddress.Replace("4A2", "020"); + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("8A2") == true) + { + // 8A2 Should be Changed to 020 + // If Halfword at XXXXXXXX = ZZZZ execute all the codes below this one in the same row (else execute none of the codes below). + // XXXXXXXX + // 0000ZZZZ + RAMAddress = RAMAddress.Replace("8A2", "020"); + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("CA2") == true) + { + // CA2 Should be Changed to 020 + // While Halfword at XXXXXXXX <> ZZZZ turn off all codes. + // XXXXXXXX + // 0000ZZZZ + RAMAddress = RAMAddress.Replace("CA2", "020"); + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("0C2") == true) + { + // 0C2 Should be Changed to 020 + // If Word at XXXXXXXX = ZZZZZZZZ then execute next code. + // XXXXXXXX + // ZZZZZZZZ + RAMAddress = RAMAddress.Replace("0C2", "020"); + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("4C2") == true) + { + // 4C2 Should be Changed to 020 + // If Word at XXXXXXXX = ZZZZZZZZ then execute next 2 codes. + // XXXXXXXX + // ZZZZZZZZ + RAMAddress = RAMAddress.Replace("4C2", "020"); + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("8C2") == true) + { + // 8C2 Should be Changed to 020 + // If Word at XXXXXXXX = ZZZZZZZZ execute all the codes below this one in the same row (else execute none of the codes below). + // XXXXXXXX + // ZZZZZZZZ + RAMAddress = RAMAddress.Replace("8C2", "020"); + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("CC2") == true) + { + // CC2 Should be Changed to 020 + // While Word at XXXXXXXX <> ZZZZZZZZ turn off all codes. + // XXXXXXXX + // ZZZZZZZZ + RAMAddress = RAMAddress.Replace("CC2", "020"); + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + // 6) If Different Code + else if (RAMAddress.StartsWith("102") == true) + { + // 102 Should be Changed to 020 + // If Byte at XXXXXXXX <> ZZ then execute next code. + // XXXXXXXX + // 000000ZZ + RAMAddress = RAMAddress.Replace("102", "020"); + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("502") == true) + { + // 502 Should be Changed to 020 + // If Byte at XXXXXXXX <> ZZ then execute next 2 codes. + // XXXXXXXX + // 000000ZZ + RAMAddress = RAMAddress.Replace("502", "020"); + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("902") == true) + { + // 902 Should be Changed to 020 + // If Byte at XXXXXXXX <> ZZ execute all the codes below this one in the same row (else execute none of the codes below). + // XXXXXXXX + // 000000ZZ + RAMAddress = RAMAddress.Replace("902", "020"); + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("D02") == true) + { + // D02 Should be Changed to 020 + // While Byte at XXXXXXXX = ZZ turn off all codes. + // XXXXXXXX + // 000000ZZ + RAMAddress = RAMAddress.Replace("D02", "020"); + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("122") == true) + { + // 122 Should be Changed to 020 + // If Halfword at XXXXXXXX <> ZZZZ then execute next code. + // XXXXXXXX + // 0000ZZZZ + RAMAddress = RAMAddress.Replace("122", "020"); + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("522") == true) + { + // 522 Should be Changed to 020 + // If Halfword at XXXXXXXX <> ZZZZ then execute next 2 codes. + // XXXXXXXX + // 0000ZZZZ + RAMAddress = RAMAddress.Replace("522", "020"); + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("922") == true) + { + // 922 Should be Changed to 020 + // If Halfword at XXXXXXXX <> ZZZZ disable all the codes below this one. + // XXXXXXXX + // 0000ZZZZ + RAMAddress = RAMAddress.Replace("922", "020"); + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("D22") == true) + { + // D22 Should be Changed to 020 + // While Halfword at XXXXXXXX = ZZZZ turn off all codes. + // XXXXXXXX + // 0000ZZZZ + RAMAddress = RAMAddress.Replace("D22", "020"); + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("142") == true) + { + // 142 Should be Changed to 020 + // If Word at XXXXXXXX <> ZZZZZZZZ then execute next code. + // XXXXXXXX + // ZZZZZZZZ + RAMAddress = RAMAddress.Replace("142", "020"); + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("542") == true) + { + // 542 Should be Changed to 020 + // If Word at XXXXXXXX <> ZZZZZZZZ then execute next 2 codes. + // XXXXXXXX + // ZZZZZZZZ + RAMAddress = RAMAddress.Replace("542", "020"); + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("942") == true) + { + // 942 Should be Changed to 020 + // If Word at XXXXXXXX <> ZZZZZZZZ disable all the codes below this one. + // XXXXXXXX + // ZZZZZZZZ + RAMAddress = RAMAddress.Replace("942", "020"); + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("D42") == true) + { + // D42 Should be Changed to 020 + // While Word at XXXXXXXX = ZZZZZZZZ turn off all codes. + // XXXXXXXX + // ZZZZZZZZ + RAMAddress = RAMAddress.Replace("D42", "020"); + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + // 7) + // [If Byte at address XXXXXXXX is lower than ZZ] (signed) Code + // Signed means : For bytes : values go from -128 to +127. For Halfword : values go from -32768/+32767. For Words : values go from -2147483648 to 2147483647. For exemple, for the Byte comparison, 7F (127) will be > to FF (-1). + // + // + else if (RAMAddress.StartsWith("182") == true) + { + // 182 Should be Changed to 020 + // If ZZ > Byte at XXXXXXXX then execute next code. + // XXXXXXXX + // 000000ZZ + if (RAMAddress.StartsWith("182") == true) + { + RAMAddress = RAMAddress.Replace("182", "020"); + } + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("582") == true) + { + // 582 Should be Changed to 020 + // If ZZ > Byte at XXXXXXXX then execute next 2 codes. + // XXXXXXXX + // 000000ZZ + if (RAMAddress.StartsWith("582") == true) + { + RAMAddress = RAMAddress.Replace("582", "020"); + } + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("982") == true) + { + // 982 Should be Changed to 020 + // If ZZ > Byte at XXXXXXXX then execute all following codes in the same row (else execute none of the codes below). + // XXXXXXXX + // 000000ZZ + if (RAMAddress.StartsWith("982") == true) + { + RAMAddress = RAMAddress.Replace("982", "020"); + } + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("D82") == true || (RAMAddress.StartsWith("E82") == true)) + { + // D82 or E82 Should be Changed to 020 + // While ZZ <= Byte at XXXXXXXX turn off all codes. + // XXXXXXXX + // 000000ZZ + if (RAMAddress.StartsWith("D82") == true) + { + RAMAddress = RAMAddress.Replace("D82", "020"); + } + else if ((RAMAddress.StartsWith("E82") == true)) + { + RAMAddress = RAMAddress.Replace("E82", "020"); + } + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("1A2") == true) + { + // 1A2 Should be Changed to 020 + // If ZZZZ > Halfword at XXXXXXXX then execute next line. + // XXXXXXXX 0000ZZZZ + if (RAMAddress.StartsWith("1A2") == true) + { + RAMAddress = RAMAddress.Replace("1A2", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("5A2") == true) + { + // 5A2 Should be Changed to 020 + // If ZZZZ > Halfword at XXXXXXXX then execute next 2 lines. + // XXXXXXXX 0000ZZZZ + if (RAMAddress.StartsWith("5A2") == true) + { + RAMAddress = RAMAddress.Replace("5A2", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("9A2") == true) + { + // 9A2 Should be Changed to 020 + // If ZZZZ > Halfword at XXXXXXXX then execute all following codes in the same row (else execute none of the codes below). + // XXXXXXXX 0000ZZZZ + if (RAMAddress.StartsWith("9A2") == true) + { + RAMAddress = RAMAddress.Replace("9A2", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("DA2") == true) + { + // DA2 Should be Changed to 020 + // While ZZZZ <= Halfword at XXXXXXXX turn off all codes. + // XXXXXXXX 0000ZZZZ + if (RAMAddress.StartsWith("DA2") == true) + { + RAMAddress = RAMAddress.Replace("DA2", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("1C2") == true) + { + // 1C2 or Should be Changed to 020 + // If ZZZZ > Word at XXXXXXXX then execute next line. + // XXXXXXXX 0000ZZZZ + if (RAMAddress.StartsWith("1C2") == true) + { + RAMAddress = RAMAddress.Replace("1C2", "020"); + } + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("5C2") == true) + { + // 5C2 Should be Changed to 020 + // If ZZZZ > Word at XXXXXXXX then execute next 2 lines. + // XXXXXXXX 0000ZZZZ + if (RAMAddress.StartsWith("5C2") == true) + { + RAMAddress = RAMAddress.Replace("5C2", "020"); + } + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("9C2") == true) + { + // 9C2 Should be Changed to 020 + // If ZZZZZZZZ > Word at XXXXXXXX then execute all following codes in the same row (else execute none of the codes below). + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("9C2") == true) + { + RAMAddress = RAMAddress.Replace("9C2", "020"); + } + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("DC2") == true) + { + // DC2 Should be Changed to 020 + // While ZZZZZZZZ <= Word at XXXXXXXX turn off all codes. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("DC2") == true) + { + RAMAddress = RAMAddress.Replace("DC2", "020"); + } + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + // 8) + // [If Byte at address XXXXXXXX is higher than ZZ] (signed) Code + // Signed means : For bytes : values go from -128 to +127. For Halfword : values go from -32768/+32767. For Words : values go from -2147483648 to 2147483647. For exemple, for the Byte comparison, 7F (127) will be > to FF (-1). + // + else if (RAMAddress.StartsWith("202") == true) + { + // 202 Should be Changed to 020 + // If ZZ < Byte at XXXXXXXX then execute next code. + // XXXXXXXX + // 000000ZZ + if (RAMAddress.StartsWith("202") == true) + { + RAMAddress = RAMAddress.Replace("202", "020"); + } + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("602") == true) + { + // 602 Should be Changed to 020 + // If ZZ < Byte at XXXXXXXX then execute next 2 codes. + // XXXXXXXX + // 000000ZZ + if (RAMAddress.StartsWith("602") == true) + { + RAMAddress = RAMAddress.Replace("602", "020"); + } + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("A02") == true) + { + // A02 Should be Changed to 020 + // If ZZ < Byte at XXXXXXXX then execute all following codes in the same row (else execute none of the codes below). + // XXXXXXXX + // 000000ZZ + if (RAMAddress.StartsWith("A02") == true) + { + RAMAddress = RAMAddress.Replace("A02", "020"); + } + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("E02") == true) + { + // E02 Should be Changed to 020 + // While ZZ => Byte at XXXXXXXX turn off all codes. + // XXXXXXXX + // 000000ZZ + if (RAMAddress.StartsWith("E02") == true) + { + RAMAddress = RAMAddress.Replace("E02", "020"); + } + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("222") == true) + { + // 222 Should be Changed to 020 + // If ZZZZ < Halfword at XXXXXXXX then execute next line. + // XXXXXXXX 0000ZZZZ + if (RAMAddress.StartsWith("222") == true) + { + RAMAddress = RAMAddress.Replace("222", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("622") == true) + { + // 622 Should be Changed to 020 + // If ZZZZ < Halfword at XXXXXXXX then execute next 2 lines. + // XXXXXXXX 0000ZZZZ + if (RAMAddress.StartsWith("622") == true) + { + RAMAddress = RAMAddress.Replace("622", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("A22") == true) + { + // A22 Should be Changed to 020 + // If ZZZZ < Halfword at XXXXXXXX then execute all following codes in the same row (else execute none of the codes below). + // XXXXXXXX 0000ZZZZ + if (RAMAddress.StartsWith("A22") == true) + { + RAMAddress = RAMAddress.Replace("A22", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("E22") == true) + { + // E22 Should be Changed to 020 + // While ZZZZ => Halfword at XXXXXXXX turn off all codes. + // XXXXXXXX 0000ZZZZ + if (RAMAddress.StartsWith("E22") == true) + { + RAMAddress = RAMAddress.Replace("E22", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("242") == true) + { + // 242 Should be Changed to 020 + // If ZZZZ < Halfword at XXXXXXXX then execute next line. + // XXXXXXXX 0000ZZZZ + if (RAMAddress.StartsWith("242") == true) + { + RAMAddress = RAMAddress.Replace("242", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("642") == true) + { + // 642 Should be Changed to 020 + // If ZZZZ < Halfword at XXXXXXXX then execute next 2 lines. + // XXXXXXXX 0000ZZZZ + if (RAMAddress.StartsWith("642") == true) + { + RAMAddress = RAMAddress.Replace("642", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("A42") == true) + { + // A42 Should be Changed to 020 + // If ZZZZ < Halfword at XXXXXXXX then execute all following codes in the same row (else execute none of the codes below). + // XXXXXXXX 0000ZZZZ + if (RAMAddress.StartsWith("A42") == true) + { + RAMAddress = RAMAddress.Replace("A42", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("E42") == true) + { + // E42 Should be Changed to 020 + // While ZZZZ => Halfword at XXXXXXXX turn off all codes. + // XXXXXXXX 0000ZZZZ + if (RAMAddress.StartsWith("E42") == true) + { + RAMAddress = RAMAddress.Replace("E42", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + // 9) + // [If Value at adress XXXXXXXX is lower than...] (unsigned) Code + // Unsigned means : For bytes : values go from 0 to +255. For Halfword : values go from 0 to +65535. For Words : values go from 0 to 4294967295. For exemple, for the Byte comparison, 7F (127) will be < to FF (255). + // + // + else if (RAMAddress.StartsWith("282") == true) + { + // 282 Should be Changed to 020 + // If ZZZZZZZZ > Byte at XXXXXXXX then execute next line. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("282") == true) + { + RAMAddress = RAMAddress.Replace("282", "020"); + } + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("682") == true) + { + // 682 Should be Changed to 020 + // If ZZZZZZZZ > Byte at XXXXXXXX then execute next 2 lines. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("682") == true) + { + RAMAddress = RAMAddress.Replace("682", "020"); + } + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("A82") == true) + { + // A82 Should be Changed to 020 + // If ZZZZZZZZ > Byte at XXXXXXXX then execute all following codes in the same row (else execute none of the codes below). + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("A82") == true) + { + RAMAddress = RAMAddress.Replace("A82", "020"); + } + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("2A2") == true) + { + // 2A2 Should be Changed to 020 + // If ZZZZZZZZ > Halfword at XXXXXXXX then execute next line. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("2A2") == true) + { + RAMAddress = RAMAddress.Replace("2A2", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("6A2") == true) + { + // 6A2 Should be Changed to 020 + // If ZZZZZZZZ > Halfword at XXXXXXXX then execute next 2 lines. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("6A2") == true) + { + RAMAddress = RAMAddress.Replace("6A2", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("AA2") == true) + { + // AA2 Should be Changed to 020 + // If ZZZZZZZZ > Halfword at XXXXXXXX then execute all following codes in the same row (else execute none of the codes below). + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("AA2") == true) + { + RAMAddress = RAMAddress.Replace("AA2", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("EA2") == true) + { + // EA2 Should be Changed to 020 + // While ZZZZZZZZ <= Halfword at XXXXXXXX turn off all codes. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("EA2") == true) + { + RAMAddress = RAMAddress.Replace("EA2", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("2C2") == true) + { + // 2C2 Should be Changed to 020 + // If ZZZZZZZZ > Word at XXXXXXXX then execute next line. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("2C2") == true) + { + RAMAddress = RAMAddress.Replace("2C2", "020"); + } + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("6C2") == true) + { + // 6C2 Should be Changed to 020 + // If ZZZZZZZZ > Word at XXXXXXXX then execute next 2 lines. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("6C2") == true) + { + RAMAddress = RAMAddress.Replace("6C2", "020"); + } + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("AC2") == true) + { + // AC2 Should be Changed to 020 + // If ZZZZZZZZ > Word at XXXXXXXX then execute all following codes in the same row (else execute none of the codes below). + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("AC2") == true) + { + RAMAddress = RAMAddress.Replace("AC2", "020"); + } + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("EC2") == true) + { + // EC2 Should be Changed to 020 + // While ZZZZZZZZ <= Word at XXXXXXXX turn off all codes. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("EC2") == true) + { + RAMAddress = RAMAddress.Replace("EC2", "020"); + } + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + // 10) + // [If Value at adress XXXXXXXX is higher than...] (unsigned) Code + // Unsigned means For bytes : values go from 0 to +255. For Halfword : values go from 0 to +65535. For Words : values go from 0 to 4294967295. For exemple, for the Byte comparison, 7F (127) will be < to FF (255). + else if (RAMAddress.StartsWith("302") == true) + { + // 302 Should be Changed to 020 + // If ZZZZZZZZ < Byte at XXXXXXXX then execute next line.. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("302") == true) + { + RAMAddress = RAMAddress.Replace("302", "020"); + } + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("702") == true) + { + // 702 Should be Changed to 020 + // If ZZZZZZZZ < Byte at XXXXXXXX then execute next line.. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("702") == true) + { + RAMAddress = RAMAddress.Replace("702", "020"); + } + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("B02") == true) + { + // B02 Should be Changed to 020 + // If ZZZZZZZZ < Byte at XXXXXXXX then execute next line.. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("B02") == true) + { + RAMAddress = RAMAddress.Replace("B02", "020"); + } + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("F02") == true) + { + // F02 Should be Changed to 020 + // If ZZZZZZZZ < Byte at XXXXXXXX then execute next line.. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("F02") == true) + { + RAMAddress = RAMAddress.Replace("F02", "020"); + } + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("322") == true) + { + // 322 Should be Changed to 020 + //If ZZZZZZZZ < Halfword at XXXXXXXX then execute next line. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("322") == true) + { + RAMAddress = RAMAddress.Replace("322", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("722") == true) + { + // 722 Should be Changed to 020 + // If ZZZZZZZZ < Halfword at XXXXXXXX then execute next line.. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("722") == true) + { + RAMAddress = RAMAddress.Replace("722", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("B22") == true) + { + // B22 Should be Changed to 020 + // If ZZZZZZZZ < Halfword at XXXXXXXX then execute next line.. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("B22") == true) + { + RAMAddress = RAMAddress.Replace("B22", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("F22") == true) + { + // F22 Should be Changed to 020 + // If ZZZZZZZZ < Halfword at XXXXXXXX then execute next line.. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("F22") == true) + { + RAMAddress = RAMAddress.Replace("F22", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + + else if (RAMAddress.StartsWith("342") == true) + { + // 342 Should be Changed to 020 + //If ZZZZZZZZ < Halfword at XXXXXXXX then execute next line. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("342") == true) + { + RAMAddress = RAMAddress.Replace("342", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("742") == true) + { + // 742 Should be Changed to 020 + // If ZZZZZZZZ < Halfword at XXXXXXXX then execute next line.. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("742") == true) + { + RAMAddress = RAMAddress.Replace("742", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("B42") == true) + { + // B42 Should be Changed to 020 + // If ZZZZZZZZ < Halfword at XXXXXXXX then execute next line.. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("B42") == true) + { + RAMAddress = RAMAddress.Replace("B42", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("F42") == true) + { + // F42 Should be Changed to 020 + // If ZZZZZZZZ < Halfword at XXXXXXXX then execute next line.. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("F42") == true) + { + RAMAddress = RAMAddress.Replace("F42", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + // 11) If AND Code + else if (RAMAddress.StartsWith("382") == true) + { + // 382 Should be Changed to 020 + // If ZZ AND Byte at XXXXXXXX <> 0 (= True) then execute next code. + // XXXXXXXX + // 000000ZZ + if (RAMAddress.StartsWith("382") == true) + { + RAMAddress = RAMAddress.Replace("382", "020"); + } + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("782") == true) + { + // 782 Should be Changed to 020 + // If ZZ AND Byte at XXXXXXXX <> 0 (= True) then execute next 2 codes. + // XXXXXXXX + // 000000ZZ + if (RAMAddress.StartsWith("782") == true) + { + RAMAddress = RAMAddress.Replace("782", "020"); + } + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("B82") == true) + { + // B82 Should be Changed to 020 + // If ZZ AND Byte at XXXXXXXX <> 0 (= True) then execute all following codes in the same row (else execute none of the codes below). + // XXXXXXXX + // 000000ZZ + if (RAMAddress.StartsWith("B82") == true) + { + RAMAddress = RAMAddress.Replace("B82", "020"); + } + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("F82") == true) + { + // F82 Should be Changed to 020 + // While ZZ AND Byte at XXXXXXXX = 0 (= False) then turn off all codes. + // XXXXXXXX + // 000000ZZ + if (RAMAddress.StartsWith("F82") == true) + { + RAMAddress = RAMAddress.Replace("F82", "020"); + } + byteSize = 8; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("3A2") == true) + { + // 3A2 Should be Changed to 020 + // If ZZZZ AND Halfword at XXXXXXXX <> 0 (= True) then execute next code. + // XXXXXXXX + // 0000ZZZZ + if (RAMAddress.StartsWith("3A2") == true) + { + RAMAddress = RAMAddress.Replace("3A2", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("7A2") == true) + { + // 7A2 Should be Changed to 020 + // If ZZZZ AND Halfword at XXXXXXXX <> 0 (= True) then execute next 2 codes. + // XXXXXXXX + // 0000ZZZZ + if (RAMAddress.StartsWith("7A2") == true) + { + RAMAddress = RAMAddress.Replace("7A2", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("3C2") == true) + { + // 3C2 Should be Changed to 020 + // If ZZZZZZZZ AND Word at XXXXXXXX <> 0 (= True) then execute next code. + // XXXXXXXX + // ZZZZZZZZ + if (RAMAddress.StartsWith("3C2") == true) + { + RAMAddress = RAMAddress.Replace("3C2", "020"); + } + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("7C2") == true) + { + // 7C2 Should be Changed to 020 + // If ZZZZZZZZ AND Word at XXXXXXXX <> 0 (= True) then execute next 2 codes. + // XXXXXXXX + // ZZZZZZZZ + if (RAMAddress.StartsWith("7C2") == true) + { + RAMAddress = RAMAddress.Replace("7C2", "020"); + } + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("BC2") == true) + { + // BC2 Should be Changed to 020 + // If ZZZZZZZZ AND Word at XXXXXXXX <> 0 (= True) then execute all following codes in the same row (else execute none of the codes below). + // XXXXXXXX + // ZZZZZZZZ + if (RAMAddress.StartsWith("BC2") == true) + { + RAMAddress = RAMAddress.Replace("BC2", "020"); + } + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("FC2") == true) + { + // FC2 Should be Changed to 020 + // While ZZZZZZZZ AND Word at XXXXXXXX = 0 (= False) then turn off all codes. + // XXXXXXXX + // ZZZZZZZZ + if (RAMAddress.StartsWith("FC2") == true) + { + RAMAddress = RAMAddress.Replace("FC2", "020"); + } + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + // 12) "Always..." Codes + // For the "Always..." codes: -XXXXXXXX can be any authorised address BUT 00000000 (use 02000000 if you don't know what to choose). -ZZZZZZZZ can be anything. -The "y" in the code data must be in the [1-7] range (which means not 0). + // + // + else if (RAMAddress.StartsWith("0E2") == true) + { + // 0E2 Should be Changed to 020 + // Always skip next line. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("0E2") == true) + { + RAMAddress = RAMAddress.Replace("0E2", "020"); + } + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("4E2") == true) + { + // 4E2 Should be Changed to 020 + // Always skip next 2 lines. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("4E2") == true) + { + RAMAddress = RAMAddress.Replace("4E2", "020"); + } + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("8E2") == true) + { + // 8E2 Should be Changed to 020 + // Always Stops executing all the codes below. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("8E2") == true) + { + RAMAddress = RAMAddress.Replace("8E2", "020"); + } + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("CE2") == true) + { + // CE2 Should be Changed to 020 + // Always turn off all codes. + // XXXXXXXX ZZZZZZZZ + if (RAMAddress.StartsWith("CE2") == true) + { + RAMAddress = RAMAddress.Replace("CE2", "020"); + } + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + // 13) 1 Line Special Codes (= starting with "00000000") + else if (RAMAddress.StartsWith("00000000") == true) + { + // End of the code list (even if you put values in the 2nd line). + // 00000000 + //Let's ignore the user's input on this one? + if (RAMAddress.StartsWith("00000000") == true) + { + RAMAddress = RAMAddress.Replace("00000000", "020"); + } + byteSize = 32; + MessageBox.Show("The code you entered is not needed by Bizhawk.", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnneeded = true; + return; + } + else if (RAMAddress.StartsWith("080") == true) + { + // End of the code list (even if you put values in the 2nd line). + // 00000000 + //Let's ignore the user's input on this one? + if (RAMAddress.StartsWith("080") == true) + { + RAMAddress = RAMAddress.Replace("080", "020"); + } + byteSize = 32; + MessageBox.Show("The code you entered is not needed by Bizhawk.", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnneeded = true; + return; + } + else if (RAMAddress.StartsWith("0800") == true && RAMAddress[6] == '0' == true && RAMAddress[7] == '0' == true) + { + // AR Slowdown : loops the AR XX times + // 0800XX00 + if (RAMAddress.StartsWith("0800") == true && RAMAddress[6] == '0' == true && RAMAddress[7] == '0' == true) + { + RAMAddress = RAMAddress.Replace("0800", "020"); + } + byteSize = 32; + MessageBox.Show("The code you entered is not needed by Bizhawk.", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnneeded = true; + return; + } + // 14) 2 Lines Special Codes (= starting with '00000000' and padded (if needed) with "00000000") + // Note: You have to add the 0es manually, after clicking the "create" button. + //Ocean Prince's note: + //Several of these appear to be conflicted with above detections. + else if (RAMAddress.StartsWith("1E2") == true) + { + // 1E2 Should be Changed to 020 + // Patches ROM address (XXXXXXXX << 1) with Halfword ZZZZ. Does not work on V1/2 upgraded to V3. Only for a real V3 Hardware? + // XXXXXXXX + // 0000ZZZZ + if (RAMAddress.StartsWith("1E2") == true) + { + RAMAddress = RAMAddress.Replace("1E2", "020"); + } + byteSize = 16; + blnActionReplayMax = true; + } + else if (RAMAddress.StartsWith("40000000") == true) + { + // 40000000 Should be Changed to 00000000 + // (SP = 0) (means : stops the "then execute all following codes in the same row" and stops the "else execute none of the codes below)". + // 00000000 + // 00000000 + if (RAMAddress.StartsWith("40000000") == true) + { + RAMAddress = RAMAddress.Replace("40000000", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("60000000") == true) + { + // 60000000 Should be Changed to 00000000 + // (SP = 1) (means : start to execute all codes until end of codes or SP = 0). (bypass the number of codes to executes set by the master code). Should be Changed to (If SP <> 2) + // 00000000 + // 00000000 + if (RAMAddress.StartsWith("60000000") == true) + { + RAMAddress = RAMAddress.Replace("60000000", "020"); + } + byteSize = 16; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + //TODO: + //Figure out how these work. + //NOTE: + //This is a Three Line Checker + #region "The Three Line Adds" + else if (RAMAddress.StartsWith("8022") == true) + { + // 802 Should be Changed to 020 + // Writes Byte YY at address XXXXXXXX. Then makes YY = YY + Z1, XXXXXXXX = XXXXXXXX + Z3Z3, Z2 = Z2 - 1, and repeats until Z2 < 0. + // XXXXXXXX + // 000000YY + // Z1Z2Z3Z3 + if (RAMAddress.StartsWith("8022") == true) + { + RAMAddress = RAMAddress.Replace("8022", "0200"); + } + byteSize = 8; + MessageBox.Show("Sorry, this tool does not support 8022 codes.", "Tool error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + blnUnhandled = true; + return; + } + //I Don't get what this is doing. + else if (RAMAddress.StartsWith("8222") == true) + { + // 822 Should be Changed to 020 + // Writes Halfword YYYY at address XXXXXXXX. Then makes YYYY = YYYY + Z1, XXXXXXXX = XXXXXXXX + Z3Z3*2, + // XXXXXXXX + // 0000YYYY + // Z1Z2Z3Z3 + if (RAMAddress.StartsWith("8222") == true) + { + RAMAddress = RAMAddress.Replace("8222", "0200"); + } + byteSize = 16; + MessageBox.Show("Sorry, this tool does not support 8222 codes.", "Tool error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("842") == true) + { + // 842 Should be Changed to 020 + // Writes Word YYYYYYYY at address XXXXXXXX. Then makes YYYYYYYY = YYYYYYYY + Z1, XXXXXXXX = XXXXXXXX + Z3Z3*4, Z2 = Z2 - 1, and repeats until Z2<0. + // XXXXXXXX + // YYYYYYYY + // Z1Z2Z3Z3 + // WARNING: There is a BUG on the REAL AR (v2 upgraded to v3, and maybe on real v3) with the 32Bits Increment Slide code. You HAVE to add a code (best choice is 80000000 00000000 : add 0 to value at address 0) right after it, else the AR will erase the 2 last 8 digits lines of the 32 Bits Inc. Slide code when you enter it !!! + if (RAMAddress.StartsWith("842") == true) + { + RAMAddress = RAMAddress.Replace("842", "020"); + } + byteSize = 32; + MessageBox.Show("Sorry, this tool does not support 8222 codes.", "Tool error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + blnUnhandled = true; + return; + } + #endregion + // 15) Special Codes + // -Master Code- + // address to patch AND $1FFFFFE Should be Changed to address to patch + // Master Code settings. + // XXXXXXXX + // 0000YYYY + // + else if (RAMValue.StartsWith("001DC0DE") == true) + { + // -ID Code- + // Word at address 080000AC + // Must always be 001DC0DE + // XXXXXXXX + // 001DC0DE + if (RAMValue.StartsWith("001DC0DE") == true) + { + RAMValue = RAMValue.Replace("001DC0DE", "020"); + } + byteSize = 32; + MessageBox.Show("The code you entered is not needed by Bizhawk.", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnneeded = true; + return; + } + else if (RAMAddress.StartsWith("DEADFACE") == true) + { + // -DEADFACE- + // New Encryption seed. + // DEADFACE + // 0000XXXX + MessageBox.Show("Sorry, this tool does not support DEADFACE codes.", "Tool error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + blnUnhandled = true; + return; + } + else if (blnActionReplayMax == false) + { + //Is it a bad code? Check the others. + blnActionReplayMax = false; + } + return; + } + public void GBACodeBreaker() + { + //These checks are done on the DECYPTED code, not the Encrypted one. + if (RAMAddress.StartsWith("0000") == true && RAMValue.StartsWith("0008") == true || RAMAddress.StartsWith("0000") == true && RAMValue.StartsWith("0002") == true) + { + //Master Code #1 + //0000xxxx yyyy + + //xxxx is the CRC value (the "Game ID" converted to hex) + //Flags("yyyy"): + //0008 - CRC Exists(CRC is used to autodetect the inserted game) + //0002 - Disable Interupts + MessageBox.Show("The code you entered is not needed by Bizhawk.", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnneeded = true; + return; + } + else if (RAMAddress.StartsWith("1") == true && RAMValue.StartsWith("1000") == true || RAMAddress.StartsWith("1") == true && RAMValue.StartsWith("2000") == true || RAMAddress.StartsWith("1") == true && RAMValue.StartsWith("3000") == true || RAMAddress.StartsWith("1") == true && RAMValue.StartsWith("4000") == true || RAMAddress.StartsWith("1") == true && RAMValue.StartsWith("0020") == true) + { + //Master Code #2 + //1aaaaaaa xxxy + //'y' is the CBA Code Handler Store Address(0 - 7)[address = ((d << 0x16) + 0x08000100)] + + //1000 - 32 - bit Long - Branch Type(Thumb) + //2000 - 32 - bit Long - Branch Type(ARM) + //3000 - 8 - bit(?) Long - Branch Type(Thumb) + //4000 - 8 - bit(?) Long - Branch Type(ARM) + //0020 - Unknown(Odd Effect) + MessageBox.Show("The code you entered is not needed by Bizhawk.", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnneeded = true; + return; + } + else if (RAMAddress.StartsWith("3") == true) + { + //8 - Bit Constant RAM Write + //3aaaaaaa 00yy + //Continuosly writes the 8 - Bit value specified by 'yy' to address aaaaaaa. + RAMAddress = RAMAddress.Remove(0, 1); + byteSize = 16; + } + else if (RAMAddress.StartsWith("4") == true) + { + //Slide Code + //4aaaaaaa yyyy + //xxxxxxxx iiii + //This is one of those two - line codes.The "yyyy" set is the data to store at the address (aaaaaaa), with xxxxxxxx being the number of addresses to store to, and iiii being the value to increment the addresses by. The codetype is usually use to fill memory with a certain value. + RAMAddress = RAMAddress.Remove(0, 1); + byteSize = 32; + MessageBox.Show("Sorry, this tool does not support 4 codes.", "Tool error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("6") == true) + { + //16 - Bit Logical AND + //6aaaaaaa yyyy + //Performs the AND function on the address provided with the value provided. I'm not going to explain what AND does, so if you'd like to know I suggest you see the instruction manual for a graphing calculator. + //This is another advanced code type you'll probably never need to use. + + //Ocean Prince's note: + //AND means "If ALL conditions are True then Do" + //I don't understand how this would be applied/works. Samples are requested. + MessageBox.Show("Sorry, this tool does not support 6 codes.", "Tool error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("7") == true) + { + //16 - Bit 'If Equal To' Activator + //7aaaaaaa yyyy + //If the value at the specified RAM address(aaaaaaa) is equal to yyyy value, active the code on the next line. + byteSize = 32; + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("8") == true) + { + //16 - Bit Constant RAM Write + //8aaaaaaa yyyy + //Continuosly writes yyyy values to the specified RAM address(aaaaaaa). + //Continuosly writes the 8 - Bit value specified by 'yy' to address aaaaaaa. + RAMAddress = RAMAddress.Remove(0, 1); + byteSize = 32; + } + else if (RAMAddress.StartsWith("9") == true) + { + //Change Encryption Seeds + //9yyyyyyy yyyy + //(When 1st Code Only!) + //Works like the DEADFACE on GSA.Changes the encryption seeds used for the rest of the codes. + MessageBox.Show("Sorry, this tool does not support 9 codes.", "Tool error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + byteSize = 32; + blnUnhandled = true; + return; + } + else if (RAMAddress.StartsWith("A") == true) + { + //16 - Bit 'If Not Equal' Activator + //Axxxxxxx yyyy + //Basicly the opposite of an 'If Equal To' Activator.Activates the code on the next line if address xxxxxxx is NOT equal to yyyy + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + byteSize = 32; + return; + + } + else if (RAMAddress.StartsWith("D00000") == true) + { + //16 - Bit Conditional RAM Write + //D00000xx yyyy + //No Description available at this time. + MessageBox.Show("The code you entered is not supported by BizHawk.", "Emulator Error", MessageBoxButtons.OK, MessageBoxIcon.Information); + blnUnhandled = true; + byteSize = 32; + return; + } + return; + } + public void AddGBA() + { + if (byteSize == 8) + { + var watch = Watch.GenerateWatch(MemoryDomains["System Bus"], long.Parse(RAMAddress, NumberStyles.HexNumber), WatchSize.Byte, Client.Common.DisplayType.Hex, false, txtDescription.Text); + Global.CheatList.Add(new Cheat(watch, int.Parse(RAMValue, NumberStyles.HexNumber))); + } + else if (byteSize == 16) + { + var watch = Watch.GenerateWatch(MemoryDomains["System Bus"], long.Parse(RAMAddress, NumberStyles.HexNumber), WatchSize.Word, Client.Common.DisplayType.Hex, false, txtDescription.Text); + Global.CheatList.Add(new Cheat(watch, int.Parse(RAMValue, NumberStyles.HexNumber))); + } + else if (byteSize == 32) + { + var watch = Watch.GenerateWatch(MemoryDomains["System Bus"], long.Parse(RAMAddress, NumberStyles.HexNumber), WatchSize.DWord, Client.Common.DisplayType.Hex, false, txtDescription.Text); + Global.CheatList.Add(new Cheat(watch, int.Parse(RAMValue, NumberStyles.HexNumber))); + } + //Clear old Inputs + txtCheat.Clear(); + txtDescription.Clear(); + } + //TODO: + //Make Slide Code Handling suck less. + //Make Slide Code Handling exist. + public void GBASlide() + { + //This works on the Action Replay MAX, not the Codebreaker, GameShark SP/Xploder + string s = firstSlide.Remove(0, 11).Insert(1, "0"); + string str2 = secondSlide.Remove(8, 9); + if (str2.StartsWith("0000")) + { + str2 = str2.Remove(0, 4); + } + long num = 0L; + num = long.Parse(secondSlide.Remove(0, 9).Remove(4, 4), NumberStyles.HexNumber); + long num2 = long.Parse(secondSlide.Remove(0, 13), NumberStyles.HexNumber); + long num3 = long.Parse(s, NumberStyles.HexNumber); + for (double i = 0.0; i != num; i++) + { + s = string.Format("{0:X8}", num3); + Watch watch = Watch.GenerateWatch(MemoryDomains["System Bus"], long.Parse(s, NumberStyles.HexNumber), WatchSize.Word, Client.Common.DisplayType.Hex, false, txtDescription.Text); + int? compare = null; + Global.CheatList.Add(new Cheat(watch, int.Parse(str2, NumberStyles.HexNumber), compare, true)); + num3 = long.Parse(s, NumberStyles.HexNumber) + num2; + } + Slider = false; + txtCheat.Clear(); + txtDescription.Clear(); } private void GEN() { @@ -496,7 +2375,7 @@ namespace BizHawk.Client.EmuHawk //This applies to the Game Genie if (txtCheat.Text.Length == 9 && txtCheat.Text.Contains("-")) { - if (txtCheat.Text.IndexOf("-") != 5) + if (txtCheat.Text.IndexOf("-") != 4) { MessageBox.Show("All Genesis Game Genie Codes need to contain a dash after the fourth character", "Input Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; @@ -1195,8 +3074,7 @@ namespace BizHawk.Client.EmuHawk } private void SNES() { - //TODO: Make these checks Suck less. - //Game Genie check and do. + Boolean GameGenie = false; if (txtCheat.Text.Contains("-") && txtCheat.Text.Length == 9) { int val = 0, add = 0; @@ -1206,9 +3084,13 @@ namespace BizHawk.Client.EmuHawk SnesGGDecode(input, ref val, ref add); RAMAddress = string.Format("{0:X6}", add); RAMValue = string.Format("{0:X2}", val); + //We trim the first value here to make it work. + RAMAddress = RAMAddress.Remove(0, 1); //Note, it's not actually a byte, but a Word. However, we are using this to keep from repeating code. byteSize = 8; - } + GameGenie = true; + + } //This ONLY applies to Action Replay. if (txtCheat.Text.Length == 8) { @@ -1244,9 +3126,16 @@ namespace BizHawk.Client.EmuHawk if (byteSize == 8) { //Is this correct? - //I don't think so, but Changing it to CARTROM, causes a major issue. - var watch = Watch.GenerateWatch(MemoryDomains["System Bus"], long.Parse(RAMAddress, NumberStyles.HexNumber), WatchSize.Word, Client.Common.DisplayType.Hex, false, txtDescription.Text); - Global.CheatList.Add(new Cheat(watch, int.Parse(RAMValue, NumberStyles.HexNumber))); + if (GameGenie == true) + { + var watch = Watch.GenerateWatch(MemoryDomains["CARTROM"], long.Parse(RAMAddress, NumberStyles.HexNumber), WatchSize.Byte, Client.Common.DisplayType.Hex, false, txtDescription.Text); + Global.CheatList.Add(new Cheat(watch, int.Parse(RAMValue, NumberStyles.HexNumber))); + } + else if (GameGenie == false) + { + var watch = Watch.GenerateWatch(MemoryDomains["System Bus"], long.Parse(RAMAddress, NumberStyles.HexNumber), WatchSize.Byte, Client.Common.DisplayType.Hex, false, txtDescription.Text); + Global.CheatList.Add(new Cheat(watch, int.Parse(RAMValue, NumberStyles.HexNumber))); + } } //Take Watch, Add our Value we want, and it should be active when addded? @@ -1271,6 +3160,7 @@ namespace BizHawk.Client.EmuHawk { //TODO? //Add special handling for cores that need special things? + //GBA may need a special thing. } } -} +} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/tools/Genesis/GenGameGenie.cs b/BizHawk.Client.EmuHawk/tools/Genesis/GenGameGenie.cs index 3d5b730ab2..a00b0858f2 100644 --- a/BizHawk.Client.EmuHawk/tools/Genesis/GenGameGenie.cs +++ b/BizHawk.Client.EmuHawk/tools/Genesis/GenGameGenie.cs @@ -12,6 +12,7 @@ using BizHawk.Emulation.Cores.Consoles.Sega.gpgx; namespace BizHawk.Client.EmuHawk { + [ToolAttributes(false, null)] public partial class GenGameGenie : Form, IToolFormAutoConfig { #pragma warning disable 675 diff --git a/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.Designer.cs b/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.Designer.cs index 8730509b58..727dd6bc3e 100644 --- a/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.Designer.cs +++ b/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.Designer.cs @@ -87,8 +87,8 @@ this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator(); this.viewN64MatrixToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.MemoryViewerBox = new System.Windows.Forms.GroupBox(); - this.AddressLabel = new System.Windows.Forms.Label(); this.HexScrollBar = new System.Windows.Forms.VScrollBar(); + this.AddressLabel = new System.Windows.Forms.Label(); this.AddressesLabel = new System.Windows.Forms.Label(); this.Header = new System.Windows.Forms.Label(); this.HexMenuStrip.SuspendLayout(); @@ -133,7 +133,7 @@ this.SaveMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveAs; this.SaveMenuItem.Name = "SaveMenuItem"; this.SaveMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); - this.SaveMenuItem.Size = new System.Drawing.Size(225, 22); + this.SaveMenuItem.Size = new System.Drawing.Size(236, 22); this.SaveMenuItem.Text = "Save"; this.SaveMenuItem.Click += new System.EventHandler(this.SaveMenuItem_Click); // @@ -142,33 +142,33 @@ this.SaveAsBinaryMenuItem.Name = "SaveAsBinaryMenuItem"; this.SaveAsBinaryMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) | System.Windows.Forms.Keys.S))); - this.SaveAsBinaryMenuItem.Size = new System.Drawing.Size(225, 22); + this.SaveAsBinaryMenuItem.Size = new System.Drawing.Size(236, 22); this.SaveAsBinaryMenuItem.Text = "Save as binary..."; this.SaveAsBinaryMenuItem.Click += new System.EventHandler(this.SaveAsBinaryMenuItem_Click); // // SaveAsTextMenuItem // this.SaveAsTextMenuItem.Name = "SaveAsTextMenuItem"; - this.SaveAsTextMenuItem.Size = new System.Drawing.Size(225, 22); + this.SaveAsTextMenuItem.Size = new System.Drawing.Size(236, 22); this.SaveAsTextMenuItem.Text = "Save as text..."; this.SaveAsTextMenuItem.Click += new System.EventHandler(this.SaveAsTextMenuItem_Click); // // toolStripSeparator4 // this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(222, 6); + this.toolStripSeparator4.Size = new System.Drawing.Size(233, 6); // // LoadTableFileMenuItem // this.LoadTableFileMenuItem.Name = "LoadTableFileMenuItem"; - this.LoadTableFileMenuItem.Size = new System.Drawing.Size(225, 22); + this.LoadTableFileMenuItem.Size = new System.Drawing.Size(236, 22); this.LoadTableFileMenuItem.Text = "&Load .tbl file"; this.LoadTableFileMenuItem.Click += new System.EventHandler(this.LoadTableFileMenuItem_Click); // // CloseTableFileMenuItem // this.CloseTableFileMenuItem.Name = "CloseTableFileMenuItem"; - this.CloseTableFileMenuItem.Size = new System.Drawing.Size(225, 22); + this.CloseTableFileMenuItem.Size = new System.Drawing.Size(236, 22); this.CloseTableFileMenuItem.Text = "Close .tbl file"; this.CloseTableFileMenuItem.Click += new System.EventHandler(this.CloseTableFileMenuItem_Click); // @@ -177,26 +177,26 @@ this.RecentTablesSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.noneToolStripMenuItem}); this.RecentTablesSubMenu.Name = "RecentTablesSubMenu"; - this.RecentTablesSubMenu.Size = new System.Drawing.Size(225, 22); + this.RecentTablesSubMenu.Size = new System.Drawing.Size(236, 22); this.RecentTablesSubMenu.Text = "Recent"; this.RecentTablesSubMenu.DropDownOpened += new System.EventHandler(this.RecentTablesSubMenu_DropDownOpened); // // noneToolStripMenuItem // this.noneToolStripMenuItem.Name = "noneToolStripMenuItem"; - this.noneToolStripMenuItem.Size = new System.Drawing.Size(99, 22); + this.noneToolStripMenuItem.Size = new System.Drawing.Size(110, 22); this.noneToolStripMenuItem.Text = "None"; // // toolStripSeparator1 // this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(222, 6); + this.toolStripSeparator1.Size = new System.Drawing.Size(233, 6); // // ExitMenuItem // this.ExitMenuItem.Name = "ExitMenuItem"; this.ExitMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4))); - this.ExitMenuItem.Size = new System.Drawing.Size(225, 22); + this.ExitMenuItem.Size = new System.Drawing.Size(236, 22); this.ExitMenuItem.Text = "E&xit"; this.ExitMenuItem.Click += new System.EventHandler(this.ExitMenuItem_Click); // @@ -220,7 +220,7 @@ this.CopyMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Duplicate; this.CopyMenuItem.Name = "CopyMenuItem"; this.CopyMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C))); - this.CopyMenuItem.Size = new System.Drawing.Size(144, 22); + this.CopyMenuItem.Size = new System.Drawing.Size(155, 22); this.CopyMenuItem.Text = "&Copy"; this.CopyMenuItem.Click += new System.EventHandler(this.CopyMenuItem_Click); // @@ -228,7 +228,7 @@ // this.ExportMenuItem.Name = "ExportMenuItem"; this.ExportMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.E))); - this.ExportMenuItem.Size = new System.Drawing.Size(144, 22); + this.ExportMenuItem.Size = new System.Drawing.Size(155, 22); this.ExportMenuItem.Text = "&Export"; this.ExportMenuItem.Click += new System.EventHandler(this.ExportMenuItem_Click); // @@ -237,20 +237,20 @@ this.PasteMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Paste; this.PasteMenuItem.Name = "PasteMenuItem"; this.PasteMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.V))); - this.PasteMenuItem.Size = new System.Drawing.Size(144, 22); + this.PasteMenuItem.Size = new System.Drawing.Size(155, 22); this.PasteMenuItem.Text = "&Paste"; this.PasteMenuItem.Click += new System.EventHandler(this.PasteMenuItem_Click); // // toolStripSeparator6 // this.toolStripSeparator6.Name = "toolStripSeparator6"; - this.toolStripSeparator6.Size = new System.Drawing.Size(141, 6); + this.toolStripSeparator6.Size = new System.Drawing.Size(152, 6); // // FindMenuItem // this.FindMenuItem.Name = "FindMenuItem"; this.FindMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F))); - this.FindMenuItem.Size = new System.Drawing.Size(144, 22); + this.FindMenuItem.Size = new System.Drawing.Size(155, 22); this.FindMenuItem.Text = "&Find..."; this.FindMenuItem.Click += new System.EventHandler(this.FindMenuItem_Click); // @@ -258,7 +258,7 @@ // this.FindNextMenuItem.Name = "FindNextMenuItem"; this.FindNextMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F3; - this.FindNextMenuItem.Size = new System.Drawing.Size(144, 22); + this.FindNextMenuItem.Size = new System.Drawing.Size(155, 22); this.FindNextMenuItem.Text = "Find Next"; this.FindNextMenuItem.Click += new System.EventHandler(this.FindNextMenuItem_Click); // @@ -266,7 +266,7 @@ // this.FindPrevMenuItem.Name = "FindPrevMenuItem"; this.FindPrevMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F2; - this.FindPrevMenuItem.Size = new System.Drawing.Size(144, 22); + this.FindPrevMenuItem.Size = new System.Drawing.Size(155, 22); this.FindPrevMenuItem.Text = "Find Prev"; this.FindPrevMenuItem.Click += new System.EventHandler(this.FindPrevMenuItem_Click); // @@ -292,7 +292,7 @@ this.MemoryDomainsMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripSeparator3}); this.MemoryDomainsMenuItem.Name = "MemoryDomainsMenuItem"; - this.MemoryDomainsMenuItem.Size = new System.Drawing.Size(206, 22); + this.MemoryDomainsMenuItem.Size = new System.Drawing.Size(217, 22); this.MemoryDomainsMenuItem.Text = "&Memory Domains"; this.MemoryDomainsMenuItem.DropDownOpened += new System.EventHandler(this.MemoryDomainsMenuItem_DropDownOpened); // @@ -308,47 +308,47 @@ this.DataSizeWordMenuItem, this.DataSizeDWordMenuItem}); this.DataSizeSubMenu.Name = "DataSizeSubMenu"; - this.DataSizeSubMenu.Size = new System.Drawing.Size(206, 22); + this.DataSizeSubMenu.Size = new System.Drawing.Size(217, 22); this.DataSizeSubMenu.Text = "Data Size"; // // DataSizeByteMenuItem // this.DataSizeByteMenuItem.Name = "DataSizeByteMenuItem"; - this.DataSizeByteMenuItem.Size = new System.Drawing.Size(105, 22); + this.DataSizeByteMenuItem.Size = new System.Drawing.Size(116, 22); this.DataSizeByteMenuItem.Text = "1 Byte"; this.DataSizeByteMenuItem.Click += new System.EventHandler(this.DataSizeByteMenuItem_Click); // // DataSizeWordMenuItem // this.DataSizeWordMenuItem.Name = "DataSizeWordMenuItem"; - this.DataSizeWordMenuItem.Size = new System.Drawing.Size(105, 22); + this.DataSizeWordMenuItem.Size = new System.Drawing.Size(116, 22); this.DataSizeWordMenuItem.Text = "2 Byte"; this.DataSizeWordMenuItem.Click += new System.EventHandler(this.DataSizeWordMenuItem_Click); // // DataSizeDWordMenuItem // this.DataSizeDWordMenuItem.Name = "DataSizeDWordMenuItem"; - this.DataSizeDWordMenuItem.Size = new System.Drawing.Size(105, 22); + this.DataSizeDWordMenuItem.Size = new System.Drawing.Size(116, 22); this.DataSizeDWordMenuItem.Text = "4 Byte"; this.DataSizeDWordMenuItem.Click += new System.EventHandler(this.DataSizeDWordMenuItem_Click); // // BigEndianMenuItem // this.BigEndianMenuItem.Name = "BigEndianMenuItem"; - this.BigEndianMenuItem.Size = new System.Drawing.Size(206, 22); + this.BigEndianMenuItem.Size = new System.Drawing.Size(217, 22); this.BigEndianMenuItem.Text = "Big Endian"; this.BigEndianMenuItem.Click += new System.EventHandler(this.BigEndianMenuItem_Click); // // toolStripSeparator2 // this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(203, 6); + this.toolStripSeparator2.Size = new System.Drawing.Size(214, 6); // // GoToAddressMenuItem // this.GoToAddressMenuItem.Name = "GoToAddressMenuItem"; this.GoToAddressMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.G))); - this.GoToAddressMenuItem.Size = new System.Drawing.Size(206, 22); + this.GoToAddressMenuItem.Size = new System.Drawing.Size(217, 22); this.GoToAddressMenuItem.Text = "&Go to Address..."; this.GoToAddressMenuItem.Click += new System.EventHandler(this.GoToAddressMenuItem_Click); // @@ -357,7 +357,7 @@ this.AddToRamWatchMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.FindHS; this.AddToRamWatchMenuItem.Name = "AddToRamWatchMenuItem"; this.AddToRamWatchMenuItem.ShortcutKeyDisplayString = "Ctrl+W"; - this.AddToRamWatchMenuItem.Size = new System.Drawing.Size(206, 22); + this.AddToRamWatchMenuItem.Size = new System.Drawing.Size(217, 22); this.AddToRamWatchMenuItem.Text = "Add to Ram Watch"; this.AddToRamWatchMenuItem.Click += new System.EventHandler(this.AddToRamWatchMenuItem_Click); // @@ -366,7 +366,7 @@ this.FreezeAddressMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Freeze; this.FreezeAddressMenuItem.Name = "FreezeAddressMenuItem"; this.FreezeAddressMenuItem.ShortcutKeyDisplayString = "Space"; - this.FreezeAddressMenuItem.Size = new System.Drawing.Size(206, 22); + this.FreezeAddressMenuItem.Size = new System.Drawing.Size(217, 22); this.FreezeAddressMenuItem.Text = "&Freeze Address"; this.FreezeAddressMenuItem.Click += new System.EventHandler(this.FreezeAddressMenuItem_Click); // @@ -375,7 +375,7 @@ this.UnfreezeAllMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Unfreeze; this.UnfreezeAllMenuItem.Name = "UnfreezeAllMenuItem"; this.UnfreezeAllMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Shift | System.Windows.Forms.Keys.Delete))); - this.UnfreezeAllMenuItem.Size = new System.Drawing.Size(206, 22); + this.UnfreezeAllMenuItem.Size = new System.Drawing.Size(217, 22); this.UnfreezeAllMenuItem.Text = "Unfreeze All"; this.UnfreezeAllMenuItem.Click += new System.EventHandler(this.UnfreezeAllMenuItem_Click); // @@ -384,7 +384,7 @@ this.PokeAddressMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.poke; this.PokeAddressMenuItem.Name = "PokeAddressMenuItem"; this.PokeAddressMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.P))); - this.PokeAddressMenuItem.Size = new System.Drawing.Size(206, 22); + this.PokeAddressMenuItem.Size = new System.Drawing.Size(217, 22); this.PokeAddressMenuItem.Text = "&Poke Address"; this.PokeAddressMenuItem.Click += new System.EventHandler(this.PokeAddressMenuItem_Click); // @@ -403,25 +403,25 @@ this.toolStripSeparator8, this.ResetColorsToDefaultMenuItem}); this.CustomColorsSubMenu.Name = "CustomColorsSubMenu"; - this.CustomColorsSubMenu.Size = new System.Drawing.Size(143, 22); + this.CustomColorsSubMenu.Size = new System.Drawing.Size(154, 22); this.CustomColorsSubMenu.Text = "Custom Colors"; // // SetColorsMenuItem // this.SetColorsMenuItem.Name = "SetColorsMenuItem"; - this.SetColorsMenuItem.Size = new System.Drawing.Size(153, 22); + this.SetColorsMenuItem.Size = new System.Drawing.Size(164, 22); this.SetColorsMenuItem.Text = "Set Colors"; this.SetColorsMenuItem.Click += new System.EventHandler(this.SetColorsMenuItem_Click); // // toolStripSeparator8 // this.toolStripSeparator8.Name = "toolStripSeparator8"; - this.toolStripSeparator8.Size = new System.Drawing.Size(150, 6); + this.toolStripSeparator8.Size = new System.Drawing.Size(161, 6); // // ResetColorsToDefaultMenuItem // this.ResetColorsToDefaultMenuItem.Name = "ResetColorsToDefaultMenuItem"; - this.ResetColorsToDefaultMenuItem.Size = new System.Drawing.Size(153, 22); + this.ResetColorsToDefaultMenuItem.Size = new System.Drawing.Size(164, 22); this.ResetColorsToDefaultMenuItem.Text = "Reset to Default"; this.ResetColorsToDefaultMenuItem.Click += new System.EventHandler(this.ResetColorsToDefaultMenuItem_Click); // @@ -570,19 +570,31 @@ | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.MemoryViewerBox.ContextMenuStrip = this.ViewerContextMenuStrip; - this.MemoryViewerBox.Controls.Add(this.AddressLabel); this.MemoryViewerBox.Controls.Add(this.HexScrollBar); + this.MemoryViewerBox.Controls.Add(this.AddressLabel); this.MemoryViewerBox.Controls.Add(this.AddressesLabel); + this.MemoryViewerBox.Controls.Add(this.Header); this.MemoryViewerBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.MemoryViewerBox.Location = new System.Drawing.Point(12, 27); this.MemoryViewerBox.MaximumSize = new System.Drawing.Size(600, 1024); this.MemoryViewerBox.MinimumSize = new System.Drawing.Size(260, 180); this.MemoryViewerBox.Name = "MemoryViewerBox"; - this.MemoryViewerBox.Size = new System.Drawing.Size(558, 262); + this.MemoryViewerBox.Size = new System.Drawing.Size(560, 262); this.MemoryViewerBox.TabIndex = 2; this.MemoryViewerBox.TabStop = false; this.MemoryViewerBox.Paint += new System.Windows.Forms.PaintEventHandler(this.MemoryViewerBox_Paint); // + // HexScrollBar + // + this.HexScrollBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Right))); + this.HexScrollBar.LargeChange = 16; + this.HexScrollBar.Location = new System.Drawing.Point(544, 16); + this.HexScrollBar.Name = "HexScrollBar"; + this.HexScrollBar.Size = new System.Drawing.Size(16, 246); + this.HexScrollBar.TabIndex = 1; + this.HexScrollBar.ValueChanged += new System.EventHandler(this.HexScrollBar_ValueChanged); + // // AddressLabel // this.AddressLabel.AutoSize = true; @@ -593,22 +605,11 @@ this.AddressLabel.TabIndex = 2; this.AddressLabel.Text = " "; // - // HexScrollBar - // - this.HexScrollBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Right))); - this.HexScrollBar.LargeChange = 16; - this.HexScrollBar.Location = new System.Drawing.Point(539, 8); - this.HexScrollBar.Name = "HexScrollBar"; - this.HexScrollBar.Size = new System.Drawing.Size(16, 251); - this.HexScrollBar.TabIndex = 1; - this.HexScrollBar.ValueChanged += new System.EventHandler(this.HexScrollBar_ValueChanged); - // // AddressesLabel // this.AddressesLabel.AutoSize = true; this.AddressesLabel.ContextMenuStrip = this.ViewerContextMenuStrip; - this.AddressesLabel.Location = new System.Drawing.Point(65, 30); + this.AddressesLabel.Location = new System.Drawing.Point(79, 30); this.AddressesLabel.Name = "AddressesLabel"; this.AddressesLabel.Size = new System.Drawing.Size(31, 13); this.AddressesLabel.TabIndex = 0; diff --git a/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.cs b/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.cs index 8aa2722435..365b37c407 100644 --- a/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.cs +++ b/BizHawk.Client.EmuHawk/tools/HexEditor/HexEditor.cs @@ -480,7 +480,7 @@ namespace BizHawk.Client.EmuHawk addrStr.Append(" "); } - addrStr.AppendLine(_addr.ToHexString(_numDigits)); + addrStr.AppendLine(_addr.ToHexString(_numDigits) + " |"); } return addrStr.ToString(); @@ -516,7 +516,7 @@ namespace BizHawk.Client.EmuHawk } } - rowStr.Append(" | "); + rowStr.Append("| "); for (var k = 0; k < 16; k++) { if (_addr + k < _domain.Size) @@ -669,13 +669,15 @@ namespace BizHawk.Client.EmuHawk private void UpdateFormText() { + Text = "Hex Editor"; if (_addressHighlighted >= 0) { - Text = "Hex Editor - Editing Address 0x" + string.Format(_numDigitsStr, _addressHighlighted); - } - else - { - Text = "Hex Editor"; + Text += " - Editing Address 0x" + string.Format(_numDigitsStr, _addressHighlighted); + if (_secondaryHighlightedAddresses.Any()) + { + Text += string.Format(" (Selected 0x{0:X})", _secondaryHighlightedAddresses.Count() + + (_secondaryHighlightedAddresses.Contains(_addressHighlighted) ? 0 : 1)); + } } } @@ -690,13 +692,13 @@ namespace BizHawk.Client.EmuHawk switch (DataSize) { case 1: - Header.Text = " 0 1 2 3 4 5 6 7 8 9 A B C D E F"; + Header.Text = " 0 1 2 3 4 5 6 7 8 9 A B C D E F"; break; case 2: - Header.Text = " 0 2 4 6 8 A C E"; + Header.Text = " 0 2 4 6 8 A C E"; break; case 4: - Header.Text = " 0 4 8 C"; + Header.Text = " 0 4 8 C"; break; } @@ -940,10 +942,11 @@ namespace BizHawk.Client.EmuHawk var column = x / (fontWidth * colWidth); - var start = GetTextOffset() - 50; + var innerOffset = AddressesLabel.Location.X - AddressLabel.Location.X + AddressesLabel.Margin.Left; + var start = GetTextOffset() - innerOffset; if (x > start) { - column = (x - start) / (fontWidth / DataSize); + column = (x - start) / (fontWidth * DataSize); } if (i >= 0 && i <= _maxRow && column >= 0 && column < (16 / DataSize)) @@ -977,6 +980,17 @@ namespace BizHawk.Client.EmuHawk _secondaryHighlightedAddresses.Add(x); } } + + if (!IsVisible(_addressOver)) + { + var value = (_addressOver / 16) + 1 - ((_addressOver / 16) < HexScrollBar.Value ? 1 : _rowsVisible); + if (value < 0) + { + value = 0; + } + + HexScrollBar.Value = (int)value; // This will fail on a sufficiently large domain + } } } @@ -1009,7 +1023,7 @@ namespace BizHawk.Client.EmuHawk { int start = (16 / DataSize) * fontWidth * (DataSize * 2 + 1); start += AddressesLabel.Location.X + fontWidth / 2; - start += fontWidth * 4; + start += fontWidth * 2; return start; } @@ -1043,7 +1057,7 @@ namespace BizHawk.Client.EmuHawk private void AddToSecondaryHighlights(long address) { - if (address >= 0 && address < _domain.Size) + if (address >= 0 && address < _domain.Size && !_secondaryHighlightedAddresses.Contains(address)) { _secondaryHighlightedAddresses.Add(address); } @@ -2166,8 +2180,8 @@ namespace BizHawk.Client.EmuHawk } else { - e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(0x77FFD4D4)), rect); - e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(0x77FFD4D4)), textrect); + e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(0x44, Global.Config.HexHighlightColor)), rect); + e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(0x44, Global.Config.HexHighlightColor)), textrect); } } } @@ -2190,6 +2204,7 @@ namespace BizHawk.Client.EmuHawk if (_mouseIsDown) { DoShiftClick(); + UpdateFormText(); MemoryViewerBox.Refresh(); } } diff --git a/BizHawk.Client.EmuHawk/tools/HexEditor/NewHexEditor.Designer.cs b/BizHawk.Client.EmuHawk/tools/HexEditor/NewHexEditor.Designer.cs new file mode 100644 index 0000000000..d6074c0358 --- /dev/null +++ b/BizHawk.Client.EmuHawk/tools/HexEditor/NewHexEditor.Designer.cs @@ -0,0 +1,102 @@ +namespace BizHawk.Client.EmuHawk +{ + partial class NewHexEditor + { + /// + /// 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.HexMenu = new System.Windows.Forms.MenuStrip(); + this.FileSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.ExitMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.HexViewControl = new BizHawk.Client.EmuHawk.HexView(); + this.HexMenu.SuspendLayout(); + this.SuspendLayout(); + // + // HexMenu + // + this.HexMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.FileSubMenu}); + this.HexMenu.Location = new System.Drawing.Point(0, 0); + this.HexMenu.Name = "HexMenu"; + this.HexMenu.Size = new System.Drawing.Size(448, 24); + this.HexMenu.TabIndex = 0; + this.HexMenu.Text = "menuStrip1"; + // + // FileSubMenu + // + this.FileSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.ExitMenuItem}); + this.FileSubMenu.Name = "FileSubMenu"; + this.FileSubMenu.Size = new System.Drawing.Size(37, 20); + this.FileSubMenu.Text = "&File"; + this.FileSubMenu.DropDownOpened += new System.EventHandler(this.FileSubMenu_DropDownOpened); + // + // ExitMenuItem + // + this.ExitMenuItem.Name = "ExitMenuItem"; + this.ExitMenuItem.ShortcutKeyDisplayString = "Alt+F4"; + this.ExitMenuItem.Size = new System.Drawing.Size(134, 22); + this.ExitMenuItem.Text = "E&xit"; + this.ExitMenuItem.Click += new System.EventHandler(this.ExitMenuItem_Click); + // + // HexViewControl + // + this.HexViewControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.HexViewControl.ArrayLength = 0; + this.HexViewControl.Location = new System.Drawing.Point(12, 27); + this.HexViewControl.Name = "HexViewControl"; + this.HexViewControl.Size = new System.Drawing.Size(424, 231); + this.HexViewControl.TabIndex = 1; + this.HexViewControl.Text = "hexView1"; + // + // NewHexEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(448, 270); + this.Controls.Add(this.HexViewControl); + this.Controls.Add(this.HexMenu); + this.MainMenuStrip = this.HexMenu; + this.Name = "NewHexEditor"; + this.Text = "NewHexEditor"; + this.Load += new System.EventHandler(this.NewHexEditor_Load); + this.HexMenu.ResumeLayout(false); + this.HexMenu.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.MenuStrip HexMenu; + private System.Windows.Forms.ToolStripMenuItem FileSubMenu; + private System.Windows.Forms.ToolStripMenuItem ExitMenuItem; + private HexView HexViewControl; + } +} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/tools/HexEditor/NewHexEditor.cs b/BizHawk.Client.EmuHawk/tools/HexEditor/NewHexEditor.cs new file mode 100644 index 0000000000..dc34d45caa --- /dev/null +++ b/BizHawk.Client.EmuHawk/tools/HexEditor/NewHexEditor.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Windows.Forms; + +using BizHawk.Emulation.Common; + +namespace BizHawk.Client.EmuHawk +{ + public partial class NewHexEditor : Form, IToolFormAutoConfig + { + #region Initialize and Dependencies + + [RequiredService] + private IMemoryDomains MemoryDomains { get; set; } + + [RequiredService] + private IEmulator Emulator { get; set; } + + public NewHexEditor() + { + InitializeComponent(); + + Closing += (o, e) => SaveConfigSettings(); + + HexViewControl.QueryIndexValue += HexView_QueryIndexValue; + HexViewControl.QueryIndexForeColor += HexView_QueryIndexForeColor; + HexViewControl.QueryIndexBgColor += HexView_QueryIndexForeColor; + } + + private void NewHexEditor_Load(object sender, EventArgs e) + { + HexViewControl.ArrayLength = MemoryDomains.MainMemory.Size; + } + + private void SaveConfigSettings() + { + + } + + #endregion + + #region IToolForm implementation + + public void UpdateValues() + { + // TODO + } + + public void FastUpdate() + { + // TODO + } + + public void Restart() + { + // TODO + } + + public bool AskSaveChanges() + { + return true; // TODO + } + + public bool UpdateBefore { get { return false; } } + + #endregion + + #region HexView Callbacks + + private void HexView_QueryIndexValue(int index, out long value) + { + value = MemoryDomains.MainMemory.PeekByte(index); + } + + private void HexView_QueryIndexBgColor(int index, ref Color color) + { + color = Color.White; + } + + private void HexView_QueryIndexForeColor(int index, ref Color color) + { + color = Color.Black; + } + + #endregion + + #region Menu Items + + private void FileSubMenu_DropDownOpened(object sender, EventArgs e) + { + + } + + private void ExitMenuItem_Click(object sender, EventArgs e) + { + Close(); + } + + #endregion + } +} diff --git a/BizHawk.Client.EmuHawk/tools/HexEditor/NewHexEditor.resx b/BizHawk.Client.EmuHawk/tools/HexEditor/NewHexEditor.resx new file mode 100644 index 0000000000..9a68370371 --- /dev/null +++ b/BizHawk.Client.EmuHawk/tools/HexEditor/NewHexEditor.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Client.cs b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Client.cs index e4dd65f42b..97488bf4ac 100644 --- a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Client.cs +++ b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Client.cs @@ -45,6 +45,15 @@ namespace BizHawk.Client.EmuHawk GlobalWin.MainForm.CloseEmulator(); } + [LuaMethodAttributes( + "exitCode", + "Closes the emulator and returns the provided code" + )] + public void CloseEmulatorWithCode(int exitCode) + { + GlobalWin.MainForm.CloseEmulator(exitCode); + } + [LuaMethodAttributes( "borderheight", "Gets the current height in pixels of the letter/pillarbox area (top side only) around the emu display surface, excluding the gameExtraPadding you've set. This function (the whole lot of them) should be renamed or refactored since the padding areas have got more complex." @@ -303,7 +312,10 @@ namespace BizHawk.Client.EmuHawk )] public static void RebootCore() { + //pretty hacky.. we dont want a lua script to be able to restart itself by rebooting the core + ((LuaConsole)GlobalWin.Tools.Get()).IsRebootingCore = true; GlobalWin.MainForm.RebootCore(); + ((LuaConsole)GlobalWin.Tools.Get()).IsRebootingCore = false; } [LuaMethodAttributes( diff --git a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Forms.cs b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Forms.cs index 6b88687cc0..0de2784db0 100644 --- a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Forms.cs +++ b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Forms.cs @@ -482,6 +482,10 @@ namespace BizHawk.Client.EmuHawk { if (form.Handle == ptr) { + if (form.GetType().GetProperty(property).PropertyType.IsEnum) + { + value = Enum.Parse(form.GetType().GetProperty(property).PropertyType, value.ToString(), true); + } form .GetType() .GetProperty(property) @@ -493,6 +497,10 @@ namespace BizHawk.Client.EmuHawk { if (control.Handle == ptr) { + if (control.GetType().GetProperty(property).PropertyType.IsEnum) + { + value = Enum.Parse(control.GetType().GetProperty(property).PropertyType, value.ToString(), true); + } control .GetType() .GetProperty(property) @@ -557,7 +565,7 @@ namespace BizHawk.Client.EmuHawk [LuaMethodAttributes( "textbox", - "Creates a textbox control on the given form. The caption property will be the initial value of the textbox (default is empty). Width and Height are option, if not specified they will be a default size of 100, 20. Type is an optional property to restrict the textbox input. The available options are HEX, SIGNED, and UNSIGNED. Passing it null or any other value will set it to no restriction. x, and y are the optional location parameters for the position of the textbox within the given form. The function returns the handle of the created textbox. If true, the multiline will enable the standard winform multi-line property. If true, the fixedWidth options will create a fixed width font" + "Creates a textbox control on the given form. The caption property will be the initial value of the textbox (default is empty). Width and Height are option, if not specified they will be a default size of 100, 20. Type is an optional property to restrict the textbox input. The available options are HEX, SIGNED, and UNSIGNED. Passing it null or any other value will set it to no restriction. x, and y are the optional location parameters for the position of the textbox within the given form. The function returns the handle of the created textbox. If true, the multiline will enable the standard winform multi-line property. If true, the fixedWidth options will create a fixed width font. Scrollbars is an optional property to specify which scrollbars to display. The available options are Vertical, Horizontal, Both, and None. Scrollbars are only shown on a multiline textbox" )] public int Textbox( int formHandle, @@ -568,7 +576,8 @@ namespace BizHawk.Client.EmuHawk int? x = null, int? y = null, bool multiline = false, - bool fixedWidth = false) + bool fixedWidth = false, + string scrollbars = null) { var form = GetForm(formHandle); if (form == null) @@ -583,6 +592,26 @@ namespace BizHawk.Client.EmuHawk } textbox.Multiline = multiline; + if (scrollbars != null) + { + switch (scrollbars.ToUpper()) + { + case "VERTICAL": + textbox.ScrollBars = ScrollBars.Vertical; + break; + case "HORIZONTAL": + textbox.ScrollBars = ScrollBars.Horizontal; + textbox.WordWrap = false; + break; + case "BOTH": + textbox.ScrollBars = ScrollBars.Both; + textbox.WordWrap = false; + break; + case "NONE": + textbox.ScrollBars = ScrollBars.None; + break; + } + } SetText(textbox, caption); if (x.HasValue && y.HasValue) diff --git a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Gui.cs b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Gui.cs index 4b65078cfe..e15f452a45 100644 --- a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Gui.cs +++ b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.Gui.cs @@ -164,7 +164,7 @@ namespace BizHawk.Client.EmuHawk [LuaMethodAttributes( "defaultForeground", - "Sets the default foreground color to use when using drawing methods, white by default" + "Sets the default foreground color to use in drawing methods, white by default" )] public void SetDefaultForegroundColor(Color color) { @@ -173,13 +173,22 @@ namespace BizHawk.Client.EmuHawk [LuaMethodAttributes( "defaultBackground", - "Sets the default background color to use when using drawing methods, transparent by default" + "Sets the default background color to use in drawing methods, transparent by default" )] public void SetDefaultBackgroundColor(Color color) { DefaultBackground = color; } + [LuaMethodAttributes( + "defaultTextBackground", + "Sets the default backgroiund color to use in text drawing methods, half-transparent black by default" + )] + public void SetDefaultTextBackground(Color color) + { + DefaultTextBackground = color; + } + [LuaMethodAttributes( "drawBezier", "Draws a Bezier curve using the table of coordinates provided in the given color" diff --git a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.cs b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.cs index ab48b62381..4bf4f196cd 100644 --- a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.cs +++ b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.cs @@ -144,7 +144,8 @@ namespace BizHawk.Client.EmuHawk public Lua SpawnCoroutine(string file) { var lua = _lua.NewThread(); - var main = lua.LoadString(File.ReadAllText(file), "main"); + var content = File.ReadAllText(file); + var main = lua.LoadString(content, "main"); lua.Push(main); // push main function on to stack for subsequent resuming return lua; } diff --git a/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs b/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs index f65226a2b7..aa355b3a16 100644 --- a/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs +++ b/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs @@ -27,6 +27,8 @@ namespace BizHawk.Client.EmuHawk private List _consoleCommandHistory = new List(); private int _consoleCommandHistoryIndex = -1; + public bool IsRebootingCore; + public LuaConsole() { _sortReverse = false; diff --git a/BizHawk.Client.EmuHawk/tools/Lua/LuaRegisteredFunctionsList.Designer.cs b/BizHawk.Client.EmuHawk/tools/Lua/LuaRegisteredFunctionsList.Designer.cs index d52452ae15..8d14a59114 100644 --- a/BizHawk.Client.EmuHawk/tools/Lua/LuaRegisteredFunctionsList.Designer.cs +++ b/BizHawk.Client.EmuHawk/tools/Lua/LuaRegisteredFunctionsList.Designer.cs @@ -107,6 +107,7 @@ // // RemoveButton // + this.RemoveButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.RemoveButton.Enabled = false; this.RemoveButton.Location = new System.Drawing.Point(93, 284); this.RemoveButton.Name = "RemoveButton"; @@ -140,6 +141,7 @@ // // RemoveAllBtn // + this.RemoveAllBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.RemoveAllBtn.Enabled = false; this.RemoveAllBtn.Location = new System.Drawing.Point(174, 284); this.RemoveAllBtn.Name = "RemoveAllBtn"; @@ -161,7 +163,7 @@ this.Controls.Add(this.FunctionView); this.Controls.Add(this.OK); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MinimumSize = new System.Drawing.Size(200, 50); + this.MinimumSize = new System.Drawing.Size(360, 150); this.Name = "LuaRegisteredFunctionsList"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.Text = "Active Registered Functions"; diff --git a/BizHawk.Client.EmuHawk/tools/Lua/LuaTextBox.cs b/BizHawk.Client.EmuHawk/tools/Lua/LuaTextBox.cs index 971f29157c..a194a42ba5 100644 --- a/BizHawk.Client.EmuHawk/tools/Lua/LuaTextBox.cs +++ b/BizHawk.Client.EmuHawk/tools/Lua/LuaTextBox.cs @@ -64,6 +64,10 @@ namespace BizHawk.Client.EmuHawk break; } } + else if (e.KeyData == (Keys.Control | Keys.A)) + { + base.SelectAll(); + } else { base.OnKeyDown(e); diff --git a/BizHawk.Client.EmuHawk/tools/Macros/MacroInput.cs b/BizHawk.Client.EmuHawk/tools/Macros/MacroInput.cs index e2d7a4539f..5f6f40a1c4 100644 --- a/BizHawk.Client.EmuHawk/tools/Macros/MacroInput.cs +++ b/BizHawk.Client.EmuHawk/tools/Macros/MacroInput.cs @@ -1,10 +1,5 @@ using System; using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; using System.Windows.Forms; using System.IO; @@ -15,6 +10,7 @@ using BizHawk.Client.EmuHawk.ToolExtensions; namespace BizHawk.Client.EmuHawk { + [ToolAttributes(false, null)] public partial class MacroInputTool : Form, IToolFormAutoConfig { [RequiredService] diff --git a/BizHawk.Client.EmuHawk/tools/NES/NESGameGenie.cs b/BizHawk.Client.EmuHawk/tools/NES/NESGameGenie.cs index 9bce0c8c31..6cbfcfc980 100644 --- a/BizHawk.Client.EmuHawk/tools/NES/NESGameGenie.cs +++ b/BizHawk.Client.EmuHawk/tools/NES/NESGameGenie.cs @@ -4,11 +4,11 @@ using System.Globalization; using System.Windows.Forms; using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; using BizHawk.Client.Common; namespace BizHawk.Client.EmuHawk { + [ToolAttributes(false, null)] public partial class NESGameGenie : Form, IToolFormAutoConfig { [RequiredService] diff --git a/BizHawk.Client.EmuHawk/tools/NES/NESMusicRipper.Designer.cs b/BizHawk.Client.EmuHawk/tools/NES/NESMusicRipper.Designer.cs index 35507aecf6..16e2b91d92 100644 --- a/BizHawk.Client.EmuHawk/tools/NES/NESMusicRipper.Designer.cs +++ b/BizHawk.Client.EmuHawk/tools/NES/NESMusicRipper.Designer.cs @@ -164,19 +164,19 @@ this.toolStripSeparator2, this.ExitMenuItem}); this.FileSubMenu.Name = "FileSubMenu"; - this.FileSubMenu.Size = new System.Drawing.Size(35, 20); + this.FileSubMenu.Size = new System.Drawing.Size(37, 20); this.FileSubMenu.Text = "&File"; // // toolStripSeparator2 // this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(129, 6); + this.toolStripSeparator2.Size = new System.Drawing.Size(131, 6); // // ExitMenuItem // this.ExitMenuItem.Name = "ExitMenuItem"; this.ExitMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4))); - this.ExitMenuItem.Size = new System.Drawing.Size(132, 22); + this.ExitMenuItem.Size = new System.Drawing.Size(134, 22); this.ExitMenuItem.Text = "E&xit"; this.ExitMenuItem.Click += new System.EventHandler(this.ExitMenuItem_Click); // @@ -189,9 +189,12 @@ this.Controls.Add(this.groupBox1); this.Controls.Add(this.textBox1); this.Controls.Add(this.menuStrip1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Name = "NESMusicRipper"; - this.Text = "NESMusicRipper"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Music Ripper"; this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.NESMusicRipper_FormClosed); + this.Load += new System.EventHandler(this.NESMusicRipper_Load); this.groupBox1.ResumeLayout(false); this.groupBox1.PerformLayout(); this.groupBox2.ResumeLayout(false); diff --git a/BizHawk.Client.EmuHawk/tools/NES/NESMusicRipper.cs b/BizHawk.Client.EmuHawk/tools/NES/NESMusicRipper.cs index de54555a79..3d173c1ebd 100644 --- a/BizHawk.Client.EmuHawk/tools/NES/NESMusicRipper.cs +++ b/BizHawk.Client.EmuHawk/tools/NES/NESMusicRipper.cs @@ -515,5 +515,9 @@ namespace BizHawk.Client.EmuHawk apu.DebugCallback = null; } + private void NESMusicRipper_Load(object sender, EventArgs e) + { + + } } } diff --git a/BizHawk.Client.EmuHawk/tools/NES/NESMusicRipper.resx b/BizHawk.Client.EmuHawk/tools/NES/NESMusicRipper.resx index 803443a4c1..a9a2d5347c 100644 --- a/BizHawk.Client.EmuHawk/tools/NES/NESMusicRipper.resx +++ b/BizHawk.Client.EmuHawk/tools/NES/NESMusicRipper.resx @@ -125,4 +125,299 @@ Make sure the template has 5 tracks. There should be pulse waveforms in instrume 17, 17 + + + + AAABAAYAMBwAAAEAIAAIFgAAZgAAADAcAAABAAgASAoAAG4WAAAgIAAAAQAgAKgQAAC2IAAAICAAAAEA + CACoCAAAXjEAABAQAAABACAAaAQAAAY6AAAQEAAAAQAIAGgFAABuPgAAKAAAADAAAAA4AAAAAQAgAAAA + AAAAKgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADU1NQYpKSkY5aUlIGWlJKBl5WVfpSS + koGUlJSBlpaWepaWlnqWlpZ6lZWVfpWVlX6VlZV+lZWVfpWVlX6XlZV+mZeVfpmXlX6XlZV+l5WVfpaU + lIGWlJSBl5WVfpWXlX6Vl5V+lZeVfpWXlX6Xl5V+l5eVfpeXlX6Xl5V+l5WVfpeVlX6WlJSBl5WVfpeV + lX6XlZV+l5WVfpeVlX6VlZV+l5WVfpeVlX6Vk5GFlJKSgaSkpGPY2NgUAAAAALe3t0QsLCz/CAQD/w4L + B/8WEQ7/Ew4L/xQQD/8NCwr/DwoJ/xALCv8RDAv/Eg0M/xINDP8SDQz/FA8O/xUQD/8QDAv/EQ0M/xMP + Dv8TDw7/FBAP/xUREP8WEhH/FxMS/xMREP8TERD/EhAP/xIQD/8RDw7/EA4N/xAODf8PDQz/FBAP/xMP + Dv8SDg3/Eg4N/xIODf8SDg3/EQ0M/xAMC/8MCgn/Ew8O/xEMCf8UDwz/DwwI/wsHBv8tLS3/s7O3Ry0s + Lv8bGRn/bWhl/4aAe/+Gfnf/eXNu/4B5dv+FgH3/h357/4qBfv+NhIH/j4aD/5GIhf+Tiof/lo2K/5iP + jP+blpP/nJeU/5+al/+hnJn/o56b/6ahnv+oo6D/qqWi/6qlov+ppKH/p6Kf/6Wgnf+inZr/oJuY/5+a + l/+emZb/mJOQ/5eSj/+VkI3/k46L/5GMif+Qi4j/jomG/4yHhP+KhYL/hX57/395dP+Lg3z/jIaB/3Nu + a/8dGxv/KSgq/wQCAv9OSUj/qaOe/6Wck/+onZX/rKOa/6igmf+moJv/rKSd/66mn/+yqqP/tKyl/7au + p/+4sKn/u7Os/762r/++tbL/wLe0/8O6t//Gvbr/yL+8/8vCv//OxcL/0MfE/9HKx//Qycb/zcbD/8rD + wP/HwL3/xL26/8K7uP/Burf/w7u0/8G5sv++tq//u7Os/7iwqf+1rab/s6uk/7Gpov+uqKP/sami/7Ws + o/+uo5v/qaCX/62nov9STUz/BwUF/wQAAP9VUE3/tq6n/8e9s//GurD/x72z/8rBuP/Jwbr/ycG6/8zE + vf/Oxr//z8fA/8/HwP/QyMH/08vE/9XNxv/Yz8v/2tHN/9zTz//e1dH/4djU/+Pa1v/l3Nj/597a/+rh + 3f/p4Nz/597a/+Tb1//h2NT/39bS/93U0P/c08//1c3G/9TMxf/QyMH/zcW+/8rCu//Hv7j/xLy1/8K6 + s/+8tK3/v7at/7uxp/+3q6H/t62j/6ujnP9STUr/BQAB/wAAAP9tbW3/7u7u/+Li4v/c3Nz/19fX/9fX + 1//Z2dn/2tra/9zc3P/U1NT/1tbW/9zc3P/d29v/1NLS/9rY2P/d29v/3NjX/+Xg3f/m4Nv/6ePe/+nj + 3v/n4N3/5+Dd/+bk2v/k4dz/4d3j/+Tc5v/i2+D/49nf/93Y2f/Y3c7/3NnU/97Z0P/i2+L/1tfT/9LV + 0//Y0dj/3NrQ/9fUz//i4bv/0c7d/8vO1v/d1db/4tvS/+Hp2P9dYmX/BwUA/wAAAP9+fn7/6enp/2ho + aP8mJib/JiYm/ysrK/8pKSn/JiYm/yoqKv8pKSn/MjAw/yYkJP8sKir/NTMz/zEvL/8wLi7/VVFQ/4aB + fv95c27/fXdy/3lzbv9ya2j/e3Rx/3dvaP91cmr/dHJq/3FvZf99d2z/X1ZT/z01PP9BPUP/RT5L/0FE + Nf8+Qjz/OjhM/0FFP/9QVkX/QjtI/0tMSv9PQE7/TEZl/0tPUP9VT0j/hHt3/+bo6P92dYX/BAIA/wMD + A/9ycnL/3Nzc/zk5Of8AAAD/BAQE/wAAAP8BAQH/AgAA/wQCAv8CAAD/AwEB/wQCAv8CAAD/BAIC/wMB + Af8DAQH/Ih4d/0pFQv9IQj3/TEZB/09JRP9KQ0D/SEE+/0s/Pf9DOjf/RkE4/0Q+Mf9JQTT/OTAm/xkS + D/8fGiP/HxUi/xgfCv8iISv/LRpN/yUbLP8kIhr/IB0f/ygmJv8qHzn/JSM3/x4iHP8sJiH/XFRU/+Ti + 6P95dYj/BAAA/wMFBf9zdXX/4+Xl/zAyMv8AAAD/AQMD/wACAv8GCAj/W1lY/2xqaf9pZ2b/NzU0/wcF + BP8FAwL/DQsK/wcIBv8RDw//GhgX/yckIP8tKST/JiAb/yslIP80LSr/KiUi/zIpJv8yKSz/Ni4v/zQp + K/8tHyP/KyUY/zw+Kv+TlpT/q6aj/52hov+jpqr/in2N/11PUf+ioYz/rK+m/6Sjp/+mrLH/dn53/yos + Jv80KjD/YVxb/+Pi3v9vbXP/BwUE/wIDAf9tbmz/4+Ti/zk6OP8AAQD/AAEA/wMEAv8eHx3/cGxr/0E9 + PP9TT07/XVta/wgGBf8GBAP/CQcG/wsMCv8GBgb/YV9e/8bDv//KxsH/w724/7q0r/+5tLH/w767/7q0 + r/+1rrH/rKin/6+oq/++sr7/cG5k/1RaT//NzOb/mYzg/4F75v+mquX/vbjH/4iCff/S0+j/kYrl/4N9 + 3P+zt+f/pKyr/zUyLf8tIir/XVpW/+bj3v9wb2v/CQsF/xMUEv9pamj/2NnX/zk6OP8AAQD/AwQC/wME + Av8nKCb/RkFA/xINDP8gHBv/VFBP/wQCAf8VExL/BwgG/wgJB/8LCwv/fnx7/+Xi3v+Cfnn/Z2Ne/2ll + YP+KhYL/zsnG/3l2bv9dWlb/YGJP/4aFd//Ty9L/fn15/0ZIU/+GecX/Hhi9/wANof8kJrr/gYek/3aC + bP9gX7v/DhKt/wkRsv8/L73/hoak/z85NP8zLi3/YF1Z/+Td4P9wa2r/Cw4F/wkHBv9pZ2b/4d/e/zo4 + N/8NCwr/UU9O/1BOTf9oZmX/TUhH/yIdHP8qJST/cm5t/15cW/9aWFf/MTIw/wwNC/8KCgr/eXd2/+jl + 4f+sqKP/pKCb/6Sgm/+wq6j/2NPQ/6ymof+WkJH/nZ6K/7Ctnv/Qxc//fnx0/0tNVf9hUaX/BADM/wAE + xv8QCs3/bGic/3Bxb/9GO7//BAjL/wAAx/8lEr//dHOV/zkyKf8yLSr/YWJZ/+Xb4f9nYWL/CgwM/xkV + FP9jX17/3dnY/0I+Pf8YFBP/YFxb/zMvLv87Nzb/MCsq/xwXFv8lIB//My8u/y8tLP9APj3/U1RS/wkK + CP8NDQ3/QUJA/39+ev+Kh4L/hIB7/4J+ef+GgX7/gHt4/4R4eP+LfYj/f3Zy/4V5ef+EcYT/U1BB/09X + Rv+bksr/JyTe/w4H+P88RMf/npWq/4N3bf+JiMz/GRLl/xEW4/9XVtz/iZGY/0M6MP80LTD/YGRZ/+Xf + 2v9lXV3/ExEd/xYWFv9aWFj/2dXU/0E/Pv8SExH/UFFN/ysoJP8wJyT/LSQg/y8mIv8rJSD/LCYh/ykk + If84MzD/UUxJ/xYTD/8bGBD/IyIU/zMzJ/8oKyn/Jyo4/ycoPP8uLzn/NzU0/y40L/81Ozr/MDQ1/zU1 + Nf8+Ozf/Mi0q/0E8Pf9vbXP/Y12A/1tYbv9xb3X/YWJZ/0tMQ/93dnj/ZGBz/11Xdv93dXT/XFhX/zw3 + NP82Lyz/aWJf/+Db2P9aWFf/FhcV/x4eHv9cV1j/1dHQ/0NBQP8dHhz/VVZS/zs4NP8+NTL/Rz84/0Q7 + N/86NC//QTs2/zk0Mf9ST0v/YF1Z/y8rKv8zLyr/QzlF/1xJdP9VPIb/UDeN/0w5fv9USmj/XllW/1E8 + ev9QOYP/SDF7/006a/9USlb/Pzwu/yopH/8wLzP/My81/yolJ/82Lyz/Ny4q/ygfG/87MDL/MSkw/zEp + NP80MjH/NjIx/zUwLf86MzD/aGFe/9nU0f9XVVT/Hh8d/x4fHf9RTUz/0c3M/1ZSUf85Ojj/X2Be/1lW + Uv9lXlv/TkY//0Q8Nf9GQDv/aWNe/1RPTP9YVFP/SUdG/zAuLf87ODT/RkI9/1lVUP9VUFL/Uk5a/05K + Vv9STFH/V05K/09EVP9QRlf/SkJT/01FT/9UTEz/R0E8/zQxLf8uLi7/MjYq/zAxJ/8wLSn/OTI1/zct + M/8yKy7/NzIz/zQyMf8tKyr/NjIx/zo1Mv8/ODX/bWZj/9jT0P9RT07/HR4c/ygpJ/9LR0b/z8rJ/15a + Wf85Ojj/Ozw6/zw6Of9PSkn/ZFxV/01FPv9HQTz/XVhV/z47N/87OTj/NTU1/z4+Pv8xKjf/OzQ3/01H + QP9JRDv/SkZB/0dAQ/9KPUX/SzpD/0c/OP9GQjf/Q0I0/0M/NP9COTX/OjIz/zMuL/8wMS//Li8z/zUy + O/80LTr/NCo7/zkvQP8xKjf/OjU+/zEvNf86ODf/Ozc2/zgzMP86MzD/bWZj/9nU0f9OTEv/ICEf/ygp + J/9DPz7/zcjH/2NeXf9DQUD/Ozw6/0JAP/9QTEv/WVNO/1JMR/9WUk3/WVZS/z87Ov87OTj/MzMz/zU1 + Nf85OjH/S0k//2hhWP9oXlf/Zl1Z/2FZUv9kW1H/aV5Q/2RZUf9cUlL/WU5W/15TVv9YUUj/SkQ5/zg0 + M/8uKzT/GBSR/x0bk/8hHpL/FxOE/yAdiv8eG4j/IR6L/xsbh/81MzL/OjY1/zs2M/88NTL/bWZj/9PO + y/9HRUT/KSoo/y8wLP9DQDz/zcXF/11YV/9APj3/QUJA/0NEQv9EQD//U05L/0xHRP9OS0f/TElF/0A+ + Pf89Ozr/Ojs5/zs8Ov81NDb/RT9A/2BUUv9eUkz/XlVM/1tSSf9aT0v/Xk9N/1xVQv9VTj3/U01A/1hS + R/9XTkX/SD87/zkzNP8zMjb/MCxP/ywqR/8yM0f/Ky04/zI1Pf8wMzv/LjA7/zMzQ/87OTj/Pzs6/0A7 + OP9AOTb/cGlm/8/Kx/9APj3/LS4s/zM0MP8/PDj/zcbD/2JaWv9CQD//R0hG/0RERP9CQED/R0VE/0A+ + Pf89Ozr/Q0FA/0E/Pv88Ozf/PDs3/z8+Ov88QDX/RkI9/1tNTv9ZSkj/W09J/1lQRv9WTkH/VEs+/1VD + UP9RR0f/TUo8/05HPv9MPkL/QDI9/zkzNP86PjL/PTY5/zgyM/89ODX/Ozcy/z06Mv89NzL/PTcy/0A5 + Nv89Ozr/Ozc2/zo1Mv8+NzT/cmto/87Jxv89Ozr/MzQy/zY3M/85NjL/zMXC/2piYv9HQ0L/QUJA/zs7 + O/9EQkL/Ojo6/0RERP89PT3/QD49/zs5OP9APzv/QD87/z06Nf84ODj/S0ZF/2peWv9rX1X/amJR/2Ve + T/9iW1L/ZFhY/2BXTv9hWVL/XFZR/1pUTf9dVEv/UEhB/z86N/86ODj/PDov/z89M/8/Ojf/QDo7/z84 + O/9COjv/Rj4+/0A5Nv8+PDv/QDw7/0I9Ov9GPzz/dm9s/8rFwv84NjX/Njc1/zs6Nv80MS3/ysPA/7qv + q/+Xi4X/loyF/5mSif+TjoX/mJCJ/5iQif+YkIn/mJCJ/5iQif+YkIn/mJCJ/5iQif+Zj4j/oJaP/6ie + l/+roZr/qqCZ/6iel/+nnZb/qJ6X/6ael/+mnpf/pp6X/6Sclf+impP/npaP/5uTjP+ZkYr/nZWO/52V + jv+dlY7/nZWO/52Vjv+dlY7/nZWO/52Vjv+cl47/oJmQ/6CWj/+glI7/uq+r/8nCv/82My//Ozo2/0ZH + Rf8lISD/wLu4/+Pa1//h1tL/5dzY/9rUzf/e29P/39fQ/9/X0P/f19D/39fQ/9/X0P/f19D/39fQ/9/X + 0P/c1M3/39fQ/+La0//i2tP/4NjR/9/X0P/g2NH/4trT/97Wz//f19D/4NjR/+HZ0v/h2dL/4NjR/9/X + 0P/f19D/39fQ/9/X0P/f19D/39fQ/9/X0P/f19D/39fQ/9/X0P/Y1c3/39nS/+Tb1//d0s7/6N/c/8G8 + uf8hHRz/TU5M/4SEhP8RDw7/ZmJh/6mhof+mn5z/pp+c/6qmof+in5r/p6Kf/6ein/+nop//p6Kf/6ei + n/+nop//p6Kf/6ein/+nop//p6Kf/6ahnv+loJ3/pJ+c/6Oem/+loJ3/pqGe/6Wgnf+loJ3/pqGe/6ah + nv+moZ7/p6Kf/6ahnv+moZ7/p6Kf/6ein/+nop//p6Kf/6ein/+nop//p6Kf/6ein/+mo57/pqKd/6eg + nf+qo6D/o5ub/2RgX/8VExL/f39//9ra2gdcXFzXCQcH/wkEBf8ZFRT/DQkI/xAODf8PDQz/EAwL/xAM + C/8QDAv/EAwL/xAMC/8QDAv/EAwL/xAMC/8SDg3/Eg4N/xENDP8RDQz/Eg4N/xIODf8RDQz/EAwL/xIO + Df8SDg3/Eg4N/xENDP8RDQz/EAwL/xAMC/8QDAv/EQ0M/xENDP8RDQz/EQ0M/xENDP8RDQz/EQ0M/xEN + DP8NCwr/EQ8O/wsHBv8XExL/DQgJ/wwKCv9cXFzX////AwAAAAAAAAAAtbW1SZyZmXScmZl0kpCQhJmZ + mXSYmJV3mJWVd5iVlXeYlZV3mJWVd5iVlXeYlZV3mJWVd5iVlXeXlZV7l5WVe5eVlXuYlZV3mpiYd5qY + mHeYlZV3l5WVe5eVlXuXlZV7l5WVe5eVlXuXlZV7l5WVe5iVlXeYlZV3mJWVd5iVlXeYlZV3mJWVd5iV + lXeYlZV3mJWVd5iVlXeXl5V7mZmZdJCOjoiYlZV3n5ycbba2tkYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /////wAA5P/5/9/nAACAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAgAAAAAABAAD7/////98AAP///////wAAKAAAADAAAAA4AAAAAQAIAAAA + AACACgAAAAAAAAAAAAAAAAAAAAAAAAMCAf8JBgX/BwgG/woLBv8GCAj/DAsK/xENDP8VEg7/FBMR/xkV + FP8aGBP/ExEd/x0dHP8hHRz/KB8b/x4iHP8lIhv/Hxci/ykdJ/8qHzn/JiQj/yslIv8nKCb/Kikl/yIh + K/8tIir/Kysq/zAnJP8yKSb/Mi0s/y4yLf8xMif/OTAm/zMyLf85Myz/PTwt/yUjN/8uLTP/Jyk6/ywu + OP8yKzP/NCs6/y4wO/80MzL/OjQz/zw5Nf8yMzv/PDU7/zU7Ov87Ojn/Qjo0/0AyPf9BPTv/ST88/zxA + Nf8+Qjz/Q0I1/0lBNP9EQTz/SkQ8/0xJPf9UTD3/LRpN/ywqR/85L0D/MCxP/zIzRf86OEz/QzxC/0s8 + Q/9DPEn/TTpr/0o1fP9RPHr/REJB/0pGQv9HSEb/TUlF/05CTv9NS0r/UUdH/1NMQv9STUv/W01L/09X + Rv9RU0P/WVJF/1NQTf9bU0v/VFpP/0tIU/9SRFP/U0tT/1tOU/9STlr/VVNR/1tUUv9cWFb/XFdY/1xa + Wv9gV07/ZV5P/2BUUv9iWlL/aV5U/2JcW/9qXlr/X2Be/2BiT/9qYlH/YmJb/2hhXP9MRmX/VEpo/1tY + bv9cSXT/XVd2/11iZf9mYWH/amVj/21oZf9ra2r/cGxl/3Jtav93c2z/a2hz/3Fvdf90dHP/fHZy/3Z+ + d/9+enT/d3Z4/359e/+Dd23/g3t4/3aCbP+GgXz/FxOE/xsbh/8eG4j/GBSR/x0bk/8gHYr/IR6S/wAN + of8OEq3/CRGy/x4Yvf8lEr//JCa6/z8vvf9ROYf/Rju//2NdgP93dYb/bGic/3Rzlf9hUaX/YF+7/wID + yf8QCs3/JyTe/xUU5P8OB/j/PETH/1dW3P+IeYj/hnnF/4N93P+Be+b/hISE/4uFgv+OiYb/lIuF/5KM + iv+Yj4r/lpGO/5qSi/+dnor/iZGY/5WUlP+Ylpb/l5iW/52Zlv+bmZn/oJWO/6SclP+onZb/o52a/6Kh + jP+poJf/pqGe/6uim/+wrZ7/g4ak/56Vqv+doaL/paSm/6qkof+sqaT/o6aq/6Ssq/+vqKv/tKuj/7Cr + qP+6r6v/u7Os/6assf+1rrH/tbS1/7u0sf+7tLv/wLe0/8O6s//DvLn/yL+8/8bBvv/Kwrz/4uG7/4mI + zP+bksr/vbjH/5WL4v+mquX/s7fn/8zFwf/Oycb/z8rJ/9DHxP/SysT/0MXP/9LNy//Yz8v/19TP/9vT + zf/Y3c7/y87W/9LM1//U1NT/3dbQ/9zZ0//Y0dj/29ra/+HW0v/h2dP/5Nza/+jf3P/m4tz/zczm/9LT + 6P/j2+L/3uDg/+bm5v//////AAAA/wAAAP/9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39 + /f39/f39/f39/f39/f397sW0tbW1tLW1t7S0tLS4tbW1tbW0tLS0tLa0tri4trW0tLW0tLW1tLS1sLDH + 7v3TGgEDBwYHAwYGBgYGBgYGBgYGBgcICAkICAYIBgUGBggHBwUHBwYFBQcGBgYBGtEaDHiIiHyCiIiI + iKytra+xtbW8vLzAwMbGxsa8vLy3tbGwsLCsrqyrq4aGiKt7DBkATb+6u8C+v8DHy8vLzc7O0tTV19fZ + 5OTl5eHh2dbW1tXVzs7Oy8vLx8vLwb7HUgEAV87X1dXZ2NjZ4uXi5eXo6urv7/T19fb29/X18/Pv7+fl + 5eHZ1tbVzs7Oy8vAVwAAfvz78vLu8vLy7u7y8u7x8vD19vf19vb39fz69frw6/Dr+u7u7+vu2u3s8PT3 + dQEAhPx5FBYaFhQaGSsVGiseJVeqfICAe3x8fHt6fGUvREY4N0NKVEZPTnBaWIb8mgAAfvIxAAAAAAAA + AAAAAAAAAA1LO0tRO0s7Mjk5OSAHEQ0KGD4SEAwUEyQQEGD8mgAAgfweAAAAAmN5eSsAAAUCBgwQFw4Q + IRAcHSgdEhAjtsfExaZgvcrFz4EXKGn3fgAAefwwAAAAD3s0UmMFAAUFAmPY4tjS0tjS0MbL3XhZ+N6p + 392I+d6o4MkhGWH8eQMIee4xAAAAGUoGDVwACAQFBYT8gm5uq+J8Y2yI54Rap5OQlcKHnpGSmMIyHWf6 + ewUFefUvBV9Xd0sNFXxjYCEFBIT3x7+/zOrGsbLB5oJanZ+foJt+mJ+flJwgHW71dwUJbvI3CGMoMR0J + EB0dSl8DBjqIrIaEiISGpoaGpj1U3KGjpMOF26KipbMyKG71aQsIYe9ECFQXGxUbFRwQIVcHBxAfFycm + KiweLiUrNB06fZlyfm5NgHR0f2MsIHfyYwgRY+5KDF8tLDk0IjIsV2EaHURzl5eXcWBJl0hHWyMVKCsX + IR0OLCgoKyshLGrvXwwPT+NXLXZgaVEyOm9XYE8lLTphXF5aW1NbWlpaUjUhHiEdHSwsKCsrGiEsMnfu + Xw8WTuNjMDExT2c7O2ExMSs3JSw7O01LRUU1OTgyMiwdJSUuKSlAJy8oLS8iLHjvTxEXOuN2SjA6UldS + V2ExMSsrLU1qaGdmZW1lYF1mVjsrJYyNjYmOi46KKy0sLHjnShoeOuRgN0pMN1JNUk00MTAxK0RmZGRT + U1NWPT1XVjUsK0E/QiUuLilCLzI0MnrhSh4rMeFpOkxKSk0xMTo3LS06NjpTU1NWUT1bUDw9RTMsLS0s + MiwsMiwyNC8sLHvjMSsrLeF3RToxOjFMMTQtOjotLUtqaGxtZWlYZ2FYWFE0LS0jNC80NDQyMTQ0NXvh + KystIdnNr62wra+vsa+vra+tr7q+wMC7u7rAvru6urGxsbm1srqxurm1srm5uc3hLDFMDdP18/Xq8O/z + 7/T09PT06ur09PTw9PTq7/Pw9PTv7+rq6urq6urr6vD16vbWDVSqCHbGvMDGv8W/v7+/v7+/xsa/v7y8 + v7+/v8XAv7+/v8bGxsbGxsbGv8a8xrx2CITyYwMBCQEGBQYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYG + BgYGBgYGBQUFCAUFY/v9/dG4uLS2t7W1tbW1tbW1tbW1tbi4tbW1tbS0tbW1tbW1tbW1tbW1triuuLjR + /f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3///////8AAOT/ + +f/f5wAAgAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAIAAAAAAAQAA+//////fAAD///////8AACgAAAAgAAAAQAAAAAEAIAAAAAAAACAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMzMzAWoqKhBlpSUaZeUlGeUlJRplJSUZZeXl2OWlpZmlpaWZpaW + lmaWlpZmmJaWZpiWlmaYlpZmlpSUaZeUlGeWlpZmlpaWZpaWlmaWmJZmlpiWZpaWlmaXlJRnl5SUZ5iW + lmaYlpZmlpaWZpaWlmaYlZNolZKSaqenp0C/v78Ea2tuUSIhH8gpJCLYKyck1yomJdgnIiLWJyMi1Sgk + I9YpJSTXKicl1yonJdcpJSTXKicl1ysoJ9csKSjYLikp1yopKNcpKCfXKSgn1ygnJdcoJyTXKicn1yon + JdcpJSXXKSUl1yklJNcnIyPXKSUk1yklI9cpJSLYJCIiyGxsbFI4ODjCOTUz/1JNSP9OSET/UEtJ/1JL + Sf9VTUv/V1BO/1lSUP9cVVP/XldV/15aWP9iXVv/ZF9d/2ZiYP9pZGL/Z2Rh/2ZiYP9kYF7/YV1b/2Bc + Wv9eWlj/XFhW/1pWVP9ZVFL/V1NR/1VQTv9TTUv/UEtG/1VQS/89OTf/ODY4wyAeH/9xbGn/k4yF/5CI + gf+Ri4b/lo6J/5qSjf+elpH/oZmU/6WcmP+poJz/q6Sh/6+opf+yq6j/trCt/7qzsP+6tLH/uLKv/7Su + q/+wqqf/rqil/6uloP+oop3/pZ6a/6Gblv+emJP/m5WQ/5iRjf+Xj4j/mZGK/3Zxbv8gHh//FxMT/5WP + i/+wpp3/s6mg/7Kqo/+0rKX/uLCp/7y0rf++tq//wbmy/8W9t//Hvrv/y8K//8/Gwv/Tysb/1s3K/9jQ + zf/Vzsr/0cnG/83Fwv/Kwr//yMC6/8a+t//BubL/vLSt/7iwqf+1raf/tKyl/7Wrov+upJv/lY+K/xkV + Ff8YFRT/pqCb/8vDuv/Kwbn/zMW+/8zFv//PyML/0MnD/9HLxf/TzMb/1s/K/9rSzv/e1dH/4dnV/+Tb + 1//m3dr/6OHc/+be2//j2tj/4NfU/9zU0P/X0Mr/1c3H/8/Jw//LxL//yMG7/8W+tv/CurT/vrWu/760 + q/+cmJH/GRQU/xsbG//Nzc3/19fX/83Nzf/MzMz/zs7O/87Ozv/Ly8v/0NDQ/8zKyv/Qzs7/08/O/9/Z + 1v/h29b/4dvW/+DZ1v/e3NP/2tfZ/9zV3P/a0db/0c/M/9HQyf/V0Mr/z87N/8rLy//Rzsn/0M7C/8zJ + zf/Hx83/2tLM/8DHvP8cHBn/Hx8f/87Ozv9gYGD/MTEx/zU1Nf8xMTH/NDQ0/zo4OP8yMDD/PDo6/zs5 + Of9UUVD/iIOA/4J8d/9+eHP/f3h1/312b/97eHH/endu/25lYf9HQUf/TUdR/0pMQP9ERFD/TVFJ/05L + T/9UUVL/VU1m/1VXVv9+dnH/ycvO/yAeIP8eHh7/w8PD/zMzM/8JCQn/CAgI/wgHB/8KCQn/CwkJ/woI + CP8MCgr/CwkJ/yMgH/9UTkv/VE5J/1VPSv9RSkf/UUdD/05IQf9OSDv/RDwy/yEaG/8lHSn/ISYZ/y0h + Rf8qJSz/JyQl/y8rMP8tKD7/KSsm/1dPTv/Jx8//IR0h/x4gIP/Fxsb/Jicn/wECAv8BAgL/MC8u/0pI + SP8vLSz/BQMC/wgGBf8HBwX/GBYV/zIuKv8yLSj/NzEs/zUvLP85Ly3/OjIx/zguK/8wKB//QEA1/3t2 + eP91eXb/cGV7/1dNTv9+f3b/fXyB/2Vpbf8pKCT/U01N/8fFx/8hHiD/HR8e/8bHxv8nKSj/AAEA/wYH + Bv9RUE7/VlJR/1BOTf8HBQT/CQcG/wkKCP80MjH/gX56/4B6df98dnH/f3p3/312dP95cnP/enB0/11W + UP9kZ1//pZ7E/5OSyP+moLX/h4B//6Six/+Ylsf/l56j/zAsKv9TTU3/x8XC/yEhH/8hIiD/wcLA/yor + Kv8AAQD/CgsJ/05LSv8wLCv/UU5N/wcFBP8JCAb/CQoI/1RSUv/JxsH/npmU/5qUkP++ubb/mZSQ/4uJ + gv+noaD/ioaD/2Vncv91bNL/UVTK/5WVvv+IiY3/aWjO/1pZzP+Rk7P/NjEu/1JOTP/Hw8H/IyQe/yYm + JP++vrz/LCwq/xUVFP8jIyH/REFA/xoVFP9OSkn/IiAf/xkZGP8JCgj/YF5d/9DMyP9/e3b/gn15/8K9 + uv+Cfnj/cnJj/6Kflv+Tj43/VFJt/y8nwP8HDrH/Y2Wp/21ygP8eILf/EhK5/25ppv86NC//VFJN/8a/ + wv8jJB//IiAf/8K/vv8wLi3/QkA//09NTP9NSUj/Ih0c/1ZSUf9VU1L/Pj89/wsLCv9VVFP/yMXB/5+b + lv+gnJf/v7q3/6CZlv+Wk4f/rqeh/4iEgP9TUmj/IhzG/wgIzv9eWan/a2eD/xoZzP8NCsr/ZWKh/zgx + Kv9VVU3/xbzA/yIhI/8rJyb/vrq5/zczMv9NSUj/NDAv/zItLP8fGhj/Lyop/zIwL/9OTUz/CgsJ/zIz + Mf98e3b/f3x4/315dv98d3X/gHV3/3xzc/9/cnf/XFVP/2BjZf9GQdP/HRrk/4N/rP+BeIH/ODLY/yYp + 2v96gKT/PjYw/1VWTv/Evrr/JyQs/ycmJv+5trX/NTMy/0FCPv8sKCT/LiUh/y0kIP8rJiH/LSgl/0pG + Q/8WEw7/IiAV/zU1LP8tLzj/Li8//zk4Of81OTb/Njk6/zw6Of83Mi//TUpM/2Negv9cWXf/Z2Zl/1hY + U/9lYnr/X1p8/2RhYv86NTH/W1VS/766t/8nJyX/LCsr/7ezsv84Nzb/RUZD/zg0MP9AODL/PTUx/zs1 + MP87NzP/WVVR/ysnJP85Mjb/UkFp/0k1ev9HOW3/VE5T/0o6bv9FM2//Sjxc/0E8Nf8xMCv/OzhC/zYx + Nf8/ODT/NCwp/z01Pf87ND//PTo5/zcxLv9cVVL/ubWy/ysrKf8rKyn/sq6t/0hFRP9QUU//UU1K/09H + Qf9DOzb/VU9K/05JRv9RT03/MS8t/0E8O/9YT13/Ukdo/05GX/9XT1D/T0Fh/0s+YP9ORFX/SEI9/zAu + Kv8xMi3/Ly0n/zYvL/8yKSz/NS4x/zIuMP80MC//OTQx/19YVf+2srD/Kiop/y4tLP+vqqn/Uk9O/0ZH + Rf9MSUf/WVJM/0hAOv9bVVH/R0RB/0A+Pv83NTb/PTc4/1FMRv9NSUr/SkRL/09CR/9KQUT/R0JC/0hB + P/9COjj/Mi8u/y8xLv8yMDL/NS02/zYtOP82MTf/MjAy/zc0M/85NDH/YFlW/7ayr/8qKyn/Ly8t/6yn + pv9XVFL/Ozw6/0JAP/9bVE//TkhC/1dTT/89Ojj/NTU1/zg3OP8+Ojj/WFFJ/1ZPSv9TSkn/V0lJ/1JK + Qv9NR0L/TkZB/0M8N/8zMDD/JyVR/yonYf8oIVz/LCZe/y0pXv8rKk//OTY1/zk0Mf9gWVb/s6+s/y0t + LP8wMC3/qqWk/1lVVP8+Pjz/RENB/1RPS/9QS0f/VFFN/z47Ov82NjX/Nzc1/0RCPP9lXFX/Y1pU/19W + T/9kWE//X1ZM/1dOTv9bUk7/TEU8/zYyM/8jH2r/IiB7/x8db/8lJHH/JCNx/ycnYv86NjX/PDc0/2Fa + V/+uqqf/MDEv/zQ0MP+qo6L/VlFR/0FBQP9DQ0H/TUlH/0pFQ/9KR0T/Pz08/zo7OP86Ojj/QT09/15S + T/9dU0v/WlBI/1tOSf9ZUEP/Ukw//1VORf9KQD3/NzM0/zIvRf8vLUP/LzA6/zM1Ov8xMTn/NjU+/z06 + Of8/OTb/ZF1a/6qmpP8yMjD/NjYy/6mjoP9aU1P/RUVE/0NCQv9FQ0L/Pz08/0E/Pv8/PTz/PDs3/z4+ + OP9DQTv/W01N/1tOSf9ZUEX/VUxA/1RFTf9OSj//TkU//0Q2Pv85NTP/PDg2/zk0M/87NzP/PTky/z03 + Mv8/OTf/Ozg3/zs2M/9lXlv/qaWi/zU1NP82NjL/p6Ge/2BZWf9CQkD/PT09/z08PP9CQUH/Pz09/zw6 + OP8/Pjr/Ozk1/0ZCQf9pXVf/aWBR/2NcT/9iV1X/X1ZO/1xVUP9ZU0v/UklD/z05N/87OTH/Pjsz/z85 + Of8/ODr/RDw8/z85N/8/Ozr/Qj06/2liX/+loZ//NjY0/zg3M/+ln5v/opeU/4Z9eP+GgXn/hX95/4eB + e/+HgHr/hn95/4eAev+Gf3n/jYR//52Si/+elIv/m5GJ/5qQiv+YkIn/mJCJ/5WOh/+QiIH/iYF7/4mD + e/+LhH3/i4N+/4uDfv+MhH7/i4R9/42Hf/+OhX7/pZuX/6Sem/85NzT/PDs5/5yXlP/TycX/y8G9/8XA + uP/Iwbr/yMC5/8jAuf/IwLn/yMC5/8jAuf/Kwbr/0MfA/8/Gv//Nxb7/z8a//8zEvf/Nxb7/zcW+/8vD + vP/Jwbr/ysK7/8rCu//Kwrv/ysK7/8rCu//Jwrr/ycS8/83Dvv/Vy8j/nJeU/z8+PP9VVFP/cGxq/8G5 + t//BubX/vrmz/765tP+/ubT/v7m0/7+5tP+/ubT/v7i0/7+4tP/AubX/vriz/723sv+/ubT/vrey/7+4 + tP+/ubT/v7m0/764s/+/ubT/v7m0/7+5tP+/ubT/v7m0/765s/++ubP/wbm1/8C4tv9wbGr/VVVU/2Zm + Zqk4NjX7ZF1d/2ReXP9lYl//ZGBd/2RgXv9kYF7/ZGBe/2RgXv9lYF7/ZWFf/2RgXf9kX13/Y19d/2Rf + Xf9kYF7/ZWBe/2RgXv9kYF7/ZF9d/2VgXv9lYF7/ZWBe/2VgXv9lYF7/ZGBe/2RhXv9kXlz/Y11c/zk2 + NvtkYmKoaWlpKSkmJrolICDUKCMj1yYlJNQnIyLVJyMi1ScjItUnIyLVJyMi1ScjI9UpJiTWKCUj1Sgl + JdUoJSXVJyMj1SkmJNYoJiTWKCQj1igkI9YnIyLVJyMj1SclI9UnJSPVJyUj1SclI9UnIyPVJiYl1CYj + ItgmISPSKikpuWJiYicAAAAAs7OzLJ2aml6Tk5NomJiYX5iVlWGYlZVhmJWVYZiVlWGYlZVhlpaWYpiW + lmSXlZVjmJWVYZiVlWGXlZVjmJaWZJaTk2SWk5NkmJaWZJiVlWGYlZVhmJWVYZiVlWGYlZVhmJWVYZaW + lmKXl5dgkY6Oa5yamlu3t7crAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////+AAAABAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAB//////////8oAAAAIAAAAEAAAAABAAgAAAAAAAAI + AAAAAAAAAAAAAAAAAAAAAAAAAQIC/wgGBf8HCQj/DAwL/xEPD/8UExP/HRoW/x0bGv8hHR3/JSAf/yQj + I/8rJiP/LCkm/ysrKv80LCb/Mi0s/zIwLv88NC//Liww/zMuM/80LDn/LzEx/zExMP81MjH/NjQy/zMx + Nf82MjT/NjU1/zgyMf84NDL/PTYx/zk2Nf89NzT/Nzg2/zw4Nf81MDn/OTc4/zo7OP89OTj/PTw6/z05 + Pf8+Pj3/QDc0/0I7Nv9BPDv/SDw//0NBPf9KQz3/KCdP/y0rTv8yL0b/My5J/zIyQP85NUf/PTlA/yok + Xf8rKVv/JyNg/yonYf8lI2n/JSNz/0E8Rf9APk7/QD5Q/0g9Vv9MP13/RDZm/0U6ZP9JPWL/Rjdt/0VD + Q/9KRUP/TEhF/0ZETP9KRUr/SklI/01KSf9LTEn/TkxK/05KTP9OTE3/UUpE/1lPRv9QREj/U01K/1hL + Sf9WUEz/W1FL/05DVf9PSVL/Vk5S/1ZMXP9UUlH/WVRT/1xZVP9XV1j/W1VY/1paWv9dWlj/XVhd/11d + XP9iVk7/YVpU/2FaWP9gXVv/ZF1a/2JdXP9mX1z/aF5Z/2VhXv9rYVv/cGZa/09GYP9QQmD/UUZo/1lX + Yv9OS3//XFl0/2FeY/9jXW7/YGBg/2diYP9jYmT/ZGRk/2llY/9taGb/aWxn/2Fhaf9ybGn/dnBv/3ly + bv97em3/bGN3/21ufP90b3L/eG9y/29ydf9xcXH/dnNz/3d1c/92dHT/enJy/3x3cv98cnT/eHZ2/3l4 + c/95eHf/fHh1/3d2f/95eHj/fHx9/4V+ef+FgHr/iYJ9/xIXuf8cGr3/KSq8/1JPgf9ZVYL/YF2f/21q + jP9ucYv/eXOD/2xtlv9yb57/XVqq/2Zhov9gYan/DQ7O/xUSy/8vKMb/JCLL/ykny/8wMMf/OTLA/0A9 + xf9KRcP/VVfJ/11by/9sa8z/d2/P/4B/gP+LhoL/kouE/5OMif+XkY3/mZGM/4qLlv+PlZ3/k5GR/5WR + kP+WlZX/mZOR/5mVkf+dlZH/mJaW/5yXlv+XmJb/mJiX/56Zlf+ZmJj/nZqa/56cnP+glpP/opqW/6Oe + m/+moZ3/qaKd/7Cmnv+HiKz/npmv/42Nuf+loaD/q6Wj/66ppv+op6j/rayr/7Oqo/+yrKr/tbGu/7qz + rf+1rrD/srGx/7Wysf+2tLL/tbK1/7W1tf+6tLD/vLi1/7m3vv+8vLz/wbev/8K6tP/Fvrn/yL+4/8bA + tv/DwLz/ycG8/5OTxP+gnMD/w8HA/8zEwf/OyMT/zcbJ/83JyP/RysX/1c3K/9bQyv/Z0s7/0dDS/93U + 0v/h2dX/49vZ/wAAAP8AAAD/AAAA//nYv7+/xca/v7/DxsbDw8G/xcXFxcbDw8bDv8O/wNj5tZKSkpCQ + kpWSkpCVlZOVlpWVlZWVlZWSlZKSlZOSlZZfDRgRHRAQGB0dHxwiHyIkIB8fGx0fHxgYGxAQHRAPXxsi + UUhIVlZXXV1mYmpqfHx7fGttaF5eXl1XXVZRViIbCXy3t7e3ubrCzM3V1dna3Nza2tXVz8/MzMK6ubq3 + gAoHttbQ2drc3Ofk6Ort8vX3+Pf08e3t6Ojc3NnZ2c+2CQrO7e3x7fLy8vb3+Pr7/Pz8/Pz6+Pj19e3s + 7Onj58EICubs3t7e4t7i3+Pm8vL19fX08fHm5OTl4uTc4+Lp4AoN5ohGS0lGT0dOTHm2tpiZmJiXgmBi + XnNoZHl3erblDQ3iKQMEBAcFAwQEClZSVlRRUVErCxQQNRQeKDUQZ+UNDd4WAAANLA0BAQIGIiIrKysq + KhEuhoWEXZKifw9d4g0N3hUAAkhcSwMCAhuTjoGTjYqHXn7v7tK27+68HV3hDQ3YFQADRhFIAwIDXOTH + udvAmdS2hbSx07uzstEfXeMNDdgYBg0uCEYMBwNk7Ji247aDzrh1rpqnoZybpite3Q0N2B8bRy8JR00n + A1bbwcHawLfPtnWqqKWgq6mfIl7aDQ/YJy4fEAkREUYFGJGLi5OPhodmf7CspKKvraMrXtoNEtQpJxAO + CwwQRgYLRj8/SklKSidQnp1/Yp6ddiJm2BAW1C4uIh4RIiJWDBpBRUNZREJAKx09KCsqPT0sHWnUFRDN + UE1WSCtRSFQYLFtycVpxRFgvEBYNEw8TExcdZ9QQFsldRkhXL1ZIKSMsSE9KU0dHLywQFRMUFCQaGxxr + zhUXxF4pRlZIViwhISZXV1RSUUhIKxMwOjc6ODEfHmvNFhDBaClGVk5WJyQhLmZlZWVlUlcvHzk8Ozs7 + OCIfa8kYIcBgLkZIR0YuIicvV2VXUlJRUi0fMjM0NDQ0JitswhgYwWdGRkYuRiknIi5VZVJSUlFRLR0i + JSIiJCsmIHzDGyG6fUxIS1BIR0hHVW9vbm5sZmZXSC8vSEhRSEhRgMEhIr7LmZmYmJiYmJe2urq6urq6 + t7eZmZmZmZmZmbbLviInuPHo5Ojo6Ojo6Ojt7ert6urp6ejo6Ojo6OTp6vG4J1B93ePc3Nzj49zc3OPj + 4+Pj49zj4+Pj4+Pj3Nzj3H1QZCZrbXltfHlufHl8bW1tbW1rfGtteXl5eXl5eW1rJmR4GxcdGB0XFxcX + HB8fHR0dHx8dHxccHR0dHRcYFxcbZHiMlYySkJWVlZWVkJCSkpCQkJCQlZWVlZWVlZKMlZV44t7Jv8jG + w8PDw8PDw8jIw8O/v8PDw8PDw8PDxr3K3uL//////////4AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAH//////////ygAAAAQAAAAIAAAAAEAIAAAAAAAAAgAAAAA + AAAAAAAAAAAAAAAAAADGxsYJlJSUMJSUlDCVlZUukpKSL5eXki+Xl5IvlJSUMJeXki+Xl5cvl5eXL5SU + lDCXl5cvkpKSL5OTkzLf398IKSkp/yQeG/8cGRj/IBsZ/yIcG/8hHRz/JCAf/ygkIv8lIyL/IyAf/yAe + Hf8iHh3/IR0c/xsZGP8iHRr/Kyoq/0dDQv+jmZH/oZyX/62lnv+zq6T/ubGu/8G4tf/JwL3/y8TB/8K7 + uP+8tbL/uLGq/7Coov+po57/qZ+X/0tGRf9kYmH/08/L/9PQzf/Rzsz/2NPR/9vW1f/j29f/5t7b/+Xg + 3P/h2dv/2dnO/9vT1f/Rysz/09C1/87Fwv9YWlr/eXl5/xcXF/8aGhr/GhkZ/xwaGv8fHR3/ZmBb/2Nc + Wf9iXVb/aWJX/zQvN/8zNTX/P0I0/0EzRv9FPzn/d3WG/3J0c/8AAAD/CQoK/2ZkY/8FAwL/Dw0N/0A8 + N/9EPTr/Qjk8/z8xNv+anJ7/o6ax/6inl/+nrbf/Mykv/29tcv9pamj/AAEA/yUmJP8mIiH/ExEQ/woK + Cv+Lh4L/j4qH/2hkYf/Qx8//joPJ/zQ2v/9ubcD/TUDC/zIsLP9wa2r/ZWJh/xMQD/9LSEf/JiEg/0lH + Rv8LCwv/lpOO/5WQjf+PhIv/oJCg/4V5vP8rLsn/b2vH/0Q80f8zLS3/ZV5e/1pXWP8WFxX/NSwp/zAq + Jf9BPTr/JCAZ/zgxS/88OUr/PzpV/0ZAQv9XVVv/WldZ/2BbXf9dW1r/NzAt/1hWVf9QTEv/OTo4/2Jb + WP9GQDv/VFBP/zk2NP9TTk//UUpP/05FU/9RSUn/Li4u/zAtK/8xKi//Liwr/z43NP9QTk3/REA//0FA + P/9PS0r/VE9K/zs5OP84ODH/ZFpT/2BXT/9ZUE7/VU5F/y4rM/8jH4f/IBx9/zUzMv87NDH/R0VE/0A9 + Of9BPz7/QkA//0NBPv88Ozj/OTs1/1pNSf9XTkT/UklD/1BEQ/83OTP/ODY7/zg1Nf88Ojn/Pjc0/z48 + O/83NDD/ZV5b/2FeW/9fXFn/YV1Y/1xYVv+Dd27/e3Nr/3pya/92bmb/XVlW/2JcV/9kXFr/YV5a/2de + Wv83NDL/Ih4d/9nPy//W08v/2NDJ/9jQyf/Vzcf/2tLM/9jRyv/X0Mn/2dLL/9fQyf/Y0Mn/2NDJ/9HO + x//WzMj/Hxsa/1FPT9wqJiX/IR8d/yIeHf8iHh3/JCAf/yMfHv8jHx7/JCAf/yMfHv8iHh3/Ix8e/yMf + Hv8gHhz/KSUj/1FRUdwAAAAAnJycLJiYmC2YmJgtmJiYLZWVlS6YmJgtmJiYLZWVlS6VlZUumJiYLZiY + mC2YmJgtlZWVLpiYmC0AAAAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA//8AACgAAAAQAAAAIAAAAAEACAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA + AAAHBQX/EhMS/xMSEf8WFRT/GBcX/xgZF/8bGRn/ICEg/yUlJP8oJCD/KCYl/ysrK/8tLSz/NS4p/zEt + LP8wLi3/MTAu/zIrMv8zLzD/NS4z/zQxMf8yMTf/NzU0/zc2Nf86NTT/ODY2/zk2Nf86Njb/OTk3/zo4 + N/8/Ojb/NTI6/zg1Of88ODn/Pjk4/zw6OP8+Ojn/Pzs6/z08Ov8/Pjr/Pzk//0A7N/9BOzr/Qz88/0Q+ + PP9DQD//RUE//0ZCPP9IQj//LSpG/zIwRf89N0b/PzpN/z01Uv89N1T/JiJr/yklaP9DQUH/Q0JB/0ZB + QP9FQ0H/RkNB/0ZEQ/9GRUT/SUFD/0hDQv9NQ0D/SEVD/0lEQ/9LRUL/TEZD/09HQf9IRUT/SUVE/0pH + Rf9OSEL/SUhG/0pIR/9LSEb/TUlH/09JRv9OSkf/SUVN/0pJSP9NSEv/TEpJ/05KSP9PTEj/T0tO/1NL + Q/9SSUb/WU9G/1BMSv9TTUn/U05J/1ZNSP9cVUv/XFBM/15WT/9LQVL/UEdQ/1BMU/9SS1X/W1NS/1tV + Uf9aVlH/YVtV/2BdW/9kXlr/YF5c/2VgWv9jYl3/ZGFd/2VhXP9nYV3/ZmJf/2diXP9pYV//aGJe/2ll + Yv9oZmP/aWZl/2pnZP9qaGb/bGlo/2xqaP9ta2n/b2xs/3Rtav93b2j/cG5s/3Jvbv95cGz/fXZv/3Nu + cf9xcnD/cnNz/3Rycv91cnD/dXV1/3V0ev92dHr/gXhw/4V7cv+Fgnv/TUqf/1JOr/9fWqL/REO//1NW + u/9cWrr/Y2Sp/z48xf+FgYb/i4KB/5CIhv+Iipv/ioif/5WVlf+WlJT/l5WU/5aXlf+Xlpb/mpWS/5iW + lf+Zl5f/l5iW/5iYl/+dmpX/mZiY/5+bmf+imZH/o5uW/6WclP+noJr/pqGd/6ujnf+tpqD/rKij/66u + rv+xqaP/ta6o/7iwrP+0tLT/tra2/7u0sP+/t7T/wLq2/8O+t//Fvbj/xL+4/8W+uP/Gvrn/yb+8/8fA + uv/Iwbv/yMG+/8nAvf/LxMD/zsnA/9DMyP/Sz8v/087K/9PQzf/W0s//19LO/9rV0v/b1tH/49zY/+ff + 2//i2tz/5uDd/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/s6Ceop6ipaCipqKipJ+fsxYeIiosO0NVTUg9Li0lJRlWq6ywtLa6wMS7ubWxrq1cecrJy8zO + 0NHT0s/NyMfGb4sLBAYGCnZsamARFRczV4yIAQdNAANpaGhajZ2ZnB6JhwUOGAIMsq+QqpOVl5YsioMZ + OQ4/CKijm5qRmJKUL4Z/HA0NKwk1NDYoUlhUZUGCfVNdS0obZmRjQBASExRFfnlMUV4dI2JhX0cxNzgy + Rn16VT48JidhW1lCIB8XIVB7d4Bwc3Fyj46FgW50dXaEeGvBvL+/vcPCwMK/wMC+xW06RENERElERElJ + REREQ0E5t6SppaWkpaWkpKWlpaeguP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAA= + + \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/tools/SNES/SNESGameGenie.cs b/BizHawk.Client.EmuHawk/tools/SNES/SNESGameGenie.cs index 160d08cfb3..e527112d68 100644 --- a/BizHawk.Client.EmuHawk/tools/SNES/SNESGameGenie.cs +++ b/BizHawk.Client.EmuHawk/tools/SNES/SNESGameGenie.cs @@ -5,12 +5,12 @@ using System.Text.RegularExpressions; using System.Windows.Forms; using BizHawk.Emulation.Common; -using BizHawk.Emulation.Common.IEmulatorExtensions; using BizHawk.Emulation.Cores.Nintendo.SNES; using BizHawk.Client.Common; namespace BizHawk.Client.EmuHawk { + [ToolAttributes(false, null)] public partial class SNESGameGenie : Form, IToolFormAutoConfig { [RequiredService] diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.cs index 500ee69340..0c6818d5a8 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/MarkerControl.cs @@ -187,6 +187,7 @@ namespace BizHawk.Client.EmuHawk Markers.Add(new TasMovieMarker(markerFrame, "")); UpdateValues(); } + Tastudio.RefreshDialog(); } public void EditMarkerPopUp(TasMovieMarker marker) diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Designer.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Designer.cs index ed3540c9b1..dab12d5ce1 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Designer.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Designer.cs @@ -82,6 +82,7 @@ namespace BizHawk.Client.EmuHawk this.ConfigSubMenu = new System.Windows.Forms.ToolStripMenuItem(); this.SetMaxUndoLevelsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.SetBranchCellHoverIntervalMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SetSeekingCutoffIntervalMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); this.AutoadjustInputMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); @@ -241,7 +242,7 @@ namespace BizHawk.Client.EmuHawk // this.NewTASMenuItem.Name = "NewTASMenuItem"; this.NewTASMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); - this.NewTASMenuItem.Size = new System.Drawing.Size(190, 22); + this.NewTASMenuItem.Size = new System.Drawing.Size(201, 22); this.NewTASMenuItem.Text = "&New"; this.NewTASMenuItem.Click += new System.EventHandler(this.NewTasMenuItem_Click); // @@ -251,21 +252,21 @@ namespace BizHawk.Client.EmuHawk this.NewFromNowMenuItem, this.NewFromCurrentSaveRamMenuItem}); this.NewFromSubMenu.Name = "NewFromSubMenu"; - this.NewFromSubMenu.Size = new System.Drawing.Size(190, 22); + this.NewFromSubMenu.Size = new System.Drawing.Size(201, 22); this.NewFromSubMenu.Text = "New From"; this.NewFromSubMenu.DropDownOpened += new System.EventHandler(this.NewFromSubMenu_DropDownOpened); // // NewFromNowMenuItem // this.NewFromNowMenuItem.Name = "NewFromNowMenuItem"; - this.NewFromNowMenuItem.Size = new System.Drawing.Size(159, 22); + this.NewFromNowMenuItem.Size = new System.Drawing.Size(170, 22); this.NewFromNowMenuItem.Text = "&Now"; this.NewFromNowMenuItem.Click += new System.EventHandler(this.StartNewProjectFromNowMenuItem_Click); // // NewFromCurrentSaveRamMenuItem // this.NewFromCurrentSaveRamMenuItem.Name = "NewFromCurrentSaveRamMenuItem"; - this.NewFromCurrentSaveRamMenuItem.Size = new System.Drawing.Size(159, 22); + this.NewFromCurrentSaveRamMenuItem.Size = new System.Drawing.Size(170, 22); this.NewFromCurrentSaveRamMenuItem.Text = "&Current SaveRam"; this.NewFromCurrentSaveRamMenuItem.Click += new System.EventHandler(this.StartANewProjectFromSaveRamMenuItem_Click); // @@ -273,7 +274,7 @@ namespace BizHawk.Client.EmuHawk // this.OpenTASMenuItem.Name = "OpenTASMenuItem"; this.OpenTASMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); - this.OpenTASMenuItem.Size = new System.Drawing.Size(190, 22); + this.OpenTASMenuItem.Size = new System.Drawing.Size(201, 22); this.OpenTASMenuItem.Text = "&Open"; this.OpenTASMenuItem.Click += new System.EventHandler(this.OpenTasMenuItem_Click); // @@ -281,7 +282,7 @@ namespace BizHawk.Client.EmuHawk // this.SaveTASMenuItem.Name = "SaveTASMenuItem"; this.SaveTASMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); - this.SaveTASMenuItem.Size = new System.Drawing.Size(190, 22); + this.SaveTASMenuItem.Size = new System.Drawing.Size(201, 22); this.SaveTASMenuItem.Text = "&Save"; this.SaveTASMenuItem.Click += new System.EventHandler(this.SaveTasMenuItem_Click); // @@ -290,7 +291,7 @@ namespace BizHawk.Client.EmuHawk this.SaveAsTASMenuItem.Name = "SaveAsTASMenuItem"; this.SaveAsTASMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) | System.Windows.Forms.Keys.S))); - this.SaveAsTASMenuItem.Size = new System.Drawing.Size(190, 22); + this.SaveAsTASMenuItem.Size = new System.Drawing.Size(201, 22); this.SaveAsTASMenuItem.Text = "Save As"; this.SaveAsTASMenuItem.Click += new System.EventHandler(this.SaveAsTasMenuItem_Click); // @@ -300,7 +301,7 @@ namespace BizHawk.Client.EmuHawk this.toolStripSeparator3}); this.RecentSubMenu.Image = ((System.Drawing.Image)(resources.GetObject("RecentSubMenu.Image"))); this.RecentSubMenu.Name = "RecentSubMenu"; - this.RecentSubMenu.Size = new System.Drawing.Size(190, 22); + this.RecentSubMenu.Size = new System.Drawing.Size(201, 22); this.RecentSubMenu.Text = "Recent"; this.RecentSubMenu.DropDownOpened += new System.EventHandler(this.RecentSubMenu_DropDownOpened); // @@ -312,19 +313,19 @@ namespace BizHawk.Client.EmuHawk // toolStripSeparator1 // this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(187, 6); + this.toolStripSeparator1.Size = new System.Drawing.Size(198, 6); // // saveSelectionToMacroToolStripMenuItem // this.saveSelectionToMacroToolStripMenuItem.Name = "saveSelectionToMacroToolStripMenuItem"; - this.saveSelectionToMacroToolStripMenuItem.Size = new System.Drawing.Size(190, 22); + this.saveSelectionToMacroToolStripMenuItem.Size = new System.Drawing.Size(201, 22); this.saveSelectionToMacroToolStripMenuItem.Text = "Save Selection to Macro"; this.saveSelectionToMacroToolStripMenuItem.Click += new System.EventHandler(this.saveSelectionToMacroToolStripMenuItem_Click); // // placeMacroAtSelectionToolStripMenuItem // this.placeMacroAtSelectionToolStripMenuItem.Name = "placeMacroAtSelectionToolStripMenuItem"; - this.placeMacroAtSelectionToolStripMenuItem.Size = new System.Drawing.Size(190, 22); + this.placeMacroAtSelectionToolStripMenuItem.Size = new System.Drawing.Size(201, 22); this.placeMacroAtSelectionToolStripMenuItem.Text = "Place Macro at Selection"; this.placeMacroAtSelectionToolStripMenuItem.Click += new System.EventHandler(this.placeMacroAtSelectionToolStripMenuItem_Click); // @@ -334,7 +335,7 @@ namespace BizHawk.Client.EmuHawk this.toolStripSeparator22}); this.recentMacrosToolStripMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Recent; this.recentMacrosToolStripMenuItem.Name = "recentMacrosToolStripMenuItem"; - this.recentMacrosToolStripMenuItem.Size = new System.Drawing.Size(190, 22); + this.recentMacrosToolStripMenuItem.Size = new System.Drawing.Size(201, 22); this.recentMacrosToolStripMenuItem.Text = "Recent Macros"; this.recentMacrosToolStripMenuItem.DropDownOpened += new System.EventHandler(this.recentMacrosToolStripMenuItem_DropDownOpened); // @@ -346,25 +347,25 @@ namespace BizHawk.Client.EmuHawk // toolStripSeparator20 // this.toolStripSeparator20.Name = "toolStripSeparator20"; - this.toolStripSeparator20.Size = new System.Drawing.Size(187, 6); + this.toolStripSeparator20.Size = new System.Drawing.Size(198, 6); // // ToBk2MenuItem // this.ToBk2MenuItem.Name = "ToBk2MenuItem"; - this.ToBk2MenuItem.Size = new System.Drawing.Size(190, 22); + this.ToBk2MenuItem.Size = new System.Drawing.Size(201, 22); this.ToBk2MenuItem.Text = "&Export to Bk2"; this.ToBk2MenuItem.Click += new System.EventHandler(this.ToBk2MenuItem_Click); // // toolStripSeparator2 // this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(187, 6); + this.toolStripSeparator2.Size = new System.Drawing.Size(198, 6); // // ExitMenuItem // this.ExitMenuItem.Name = "ExitMenuItem"; this.ExitMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4))); - this.ExitMenuItem.Size = new System.Drawing.Size(190, 22); + this.ExitMenuItem.Size = new System.Drawing.Size(201, 22); this.ExitMenuItem.Text = "E&xit"; this.ExitMenuItem.Click += new System.EventHandler(this.ExitMenuItem_Click); // @@ -406,7 +407,7 @@ namespace BizHawk.Client.EmuHawk // this.UndoMenuItem.Name = "UndoMenuItem"; this.UndoMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Z))); - this.UndoMenuItem.Size = new System.Drawing.Size(280, 22); + this.UndoMenuItem.Size = new System.Drawing.Size(291, 22); this.UndoMenuItem.Text = "&Undo"; this.UndoMenuItem.Click += new System.EventHandler(this.UndoMenuItem_Click); // @@ -415,14 +416,14 @@ namespace BizHawk.Client.EmuHawk this.RedoMenuItem.Enabled = false; this.RedoMenuItem.Name = "RedoMenuItem"; this.RedoMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Y))); - this.RedoMenuItem.Size = new System.Drawing.Size(280, 22); + this.RedoMenuItem.Size = new System.Drawing.Size(291, 22); this.RedoMenuItem.Text = "&Redo"; this.RedoMenuItem.Click += new System.EventHandler(this.RedoMenuItem_Click); // // showUndoHistoryToolStripMenuItem // this.showUndoHistoryToolStripMenuItem.Name = "showUndoHistoryToolStripMenuItem"; - this.showUndoHistoryToolStripMenuItem.Size = new System.Drawing.Size(280, 22); + this.showUndoHistoryToolStripMenuItem.Size = new System.Drawing.Size(291, 22); this.showUndoHistoryToolStripMenuItem.Text = "Show Undo History"; this.showUndoHistoryToolStripMenuItem.Click += new System.EventHandler(this.showUndoHistoryToolStripMenuItem_Click); // @@ -431,7 +432,7 @@ namespace BizHawk.Client.EmuHawk this.SelectionUndoMenuItem.Enabled = false; this.SelectionUndoMenuItem.Name = "SelectionUndoMenuItem"; this.SelectionUndoMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Q))); - this.SelectionUndoMenuItem.Size = new System.Drawing.Size(280, 22); + this.SelectionUndoMenuItem.Size = new System.Drawing.Size(291, 22); this.SelectionUndoMenuItem.Text = "Selection Undo"; // // SelectionRedoMenuItem @@ -439,18 +440,18 @@ namespace BizHawk.Client.EmuHawk this.SelectionRedoMenuItem.Enabled = false; this.SelectionRedoMenuItem.Name = "SelectionRedoMenuItem"; this.SelectionRedoMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.W))); - this.SelectionRedoMenuItem.Size = new System.Drawing.Size(280, 22); + this.SelectionRedoMenuItem.Size = new System.Drawing.Size(291, 22); this.SelectionRedoMenuItem.Text = "Selection Redo"; // // toolStripSeparator5 // this.toolStripSeparator5.Name = "toolStripSeparator5"; - this.toolStripSeparator5.Size = new System.Drawing.Size(277, 6); + this.toolStripSeparator5.Size = new System.Drawing.Size(288, 6); // // DeselectMenuItem // this.DeselectMenuItem.Name = "DeselectMenuItem"; - this.DeselectMenuItem.Size = new System.Drawing.Size(280, 22); + this.DeselectMenuItem.Size = new System.Drawing.Size(291, 22); this.DeselectMenuItem.Text = "Deselect"; this.DeselectMenuItem.Click += new System.EventHandler(this.DeselectMenuItem_Click); // @@ -458,7 +459,7 @@ namespace BizHawk.Client.EmuHawk // this.SelectBetweenMarkersMenuItem.Name = "SelectBetweenMarkersMenuItem"; this.SelectBetweenMarkersMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.A))); - this.SelectBetweenMarkersMenuItem.Size = new System.Drawing.Size(280, 22); + this.SelectBetweenMarkersMenuItem.Size = new System.Drawing.Size(291, 22); this.SelectBetweenMarkersMenuItem.Text = "Select between Markers"; this.SelectBetweenMarkersMenuItem.Click += new System.EventHandler(this.SelectBetweenMarkersMenuItem_Click); // @@ -468,7 +469,7 @@ namespace BizHawk.Client.EmuHawk this.SelectAllMenuItem.ShortcutKeyDisplayString = ""; this.SelectAllMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) | System.Windows.Forms.Keys.A))); - this.SelectAllMenuItem.Size = new System.Drawing.Size(280, 22); + this.SelectAllMenuItem.Size = new System.Drawing.Size(291, 22); this.SelectAllMenuItem.Text = "Select &All"; this.SelectAllMenuItem.Click += new System.EventHandler(this.SelectAllMenuItem_Click); // @@ -476,20 +477,20 @@ namespace BizHawk.Client.EmuHawk // this.ReselectClipboardMenuItem.Name = "ReselectClipboardMenuItem"; this.ReselectClipboardMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.B))); - this.ReselectClipboardMenuItem.Size = new System.Drawing.Size(280, 22); + this.ReselectClipboardMenuItem.Size = new System.Drawing.Size(291, 22); this.ReselectClipboardMenuItem.Text = "Reselect Clipboard"; this.ReselectClipboardMenuItem.Click += new System.EventHandler(this.ReselectClipboardMenuItem_Click); // // toolStripSeparator7 // this.toolStripSeparator7.Name = "toolStripSeparator7"; - this.toolStripSeparator7.Size = new System.Drawing.Size(277, 6); + this.toolStripSeparator7.Size = new System.Drawing.Size(288, 6); // // CopyMenuItem // this.CopyMenuItem.Name = "CopyMenuItem"; this.CopyMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C))); - this.CopyMenuItem.Size = new System.Drawing.Size(280, 22); + this.CopyMenuItem.Size = new System.Drawing.Size(291, 22); this.CopyMenuItem.Text = "Copy"; this.CopyMenuItem.Click += new System.EventHandler(this.CopyMenuItem_Click); // @@ -497,7 +498,7 @@ namespace BizHawk.Client.EmuHawk // this.PasteMenuItem.Name = "PasteMenuItem"; this.PasteMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.V))); - this.PasteMenuItem.Size = new System.Drawing.Size(280, 22); + this.PasteMenuItem.Size = new System.Drawing.Size(291, 22); this.PasteMenuItem.Text = "&Paste"; this.PasteMenuItem.Click += new System.EventHandler(this.PasteMenuItem_Click); // @@ -506,7 +507,7 @@ namespace BizHawk.Client.EmuHawk this.PasteInsertMenuItem.Name = "PasteInsertMenuItem"; this.PasteInsertMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) | System.Windows.Forms.Keys.V))); - this.PasteInsertMenuItem.Size = new System.Drawing.Size(280, 22); + this.PasteInsertMenuItem.Size = new System.Drawing.Size(291, 22); this.PasteInsertMenuItem.Text = "&Paste Insert"; this.PasteInsertMenuItem.Click += new System.EventHandler(this.PasteInsertMenuItem_Click); // @@ -514,21 +515,21 @@ namespace BizHawk.Client.EmuHawk // this.CutMenuItem.Name = "CutMenuItem"; this.CutMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.X))); - this.CutMenuItem.Size = new System.Drawing.Size(280, 22); + this.CutMenuItem.Size = new System.Drawing.Size(291, 22); this.CutMenuItem.Text = "&Cut"; this.CutMenuItem.Click += new System.EventHandler(this.CutMenuItem_Click); // // toolStripSeparator8 // this.toolStripSeparator8.Name = "toolStripSeparator8"; - this.toolStripSeparator8.Size = new System.Drawing.Size(277, 6); + this.toolStripSeparator8.Size = new System.Drawing.Size(288, 6); // // ClearMenuItem // this.ClearMenuItem.Name = "ClearMenuItem"; this.ClearMenuItem.ShortcutKeyDisplayString = ""; this.ClearMenuItem.ShortcutKeys = System.Windows.Forms.Keys.Delete; - this.ClearMenuItem.Size = new System.Drawing.Size(280, 22); + this.ClearMenuItem.Size = new System.Drawing.Size(291, 22); this.ClearMenuItem.Text = "Clear"; this.ClearMenuItem.Click += new System.EventHandler(this.ClearMenuItem_Click); // @@ -536,7 +537,7 @@ namespace BizHawk.Client.EmuHawk // this.InsertFrameMenuItem.Name = "InsertFrameMenuItem"; this.InsertFrameMenuItem.ShortcutKeys = System.Windows.Forms.Keys.Insert; - this.InsertFrameMenuItem.Size = new System.Drawing.Size(280, 22); + this.InsertFrameMenuItem.Size = new System.Drawing.Size(291, 22); this.InsertFrameMenuItem.Text = "&Insert"; this.InsertFrameMenuItem.Click += new System.EventHandler(this.InsertFrameMenuItem_Click); // @@ -544,7 +545,7 @@ namespace BizHawk.Client.EmuHawk // this.DeleteFramesMenuItem.Name = "DeleteFramesMenuItem"; this.DeleteFramesMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Delete))); - this.DeleteFramesMenuItem.Size = new System.Drawing.Size(280, 22); + this.DeleteFramesMenuItem.Size = new System.Drawing.Size(291, 22); this.DeleteFramesMenuItem.Text = "&Delete"; this.DeleteFramesMenuItem.Click += new System.EventHandler(this.DeleteFramesMenuItem_Click); // @@ -552,7 +553,7 @@ namespace BizHawk.Client.EmuHawk // this.CloneMenuItem.Name = "CloneMenuItem"; this.CloneMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Insert))); - this.CloneMenuItem.Size = new System.Drawing.Size(280, 22); + this.CloneMenuItem.Size = new System.Drawing.Size(291, 22); this.CloneMenuItem.Text = "&Clone"; this.CloneMenuItem.Click += new System.EventHandler(this.CloneMenuItem_Click); // @@ -562,40 +563,40 @@ namespace BizHawk.Client.EmuHawk this.InsertNumFramesMenuItem.ShortcutKeyDisplayString = ""; this.InsertNumFramesMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) | System.Windows.Forms.Keys.Insert))); - this.InsertNumFramesMenuItem.Size = new System.Drawing.Size(280, 22); + this.InsertNumFramesMenuItem.Size = new System.Drawing.Size(291, 22); this.InsertNumFramesMenuItem.Text = "Insert # of Frames"; this.InsertNumFramesMenuItem.Click += new System.EventHandler(this.InsertNumFramesMenuItem_Click); // // toolStripSeparator6 // this.toolStripSeparator6.Name = "toolStripSeparator6"; - this.toolStripSeparator6.Size = new System.Drawing.Size(277, 6); + this.toolStripSeparator6.Size = new System.Drawing.Size(288, 6); // // TruncateMenuItem // this.TruncateMenuItem.Name = "TruncateMenuItem"; - this.TruncateMenuItem.Size = new System.Drawing.Size(280, 22); + this.TruncateMenuItem.Size = new System.Drawing.Size(291, 22); this.TruncateMenuItem.Text = "&Truncate Movie"; this.TruncateMenuItem.Click += new System.EventHandler(this.TruncateMenuItem_Click); // // ClearGreenzoneMenuItem // this.ClearGreenzoneMenuItem.Name = "ClearGreenzoneMenuItem"; - this.ClearGreenzoneMenuItem.Size = new System.Drawing.Size(280, 22); + this.ClearGreenzoneMenuItem.Size = new System.Drawing.Size(291, 22); this.ClearGreenzoneMenuItem.Text = "&Clear Savestate History"; this.ClearGreenzoneMenuItem.Click += new System.EventHandler(this.ClearGreenzoneMenuItem_Click); // // GreenzoneICheckSeparator // this.GreenzoneICheckSeparator.Name = "GreenzoneICheckSeparator"; - this.GreenzoneICheckSeparator.Size = new System.Drawing.Size(277, 6); + this.GreenzoneICheckSeparator.Size = new System.Drawing.Size(288, 6); // // StateHistoryIntegrityCheckMenuItem // this.StateHistoryIntegrityCheckMenuItem.Name = "StateHistoryIntegrityCheckMenuItem"; this.StateHistoryIntegrityCheckMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) | System.Windows.Forms.Keys.I))); - this.StateHistoryIntegrityCheckMenuItem.Size = new System.Drawing.Size(280, 22); + this.StateHistoryIntegrityCheckMenuItem.Size = new System.Drawing.Size(291, 22); this.StateHistoryIntegrityCheckMenuItem.Text = "State History Integrity Check"; this.StateHistoryIntegrityCheckMenuItem.Click += new System.EventHandler(this.StateHistoryIntegrityCheckMenuItem_Click); // @@ -604,6 +605,7 @@ namespace BizHawk.Client.EmuHawk this.ConfigSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.SetMaxUndoLevelsMenuItem, this.SetBranchCellHoverIntervalMenuItem, + this.SetSeekingCutoffIntervalMenuItem, this.toolStripSeparator9, this.AutoadjustInputMenuItem, this.toolStripSeparator11, @@ -629,38 +631,45 @@ namespace BizHawk.Client.EmuHawk // SetMaxUndoLevelsMenuItem // this.SetMaxUndoLevelsMenuItem.Name = "SetMaxUndoLevelsMenuItem"; - this.SetMaxUndoLevelsMenuItem.Size = new System.Drawing.Size(242, 22); + this.SetMaxUndoLevelsMenuItem.Size = new System.Drawing.Size(253, 22); this.SetMaxUndoLevelsMenuItem.Text = "Set max Undo Levels"; this.SetMaxUndoLevelsMenuItem.Click += new System.EventHandler(this.SetMaxUndoLevelsMenuItem_Click); // // SetBranchCellHoverIntervalMenuItem // this.SetBranchCellHoverIntervalMenuItem.Name = "SetBranchCellHoverIntervalMenuItem"; - this.SetBranchCellHoverIntervalMenuItem.Size = new System.Drawing.Size(242, 22); + this.SetBranchCellHoverIntervalMenuItem.Size = new System.Drawing.Size(253, 22); this.SetBranchCellHoverIntervalMenuItem.Text = "Set Branch Cell Hover Interval"; this.SetBranchCellHoverIntervalMenuItem.Click += new System.EventHandler(this.SetBranchCellHoverIntervalMenuItem_Click); // + // SetSeekingCutoffIntervalMenuItem + // + this.SetSeekingCutoffIntervalMenuItem.Name = "SetSeekingCutoffIntervalMenuItem"; + this.SetSeekingCutoffIntervalMenuItem.Size = new System.Drawing.Size(253, 22); + this.SetSeekingCutoffIntervalMenuItem.Text = "Set Seeking Cutoff Interval"; + this.SetSeekingCutoffIntervalMenuItem.Click += new System.EventHandler(this.SetSeekingCutoffIntervalMenuItem_Click); + // // toolStripSeparator9 // this.toolStripSeparator9.Name = "toolStripSeparator9"; - this.toolStripSeparator9.Size = new System.Drawing.Size(239, 6); + this.toolStripSeparator9.Size = new System.Drawing.Size(250, 6); // // AutoadjustInputMenuItem // this.AutoadjustInputMenuItem.CheckOnClick = true; this.AutoadjustInputMenuItem.Name = "AutoadjustInputMenuItem"; - this.AutoadjustInputMenuItem.Size = new System.Drawing.Size(242, 22); + this.AutoadjustInputMenuItem.Size = new System.Drawing.Size(253, 22); this.AutoadjustInputMenuItem.Text = "Auto-adjust Input according to Lag"; // // toolStripSeparator11 // this.toolStripSeparator11.Name = "toolStripSeparator11"; - this.toolStripSeparator11.Size = new System.Drawing.Size(239, 6); + this.toolStripSeparator11.Size = new System.Drawing.Size(250, 6); // // DrawInputByDraggingMenuItem // this.DrawInputByDraggingMenuItem.Name = "DrawInputByDraggingMenuItem"; - this.DrawInputByDraggingMenuItem.Size = new System.Drawing.Size(242, 22); + this.DrawInputByDraggingMenuItem.Size = new System.Drawing.Size(253, 22); this.DrawInputByDraggingMenuItem.Text = "Draw Input by dragging"; this.DrawInputByDraggingMenuItem.Click += new System.EventHandler(this.DrawInputByDraggingMenuItem_Click); // @@ -668,7 +677,7 @@ namespace BizHawk.Client.EmuHawk // this.applyPatternToPaintedInputToolStripMenuItem.CheckOnClick = true; this.applyPatternToPaintedInputToolStripMenuItem.Name = "applyPatternToPaintedInputToolStripMenuItem"; - this.applyPatternToPaintedInputToolStripMenuItem.Size = new System.Drawing.Size(242, 22); + this.applyPatternToPaintedInputToolStripMenuItem.Size = new System.Drawing.Size(253, 22); this.applyPatternToPaintedInputToolStripMenuItem.Text = "Apply Pattern to painted input"; this.applyPatternToPaintedInputToolStripMenuItem.CheckedChanged += new System.EventHandler(this.applyPatternToPaintedInputToolStripMenuItem_CheckedChanged); // @@ -679,20 +688,20 @@ namespace BizHawk.Client.EmuHawk this.onlyOnAutoFireColumnsToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; this.onlyOnAutoFireColumnsToolStripMenuItem.Enabled = false; this.onlyOnAutoFireColumnsToolStripMenuItem.Name = "onlyOnAutoFireColumnsToolStripMenuItem"; - this.onlyOnAutoFireColumnsToolStripMenuItem.Size = new System.Drawing.Size(242, 22); + this.onlyOnAutoFireColumnsToolStripMenuItem.Size = new System.Drawing.Size(253, 22); this.onlyOnAutoFireColumnsToolStripMenuItem.Text = "Only on Auto-Fire columns"; // // UseInputKeysItem // this.UseInputKeysItem.Enabled = false; this.UseInputKeysItem.Name = "UseInputKeysItem"; - this.UseInputKeysItem.Size = new System.Drawing.Size(242, 22); + this.UseInputKeysItem.Size = new System.Drawing.Size(253, 22); this.UseInputKeysItem.Text = "Use Input keys for Column Set"; // // toolStripSeparator4 // this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(239, 6); + this.toolStripSeparator4.Size = new System.Drawing.Size(250, 6); // // BindMarkersToInputMenuItem // @@ -700,52 +709,52 @@ namespace BizHawk.Client.EmuHawk this.BindMarkersToInputMenuItem.CheckOnClick = true; this.BindMarkersToInputMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; this.BindMarkersToInputMenuItem.Name = "BindMarkersToInputMenuItem"; - this.BindMarkersToInputMenuItem.Size = new System.Drawing.Size(242, 22); + this.BindMarkersToInputMenuItem.Size = new System.Drawing.Size(253, 22); this.BindMarkersToInputMenuItem.Text = "Bind Markers to Input"; this.BindMarkersToInputMenuItem.Click += new System.EventHandler(this.BindMarkersToInputMenuItem_Click); // // EmptyNewMarkerNotesMenuItem // this.EmptyNewMarkerNotesMenuItem.Name = "EmptyNewMarkerNotesMenuItem"; - this.EmptyNewMarkerNotesMenuItem.Size = new System.Drawing.Size(242, 22); + this.EmptyNewMarkerNotesMenuItem.Size = new System.Drawing.Size(253, 22); this.EmptyNewMarkerNotesMenuItem.Text = "Empty new Marker Notes"; this.EmptyNewMarkerNotesMenuItem.Click += new System.EventHandler(this.EmptyNewMarkerNotesMenuItem_Click); // // toolStripSeparator13 // this.toolStripSeparator13.Name = "toolStripSeparator13"; - this.toolStripSeparator13.Size = new System.Drawing.Size(239, 6); + this.toolStripSeparator13.Size = new System.Drawing.Size(250, 6); // // BranchesRestoreEntireMovieMenuItem // this.BranchesRestoreEntireMovieMenuItem.Enabled = false; this.BranchesRestoreEntireMovieMenuItem.Name = "BranchesRestoreEntireMovieMenuItem"; - this.BranchesRestoreEntireMovieMenuItem.Size = new System.Drawing.Size(242, 22); + this.BranchesRestoreEntireMovieMenuItem.Size = new System.Drawing.Size(253, 22); this.BranchesRestoreEntireMovieMenuItem.Text = "Branches restore entire Movie"; // // OsdInBranchScreenshotsMenuItem // this.OsdInBranchScreenshotsMenuItem.Enabled = false; this.OsdInBranchScreenshotsMenuItem.Name = "OsdInBranchScreenshotsMenuItem"; - this.OsdInBranchScreenshotsMenuItem.Size = new System.Drawing.Size(242, 22); + this.OsdInBranchScreenshotsMenuItem.Size = new System.Drawing.Size(253, 22); this.OsdInBranchScreenshotsMenuItem.Text = "OSD in Branch screenshots"; // // toolStripSeparator14 // this.toolStripSeparator14.Name = "toolStripSeparator14"; - this.toolStripSeparator14.Size = new System.Drawing.Size(239, 6); + this.toolStripSeparator14.Size = new System.Drawing.Size(250, 6); // // AutopauseAtEndOfMovieMenuItem // this.AutopauseAtEndOfMovieMenuItem.Name = "AutopauseAtEndOfMovieMenuItem"; - this.AutopauseAtEndOfMovieMenuItem.Size = new System.Drawing.Size(242, 22); + this.AutopauseAtEndOfMovieMenuItem.Size = new System.Drawing.Size(253, 22); this.AutopauseAtEndOfMovieMenuItem.Text = "Autopause at end of Movie"; this.AutopauseAtEndOfMovieMenuItem.Click += new System.EventHandler(this.AutopauseAtEndMenuItem_Click); // // sepToolStripMenuItem // this.sepToolStripMenuItem.Name = "sepToolStripMenuItem"; - this.sepToolStripMenuItem.Size = new System.Drawing.Size(239, 6); + this.sepToolStripMenuItem.Size = new System.Drawing.Size(250, 6); // // autoHoldFireToolStripMenuItem // @@ -758,20 +767,20 @@ namespace BizHawk.Client.EmuHawk this.setpToolStripMenuItem, this.setCustomsToolStripMenuItem}); this.autoHoldFireToolStripMenuItem.Name = "autoHoldFireToolStripMenuItem"; - this.autoHoldFireToolStripMenuItem.Size = new System.Drawing.Size(242, 22); + this.autoHoldFireToolStripMenuItem.Size = new System.Drawing.Size(253, 22); this.autoHoldFireToolStripMenuItem.Text = "Auto Hold/Fire"; // // keepSetPatternsToolStripMenuItem // this.keepSetPatternsToolStripMenuItem.CheckOnClick = true; this.keepSetPatternsToolStripMenuItem.Name = "keepSetPatternsToolStripMenuItem"; - this.keepSetPatternsToolStripMenuItem.Size = new System.Drawing.Size(160, 22); + this.keepSetPatternsToolStripMenuItem.Size = new System.Drawing.Size(171, 22); this.keepSetPatternsToolStripMenuItem.Text = "Keep set patterns"; // // sepToolStripMenuItem1 // this.sepToolStripMenuItem1.Name = "sepToolStripMenuItem1"; - this.sepToolStripMenuItem1.Size = new System.Drawing.Size(157, 6); + this.sepToolStripMenuItem1.Size = new System.Drawing.Size(168, 6); // // autoHoldToolStripMenuItem // @@ -779,7 +788,7 @@ namespace BizHawk.Client.EmuHawk this.autoHoldToolStripMenuItem.CheckOnClick = true; this.autoHoldToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; this.autoHoldToolStripMenuItem.Name = "autoHoldToolStripMenuItem"; - this.autoHoldToolStripMenuItem.Size = new System.Drawing.Size(160, 22); + this.autoHoldToolStripMenuItem.Size = new System.Drawing.Size(171, 22); this.autoHoldToolStripMenuItem.Text = "Auto-Hold"; this.autoHoldToolStripMenuItem.CheckedChanged += new System.EventHandler(this.autoHoldToolStripMenuItem_CheckedChanged); // @@ -787,7 +796,7 @@ namespace BizHawk.Client.EmuHawk // this.autoFireToolStripMenuItem.CheckOnClick = true; this.autoFireToolStripMenuItem.Name = "autoFireToolStripMenuItem"; - this.autoFireToolStripMenuItem.Size = new System.Drawing.Size(160, 22); + this.autoFireToolStripMenuItem.Size = new System.Drawing.Size(171, 22); this.autoFireToolStripMenuItem.Text = "Auto-Fire"; this.autoFireToolStripMenuItem.CheckedChanged += new System.EventHandler(this.autoFireToolStripMenuItem_CheckedChanged); // @@ -795,19 +804,19 @@ namespace BizHawk.Client.EmuHawk // this.customPatternToolStripMenuItem.CheckOnClick = true; this.customPatternToolStripMenuItem.Name = "customPatternToolStripMenuItem"; - this.customPatternToolStripMenuItem.Size = new System.Drawing.Size(160, 22); + this.customPatternToolStripMenuItem.Size = new System.Drawing.Size(171, 22); this.customPatternToolStripMenuItem.Text = "Custom Pattern"; this.customPatternToolStripMenuItem.CheckedChanged += new System.EventHandler(this.customPatternToolStripMenuItem_CheckedChanged); // // setpToolStripMenuItem // this.setpToolStripMenuItem.Name = "setpToolStripMenuItem"; - this.setpToolStripMenuItem.Size = new System.Drawing.Size(157, 6); + this.setpToolStripMenuItem.Size = new System.Drawing.Size(168, 6); // // setCustomsToolStripMenuItem // this.setCustomsToolStripMenuItem.Name = "setCustomsToolStripMenuItem"; - this.setCustomsToolStripMenuItem.Size = new System.Drawing.Size(160, 22); + this.setCustomsToolStripMenuItem.Size = new System.Drawing.Size(171, 22); this.setCustomsToolStripMenuItem.Text = "Set Customs..."; this.setCustomsToolStripMenuItem.Click += new System.EventHandler(this.setCustomsToolStripMenuItem_Click); // @@ -827,40 +836,40 @@ namespace BizHawk.Client.EmuHawk // HeaderMenuItem // this.HeaderMenuItem.Name = "HeaderMenuItem"; - this.HeaderMenuItem.Size = new System.Drawing.Size(229, 22); + this.HeaderMenuItem.Size = new System.Drawing.Size(240, 22); this.HeaderMenuItem.Text = "&Header..."; this.HeaderMenuItem.Click += new System.EventHandler(this.HeaderMenuItem_Click); // // StateHistorySettingsMenuItem // this.StateHistorySettingsMenuItem.Name = "StateHistorySettingsMenuItem"; - this.StateHistorySettingsMenuItem.Size = new System.Drawing.Size(229, 22); + this.StateHistorySettingsMenuItem.Size = new System.Drawing.Size(240, 22); this.StateHistorySettingsMenuItem.Text = "&Savestate History Settings..."; this.StateHistorySettingsMenuItem.Click += new System.EventHandler(this.StateHistorySettingsMenuItem_Click); // // CommentsMenuItem // this.CommentsMenuItem.Name = "CommentsMenuItem"; - this.CommentsMenuItem.Size = new System.Drawing.Size(229, 22); + this.CommentsMenuItem.Size = new System.Drawing.Size(240, 22); this.CommentsMenuItem.Text = "&Comments..."; this.CommentsMenuItem.Click += new System.EventHandler(this.CommentsMenuItem_Click); // // SubtitlesMenuItem // this.SubtitlesMenuItem.Name = "SubtitlesMenuItem"; - this.SubtitlesMenuItem.Size = new System.Drawing.Size(229, 22); + this.SubtitlesMenuItem.Size = new System.Drawing.Size(240, 22); this.SubtitlesMenuItem.Text = "&Subtitles..."; this.SubtitlesMenuItem.Click += new System.EventHandler(this.SubtitlesMenuItem_Click); // // toolStripSeparator21 // this.toolStripSeparator21.Name = "toolStripSeparator21"; - this.toolStripSeparator21.Size = new System.Drawing.Size(226, 6); + this.toolStripSeparator21.Size = new System.Drawing.Size(237, 6); // // DefaultStateSettingsMenuItem // this.DefaultStateSettingsMenuItem.Name = "DefaultStateSettingsMenuItem"; - this.DefaultStateSettingsMenuItem.Size = new System.Drawing.Size(229, 22); + this.DefaultStateSettingsMenuItem.Size = new System.Drawing.Size(240, 22); this.DefaultStateSettingsMenuItem.Text = "&Default State History Settings..."; this.DefaultStateSettingsMenuItem.Click += new System.EventHandler(this.DefaultStateSettingsMenuItem_Click); // @@ -882,7 +891,7 @@ namespace BizHawk.Client.EmuHawk // RotateMenuItem // this.RotateMenuItem.Name = "RotateMenuItem"; - this.RotateMenuItem.Size = new System.Drawing.Size(177, 22); + this.RotateMenuItem.Size = new System.Drawing.Size(188, 22); this.RotateMenuItem.Text = "Rotate"; this.RotateMenuItem.Click += new System.EventHandler(this.RotateMenuItem_Click); // @@ -896,7 +905,7 @@ namespace BizHawk.Client.EmuHawk this.toolStripSeparator12, this.hideWasLagFramesToolStripMenuItem}); this.HideLagFramesSubMenu.Name = "HideLagFramesSubMenu"; - this.HideLagFramesSubMenu.Size = new System.Drawing.Size(177, 22); + this.HideLagFramesSubMenu.Size = new System.Drawing.Size(188, 22); this.HideLagFramesSubMenu.Text = "Hide Lag Frames"; this.HideLagFramesSubMenu.DropDownOpened += new System.EventHandler(this.HideLagFramesSubMenu_DropDownOpened); // @@ -906,7 +915,7 @@ namespace BizHawk.Client.EmuHawk this.HideLagFrames0.CheckOnClick = true; this.HideLagFrames0.CheckState = System.Windows.Forms.CheckState.Checked; this.HideLagFrames0.Name = "HideLagFrames0"; - this.HideLagFrames0.Size = new System.Drawing.Size(174, 22); + this.HideLagFrames0.Size = new System.Drawing.Size(185, 22); this.HideLagFrames0.Tag = 0; this.HideLagFrames0.Text = "Don\'t Hide"; this.HideLagFrames0.Click += new System.EventHandler(this.HideLagFramesX_Click); @@ -915,7 +924,7 @@ namespace BizHawk.Client.EmuHawk // this.HideLagFrames1.CheckOnClick = true; this.HideLagFrames1.Name = "HideLagFrames1"; - this.HideLagFrames1.Size = new System.Drawing.Size(174, 22); + this.HideLagFrames1.Size = new System.Drawing.Size(185, 22); this.HideLagFrames1.Tag = 1; this.HideLagFrames1.Text = "1 (30 fps)"; this.HideLagFrames1.Click += new System.EventHandler(this.HideLagFramesX_Click); @@ -923,7 +932,7 @@ namespace BizHawk.Client.EmuHawk // HideLagFrames2 // this.HideLagFrames2.Name = "HideLagFrames2"; - this.HideLagFrames2.Size = new System.Drawing.Size(174, 22); + this.HideLagFrames2.Size = new System.Drawing.Size(185, 22); this.HideLagFrames2.Tag = 2; this.HideLagFrames2.Text = "2 (20 fps)"; this.HideLagFrames2.Click += new System.EventHandler(this.HideLagFramesX_Click); @@ -932,7 +941,7 @@ namespace BizHawk.Client.EmuHawk // this.HideLagFrames3.CheckOnClick = true; this.HideLagFrames3.Name = "HideLagFrames3"; - this.HideLagFrames3.Size = new System.Drawing.Size(174, 22); + this.HideLagFrames3.Size = new System.Drawing.Size(185, 22); this.HideLagFrames3.Tag = 3; this.HideLagFrames3.Text = "3 (15fps)"; this.HideLagFrames3.Click += new System.EventHandler(this.HideLagFramesX_Click); @@ -940,13 +949,13 @@ namespace BizHawk.Client.EmuHawk // toolStripSeparator12 // this.toolStripSeparator12.Name = "toolStripSeparator12"; - this.toolStripSeparator12.Size = new System.Drawing.Size(171, 6); + this.toolStripSeparator12.Size = new System.Drawing.Size(182, 6); // // hideWasLagFramesToolStripMenuItem // this.hideWasLagFramesToolStripMenuItem.CheckOnClick = true; this.hideWasLagFramesToolStripMenuItem.Name = "hideWasLagFramesToolStripMenuItem"; - this.hideWasLagFramesToolStripMenuItem.Size = new System.Drawing.Size(174, 22); + this.hideWasLagFramesToolStripMenuItem.Size = new System.Drawing.Size(185, 22); this.hideWasLagFramesToolStripMenuItem.Text = "Hide WasLag Frames"; this.hideWasLagFramesToolStripMenuItem.Click += new System.EventHandler(this.hideWasLagFramesToolStripMenuItem_Click); // @@ -958,7 +967,7 @@ namespace BizHawk.Client.EmuHawk this.denoteMarkersWithIconsToolStripMenuItem, this.denoteMarkersWithBGColorToolStripMenuItem}); this.iconsToolStripMenuItem.Name = "iconsToolStripMenuItem"; - this.iconsToolStripMenuItem.Size = new System.Drawing.Size(177, 22); + this.iconsToolStripMenuItem.Size = new System.Drawing.Size(188, 22); this.iconsToolStripMenuItem.Text = "Icons"; this.iconsToolStripMenuItem.DropDownOpened += new System.EventHandler(this.iconsToolStripMenuItem_DropDownOpened); // @@ -966,7 +975,7 @@ namespace BizHawk.Client.EmuHawk // this.denoteStatesWithIconsToolStripMenuItem.CheckOnClick = true; this.denoteStatesWithIconsToolStripMenuItem.Name = "denoteStatesWithIconsToolStripMenuItem"; - this.denoteStatesWithIconsToolStripMenuItem.Size = new System.Drawing.Size(219, 22); + this.denoteStatesWithIconsToolStripMenuItem.Size = new System.Drawing.Size(230, 22); this.denoteStatesWithIconsToolStripMenuItem.Text = "Denote States With Icons"; this.denoteStatesWithIconsToolStripMenuItem.Click += new System.EventHandler(this.denoteStatesWithIconsToolStripMenuItem_Click); // @@ -974,7 +983,7 @@ namespace BizHawk.Client.EmuHawk // this.denoteStatesWithBGColorToolStripMenuItem.CheckOnClick = true; this.denoteStatesWithBGColorToolStripMenuItem.Name = "denoteStatesWithBGColorToolStripMenuItem"; - this.denoteStatesWithBGColorToolStripMenuItem.Size = new System.Drawing.Size(219, 22); + this.denoteStatesWithBGColorToolStripMenuItem.Size = new System.Drawing.Size(230, 22); this.denoteStatesWithBGColorToolStripMenuItem.Text = "Denote States With BG Color"; this.denoteStatesWithBGColorToolStripMenuItem.Click += new System.EventHandler(this.denoteStatesWithBGColorToolStripMenuItem_Click); // @@ -982,7 +991,7 @@ namespace BizHawk.Client.EmuHawk // this.denoteMarkersWithIconsToolStripMenuItem.CheckOnClick = true; this.denoteMarkersWithIconsToolStripMenuItem.Name = "denoteMarkersWithIconsToolStripMenuItem"; - this.denoteMarkersWithIconsToolStripMenuItem.Size = new System.Drawing.Size(219, 22); + this.denoteMarkersWithIconsToolStripMenuItem.Size = new System.Drawing.Size(230, 22); this.denoteMarkersWithIconsToolStripMenuItem.Text = "Denote Markers With Icons"; this.denoteMarkersWithIconsToolStripMenuItem.Click += new System.EventHandler(this.denoteMarkersWithIconsToolStripMenuItem_Click); // @@ -990,14 +999,14 @@ namespace BizHawk.Client.EmuHawk // this.denoteMarkersWithBGColorToolStripMenuItem.CheckOnClick = true; this.denoteMarkersWithBGColorToolStripMenuItem.Name = "denoteMarkersWithBGColorToolStripMenuItem"; - this.denoteMarkersWithBGColorToolStripMenuItem.Size = new System.Drawing.Size(219, 22); + this.denoteMarkersWithBGColorToolStripMenuItem.Size = new System.Drawing.Size(230, 22); this.denoteMarkersWithBGColorToolStripMenuItem.Text = "Denote Markers With BG Color"; this.denoteMarkersWithBGColorToolStripMenuItem.Click += new System.EventHandler(this.denoteMarkersWithBGColorToolStripMenuItem_Click); // // toolStripSeparator23 // this.toolStripSeparator23.Name = "toolStripSeparator23"; - this.toolStripSeparator23.Size = new System.Drawing.Size(174, 6); + this.toolStripSeparator23.Size = new System.Drawing.Size(185, 6); // // followCursorToolStripMenuItem // @@ -1009,7 +1018,7 @@ namespace BizHawk.Client.EmuHawk this.scrollToBottomToolStripMenuItem, this.scrollToCenterToolStripMenuItem}); this.followCursorToolStripMenuItem.Name = "followCursorToolStripMenuItem"; - this.followCursorToolStripMenuItem.Size = new System.Drawing.Size(177, 22); + this.followCursorToolStripMenuItem.Size = new System.Drawing.Size(188, 22); this.followCursorToolStripMenuItem.Text = "Follow Cursor"; this.followCursorToolStripMenuItem.DropDownOpened += new System.EventHandler(this.followCursorToolStripMenuItem_DropDownOpened); // @@ -1017,14 +1026,14 @@ namespace BizHawk.Client.EmuHawk // this.alwaysScrollToolStripMenuItem.CheckOnClick = true; this.alwaysScrollToolStripMenuItem.Name = "alwaysScrollToolStripMenuItem"; - this.alwaysScrollToolStripMenuItem.Size = new System.Drawing.Size(149, 22); + this.alwaysScrollToolStripMenuItem.Size = new System.Drawing.Size(160, 22); this.alwaysScrollToolStripMenuItem.Text = "Always Scroll"; this.alwaysScrollToolStripMenuItem.Click += new System.EventHandler(this.alwaysScrollToolStripMenuItem_Click); // // toolStripSeparator24 // this.toolStripSeparator24.Name = "toolStripSeparator24"; - this.toolStripSeparator24.Size = new System.Drawing.Size(146, 6); + this.toolStripSeparator24.Size = new System.Drawing.Size(157, 6); // // scrollToViewToolStripMenuItem // @@ -1032,7 +1041,7 @@ namespace BizHawk.Client.EmuHawk this.scrollToViewToolStripMenuItem.CheckOnClick = true; this.scrollToViewToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; this.scrollToViewToolStripMenuItem.Name = "scrollToViewToolStripMenuItem"; - this.scrollToViewToolStripMenuItem.Size = new System.Drawing.Size(149, 22); + this.scrollToViewToolStripMenuItem.Size = new System.Drawing.Size(160, 22); this.scrollToViewToolStripMenuItem.Text = "Scroll to View"; this.scrollToViewToolStripMenuItem.Click += new System.EventHandler(this.scrollToViewToolStripMenuItem_Click); // @@ -1040,7 +1049,7 @@ namespace BizHawk.Client.EmuHawk // this.scrollToTopToolStripMenuItem.CheckOnClick = true; this.scrollToTopToolStripMenuItem.Name = "scrollToTopToolStripMenuItem"; - this.scrollToTopToolStripMenuItem.Size = new System.Drawing.Size(149, 22); + this.scrollToTopToolStripMenuItem.Size = new System.Drawing.Size(160, 22); this.scrollToTopToolStripMenuItem.Text = "Scroll to Top"; this.scrollToTopToolStripMenuItem.Click += new System.EventHandler(this.scrollToTopToolStripMenuItem_Click); // @@ -1048,7 +1057,7 @@ namespace BizHawk.Client.EmuHawk // this.scrollToBottomToolStripMenuItem.CheckOnClick = true; this.scrollToBottomToolStripMenuItem.Name = "scrollToBottomToolStripMenuItem"; - this.scrollToBottomToolStripMenuItem.Size = new System.Drawing.Size(149, 22); + this.scrollToBottomToolStripMenuItem.Size = new System.Drawing.Size(160, 22); this.scrollToBottomToolStripMenuItem.Text = "Scroll to Bottom"; this.scrollToBottomToolStripMenuItem.Click += new System.EventHandler(this.scrollToBottomToolStripMenuItem_Click); // @@ -1056,19 +1065,19 @@ namespace BizHawk.Client.EmuHawk // this.scrollToCenterToolStripMenuItem.CheckOnClick = true; this.scrollToCenterToolStripMenuItem.Name = "scrollToCenterToolStripMenuItem"; - this.scrollToCenterToolStripMenuItem.Size = new System.Drawing.Size(149, 22); + this.scrollToCenterToolStripMenuItem.Size = new System.Drawing.Size(160, 22); this.scrollToCenterToolStripMenuItem.Text = "Scroll to Center"; this.scrollToCenterToolStripMenuItem.Click += new System.EventHandler(this.scrollToCenterToolStripMenuItem_Click); // // toolStripSeparator25 // this.toolStripSeparator25.Name = "toolStripSeparator25"; - this.toolStripSeparator25.Size = new System.Drawing.Size(174, 6); + this.toolStripSeparator25.Size = new System.Drawing.Size(185, 6); // // wheelScrollSpeedToolStripMenuItem // this.wheelScrollSpeedToolStripMenuItem.Name = "wheelScrollSpeedToolStripMenuItem"; - this.wheelScrollSpeedToolStripMenuItem.Size = new System.Drawing.Size(177, 22); + this.wheelScrollSpeedToolStripMenuItem.Size = new System.Drawing.Size(188, 22); this.wheelScrollSpeedToolStripMenuItem.Text = "Wheel Scroll Speed..."; this.wheelScrollSpeedToolStripMenuItem.Click += new System.EventHandler(this.wheelScrollSpeedToolStripMenuItem_Click); // @@ -1099,19 +1108,19 @@ namespace BizHawk.Client.EmuHawk // this.EnableTooltipsMenuItem.Enabled = false; this.EnableTooltipsMenuItem.Name = "EnableTooltipsMenuItem"; - this.EnableTooltipsMenuItem.Size = new System.Drawing.Size(146, 22); + this.EnableTooltipsMenuItem.Size = new System.Drawing.Size(157, 22); this.EnableTooltipsMenuItem.Text = "&Enable Tooltips"; // // toolStripSeparator10 // this.toolStripSeparator10.Name = "toolStripSeparator10"; - this.toolStripSeparator10.Size = new System.Drawing.Size(143, 6); + this.toolStripSeparator10.Size = new System.Drawing.Size(154, 6); // // aboutToolStripMenuItem // this.aboutToolStripMenuItem.Enabled = false; this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; - this.aboutToolStripMenuItem.Size = new System.Drawing.Size(146, 22); + this.aboutToolStripMenuItem.Size = new System.Drawing.Size(157, 22); this.aboutToolStripMenuItem.Text = "&About"; // // TasView @@ -1674,7 +1683,7 @@ namespace BizHawk.Client.EmuHawk private System.Windows.Forms.ToolStripMenuItem scrollToCenterToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem applyPatternToPaintedInputToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem onlyOnAutoFireColumnsToolStripMenuItem; - public BookmarksBranchesBox BookMarkControl; + private BookmarksBranchesBox BookMarkControl; private System.Windows.Forms.ToolStripMenuItem BranchContextMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator25; private System.Windows.Forms.ToolStripMenuItem wheelScrollSpeedToolStripMenuItem; @@ -1691,5 +1700,6 @@ namespace BizHawk.Client.EmuHawk private System.Windows.Forms.ToolStripMenuItem NewFromCurrentSaveRamMenuItem; private System.Windows.Forms.ToolStripMenuItem SetBranchCellHoverIntervalMenuItem; private System.Windows.Forms.ToolStripMenuItem SetMarkerWithTextContextMenuItem; + private System.Windows.Forms.ToolStripMenuItem SetSeekingCutoffIntervalMenuItem; } } \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IControlMainForm.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IControlMainForm.cs index 0645648728..9ad2455e74 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IControlMainForm.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.IControlMainForm.cs @@ -6,7 +6,47 @@ namespace BizHawk.Client.EmuHawk { private bool _suppressAskSave = false; + public bool WantsToControlSavestates { get { return true; } } + + public void SaveState() + { + BookMarkControl.UpdateBranchExternal(); + } + public void LoadState() + { + BookMarkControl.LoadBranchExternal(); + } + public void SaveStateAs() + { + // dummy + } + public void LoadStateAs() + { + // dummy + } + public void SaveQuickSave(int slot) + { + BookMarkControl.UpdateBranchExternal(slot); + } + public void LoadQuickSave(int slot) + { + BookMarkControl.LoadBranchExternal(slot); + } + public void SelectSlot(int slot) + { + BookMarkControl.SelectBranchExternal(slot); + } + public void PreviousSlot() + { + BookMarkControl.SelectBranchExternal(false); + } + public void NextSlot() + { + BookMarkControl.SelectBranchExternal(true); + } + public bool WantsToControlReadOnly { get { return false; } } + public void ToggleReadOnly() { GlobalWin.OSD.AddMessage("TAStudio does not allow manual readonly toggle"); @@ -31,7 +71,7 @@ namespace BizHawk.Client.EmuHawk public bool Rewind() { - GoToPreviousFrame(); + GoToPreviousFrame(); // todo: behave as normal rewind in differentiating between hitting rewind once and holding it. return true; } diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs index b916085532..48122a60df 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.ListView.cs @@ -45,6 +45,8 @@ namespace BizHawk.Client.EmuHawk private bool _triggerAutoRestore; // If true, autorestore will be called on mouse up private int? _autoRestoreFrame; // The frame auto-restore will restore to, if set private bool? _autoRestorePaused = null; + private int? _seekStartFrame = null; + private void JumpToGreenzone() { if (Global.Emulator.Frame > CurrentTasMovie.LastValidFrame) @@ -57,11 +59,33 @@ namespace BizHawk.Client.EmuHawk } GoToLastEmulatedFrameIfNecessary(CurrentTasMovie.LastValidFrame); - GlobalWin.MainForm.PauseOnFrame = _autoRestoreFrame; - GlobalWin.MainForm.PauseEmulator(); + StartSeeking(_autoRestoreFrame, true); } } + private void StartSeeking(int? frame, bool pause = false) + { + if (!frame.HasValue) + return; + + _seekStartFrame = Emulator.Frame; + GlobalWin.MainForm.PauseOnFrame = frame.Value; + int? diff = GlobalWin.MainForm.PauseOnFrame - _seekStartFrame; + + if (pause) + GlobalWin.MainForm.PauseEmulator(); + else + GlobalWin.MainForm.UnpauseEmulator(); + + if (!_seekBackgroundWorker.IsBusy && diff.Value > TasView.SeekingCutoffInterval) + _seekBackgroundWorker.RunWorkerAsync(); + } + + public void StopSeeking() + { + _seekBackgroundWorker.CancelAsync(); + } + // public static Color CurrentFrame_FrameCol = Color.FromArgb(0xCFEDFC); Why? public static Color CurrentFrame_InputLog = Color.FromArgb(0xB5E7F7); diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs index c1f431efbc..ee409d3d6d 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs @@ -695,6 +695,28 @@ namespace BizHawk.Client.EmuHawk } } + private void SetSeekingCutoffIntervalMenuItem_Click(object sender, EventArgs e) + { + using (var prompt = new InputPrompt + { + TextInputType = InputPrompt.InputType.Unsigned, + Message = "Seeking Cutoff Interval", + InitialValue = Settings.SeekingCutoffInterval.ToString() + }) + { + DialogResult result = prompt.ShowDialog(); + if (result == DialogResult.OK) + { + int val = int.Parse(prompt.PromptText); + if (val > 0) + { + Settings.SeekingCutoffInterval = val; + TasView.SeekingCutoffInterval = val; + } + } + } + } + private void ConfigSubMenu_DropDownOpened(object sender, EventArgs e) { DrawInputByDraggingMenuItem.Checked = Settings.DrawInput; @@ -1097,7 +1119,7 @@ namespace BizHawk.Client.EmuHawk index, (byte[])StatableEmulator.SaveStateBinary().Clone()); GlobalWin.MainForm.PauseEmulator(); - LoadFile(new FileInfo(newProject.Filename)); + LoadFile(new FileInfo(newProject.Filename), true); } } @@ -1112,7 +1134,7 @@ namespace BizHawk.Client.EmuHawk SaveRamEmulator.CloneSaveRam()); GlobalWin.MainForm.PauseEmulator(); - LoadFile(new FileInfo(newProject.Filename)); + LoadFile(new FileInfo(newProject.Filename), true); } } diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Navigation.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Navigation.cs index ddeb65f5ce..53b806b1cc 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Navigation.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.Navigation.cs @@ -38,8 +38,6 @@ namespace BizHawk.Client.EmuHawk StartAtNearestFrameAndEmulate(frame); MaybeFollowCursor(); - - //return; seriously? well, maybe it's for some insane speedup, but it skipped updating when putting playback to frame zero. } else // Emulate to a future frame { @@ -58,8 +56,7 @@ namespace BizHawk.Client.EmuHawk if (lastState > Emulator.Frame) LoadState(CurrentTasMovie.TasStateManager[lastState]); // STATE ACCESS - GlobalWin.MainForm.UnpauseEmulator(); - GlobalWin.MainForm.PauseOnFrame = frame; + StartSeeking(frame); } } diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs index e99f770ea8..e15827b30c 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs @@ -26,6 +26,7 @@ namespace BizHawk.Client.EmuHawk private readonly List _tasClipboard = new List(); private BackgroundWorker _saveBackgroundWorker; + private BackgroundWorker _seekBackgroundWorker; private MovieEndAction _originalEndAction; // The movie end behavior selected by the user (that is overridden by TAStudio) private Dictionary GenerateColumnNames() @@ -64,6 +65,7 @@ namespace BizHawk.Client.EmuHawk FollowCursorAlwaysScroll = false; FollowCursorScrollMethod = "near"; BranchCellHoverInterval = 1; + SeekingCutoffInterval = 2; // default to taseditor fashion denoteStatesWithIcons = false; denoteStatesWithBGColor = true; @@ -81,6 +83,7 @@ namespace BizHawk.Client.EmuHawk public bool FollowCursorAlwaysScroll { get; set; } public string FollowCursorScrollMethod { get; set; } public int BranchCellHoverInterval { get; set; } + public int SeekingCutoffInterval { get; set; } public bool denoteStatesWithIcons { get; set; } public bool denoteStatesWithBGColor { get; set; } @@ -127,6 +130,7 @@ namespace BizHawk.Client.EmuHawk this.SavingProgressBar.Visible = false; InitializeSaveWorker(); + InitializeSeekWorker(); WantsToControlStopMovie = true; TasPlaybackBox.Tastudio = this; @@ -178,6 +182,57 @@ namespace BizHawk.Client.EmuHawk CurrentTasMovie.NewBGWorker(_saveBackgroundWorker); } + private void InitializeSeekWorker() + { + if (_seekBackgroundWorker != null) + { + _seekBackgroundWorker.Dispose(); + _seekBackgroundWorker = null; // Idk if this line is even useful. + } + + _seekBackgroundWorker = new BackgroundWorker(); + _seekBackgroundWorker.WorkerReportsProgress = true; + _seekBackgroundWorker.WorkerSupportsCancellation = true; + + _seekBackgroundWorker.DoWork += (s, e) => + { + this.Invoke(() => this.MessageStatusLabel.Text = "Seeking..."); + this.Invoke(() => this.SavingProgressBar.Visible = true); + for ( ; ; ) + { + if (_seekBackgroundWorker.CancellationPending) + { + e.Cancel = true; + break; + } + + int diff = Global.Emulator.Frame - _seekStartFrame.Value; + int unit = GlobalWin.MainForm.PauseOnFrame.Value - _seekStartFrame.Value; + double progress = 0; + + if (diff != 0 && unit != 0) + progress = (double)100d / unit * diff; + if (progress < 0) + progress = 0; + + _seekBackgroundWorker.ReportProgress((int)progress); + System.Threading.Thread.Sleep(1); + } + }; + + _seekBackgroundWorker.ProgressChanged += (s, e) => + { + this.Invoke(() => this.SavingProgressBar.Value = e.ProgressPercentage); + }; + + _seekBackgroundWorker.RunWorkerCompleted += (s, e) => + { + this.Invoke(() => this.SavingProgressBar.Visible = false); + this.Invoke(() => this.MessageStatusLabel.Text = ""); + InitializeSeekWorker(); // Required, or it will error when trying to report progress again. + }; + } + private bool _initialized = false; private void Tastudio_Load(object sender, EventArgs e) { @@ -207,6 +262,7 @@ namespace BizHawk.Client.EmuHawk TasView.ScrollSpeed = Settings.ScrollSpeed; TasView.AlwaysScroll = Settings.FollowCursorAlwaysScroll; TasView.ScrollMethod = Settings.FollowCursorScrollMethod; + TasView.SeekingCutoffInterval = Settings.SeekingCutoffInterval; BookMarkControl.HoverInterval = Settings.BranchCellHoverInterval; TasView.denoteStatesWithIcons = Settings.denoteStatesWithIcons; @@ -296,10 +352,12 @@ namespace BizHawk.Client.EmuHawk return true; } - private void SetTasMovieCallbacks() + private void SetTasMovieCallbacks(TasMovie movie = null) { - CurrentTasMovie.ClientSettingsForSave = ClientSettingsForSave; - CurrentTasMovie.GetClientSettingsOnLoad = GetClientSettingsOnLoad; + if (movie == null) + movie = CurrentTasMovie; + movie.ClientSettingsForSave = ClientSettingsForSave; + movie.GetClientSettingsOnLoad = GetClientSettingsOnLoad; } private string ClientSettingsForSave() @@ -343,8 +401,7 @@ namespace BizHawk.Client.EmuHawk column.Visible = false; } - TasView.AllColumns.ColumnsChanged(); - + TasView.AllColumns.ColumnsChanged(); // Patterns int bStart = 0; @@ -420,7 +477,7 @@ namespace BizHawk.Client.EmuHawk Settings.RecentTas.Add(Global.MovieSession.Movie.Filename); } - private bool LoadFile(FileInfo file) + private bool LoadFile(FileInfo file, bool startsFromSavestate = false) { if (!file.Exists) { @@ -428,7 +485,7 @@ namespace BizHawk.Client.EmuHawk return false; } - TasMovie newMovie = new TasMovie(false, _saveBackgroundWorker); + TasMovie newMovie = new TasMovie(startsFromSavestate, _saveBackgroundWorker); newMovie.TasStateManager.InvalidateCallback = GreenzoneInvalidated; newMovie.Filename = file.FullName; @@ -437,8 +494,13 @@ namespace BizHawk.Client.EmuHawk if (!HandleMovieLoadStuff(newMovie)) return false; - SetUpColumns(); - GoToFrame(CurrentTasMovie.Session.CurrentFrame); + if (TasView.AllColumns.Count() == 0) + SetUpColumns(); + if (startsFromSavestate) + GoToFrame(0); + else + GoToFrame(CurrentTasMovie.Session.CurrentFrame); + CurrentTasMovie.PropertyChanged += new PropertyChangedEventHandler(this.TasMovie_OnPropertyChanged); CurrentTasMovie.CurrentBranch = CurrentTasMovie.Session.CurrentBranch; // clear all selections @@ -476,9 +538,9 @@ namespace BizHawk.Client.EmuHawk private bool HandleMovieLoadStuff(TasMovie movie = null) { - - WantsToControlStopMovie = false; bool result; + WantsToControlStopMovie = false; + if (movie == null) { movie = CurrentTasMovie; @@ -486,8 +548,10 @@ namespace BizHawk.Client.EmuHawk } else result = StartNewMovieWrapper(false, movie); + if (!result) return false; + WantsToControlStopMovie = true; CurrentTasMovie.ChangeLog.ClearLog(); @@ -503,6 +567,7 @@ namespace BizHawk.Client.EmuHawk _initializing = true; if (movie == null) movie = CurrentTasMovie; + SetTasMovieCallbacks(movie as TasMovie); bool result = GlobalWin.MainForm.StartNewMovie(movie, record); _initializing = false; @@ -632,8 +697,7 @@ namespace BizHawk.Client.EmuHawk { if (_autoRestoreFrame > Emulator.Frame) // Don't unpause if we are already on the desired frame, else runaway seek { - GlobalWin.MainForm.PauseOnFrame = _autoRestoreFrame; - GlobalWin.MainForm.UnpauseEmulator(); + StartSeeking(_autoRestoreFrame); } } else @@ -643,8 +707,6 @@ namespace BizHawk.Client.EmuHawk _autoRestorePaused = null; GlobalWin.MainForm.PauseOnFrame = null; // Cancel seek to autorestore point } - - _autoRestoreFrame = null; } @@ -665,8 +727,7 @@ namespace BizHawk.Client.EmuHawk { if (GlobalWin.MainForm.EmulatorPaused || GlobalWin.MainForm.IsSeeking) // make seek frame keep up with emulation on fast scrolls { - GlobalWin.MainForm.PauseOnFrame = frame; - GlobalWin.MainForm.UnpauseEmulator(); + StartSeeking(frame); } } } @@ -686,6 +747,16 @@ namespace BizHawk.Client.EmuHawk _hackyDontUpdate = false; } + public void AddBranchExternal() + { + BookMarkControl.AddBranchExternal(); + } + + public void RemoveBranchExtrenal() + { + BookMarkControl.RemoveBranchExtrenal(); + } + private void UpdateOtherTools() // a hack probably, surely there is a better way to do this { _hackyDontUpdate = true; diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.resx b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.resx index 37beccf209..15d4726218 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.resx +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.resx @@ -124,18 +124,18 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALCQAA - CwkBEvpHPgAAAk1JREFUOE+VkktvUlEUhVsfsdHoREcOHJr4C/RPONHoXzBxoOlAJybOlAZtkdSa2piY - NsjjFiiX8qY8ChYL+ECB2lKB8rq0k5bEmiiRbtc+6b2B6MTBR/ZZa+919j3tEBH9RbudHD6E63/2qAwc - treT58BVRVnWl8vBbLEg7wNC/QPaMrwb4GT/jFa024mzQLe56c9GwjM7klXXlcw6ksyPSbLoKByc/lUq - +TbQMwrODARAGAF3SxtexSMbf8vOCVp9ZyK+/euaW9TO+SfksOlprSjvoteAjU5rAYqSuFyvR1PR8Ewv - GJii8rcAoYFSb+d4gDAgNI/8jGTHOFUroT3410QAHuk4Am4Vi/KOzz2JGxfFcLMZI3wK5T7ZqaXEhcYb - WU2PKJM2H7Ra8XE14AQO91dTpk4k9JLq9YgYHghoxcWZPa/bSCH/C2o0orPaBo1GbDQee9VJxF+zoYFP - wtpGWgpN0/uMRWgcyiG1WsSkBhxFwG0E7AV8z2lrKyxuYvgBs2kLr4z1XcLj4SA2gD+nBhxB8p1sxtKZ - t4xR/otTDNdqS1oQw7ezx2/AfxVok1oAmh+WSt7v/MKLLgOtr3tEQD+sseeyPyX0dqHdVAOGq9XQPazX - /JyzH9itY+SQ9LSSnKV8fkHANWvsoYc/JYaZERHAPzicBw9AoZBf+BnwTZEN/4G2N4egZg1eDz05cIHn - tACmUgmeAtdhRsvlwH6x6Dr4+EESoO5B68JLo+eSOjMQwKDpGLgCJtDoBysgBXzQDOBifz8zcPh/aOgP - 7nYTiVA2JaoAAAAASUVORK5CYII= + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALBwAA + CwcBtnMLwAAAAllJREFUOE+VU8tuUlEUFR+x0ehEB40DhyZ+gQ78BSca/QUTB5oOdGLiTGnQFkmtqY2J + aYO8CpRLeVMehRYL+ECB2lKB8qYTS2JNlAjbtU96b2h1IskiZ6+19jr7HA4qIjp08NNuL6v2OCEOD1/5 + y6MQHCCj3Y6fBa42m0uaYtGfzuekXYCw/gFuCdoN4MRgj9LcasXOAOrNTW86FJzetpjUXYtBTRbDY7IY + 1RT0T/0qFDwb8IwAp+UQEQBiCLhb2HA3XZLut2Qfp9W3euLdv6w5xdo+94RsZg2t5aVv8Gox0SlxfP5q + NmOXqtVwIhyc7vl9k1T86iMYKLE8yw2EBsG5pGck2caoXArsQL8mAlqt+DEE3MrnpW2PcwI7Lojmej1C + OAplPlqp0YwKjicy6R9RKmnoNxrRMTngOIr7qwl9JxR4SdVqSDTvC2hERc2a26mjgPcF1WrhGWWCWi0y + Eo286sSir1lQgCNhbB0tBqboXcooeJ6KQyqVkF4OOIKA2wjY8Xme09ZWUOzE4AtMJ408MsZ3CI2b/ZgA + +qwccBjJd9IpY2fOOErZz3bRXKksKkFc8+6s8R3wrwJuQgmA+WGh4P7ON7zg0NL6uksEDII51hzWpwRv + F9pNOUBVLgfuYbz6p4y1bzWNks2ioZX4DGWz8wK8Zo41ePgoEfQMKe8AxTngAZDLZed/+jyTZMYLNL/Z + A9bMQevBkwHO73uJXJRK/pPAdYjhYtG3m887+h/eWwSw7oHrQkvCc/Gf/wUmYToKXAbGYfQCK0AC8IDT + AhcGm5UjHCT/p/4DPvHsVpirf9UAAAAASUVORK5CYII= diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/UndoHistoryForm.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/UndoHistoryForm.cs index b15d391224..692f8ef1b8 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/UndoHistoryForm.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/UndoHistoryForm.cs @@ -44,9 +44,9 @@ namespace BizHawk.Client.EmuHawk return; if (row == log.UndoIndex) - color = Color.Green; + color = TAStudio.GreenZone_InputLog; else if (row > log.UndoIndex) - color = Color.Red; + color = TAStudio.LagZone_InputLog; } private string _lastUndoAction = null; @@ -55,7 +55,7 @@ namespace BizHawk.Client.EmuHawk HistoryView.ItemCount = log.Names.Count; if (AutoScrollCheck.Checked && _lastUndoAction != log.NextUndoStepName) { - HistoryView.ensureVisible(log.UndoIndex - 1); + HistoryView.ensureVisible(log.UndoIndex); HistoryView.clearSelection(); HistoryView.SelectItem(log.UndoIndex - 1, true); } diff --git a/BizHawk.Client.EmuHawk/tools/ToolBox.cs b/BizHawk.Client.EmuHawk/tools/ToolBox.cs index 3105a711ff..1755fedef5 100644 --- a/BizHawk.Client.EmuHawk/tools/ToolBox.cs +++ b/BizHawk.Client.EmuHawk/tools/ToolBox.cs @@ -55,43 +55,37 @@ namespace BizHawk.Client.EmuHawk { ToolBoxStrip.Items.Clear(); - var availableTools = Assembly - .GetAssembly(typeof(IToolForm)) - .GetTypes() - .Where(t => typeof(IToolForm).IsAssignableFrom(t)) - .Where(t => typeof(Form).IsAssignableFrom(t)) - .Where(t => !(typeof(ToolBox).IsAssignableFrom(t))) - .Where(t => VersionInfo.DeveloperBuild ? true : !(t.GetCustomAttributes(false) - .OfType().Any(a => !a.Released))) - .Where(t => !(t == typeof(GBGameGenie))) // Hack, this tool is specific to a system id and a sub-system (gb and gg) we have no reasonable way to declare a dependency like that - .Where(t => BizHawk.Emulation.Common.ServiceInjector.IsAvailable(Global.Emulator.ServiceProvider, t)) - .Select(t => Activator.CreateInstance(t)) - .Select(instance => new - { - Type = instance.GetType(), - Instance = instance, - Icon = (instance as Form).Icon.ToBitmap(), - Text = (instance as Form).Text, - ShowIcon = (instance as Form).ShowIcon - }) - .ToList(); - - foreach (var tool in availableTools) + foreach (var t in Assembly.GetAssembly(GetType()).GetTypes()) { - var t = new ToolStripButton + if (!typeof(IToolForm).IsAssignableFrom(t)) + continue; + if (!typeof(Form).IsAssignableFrom(t)) + continue; + if (typeof(ToolBox).IsAssignableFrom(t)) //yo dawg i head you like toolboxes + continue; + if (VersionInfo.DeveloperBuild && t.GetCustomAttributes(false).OfType().Any(a => !a.Released)) + continue; + if (t == typeof(GBGameGenie)) // Hack, this tool is specific to a system id and a sub-system (gb and gg) we have no reasonable way to declare a dependency like that + continue; + if (!BizHawk.Emulation.Common.ServiceInjector.IsAvailable(Global.Emulator.ServiceProvider, t)) + continue; + + var instance = Activator.CreateInstance(t); + + var tsb = new ToolStripButton { - Image = tool.Icon, - Text = tool.Text, - DisplayStyle = tool.ShowIcon ? ToolStripItemDisplayStyle.Image : ToolStripItemDisplayStyle.Text + Image = (instance as Form).Icon.ToBitmap(), + Text = (instance as Form).Text, + DisplayStyle = (instance as Form).ShowIcon ? ToolStripItemDisplayStyle.Image : ToolStripItemDisplayStyle.Text }; - t.Click += (o, e) => + tsb.Click += (o, e) => { - GlobalWin.Tools.Load(tool.Type); + GlobalWin.Tools.Load(t); Close(); }; - ToolBoxStrip.Items.Add(t); + ToolBoxStrip.Items.Add(tsb); } } diff --git a/BizHawk.Client.EmuHawk/tools/ToolManager.cs b/BizHawk.Client.EmuHawk/tools/ToolManager.cs index 626182c719..3bc23bcfb2 100644 --- a/BizHawk.Client.EmuHawk/tools/ToolManager.cs +++ b/BizHawk.Client.EmuHawk/tools/ToolManager.cs @@ -84,14 +84,24 @@ namespace BizHawk.Client.EmuHawk public T Load(string toolPath, bool focus = true) where T : class, IToolForm { - if (!IsAvailable() && typeof(T) != typeof(IExternalToolForm)) + bool isExternal = typeof(T) == typeof(IExternalToolForm); + + if (!IsAvailable() && !isExternal) { return null; } - T existingTool = (T)_tools.FirstOrDefault(x => x is T); + T existingTool; + if (isExternal) + { + existingTool = (T)_tools.FirstOrDefault(x => x is T && x.GetType().Assembly.Location == toolPath); + } + else + { + existingTool = (T)_tools.FirstOrDefault(x => x is T); + } - if (existingTool != null && typeof(T) != typeof(IExternalToolForm)) + if (existingTool != null) { if (existingTool.IsDisposed) { @@ -441,7 +451,12 @@ namespace BizHawk.Client.EmuHawk if (ServiceInjector.IsAvailable(Global.Emulator.ServiceProvider, tool.GetType())) { ServiceInjector.UpdateServices(Global.Emulator.ServiceProvider, tool); + bool restartTool = false; if ((tool.IsHandleCreated && !tool.IsDisposed) || tool is RamWatch) // Hack for Ram Watch - in display watches mode it wants to keep running even closed, it will handle disposed logic + restartTool = true; + if (tool is LuaConsole && ((LuaConsole)tool).IsRebootingCore) + restartTool = false; + if (restartTool) { tool.Restart(); } @@ -572,7 +587,7 @@ namespace BizHawk.Client.EmuHawk try { tool = Activator.CreateInstanceFrom(dllPath, "BizHawk.Client.EmuHawk.CustomMainForm").Unwrap() as IExternalToolForm; - if (tool == null) + if (tool == null) { MessageBox.Show("It seems that the object CustomMainForm does not implement IExternalToolForm. Please review the code.", "No, no, no. Wrong Way !", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return null; @@ -711,19 +726,6 @@ namespace BizHawk.Client.EmuHawk return true; } - // Eventually we want a single game genie tool, then this mess goes away - public bool GameGenieAvailable - { - get - { - return (Global.Emulator.SystemId == "NES") - || (Global.Emulator.SystemId == "GEN") - || (Global.Emulator.SystemId == "GB") - || (Global.Game.System == "GG") - || (Global.Emulator is BizHawk.Emulation.Cores.Nintendo.SNES.LibsnesCore); - } - } - // Note: Referencing these properties creates an instance of the tool and persists it. They should be referenced by type if this is not desired #region Tools @@ -938,21 +940,9 @@ namespace BizHawk.Client.EmuHawk public void LoadGameGenieEc() { - if (Global.Emulator.SystemId == "NES") + if (GlobalWin.Tools.IsAvailable()) { - Load(); - } - else if (Global.Emulator.SystemId == "SNES") - { - Load(); - } - else if ((Global.Emulator.SystemId == "GB") || (Global.Game.System == "GG")) - { - Load(); - } - else if (Global.Emulator.SystemId == "GEN") - { - Load(); + GlobalWin.Tools.Load(); } } diff --git a/BizHawk.Client.EmuHawk/tools/VirtualPads/VirtualPad.cs b/BizHawk.Client.EmuHawk/tools/VirtualPads/VirtualPad.cs index aa8238de3d..1c1935bb36 100644 --- a/BizHawk.Client.EmuHawk/tools/VirtualPads/VirtualPad.cs +++ b/BizHawk.Client.EmuHawk/tools/VirtualPads/VirtualPad.cs @@ -85,7 +85,7 @@ namespace BizHawk.Client.EmuHawk { Name = button.Name, Location = UIHelper.Scale(button.Location), - Size = UIHelper.Scale(new Size(127 + 79, 127 + 9)), + Size = UIHelper.Scale(new Size(180 + 79, 200 + 9)), RangeX = new float[] { button.MinValue, button.MidValue, button.MaxValue }, RangeY = new float[] { button.MinValueSec, button.MidValueSec, button.MaxValueSec }, }); diff --git a/BizHawk.Client.EmuHawk/tools/VirtualPads/controls/VirtualPadAnalogStick.Designer.cs b/BizHawk.Client.EmuHawk/tools/VirtualPads/controls/VirtualPadAnalogStick.Designer.cs index 6245962f67..2d3abd745e 100644 --- a/BizHawk.Client.EmuHawk/tools/VirtualPads/controls/VirtualPadAnalogStick.Designer.cs +++ b/BizHawk.Client.EmuHawk/tools/VirtualPads/controls/VirtualPadAnalogStick.Designer.cs @@ -35,18 +35,24 @@ this.MaxLabel = new System.Windows.Forms.Label(); this.MaxXNumeric = new System.Windows.Forms.NumericUpDown(); this.MaxYNumeric = new System.Windows.Forms.NumericUpDown(); + this.rLabel = new System.Windows.Forms.Label(); + this.manualR = new System.Windows.Forms.NumericUpDown(); + this.manualTheta = new System.Windows.Forms.NumericUpDown(); + this.thetaLabel = new System.Windows.Forms.Label(); this.AnalogStick = new BizHawk.Client.EmuHawk.AnalogStickPanel(); ((System.ComponentModel.ISupportInitialize)(this.ManualX)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.ManualY)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.MaxXNumeric)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.MaxYNumeric)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.manualR)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.manualTheta)).BeginInit(); this.SuspendLayout(); // // XLabel // this.XLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.XLabel.AutoSize = true; - this.XLabel.Location = new System.Drawing.Point(138, 7); + this.XLabel.Location = new System.Drawing.Point(187, 7); this.XLabel.Name = "XLabel"; this.XLabel.Size = new System.Drawing.Size(14, 13); this.XLabel.TabIndex = 23; @@ -55,7 +61,7 @@ // ManualX // this.ManualX.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.ManualX.Location = new System.Drawing.Point(156, 3); + this.ManualX.Location = new System.Drawing.Point(205, 3); this.ManualX.Maximum = new decimal(new int[] { 127, 0, @@ -69,14 +75,13 @@ this.ManualX.Name = "ManualX"; this.ManualX.Size = new System.Drawing.Size(44, 20); this.ManualX.TabIndex = 24; - this.ManualX.ValueChanged += new System.EventHandler(this.ManualX_ValueChanged); - this.ManualX.KeyUp += new System.Windows.Forms.KeyEventHandler(this.ManualX_KeyUp); + this.ManualX.KeyUp += new System.Windows.Forms.KeyEventHandler(this.ManualXY_ValueChanged); // // YLabel // this.YLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.YLabel.AutoSize = true; - this.YLabel.Location = new System.Drawing.Point(138, 33); + this.YLabel.Location = new System.Drawing.Point(187, 33); this.YLabel.Name = "YLabel"; this.YLabel.Size = new System.Drawing.Size(14, 13); this.YLabel.TabIndex = 26; @@ -85,7 +90,7 @@ // ManualY // this.ManualY.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.ManualY.Location = new System.Drawing.Point(156, 29); + this.ManualY.Location = new System.Drawing.Point(205, 29); this.ManualY.Maximum = new decimal(new int[] { 127, 0, @@ -100,14 +105,13 @@ this.ManualY.RightToLeft = System.Windows.Forms.RightToLeft.No; this.ManualY.Size = new System.Drawing.Size(44, 20); this.ManualY.TabIndex = 25; - this.ManualY.ValueChanged += new System.EventHandler(this.ManualY_ValueChanged); - this.ManualY.KeyUp += new System.Windows.Forms.KeyEventHandler(this.ManualY_KeyUp); + this.ManualY.KeyUp += new System.Windows.Forms.KeyEventHandler(this.ManualXY_ValueChanged); // // MaxLabel // this.MaxLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.MaxLabel.AutoSize = true; - this.MaxLabel.Location = new System.Drawing.Point(138, 72); + this.MaxLabel.Location = new System.Drawing.Point(205, 107); this.MaxLabel.Name = "MaxLabel"; this.MaxLabel.Size = new System.Drawing.Size(47, 13); this.MaxLabel.TabIndex = 27; @@ -116,7 +120,7 @@ // MaxXNumeric // this.MaxXNumeric.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.MaxXNumeric.Location = new System.Drawing.Point(138, 89); + this.MaxXNumeric.Location = new System.Drawing.Point(205, 124); this.MaxXNumeric.Maximum = new decimal(new int[] { 127, 0, @@ -130,13 +134,13 @@ this.MaxXNumeric.Name = "MaxXNumeric"; this.MaxXNumeric.Size = new System.Drawing.Size(44, 20); this.MaxXNumeric.TabIndex = 28; - this.MaxXNumeric.ValueChanged += new System.EventHandler(this.MaxXNumeric_ValueChanged); - this.MaxXNumeric.KeyUp += new System.Windows.Forms.KeyEventHandler(this.MaxXNumeric_KeyUp); + this.MaxXNumeric.ValueChanged += new System.EventHandler(this.MaxManualXY_ValueChanged); + this.MaxXNumeric.KeyUp += new System.Windows.Forms.KeyEventHandler(this.MaxManualXY_ValueChanged); // // MaxYNumeric // this.MaxYNumeric.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.MaxYNumeric.Location = new System.Drawing.Point(138, 112); + this.MaxYNumeric.Location = new System.Drawing.Point(205, 147); this.MaxYNumeric.Maximum = new decimal(new int[] { 127, 0, @@ -151,21 +155,71 @@ this.MaxYNumeric.RightToLeft = System.Windows.Forms.RightToLeft.No; this.MaxYNumeric.Size = new System.Drawing.Size(44, 20); this.MaxYNumeric.TabIndex = 29; - this.MaxYNumeric.ValueChanged += new System.EventHandler(this.MaxYNumeric_ValueChanged); - this.MaxYNumeric.KeyUp += new System.Windows.Forms.KeyEventHandler(this.MaxYNumeric_KeyUp); + this.MaxYNumeric.ValueChanged += new System.EventHandler(this.MaxManualXY_ValueChanged); + this.MaxYNumeric.KeyUp += new System.Windows.Forms.KeyEventHandler(this.MaxManualXY_ValueChanged); + // + // rLabel + // + this.rLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.rLabel.AutoSize = true; + this.rLabel.Location = new System.Drawing.Point(167, 60); + this.rLabel.Name = "rLabel"; + this.rLabel.Size = new System.Drawing.Size(26, 13); + this.rLabel.TabIndex = 30; + this.rLabel.Text = "Ray"; + // + // manualR + // + this.manualR.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.manualR.DecimalPlaces = 2; + this.manualR.Location = new System.Drawing.Point(193, 58); + this.manualR.Maximum = new decimal(new int[] { + 182, + 0, + 0, + 0}); + this.manualR.Name = "manualR"; + this.manualR.Size = new System.Drawing.Size(56, 20); + this.manualR.TabIndex = 31; + // + // manualTheta + // + this.manualTheta.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.manualTheta.DecimalPlaces = 2; + this.manualTheta.Location = new System.Drawing.Point(193, 84); + this.manualTheta.Maximum = new decimal(new int[] { + 360, + 0, + 0, + 0}); + this.manualTheta.Minimum = new decimal(new int[] { + 360, + 0, + 0, + -2147483648}); + this.manualTheta.Name = "manualTheta"; + this.manualTheta.Size = new System.Drawing.Size(56, 20); + this.manualTheta.TabIndex = 33; + // + // thetaLabel + // + this.thetaLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.thetaLabel.AutoSize = true; + this.thetaLabel.Location = new System.Drawing.Point(167, 86); + this.thetaLabel.Name = "thetaLabel"; + this.thetaLabel.Size = new System.Drawing.Size(20, 13); + this.thetaLabel.TabIndex = 32; + this.thetaLabel.Text = "θ °"; // // AnalogStick // - this.AnalogStick.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); this.AnalogStick.BackColor = System.Drawing.Color.Gray; this.AnalogStick.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; this.AnalogStick.ClearCallback = null; this.AnalogStick.Location = new System.Drawing.Point(3, 3); this.AnalogStick.Name = "AnalogStick"; this.AnalogStick.ReadOnly = false; - this.AnalogStick.Size = new System.Drawing.Size(129, 129); + this.AnalogStick.Size = new System.Drawing.Size(164, 164); this.AnalogStick.TabIndex = 0; this.AnalogStick.X = 0; this.AnalogStick.Y = 0; @@ -176,6 +230,10 @@ // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.manualTheta); + this.Controls.Add(this.thetaLabel); + this.Controls.Add(this.manualR); + this.Controls.Add(this.rLabel); this.Controls.Add(this.MaxYNumeric); this.Controls.Add(this.MaxXNumeric); this.Controls.Add(this.MaxLabel); @@ -185,12 +243,14 @@ this.Controls.Add(this.XLabel); this.Controls.Add(this.AnalogStick); this.Name = "VirtualPadAnalogStick"; - this.Size = new System.Drawing.Size(204, 136); + this.Size = new System.Drawing.Size(253, 172); this.Load += new System.EventHandler(this.VirtualPadAnalogStick_Load); ((System.ComponentModel.ISupportInitialize)(this.ManualX)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.ManualY)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.MaxXNumeric)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.MaxYNumeric)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.manualR)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.manualTheta)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -206,5 +266,9 @@ private System.Windows.Forms.Label MaxLabel; private System.Windows.Forms.NumericUpDown MaxXNumeric; private System.Windows.Forms.NumericUpDown MaxYNumeric; + private System.Windows.Forms.Label rLabel; + private System.Windows.Forms.NumericUpDown manualR; + private System.Windows.Forms.NumericUpDown manualTheta; + private System.Windows.Forms.Label thetaLabel; } } diff --git a/BizHawk.Client.EmuHawk/tools/VirtualPads/controls/VirtualPadAnalogStick.cs b/BizHawk.Client.EmuHawk/tools/VirtualPads/controls/VirtualPadAnalogStick.cs index edd6b6cd02..f562c323c0 100644 --- a/BizHawk.Client.EmuHawk/tools/VirtualPads/controls/VirtualPadAnalogStick.cs +++ b/BizHawk.Client.EmuHawk/tools/VirtualPads/controls/VirtualPadAnalogStick.cs @@ -5,18 +5,34 @@ using System.Windows.Forms; using BizHawk.Emulation.Common; using BizHawk.Client.Common; using System.Windows; +using BizHawk.Common.NumberExtensions; namespace BizHawk.Client.EmuHawk { public partial class VirtualPadAnalogStick : UserControl, IVirtualPadControl { + #region Fields + private bool _programmaticallyUpdatingNumerics; private bool _readonly; + private EventHandler manualXYValueChangedEventHandler; + private EventHandler polarNumericChangedEventHandler; + + #endregion + public VirtualPadAnalogStick() { InitializeComponent(); AnalogStick.ClearCallback = ClearCallback; + + manualXYValueChangedEventHandler = new EventHandler(ManualXY_ValueChanged); + polarNumericChangedEventHandler = new EventHandler(PolarNumeric_Changed); + + ManualX.ValueChanged += manualXYValueChangedEventHandler; + ManualY.ValueChanged += manualXYValueChangedEventHandler; + manualR.ValueChanged += polarNumericChangedEventHandler; + manualTheta.ValueChanged += polarNumericChangedEventHandler; } public float[] RangeX = new float[] { -128f, 0.0f, 127f }; @@ -64,6 +80,8 @@ namespace BizHawk.Client.EmuHawk { ManualX.Value = 0; ManualY.Value = 0; + manualR.Value = 0; + manualTheta.Value = 0; //see HOOMOO Global.AutofireStickyXORAdapter.SetSticky(AnalogStick.XName, false); Global.StickyXORAdapter.Unset(AnalogStick.XName); @@ -95,12 +113,16 @@ namespace BizHawk.Client.EmuHawk MaxLabel.Enabled = MaxXNumeric.Enabled = MaxYNumeric.Enabled = + manualR.Enabled = + rLabel.Enabled = + manualTheta.Enabled = + thetaLabel.Enabled = !value; - AnalogStick.ReadOnly = + AnalogStick.ReadOnly = _readonly = value; - + Refresh(); } } @@ -130,24 +152,30 @@ namespace BizHawk.Client.EmuHawk AnalogStick.SetPrevious(previous); } - private void ManualX_ValueChanged(object sender, EventArgs e) + private void ManualXY_ValueChanged(object sender, EventArgs e) { SetAnalogControlFromNumerics(); } - - private void ManualX_KeyUp(object sender, KeyEventArgs e) + private void MaxManualXY_ValueChanged(object sender, EventArgs e) { - SetAnalogControlFromNumerics(); + SetAnalogMaxFromNumerics(); } - private void ManualY_KeyUp(object sender, KeyEventArgs e) + private void PolarNumeric_Changed(object sender, EventArgs e) { - SetAnalogControlFromNumerics(); - } + ManualX.ValueChanged -= manualXYValueChangedEventHandler; + ManualY.ValueChanged -= manualXYValueChangedEventHandler; - private void ManualY_ValueChanged(object sender, EventArgs e) - { - SetAnalogControlFromNumerics(); + ManualX.Value = Math.Ceiling(manualR.Value * (decimal)Math.Cos(Math.PI * (double)manualTheta.Value / 180)).Clamp(-127, 127); + ManualY.Value = Math.Ceiling(manualR.Value * (decimal)Math.Sin(Math.PI * (double)manualTheta.Value / 180)).Clamp(-127, 127); + + AnalogStick.X = (int)ManualX.Value; + AnalogStick.Y = (int)ManualY.Value; + AnalogStick.HasValue = true; + AnalogStick.Refresh(); + + ManualX.ValueChanged += manualXYValueChangedEventHandler; + ManualY.ValueChanged += manualXYValueChangedEventHandler; } private void SetAnalogControlFromNumerics() @@ -188,6 +216,15 @@ namespace BizHawk.Client.EmuHawk ManualY.Value = 0; } } + + manualR.ValueChanged -= polarNumericChangedEventHandler; + manualTheta.ValueChanged -= polarNumericChangedEventHandler; + + manualR.Value = (decimal)Math.Sqrt(Math.Pow(AnalogStick.X, 2) + Math.Pow(AnalogStick.Y, 2)); + manualTheta.Value = (decimal)(Math.Atan2(AnalogStick.Y, AnalogStick.X) * (180 / Math.PI)); + + manualR.ValueChanged += polarNumericChangedEventHandler; + manualTheta.ValueChanged += polarNumericChangedEventHandler; } private void AnalogStick_MouseDown(object sender, MouseEventArgs e) @@ -210,26 +247,6 @@ namespace BizHawk.Client.EmuHawk } } - private void MaxXNumeric_ValueChanged(object sender, EventArgs e) - { - SetAnalogMaxFromNumerics(); - } - - private void MaxXNumeric_KeyUp(object sender, KeyEventArgs e) - { - SetAnalogMaxFromNumerics(); - } - - private void MaxYNumeric_ValueChanged(object sender, EventArgs e) - { - SetAnalogMaxFromNumerics(); - } - - private void MaxYNumeric_KeyUp(object sender, KeyEventArgs e) - { - SetAnalogMaxFromNumerics(); - } - private void SetAnalogMaxFromNumerics() { if (!_programmaticallyUpdatingNumerics) diff --git a/BizHawk.Client.EmuHawk/tools/VirtualPads/controls/components/AnalogSticklPanel.cs b/BizHawk.Client.EmuHawk/tools/VirtualPads/controls/components/AnalogSticklPanel.cs index 77da016124..46d17aa5c7 100644 --- a/BizHawk.Client.EmuHawk/tools/VirtualPads/controls/components/AnalogSticklPanel.cs +++ b/BizHawk.Client.EmuHawk/tools/VirtualPads/controls/components/AnalogSticklPanel.cs @@ -123,8 +123,8 @@ namespace BizHawk.Client.EmuHawk //dont count on this working. it's never been tested. //but it kind of must be, or else nothing here would work... - public float ScaleX = 0.5f; - public float ScaleY = 0.5f; + public float ScaleX = 0.60f; + public float ScaleY = 0.60f; int MinX { get { return (int)(RangeX[0]); } } int MinY { get { return (int)(RangeY[0]); } } @@ -252,7 +252,7 @@ namespace BizHawk.Client.EmuHawk unchecked { // Background - e.Graphics.Clear(Color.Black); + e.Graphics.Clear(Color.LightGray); e.Graphics.FillRectangle(GrayBrush, PixelMinX, PixelMinY, PixelMaxX - PixelMinX, PixelMaxY- PixelMinY); e.Graphics.FillEllipse(ReadOnly ? OffWhiteBrush : WhiteBrush, PixelMinX, PixelMinY, PixelMaxX - PixelMinX - 2, PixelMaxY - PixelMinY - 3); diff --git a/BizHawk.Client.EmuHawk/tools/VirtualPads/schema/N64Schema.cs b/BizHawk.Client.EmuHawk/tools/VirtualPads/schema/N64Schema.cs index 6afa6fb363..aa3ecbfa1d 100644 --- a/BizHawk.Client.EmuHawk/tools/VirtualPads/schema/N64Schema.cs +++ b/BizHawk.Client.EmuHawk/tools/VirtualPads/schema/N64Schema.cs @@ -26,7 +26,7 @@ namespace BizHawk.Client.EmuHawk return new PadSchema { IsConsole = false, - DefaultSize = new Size(220, 316), + DefaultSize = new Size(275, 316), Buttons = new[] { new PadSchema.ButtonScema @@ -34,7 +34,7 @@ namespace BizHawk.Client.EmuHawk Name = "P" + controller + " DPad U", DisplayName = "", Icon = Properties.Resources.BlueUp, - Location = new Point(24, 195), + Location = new Point(24, 230), Type = PadSchema.PadInputType.Boolean }, new PadSchema.ButtonScema @@ -42,7 +42,7 @@ namespace BizHawk.Client.EmuHawk Name = "P" + controller + " DPad D", DisplayName = "", Icon = Properties.Resources.BlueDown, - Location = new Point(24, 216), + Location = new Point(24, 251), Type = PadSchema.PadInputType.Boolean }, new PadSchema.ButtonScema @@ -50,7 +50,7 @@ namespace BizHawk.Client.EmuHawk Name = "P" + controller + " DPad L", DisplayName = "", Icon = Properties.Resources.Back, - Location = new Point(3, 207), + Location = new Point(3, 242), Type = PadSchema.PadInputType.Boolean }, new PadSchema.ButtonScema @@ -58,77 +58,77 @@ namespace BizHawk.Client.EmuHawk Name = "P" + controller + " DPad R", DisplayName = "", Icon = Properties.Resources.Forward, - Location = new Point(45, 207), + Location = new Point(45, 242), Type = PadSchema.PadInputType.Boolean }, new PadSchema.ButtonScema { Name = "P" + controller + " L", DisplayName = "L", - Location = new Point(3, 150), + Location = new Point(3, 185), Type = PadSchema.PadInputType.Boolean }, new PadSchema.ButtonScema { Name = "P" + controller + " R", DisplayName = "R", - Location = new Point(191, 150), + Location = new Point(191, 185), Type = PadSchema.PadInputType.Boolean }, new PadSchema.ButtonScema { Name = "P" + controller + " Z", DisplayName = "Z", - Location = new Point(81, 234), + Location = new Point(81, 269), Type = PadSchema.PadInputType.Boolean }, new PadSchema.ButtonScema { Name = "P" + controller + " Start", DisplayName = "S", - Location = new Point(81, 211), + Location = new Point(81, 246), Type = PadSchema.PadInputType.Boolean }, new PadSchema.ButtonScema { Name = "P" + controller + " B", DisplayName = "B", - Location = new Point(127, 211), + Location = new Point(127, 246), Type = PadSchema.PadInputType.Boolean }, new PadSchema.ButtonScema { Name = "P" + controller + " A", DisplayName = "A", - Location = new Point(138, 234), + Location = new Point(138, 269), Type = PadSchema.PadInputType.Boolean }, new PadSchema.ButtonScema { Name = "P" + controller + " C Up", Icon = Properties.Resources.YellowUp, - Location = new Point(173, 175), + Location = new Point(173, 210), Type = PadSchema.PadInputType.Boolean }, new PadSchema.ButtonScema { Name = "P" + controller + " C Down", Icon = Properties.Resources.YellowDown, - Location = new Point(173, 196), + Location = new Point(173, 231), Type = PadSchema.PadInputType.Boolean }, new PadSchema.ButtonScema { Name = "P" + controller + " C Left", Icon = Properties.Resources.YellowLeft, - Location = new Point(152, 189), + Location = new Point(152, 221), Type = PadSchema.PadInputType.Boolean }, new PadSchema.ButtonScema { Name = "P" + controller + " C Right", Icon = Properties.Resources.YellowRight, - Location = new Point(194, 189), + Location = new Point(194, 221), Type = PadSchema.PadInputType.Boolean }, new PadSchema.ButtonScema diff --git a/BizHawk.Client.EmuHawk/tools/Watch/RamWatch.cs b/BizHawk.Client.EmuHawk/tools/Watch/RamWatch.cs index 5c5e24b938..09e8e9995f 100644 --- a/BizHawk.Client.EmuHawk/tools/Watch/RamWatch.cs +++ b/BizHawk.Client.EmuHawk/tools/Watch/RamWatch.cs @@ -119,7 +119,7 @@ namespace BizHawk.Client.EmuHawk public void AddWatch(Watch watch) { _watches.Add(watch); - WatchListView.ItemCount = _watches.ItemCount; + WatchListView.ItemCount = _watches.Count; UpdateValues(); UpdateWatchCount(); Changes(); @@ -176,7 +176,7 @@ namespace BizHawk.Client.EmuHawk else { Global.Config.RecentWatches.Add(path); - WatchListView.ItemCount = _watches.ItemCount; + WatchListView.ItemCount = _watches.Count; UpdateWatchCount(); UpdateStatusBar(); _watches.Changes = false; @@ -197,7 +197,7 @@ namespace BizHawk.Client.EmuHawk if (result) { _watches.Load(file.FullName, append); - WatchListView.ItemCount = _watches.ItemCount; + WatchListView.ItemCount = _watches.Count; UpdateWatchCount(); Global.Config.RecentWatches.Add(_watches.CurrentFileName); SetMemoryDomain(_watches.Domain.ToString()); @@ -254,7 +254,7 @@ namespace BizHawk.Client.EmuHawk { var frozen = !_watches[i].IsSeparator && Global.CheatList.IsActive(_watches[i].Domain, _watches[i].Address); GlobalWin.OSD.AddGUIText( - _watches[i].ToString(), + _watches[i].ToDisplayString(), Global.Config.DispRamWatchx, Global.Config.DispRamWatchy + (i * 14), Color.Black, @@ -280,7 +280,7 @@ namespace BizHawk.Client.EmuHawk { get { - foreach(var watch in _watches) + foreach (var watch in _watches) { if (watch.IsSeparator) { @@ -324,7 +324,7 @@ namespace BizHawk.Client.EmuHawk { var frozen = !_watches[i].IsSeparator && Global.CheatList.IsActive(_watches[i].Domain, _watches[i].Address); GlobalWin.OSD.AddGUIText( - _watches[i].ToString(), + _watches[i].ToDisplayString(), Global.Config.DispRamWatchx, Global.Config.DispRamWatchy + (i * 14), Color.Black, @@ -386,7 +386,7 @@ namespace BizHawk.Client.EmuHawk private void FullyUpdateWatchList() { - WatchListView.ItemCount = _watches.ItemCount; + WatchListView.ItemCount = _watches.Count; UpdateWatchCount(); UpdateStatusBar(); UpdateValues(); @@ -409,7 +409,7 @@ namespace BizHawk.Client.EmuHawk }; we.SetWatch(SelectedWatches.First().Domain, SelectedWatches, duplicate ? WatchEditor.Mode.Duplicate : WatchEditor.Mode.Edit); - + var result = we.ShowHawkDialog(); if (result == DialogResult.OK) { @@ -417,7 +417,7 @@ namespace BizHawk.Client.EmuHawk if (duplicate) { _watches.AddRange(we.Watches); - WatchListView.ItemCount = _watches.ItemCount; + WatchListView.ItemCount = _watches.Count; } else { @@ -499,7 +499,7 @@ namespace BizHawk.Client.EmuHawk if (result || suppressAsk) { _watches.Clear(); - WatchListView.ItemCount = _watches.ItemCount; + WatchListView.ItemCount = _watches.Count; UpdateWatchCount(); UpdateStatusBar(); _sortReverse = false; @@ -598,7 +598,7 @@ namespace BizHawk.Client.EmuHawk private void WatchListView_QueryItemBkColor(int index, int column, ref Color color) { - if (index >= _watches.ItemCount) + if (index >= _watches.Count) { return; } @@ -624,7 +624,7 @@ namespace BizHawk.Client.EmuHawk { text = string.Empty; - if (index >= _watches.ItemCount || _watches[index].IsSeparator) + if (index >= _watches.Count || _watches[index].IsSeparator) { return; } @@ -764,7 +764,7 @@ namespace BizHawk.Client.EmuHawk _watches.Add(we.Watches[0]); Changes(); UpdateWatchCount(); - WatchListView.ItemCount = _watches.ItemCount; + WatchListView.ItemCount = _watches.Count; UpdateValues(); } } @@ -784,7 +784,7 @@ namespace BizHawk.Client.EmuHawk _watches.Remove(item); } - WatchListView.ItemCount = _watches.ItemCount; + WatchListView.ItemCount = _watches.Count; UpdateValues(); UpdateWatchCount(); } @@ -838,7 +838,7 @@ namespace BizHawk.Client.EmuHawk _watches.Add(SeparatorWatch.Instance); } - WatchListView.ItemCount = _watches.ItemCount; + WatchListView.ItemCount = _watches.Count; Changes(); UpdateWatchCount(); } @@ -873,7 +873,7 @@ namespace BizHawk.Client.EmuHawk WatchListView.SelectItem(t, true); } - WatchListView.ItemCount = _watches.ItemCount; + WatchListView.ItemCount = _watches.Count; } private void MoveDownMenuItem_Click(object sender, EventArgs e) @@ -900,7 +900,7 @@ namespace BizHawk.Client.EmuHawk } Changes(); - WatchListView.ItemCount = _watches.ItemCount; + WatchListView.ItemCount = _watches.Count; } private void SelectAllMenuItem_Click(object sender, EventArgs e) @@ -1037,7 +1037,7 @@ namespace BizHawk.Client.EmuHawk { _watches.Load(filePaths[0], append: false); Global.Config.RecentWatches.Add(_watches.CurrentFileName); - WatchListView.ItemCount = _watches.ItemCount; + WatchListView.ItemCount = _watches.Count; } } @@ -1056,9 +1056,9 @@ namespace BizHawk.Client.EmuHawk PokeContextMenuItem.Visible = FreezeContextMenuItem.Visible = Separator4.Visible = - ReadBreakpointContextMenuItem.Visible = + ReadBreakpointContextMenuItem.Visible = WriteBreakpointContextMenuItem.Visible = - Separator6.Visible = + Separator6.Visible = InsertSeperatorContextMenuItem.Visible = MoveUpContextMenuItem.Visible = MoveDownContextMenuItem.Visible = @@ -1115,7 +1115,7 @@ namespace BizHawk.Client.EmuHawk } else { - ToolHelpers.ViewInHexEditor(selected.First().Domain, selected.Select(x => x.Address ), selected.First().Size); + ToolHelpers.ViewInHexEditor(selected.First().Domain, selected.Select(x => x.Address), selected.First().Size); } } } @@ -1134,7 +1134,7 @@ namespace BizHawk.Client.EmuHawk } } } - + private void WriteBreakpointContextMenuItem_Click(object sender, EventArgs e) { var selected = SelectedWatches.ToList(); @@ -1205,7 +1205,7 @@ namespace BizHawk.Client.EmuHawk _watches.Remove(item); } - WatchListView.ItemCount = _watches.ItemCount; + WatchListView.ItemCount = _watches.Count; UpdateValues(); UpdateWatchCount(); UpdateStatusBar(); diff --git a/BizHawk.Client.MultiHawk/Program.cs b/BizHawk.Client.MultiHawk/Program.cs index 3b2fd1c6b9..800eb0e459 100644 --- a/BizHawk.Client.MultiHawk/Program.cs +++ b/BizHawk.Client.MultiHawk/Program.cs @@ -158,25 +158,6 @@ namespace BizHawk.Client.MultiHawk DeleteFileW(path + ":Zone.Identifier"); } - //for debugging purposes, this is provided. when we're satisfied everyone understands whats going on, we'll get rid of this - [DllImportAttribute("kernel32.dll", EntryPoint = "CreateFileW")] - public static extern IntPtr CreateFileW([InAttribute()] [MarshalAsAttribute(UnmanagedType.LPWStr)] string lpFileName, int dwDesiredAccess, int dwShareMode, [InAttribute()] int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, [InAttribute()] int hTemplateFile); - static void ApplyMOTW(string path) - { - int generic_write = 0x40000000; - int file_share_write = 2; - int create_always = 2; - var adsHandle = CreateFileW(path + ":Zone.Identifier", generic_write, file_share_write, 0, create_always, 0, 0); - using (var sfh = new Microsoft.Win32.SafeHandles.SafeFileHandle(adsHandle, true)) - { - var adsStream = new FileStream(sfh, FileAccess.Write); - StreamWriter sw = new StreamWriter(adsStream); - sw.Write("[ZoneTransfer]\r\nZoneId=3"); - sw.Flush(); - adsStream.Close(); - } - } - static void WhackAllMOTW(string dllDir) { var todo = new Queue(new[] { new DirectoryInfo(dllDir) }); diff --git a/BizHawk.Common/BizHawk.Common.csproj b/BizHawk.Common/BizHawk.Common.csproj index eaeabf9830..2fe7d6586c 100644 --- a/BizHawk.Common/BizHawk.Common.csproj +++ b/BizHawk.Common/BizHawk.Common.csproj @@ -18,7 +18,7 @@ full false ..\output\dll\ - DEBUG;TRACE + TRACE;DEBUG;WINDOWS prompt 4 x86 @@ -28,7 +28,7 @@ pdbonly true ..\output\dll\ - TRACE + TRACE;WINDOWS prompt 4 x86 diff --git a/BizHawk.Common/Extensions/NumberExtensions.cs b/BizHawk.Common/Extensions/NumberExtensions.cs index cb2f5f19b6..3cb3294de2 100644 --- a/BizHawk.Common/Extensions/NumberExtensions.cs +++ b/BizHawk.Common/Extensions/NumberExtensions.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; namespace BizHawk.Common.NumberExtensions { @@ -106,5 +107,29 @@ namespace BizHawk.Common.NumberExtensions { return a - (b * (int)System.Math.Floor((float)a / b)); } + + /// + /// Force the value to be stricly between min and max (both exclued) + /// + /// Anything that implements + /// Value that will be clamped + /// Minimum allowed + /// Maximum allowed + /// The value if strictly between min and max; otherwise min (or max depending of what is passed) + public static T Clamp(this T val, T min, T max) where T : IComparable + { + if(val.CompareTo(min) < 0) + { + return min; + } + else if(val.CompareTo(max) > 0) + { + return max; + } + else + { + return val; + } + } } } diff --git a/BizHawk.Common/TempFileManager.cs b/BizHawk.Common/TempFileManager.cs index 895c9fef6e..97afd7c06d 100644 --- a/BizHawk.Common/TempFileManager.cs +++ b/BizHawk.Common/TempFileManager.cs @@ -1,5 +1,6 @@ using System; -using System.IO; +using System.IO; +using System.Runtime.InteropServices; namespace BizHawk.Common { @@ -41,7 +42,12 @@ namespace BizHawk.Common thread.Priority = System.Threading.ThreadPriority.Lowest; thread.Start(); } - } + } + + #if WINDOWS + [DllImport("kernel32.dll", EntryPoint = "DeleteFileW", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true)] + static extern bool DeleteFileW([MarshalAs(UnmanagedType.LPWStr)]string lpFileName); + #endif static void ThreadProc() { @@ -53,7 +59,12 @@ namespace BizHawk.Common { try { + //SHUT. UP. THE. EXCEPTIONS. + #if WINDOWS + DeleteFileW(fi.FullName); + #else fi.Delete(); + #endif } catch { diff --git a/BizHawk.Emulation.Common/Interfaces/IInputPollable.cs b/BizHawk.Emulation.Common/Interfaces/IInputPollable.cs index 54a3ef5f50..fdb9259a8e 100644 --- a/BizHawk.Emulation.Common/Interfaces/IInputPollable.cs +++ b/BizHawk.Emulation.Common/Interfaces/IInputPollable.cs @@ -11,7 +11,7 @@ /// If the current frame is a lag frame. /// All cores should define it the same, a lag frame is a frame in which input was not polled. /// - bool IsLagFrame { get; } + bool IsLagFrame { get; set; } IInputCallbackSystem InputCallbacks { get; } } diff --git a/BizHawk.Emulation.Cores/CPUs/MOS 6502X/Execute.cs b/BizHawk.Emulation.Cores/CPUs/MOS 6502X/Execute.cs index a79d0f8881..1fd4e0b784 100644 --- a/BizHawk.Emulation.Cores/CPUs/MOS 6502X/Execute.cs +++ b/BizHawk.Emulation.Cores/CPUs/MOS 6502X/Execute.cs @@ -34,7 +34,7 @@ namespace BizHawk.Emulation.Cores.Components.M6502 //0x00 /*BRK [implied]*/ new Uop[] { Uop.Fetch2, Uop.PushPCH, Uop.PushPCL, Uop.PushP_BRK, Uop.FetchPCLVector, Uop.FetchPCHVector, Uop.End_SuppressInterrupt }, /*ORA (addr,X) [indexed indirect READ]*/ new Uop[] { Uop.Fetch2, Uop.IdxInd_Stage3, Uop.IdxInd_Stage4, Uop.IdxInd_Stage5, Uop.IdxInd_Stage6_READ_ORA, Uop.End }, - /*JAM*/ new Uop[] { Uop.End }, + /*JAM*/ new Uop[] { Uop.Jam }, /*SLO* (addr,X) [indexed indirect RMW] [unofficial]*/ new Uop[] { Uop.Fetch2, Uop.IdxInd_Stage3, Uop.IdxInd_Stage4, Uop.IdxInd_Stage5, Uop.IdxInd_Stage6_RMW, Uop.IdxInd_Stage7_RMW_SLO, Uop.IdxInd_Stage8_RMW, Uop.End }, /*NOP zp [zero page READ]*/ new Uop[] { Uop.Fetch2, Uop.ZP_READ_NOP, Uop.End }, /*ORA zp [zero page READ]*/ new Uop[] { Uop.Fetch2, Uop.ZP_READ_ORA, Uop.End }, @@ -51,7 +51,7 @@ namespace BizHawk.Emulation.Cores.Components.M6502 //0x10 /*BPL +/-rel*/ new Uop[] { Uop.RelBranch_Stage2_BPL, Uop.End }, /*ORA (addr),Y* [indirect indexed READ]*/ new Uop[] { Uop.Fetch2, Uop.IndIdx_Stage3, Uop.IndIdx_Stage4, Uop.IndIdx_READ_Stage5, Uop.IndIdx_READ_Stage6_ORA, Uop.End }, - /*JAM*/ new Uop[] { Uop.End }, + /*JAM*/ new Uop[] { Uop.Jam }, /*SLO (addr),Y* [indirect indexed RMW] [unofficial] */ new Uop[] { Uop.Fetch2, Uop.IndIdx_Stage3, Uop.IndIdx_Stage4, Uop.IndIdx_RMW_Stage5, Uop.IndIdx_RMW_Stage6, Uop.IndIdx_RMW_Stage7_SLO, Uop.IndIdx_RMW_Stage8, Uop.End }, /*NOP zp,X [zero page indexed READ]*/ new Uop[] { Uop.Fetch2, Uop.ZpIdx_Stage3_X, Uop.ZP_READ_NOP, Uop.End }, /*ORA zp,X [zero page indexed READ]*/ new Uop[] { Uop.Fetch2, Uop.ZpIdx_Stage3_X, Uop.ZP_READ_ORA, Uop.End }, @@ -68,7 +68,7 @@ namespace BizHawk.Emulation.Cores.Components.M6502 //0x20 /*JSR*/ new Uop[] { Uop.Fetch2, Uop.NOP, Uop.PushPCH, Uop.PushPCL, Uop.JSR, Uop.End }, /*AND (addr,X) [indexed indirect READ]*/ new Uop[] { Uop.Fetch2, Uop.IdxInd_Stage3, Uop.IdxInd_Stage4, Uop.IdxInd_Stage5, Uop.IdxInd_Stage6_READ_AND, Uop.End }, - /*JAM*/ new Uop[] { Uop.End }, + /*JAM*/ new Uop[] { Uop.Jam }, /*RLA* (addr,X) [indexed indirect RMW] [unofficial]*/ new Uop[] { Uop.Fetch2, Uop.IdxInd_Stage3, Uop.IdxInd_Stage4, Uop.IdxInd_Stage5, Uop.IdxInd_Stage6_RMW, Uop.IdxInd_Stage7_RMW_RLA, Uop.IdxInd_Stage8_RMW, Uop.End }, /*BIT zp [zero page READ]*/ new Uop[] { Uop.Fetch2, Uop.ZP_READ_BIT, Uop.End }, /*AND zp [zero page READ]*/ new Uop[] { Uop.Fetch2, Uop.ZP_READ_AND, Uop.End }, @@ -85,7 +85,7 @@ namespace BizHawk.Emulation.Cores.Components.M6502 //0x30 /*BMI +/-rel [relative]*/ new Uop[] { Uop.RelBranch_Stage2_BMI, Uop.End }, /*AND (addr),Y* [indirect indexed READ]*/ new Uop[] { Uop.Fetch2, Uop.IndIdx_Stage3, Uop.IndIdx_Stage4, Uop.IndIdx_READ_Stage5, Uop.IndIdx_READ_Stage6_AND, Uop.End }, - /*JAM*/ new Uop[] { Uop.End }, + /*JAM*/ new Uop[] { Uop.Jam }, /*RLA* (addr),Y* [indirect indexed RMW] [unofficial] */ new Uop[] { Uop.Fetch2, Uop.IndIdx_Stage3, Uop.IndIdx_Stage4, Uop.IndIdx_RMW_Stage5, Uop.IndIdx_RMW_Stage6, Uop.IndIdx_RMW_Stage7_RLA, Uop.IndIdx_RMW_Stage8, Uop.End }, /*NOP zp,X [zero page indexed READ]*/ new Uop[] { Uop.Fetch2, Uop.ZpIdx_Stage3_X, Uop.ZP_READ_NOP, Uop.End }, /*AND zp,X [zero page indexed READ]*/ new Uop[] { Uop.Fetch2, Uop.ZpIdx_Stage3_X, Uop.ZP_READ_AND, Uop.End }, @@ -102,7 +102,7 @@ namespace BizHawk.Emulation.Cores.Components.M6502 //0x40 /*RTI*/ new Uop[] { Uop.FetchDummy, Uop.IncS, Uop.PullP, Uop.PullPCL, Uop.PullPCH_NoInc, Uop.End }, /*EOR (addr,X) [indexed indirect READ]*/ new Uop[] { Uop.Fetch2, Uop.IdxInd_Stage3, Uop.IdxInd_Stage4, Uop.IdxInd_Stage5, Uop.IdxInd_Stage6_READ_EOR, Uop.End }, - /*JAM*/ new Uop[] { Uop.End }, + /*JAM*/ new Uop[] { Uop.Jam }, /*SRE* (addr,X) [indexed indirect RMW] [unofficial]*/ new Uop[] { Uop.Fetch2, Uop.IdxInd_Stage3, Uop.IdxInd_Stage4, Uop.IdxInd_Stage5, Uop.IdxInd_Stage6_RMW, Uop.IdxInd_Stage7_RMW_SRE, Uop.IdxInd_Stage8_RMW, Uop.End }, /*NOP zp [zero page READ]*/ new Uop[] { Uop.Fetch2, Uop.ZP_READ_NOP, Uop.End }, /*EOR zp [zero page READ]*/ new Uop[] { Uop.Fetch2, Uop.ZP_READ_EOR, Uop.End }, @@ -119,7 +119,7 @@ namespace BizHawk.Emulation.Cores.Components.M6502 //0x50 /*BVC +/-rel [relative]*/ new Uop[] { Uop.RelBranch_Stage2_BVC, Uop.End }, /*EOR (addr),Y* [indirect indexed READ]*/ new Uop[] { Uop.Fetch2, Uop.IndIdx_Stage3, Uop.IndIdx_Stage4, Uop.IndIdx_READ_Stage5, Uop.IndIdx_READ_Stage6_EOR, Uop.End }, - /*JAM*/ new Uop[] { Uop.End }, + /*JAM*/ new Uop[] { Uop.Jam }, /*SRE* (addr),Y* [indirect indexed RMW] [unofficial] */ new Uop[] { Uop.Fetch2, Uop.IndIdx_Stage3, Uop.IndIdx_Stage4, Uop.IndIdx_RMW_Stage5, Uop.IndIdx_RMW_Stage6, Uop.IndIdx_RMW_Stage7_SRE, Uop.IndIdx_RMW_Stage8, Uop.End }, /*NOP zp,X [zero page indexed READ]*/ new Uop[] { Uop.Fetch2, Uop.ZpIdx_Stage3_X, Uop.ZP_READ_NOP, Uop.End }, /*EOR zp,X [zero page indexed READ]*/ new Uop[] { Uop.Fetch2, Uop.ZpIdx_Stage3_X, Uop.ZP_READ_EOR, Uop.End }, @@ -136,7 +136,7 @@ namespace BizHawk.Emulation.Cores.Components.M6502 //0x60 /*RTS*/ new Uop[] { Uop.FetchDummy, Uop.IncS, Uop.PullPCL, Uop.PullPCH_NoInc, Uop.IncPC, Uop.End }, //can't fetch here because the PC isnt ready until the end of the last clock /*ADC (addr,X) [indexed indirect READ]*/ new Uop[] { Uop.Fetch2, Uop.IdxInd_Stage3, Uop.IdxInd_Stage4, Uop.IdxInd_Stage5, Uop.IdxInd_Stage6_READ_ADC, Uop.End }, - /*JAM*/ new Uop[] { Uop.End }, + /*JAM*/ new Uop[] { Uop.Jam }, /*RRA* (addr,X) [indexed indirect RMW] [unofficial]*/ new Uop[] { Uop.Fetch2, Uop.IdxInd_Stage3, Uop.IdxInd_Stage4, Uop.IdxInd_Stage5, Uop.IdxInd_Stage6_RMW, Uop.IdxInd_Stage7_RMW_RRA, Uop.IdxInd_Stage8_RMW, Uop.End }, /*NOP zp [zero page READ]*/ new Uop[] { Uop.Fetch2, Uop.ZP_READ_NOP, Uop.End }, /*ADC zp [zero page READ]*/ new Uop[] { Uop.Fetch2, Uop.ZP_READ_ADC, Uop.End }, @@ -153,7 +153,7 @@ namespace BizHawk.Emulation.Cores.Components.M6502 //0x70 /*BVS +/-rel [relative]*/ new Uop[] { Uop.RelBranch_Stage2_BVS, Uop.End }, /*ADC (addr),Y [indirect indexed READ]*/ new Uop[] { Uop.Fetch2, Uop.IndIdx_Stage3, Uop.IndIdx_Stage4, Uop.IndIdx_READ_Stage5, Uop.IndIdx_READ_Stage6_ADC, Uop.End }, - /*JAM*/ new Uop[] { Uop.End }, + /*JAM*/ new Uop[] { Uop.Jam }, /*RRA* (addr),Y [indirect indexed RMW Y] [unofficial] */ new Uop[] { Uop.Fetch2, Uop.IndIdx_Stage3, Uop.IndIdx_Stage4, Uop.IndIdx_RMW_Stage5, Uop.IndIdx_RMW_Stage6, Uop.IndIdx_RMW_Stage7_RRA, Uop.IndIdx_RMW_Stage8, Uop.End }, /*NOP zp,X [zero page indexed READ]*/ new Uop[] { Uop.Fetch2, Uop.ZpIdx_Stage3_X, Uop.ZP_READ_NOP, Uop.End }, /*ADC zp,X [zero page indexed READ]*/ new Uop[] { Uop.Fetch2, Uop.ZpIdx_Stage3_X, Uop.ZP_READ_ADC, Uop.End }, @@ -187,7 +187,7 @@ namespace BizHawk.Emulation.Cores.Components.M6502 //0x90 /*BCC +/-rel [relative]*/ new Uop[] { Uop.RelBranch_Stage2_BCC, Uop.End }, /*STA (addr),Y [indirect indexed WRITE]*/ new Uop[] { Uop.Fetch2, Uop.IndIdx_Stage3, Uop.IndIdx_Stage4, Uop.IndIdx_WRITE_Stage5, Uop.IndIdx_WRITE_Stage6_STA, Uop.End }, - /*JAM*/ new Uop[] { Uop.End }, + /*JAM*/ new Uop[] { Uop.Jam }, /*SHA** [indirect indexed WRITE] [unofficial] [not tested by blargg's instruction tests]*/ new Uop[] { Uop.Fetch2, Uop.IndIdx_Stage3, Uop.IndIdx_Stage4, Uop.IndIdx_WRITE_Stage5, Uop.IndIdx_WRITE_Stage6_SHA, Uop.End }, /*STY zp,X [zero page indexed WRITE X]*/ new Uop[] { Uop.Fetch2, Uop.ZpIdx_Stage3_X, Uop.ZP_WRITE_STY, Uop.End }, /*STA zp,X [zero page indexed WRITE X]*/ new Uop[] { Uop.Fetch2, Uop.ZpIdx_Stage3_X, Uop.ZP_WRITE_STA, Uop.End }, @@ -221,7 +221,7 @@ namespace BizHawk.Emulation.Cores.Components.M6502 //0xB0 /*BCS +/-rel [relative]*/ new Uop[] { Uop.RelBranch_Stage2_BCS, Uop.End }, /*LDA (addr),Y* [indirect indexed READ]*/ new Uop[] { Uop.Fetch2, Uop.IndIdx_Stage3, Uop.IndIdx_Stage4, Uop.IndIdx_READ_Stage5, Uop.IndIdx_READ_Stage6_LDA, Uop.End }, - /*JAM*/ new Uop[] { Uop.End }, + /*JAM*/ new Uop[] { Uop.Jam }, /*LAX* (addr),Y* [indirect indexed READ] [unofficial] */ new Uop[] { Uop.Fetch2, Uop.IndIdx_Stage3, Uop.IndIdx_Stage4, Uop.IndIdx_READ_Stage5, Uop.IndIdx_READ_Stage6_LAX, Uop.End }, /*LDY zp,X [zero page indexed READ X]*/ new Uop[] { Uop.Fetch2, Uop.ZpIdx_Stage3_X, Uop.ZP_READ_LDY, Uop.End }, /*LDA zp,X [zero page indexed READ X]*/ new Uop[] { Uop.Fetch2, Uop.ZpIdx_Stage3_X, Uop.ZP_READ_LDA, Uop.End }, @@ -255,7 +255,7 @@ namespace BizHawk.Emulation.Cores.Components.M6502 //0xD0 /*BNE +/-rel [relative]*/ new Uop[] { Uop.RelBranch_Stage2_BNE, Uop.End }, /*CMP (addr),Y* [indirect indexed READ]*/ new Uop[] { Uop.Fetch2, Uop.IndIdx_Stage3, Uop.IndIdx_Stage4, Uop.IndIdx_READ_Stage5, Uop.IndIdx_READ_Stage6_CMP, Uop.End }, - /*JAM*/ new Uop[] { Uop.End }, + /*JAM*/ new Uop[] { Uop.Jam }, /*DCP* (addr),Y* [indirect indexed RMW Y] [unofficial] */ new Uop[] { Uop.Fetch2, Uop.IndIdx_Stage3, Uop.IndIdx_Stage4, Uop.IndIdx_RMW_Stage5, Uop.IndIdx_RMW_Stage6, Uop.IndIdx_RMW_Stage7_DCP, Uop.IndIdx_RMW_Stage8, Uop.End }, /*NOP zp,X [zero page indexed READ]*/ new Uop[] { Uop.Fetch2, Uop.ZpIdx_Stage3_X, Uop.ZP_READ_NOP, Uop.End }, /*CMP zp,X [zero page indexed READ]*/ new Uop[] { Uop.Fetch2, Uop.ZpIdx_Stage3_X, Uop.ZP_READ_CMP, Uop.End }, @@ -289,7 +289,7 @@ namespace BizHawk.Emulation.Cores.Components.M6502 //0xF0 /*BEQ +/-rel [relative]*/ new Uop[] { Uop.RelBranch_Stage2_BEQ, Uop.End }, /*SBC (addr),Y* [indirect indexed READ]*/ new Uop[] { Uop.Fetch2, Uop.IndIdx_Stage3, Uop.IndIdx_Stage4, Uop.IndIdx_READ_Stage5, Uop.IndIdx_READ_Stage6_SBC, Uop.End }, - /*JAM*/ new Uop[] { Uop.End }, + /*JAM*/ new Uop[] { Uop.Jam }, /*ISC* (addr),Y* [indirect indexed RMW Y] [unofficial] */ new Uop[] { Uop.Fetch2, Uop.IndIdx_Stage3, Uop.IndIdx_Stage4, Uop.IndIdx_RMW_Stage5, Uop.IndIdx_RMW_Stage6, Uop.IndIdx_RMW_Stage7_ISC, Uop.IndIdx_RMW_Stage8, Uop.End }, /*NOP zp,X [zero page indexed READ]*/ new Uop[] { Uop.Fetch2, Uop.ZpIdx_Stage3_X, Uop.ZP_READ_NOP, Uop.End }, /*SBC zp,X [zero page indexed READ X]*/ new Uop[] { Uop.Fetch2, Uop.ZpIdx_Stage3_X, Uop.ZP_READ_SBC, Uop.End }, @@ -466,6 +466,8 @@ namespace BizHawk.Emulation.Cores.Components.M6502 End_ISpecial, //same as end, but preserves the iflag set by the instruction End_BranchSpecial, End_SuppressInterrupt, + + Jam, } void InitOpcodeHandlers() @@ -2659,6 +2661,11 @@ namespace BizHawk.Emulation.Cores.Components.M6502 End(); } + void Jam() + { + rdy_freeze = true; + } + void ExecuteOneRetry() { //dont know whether this system is any faster. hard to get benchmarks someone else try it? @@ -2912,6 +2919,7 @@ namespace BizHawk.Emulation.Cores.Components.M6502 case Uop.End_SuppressInterrupt: End_SuppressInterrupt(); break; case Uop.End: End(); break; case Uop.End_BranchSpecial: End_BranchSpecial(); break; + case Uop.Jam: Jam(); break; } } diff --git a/BizHawk.Emulation.Cores/CPUs/Z80/Z80A.cs b/BizHawk.Emulation.Cores/CPUs/Z80/Z80A.cs index f16f5dfb14..6674982d86 100644 --- a/BizHawk.Emulation.Cores/CPUs/Z80/Z80A.cs +++ b/BizHawk.Emulation.Cores/CPUs/Z80/Z80A.cs @@ -56,7 +56,12 @@ namespace BizHawk.Emulation.Cores.Components.Z80 MemoryCallbacks.CallReads(addr); } - return FetchMemory(addr, true); + if (FetchMemory != null) + { + return FetchMemory(addr, true); + } + + return ReadMemory(addr); } public byte FetchMemoryWrapper(ushort addr) @@ -66,7 +71,12 @@ namespace BizHawk.Emulation.Cores.Components.Z80 MemoryCallbacks.CallReads(addr); } - return FetchMemory(addr, false); + if (FetchMemory != null) + { + return FetchMemory(addr, false); + } + + return ReadMemory(addr); } public void WriteMemoryWrapper(ushort addr, byte value) diff --git a/BizHawk.Emulation.Cores/Calculator/TI83.IInputPollable.cs b/BizHawk.Emulation.Cores/Calculator/TI83.IInputPollable.cs index 22927c62ee..83e05e04e3 100644 --- a/BizHawk.Emulation.Cores/Calculator/TI83.IInputPollable.cs +++ b/BizHawk.Emulation.Cores/Calculator/TI83.IInputPollable.cs @@ -19,6 +19,7 @@ namespace BizHawk.Emulation.Cores.Calculators public bool IsLagFrame { get { return _isLag; } + set { _isLag = value; } } } } diff --git a/BizHawk.Emulation.Cores/Computers/AppleII/AppleII.IInputPollable.cs b/BizHawk.Emulation.Cores/Computers/AppleII/AppleII.IInputPollable.cs index 26419f41e5..a595a2b73b 100644 --- a/BizHawk.Emulation.Cores/Computers/AppleII/AppleII.IInputPollable.cs +++ b/BizHawk.Emulation.Cores/Computers/AppleII/AppleII.IInputPollable.cs @@ -9,7 +9,7 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII public bool IsLagFrame { get { return _machine.Lagged; } - private set { _machine.Lagged = value; } + set { _machine.Lagged = value; } } public IInputCallbackSystem InputCallbacks { get; private set; } diff --git a/BizHawk.Emulation.Cores/Computers/Commodore64/C64.IInputPollable.cs b/BizHawk.Emulation.Cores/Computers/Commodore64/C64.IInputPollable.cs index b0aef31cbd..fd668b5830 100644 --- a/BizHawk.Emulation.Cores/Computers/Commodore64/C64.IInputPollable.cs +++ b/BizHawk.Emulation.Cores/Computers/Commodore64/C64.IInputPollable.cs @@ -7,6 +7,7 @@ namespace BizHawk.Emulation.Cores.Computers.Commodore64 public bool IsLagFrame { get { return _islag; } + set { _islag = value; } } public int LagCount diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.IInputPollable.cs b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.IInputPollable.cs index efe6e472c9..8d6efbf22d 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.IInputPollable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/2600/Atari2600.IInputPollable.cs @@ -13,6 +13,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600 public bool IsLagFrame { get { return _islag; } + set { _islag = value; } } public IInputCallbackSystem InputCallbacks { get; private set; } diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IInputPollable.cs b/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IInputPollable.cs index 74937501de..479cba9ca9 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IInputPollable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IInputPollable.cs @@ -13,6 +13,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari7800 public bool IsLagFrame { get { return _islag; } + set { _islag = value; } } public IInputCallbackSystem InputCallbacks { get; private set; } diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/lynx/Lynx.IInputPollable.cs b/BizHawk.Emulation.Cores/Consoles/Atari/lynx/Lynx.IInputPollable.cs index 9ba1ba6b32..334b78474d 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/lynx/Lynx.IInputPollable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/lynx/Lynx.IInputPollable.cs @@ -10,7 +10,7 @@ namespace BizHawk.Emulation.Cores.Atari.Lynx { public int LagCount { get; set; } - public bool IsLagFrame { get; private set; } + public bool IsLagFrame { get; set; } // TODO public IInputCallbackSystem InputCallbacks diff --git a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IInputPollable.cs b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IInputPollable.cs index bfac04bd55..3c9708667b 100644 --- a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IInputPollable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IInputPollable.cs @@ -14,6 +14,7 @@ namespace BizHawk.Emulation.Cores.ColecoVision public bool IsLagFrame { get { return _isLag; } + set { _isLag = value; } } public IInputCallbackSystem InputCallbacks diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/MGBAHawk.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/MGBAHawk.cs index cec1c68c4e..b2d06b0e42 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/MGBAHawk.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/MGBAHawk.cs @@ -371,7 +371,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA } public int LagCount { get; set; } - public bool IsLagFrame { get; private set; } + public bool IsLagFrame { get; set; } [FeatureNotImplemented] public IInputCallbackSystem InputCallbacks diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/Meteor.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/Meteor.cs index 965192275e..3e918a1258 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/Meteor.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/Meteor.cs @@ -102,7 +102,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA public int Frame { get; private set; } public int LagCount { get; set; } - public bool IsLagFrame { get; private set; } + public bool IsLagFrame { get; set; } private readonly InputCallbackSystem _inputCallbacks = new InputCallbackSystem(); diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/VBANext.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/VBANext.cs index f529b4ffbc..3678b24584 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/VBANext.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/GBA/VBANext.cs @@ -116,7 +116,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.GBA public int Frame { get; private set; } public int LagCount { get; set; } - public bool IsLagFrame { get; private set; } + public bool IsLagFrame { get; set; } private ITraceable Tracer { get; set; } diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs index b8270fe39e..428b6a7894 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs @@ -196,7 +196,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy public int Frame { get; set; } public int LagCount { get; set; } - public bool IsLagFrame { get; private set; } + public bool IsLagFrame { get; set; } // all cycle counts are relative to a 2*1024*1024 mhz refclock diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambatteLink.IInputPollable.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambatteLink.IInputPollable.cs index efddc620da..1148b51f94 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambatteLink.IInputPollable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambatteLink.IInputPollable.cs @@ -7,7 +7,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy { public int LagCount { get; set; } - public bool IsLagFrame { get; private set; } + public bool IsLagFrame { get; set; } public IInputCallbackSystem InputCallbacks { diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/N64.IInputPollable.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/N64.IInputPollable.cs index 14103da9d6..31d7b96745 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/N64.IInputPollable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/N64.IInputPollable.cs @@ -19,7 +19,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.N64 return !_inputProvider.LastFrameInputPolled; } - internal set + set { if (_settings.UseMupenStyleLag) { diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/NSFBoard.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/NSFBoard.cs index 4816614864..a3bf9dc415 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/NSFBoard.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/Boards/NSFBoard.cs @@ -125,12 +125,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES Buffer.BlockCopy(nsf.NSFData, 0x80, FakePRG, load_start, load_size); } - ReplayInit(); CurrentSong = nsf.StartingSong; + ReplayInit(); } void ReplayInit() { + Console.WriteLine("NSF: Playing track {0}/{1}", CurrentSong, nsf.TotalSongs-1); InitPending = true; Patch_Vectors = true; } @@ -330,13 +331,19 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES bool reset = false; if (right) { - CurrentSong++; - reset = true; + if (CurrentSong < nsf.TotalSongs - 1) + { + CurrentSong++; + reset = true; + } } if (left) { - CurrentSong--; - reset = true; + if (CurrentSong > 0) + { + CurrentSong--; + reset = true; + } } if (a) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.IInputPollable.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.IInputPollable.cs index 8438b25012..8e2ecccd8b 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.IInputPollable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/NES/NES.IInputPollable.cs @@ -13,6 +13,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES public bool IsLagFrame { get { return islag; } + set { islag = value; } } public IInputCallbackSystem InputCallbacks diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/QuickNES.IInputPollable.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/QuickNES.IInputPollable.cs index 9164bb7653..a83c9d6bc9 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/QuickNES.IInputPollable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/QuickNES/QuickNES.IInputPollable.cs @@ -6,7 +6,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES public partial class QuickNES : IInputPollable { public int LagCount { get; set; } - public bool IsLagFrame { get; private set; } + public bool IsLagFrame { get; set; } public IInputCallbackSystem InputCallbacks { diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesCore.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesCore.cs index ad7b619b62..0d1d3e5657 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesCore.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesCore.cs @@ -740,7 +740,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES int timeFrameCounter; public int Frame { get { return timeFrameCounter; } set { timeFrameCounter = value; } } public int LagCount { get; set; } - public bool IsLagFrame { get; private set; } + public bool IsLagFrame { get; set; } public string SystemId { get; private set; } public string BoardName { get; private set; } @@ -748,13 +748,17 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES // adelikat: Nasty hack to force new business logic. Compatibility (and Accuracy when fully supported) will ALWAYS be in deterministic mode, // a consequence is a permanent performance hit to the compatibility core // Perormance will NEVER be in deterministic mode (and the client side logic will prohibit movie recording on it) + // feos: Nasty hack to a nasty hack. Allow user disable it with a strong warning. public bool DeterministicEmulation { - get { return CurrentProfile == "Compatibility" || CurrentProfile == "Accuracy"; } + get + { + return Settings.ForceDeterminism && + (CurrentProfile == "Compatibility" || CurrentProfile == "Accuracy"); + } private set { /* Do nothing */ } } - public bool SaveRamModified { get @@ -1238,6 +1242,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES public bool UseRingBuffer = true; public bool AlwaysDoubleSize = false; + public bool ForceDeterminism = true; public string Palette = "BizHawk"; public SnesSettings Clone() diff --git a/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs b/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs index b288ae20ef..c39273e240 100644 --- a/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs +++ b/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs @@ -310,7 +310,7 @@ namespace BizHawk.Emulation.Cores.PCEngine bool isLag = false; public int Frame { get { return frame; } set { frame = value; } } public int LagCount { get { return lagCount; } set { lagCount = value; } } - public bool IsLagFrame { get { return isLag; } } + public bool IsLagFrame { get { return isLag; } set { isLag = value; } } private readonly InputCallbackSystem _inputCallbacks = new InputCallbackSystem(); public IInputCallbackSystem InputCallbacks { get { return _inputCallbacks; } } diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/Genesis/Genesis.cs b/BizHawk.Emulation.Cores/Consoles/Sega/Genesis/Genesis.cs index ef74d601bf..48f1faa3c8 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/Genesis/Genesis.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/Genesis/Genesis.cs @@ -310,7 +310,7 @@ namespace BizHawk.Emulation.Cores.Sega.Genesis public int Frame { get; set; } public int LagCount { get { return _lagcount; } set { _lagcount = value; } } - public bool IsLagFrame { get { return islag; } } + public bool IsLagFrame { get { return islag; } set { islag = value; } } public bool DeterministicEmulation { get { return true; } } public string SystemId { get { return "GEN"; } } diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs index fb5f254241..fde4cac977 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/SMS/SMS.cs @@ -78,7 +78,7 @@ namespace BizHawk.Emulation.Cores.Sega.MasterSystem bool isLag = false; public int Frame { get { return frame; } set { frame = value; } } public int LagCount { get { return lagCount; } set { lagCount = value; } } - public bool IsLagFrame { get { return isLag; } } + public bool IsLagFrame { get { return isLag; } set { isLag = value; } } private readonly InputCallbackSystem _inputCallbacks = new InputCallbackSystem(); public IInputCallbackSystem InputCallbacks { get { return _inputCallbacks; } } diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/Saturn/Yabause.IInputPollable.cs b/BizHawk.Emulation.Cores/Consoles/Sega/Saturn/Yabause.IInputPollable.cs index 65519c8f89..76fcd17db9 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/Saturn/Yabause.IInputPollable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/Saturn/Yabause.IInputPollable.cs @@ -10,7 +10,7 @@ namespace BizHawk.Emulation.Cores.Sega.Saturn { public int LagCount { get; set; } - public bool IsLagFrame { get; private set; } + public bool IsLagFrame { get; set; } // TODO: optimize managed to unmanaged using the ActiveChanged event public IInputCallbackSystem InputCallbacks diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx/GPGX.cs b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx/GPGX.cs index caba32a817..304dc65aee 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx/GPGX.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx/GPGX.cs @@ -70,8 +70,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx // http://www.sega-16.com/forum/showthread.php?4398-Forgotten-Worlds-giving-you-GAME-OVER-immediately-Fix-inside&highlight=forgotten%20worlds //hack, don't use - //romfile = File.ReadAllBytes(@"D:\encodes\bizhawksrc\output\SANIC CD\PierSolar (E).bin"); - if (rom != null && rom.Length > 16 * 1024 * 1024) + if (rom != null && rom.Length > 32 * 1024 * 1024) { throw new InvalidOperationException("ROM too big! Did you try to load a CD as a ROM?"); } @@ -476,7 +475,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx public int Frame { get; private set; } public int LagCount { get; set; } - public bool IsLagFrame { get; private set; } + public bool IsLagFrame { get; set; } public string SystemId { get { return "GEN"; } } public bool DeterministicEmulation { get { return true; } } diff --git a/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs b/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs index abcc6566d9..1ae0a88609 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sony/PSX/Octoshock.cs @@ -324,6 +324,7 @@ namespace BizHawk.Emulation.Cores.Sony.PSX OctoshockDll.shock_Create(out psx, SystemRegion, pFirmware); SetMemoryDomains(); + InitMemCallbacks(); //set a default framebuffer based on the first frame of emulation, to cut down on flickering or whatever //this is probably quixotic, but we have to pick something @@ -715,6 +716,8 @@ namespace BizHawk.Emulation.Cores.Sony.PSX IsLagFrame = true; if (pad1 == OctoshockDll.SHOCK_TRUE) IsLagFrame = false; if (pad2 == OctoshockDll.SHOCK_TRUE) IsLagFrame = false; + if (_Settings.GPULag) + IsLagFrame = OctoshockDll.shock_GetGPUUnlagged(psx) != OctoshockDll.SHOCK_TRUE; if (IsLagFrame) LagCount++; @@ -768,7 +771,7 @@ namespace BizHawk.Emulation.Cores.Sony.PSX public int Frame { get; private set; } public int LagCount { get; set; } - public bool IsLagFrame { get; private set; } + public bool IsLagFrame { get; set; } public IInputCallbackSystem InputCallbacks { @@ -790,6 +793,39 @@ namespace BizHawk.Emulation.Cores.Sony.PSX #region Debugging + OctoshockDll.ShockCallback_Mem mem_cb; + + void ShockMemCallback(uint address, OctoshockDll.eShockMemCb type, uint size, uint value) + { + switch (type) + { + case OctoshockDll.eShockMemCb.Read: + MemoryCallbacks.CallReads(address); + break; + case OctoshockDll.eShockMemCb.Write: + MemoryCallbacks.CallWrites(address); + break; + case OctoshockDll.eShockMemCb.Execute: + MemoryCallbacks.CallExecutes(address); + break; + } + } + + void InitMemCallbacks() + { + mem_cb = new OctoshockDll.ShockCallback_Mem(ShockMemCallback); + _memoryCallbacks.ActiveChanged += RefreshMemCallbacks; + } + + void RefreshMemCallbacks() + { + OctoshockDll.eShockMemCb mask = OctoshockDll.eShockMemCb.None; + if (MemoryCallbacks.HasReads) mask |= OctoshockDll.eShockMemCb.Read; + if (MemoryCallbacks.HasWrites) mask |= OctoshockDll.eShockMemCb.Write; + if (MemoryCallbacks.HasExecutes) mask |= OctoshockDll.eShockMemCb.Execute; + OctoshockDll.shock_SetMemCb(psx, mem_cb, mask); + } + unsafe void SetMemoryDomains() { var mmd = new List(); @@ -1110,8 +1146,11 @@ namespace BizHawk.Emulation.Cores.Sony.PSX public class Settings { + [DisplayName("Determine Lag from GPU Frames")] + [DefaultValue(false)] + public bool GPULag { get; set; } + [DisplayName("Resolution Mode")] - [Description("Stuff")] [DefaultValue(eResolutionMode.PixelPro)] public eResolutionMode ResolutionMode { get; set; } @@ -1284,13 +1323,13 @@ namespace BizHawk.Emulation.Cores.Sony.PSX public ITraceable Tracer { get { return tracer; } } - public int ShockTraceCallback(IntPtr opaque, uint PC, uint inst, string dis) + public void ShockTraceCallback(IntPtr opaque, uint PC, uint inst, string dis) { Tracer.Put(dis); - return OctoshockDll.SHOCK_OK; } - public IMemoryCallbackSystem MemoryCallbacks { get { throw new NotImplementedException(); } } + private readonly MemoryCallbackSystem _memoryCallbacks = new MemoryCallbackSystem(); + public IMemoryCallbackSystem MemoryCallbacks { get { return _memoryCallbacks; } } public bool CanStep(StepType type) { return false; } diff --git a/BizHawk.Emulation.Cores/Consoles/Sony/PSX/OctoshockDll.cs b/BizHawk.Emulation.Cores/Consoles/Sony/PSX/OctoshockDll.cs index ddecc7141a..1be06a008c 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sony/PSX/OctoshockDll.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sony/PSX/OctoshockDll.cs @@ -96,6 +96,15 @@ namespace BizHawk.Emulation.Cores.Sony.PSX BobOffset } + [Flags] + public enum eShockMemCb : int + { + None = 0, + Read = 1, + Write = 2, + Execute = 4 + } + public const int SHOCK_OK = 0; public const int SHOCK_FALSE = 0; public const int SHOCK_TRUE = 1; @@ -172,8 +181,9 @@ namespace BizHawk.Emulation.Cores.Sony.PSX public TextStateFPtrs ff; }; + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate int ShockTraceCallback(IntPtr opaque, uint PC, uint inst, string dis); + public delegate void ShockCallback_Trace(IntPtr opaque, uint PC, uint inst, string dis); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate int ShockDisc_ReadTOC(IntPtr opaque, ShockTOC* read_target, ShockTOCTrack* tracks101); @@ -181,6 +191,9 @@ namespace BizHawk.Emulation.Cores.Sony.PSX [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate int ShockDisc_ReadLBA(IntPtr opaque, int lba, void* dst); + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void ShockCallback_Mem(uint address, eShockMemCb type, uint size, uint value); + [DllImport(dd, CallingConvention = cc)] public static extern int shock_Util_DisassembleMIPS(uint PC, uint instr, IntPtr outbuf, int buflen); @@ -193,8 +206,6 @@ namespace BizHawk.Emulation.Cores.Sony.PSX [DllImport(dd, CallingConvention = cc)] public static extern int shock_AnalyzeDisc(IntPtr disc, out ShockDiscInfo info); - - [DllImport(dd, CallingConvention = cc)] public static extern int shock_Create(out IntPtr psx, eRegion region, void* firmware512k); @@ -271,9 +282,15 @@ namespace BizHawk.Emulation.Cores.Sony.PSX public static extern int shock_SetRegister_CPU(IntPtr psx, int index, uint value); [DllImport(dd, CallingConvention = cc)] - public static extern int shock_SetTraceCallback(IntPtr psx, IntPtr opaque, ShockTraceCallback callback); + public static extern int shock_SetTraceCallback(IntPtr psx, IntPtr opaque, ShockCallback_Trace callback); + + [DllImport(dd, CallingConvention = cc)] + public static extern int shock_SetMemCb(IntPtr psx, ShockCallback_Mem cb, eShockMemCb cbMask); [DllImport(dd, CallingConvention = cc)] public static extern int shock_SetLEC(IntPtr psx, bool enable); + + [DllImport(dd, CallingConvention = cc)] + public static extern int shock_GetGPUUnlagged(IntPtr psx); } } \ No newline at end of file diff --git a/BizHawk.Emulation.Cores/Consoles/WonderSwan/WonderSwan.cs b/BizHawk.Emulation.Cores/Consoles/WonderSwan/WonderSwan.cs index 5d77013af8..4746759cec 100644 --- a/BizHawk.Emulation.Cores/Consoles/WonderSwan/WonderSwan.cs +++ b/BizHawk.Emulation.Cores/Consoles/WonderSwan/WonderSwan.cs @@ -101,7 +101,7 @@ namespace BizHawk.Emulation.Cores.WonderSwan public int Frame { get; private set; } public int LagCount { get; set; } - public bool IsLagFrame { get; private set; } + public bool IsLagFrame { get; set; } public string SystemId { get { return "WSWAN"; } } public bool DeterministicEmulation { get; private set; } diff --git a/BizHawk.Emulation.Cores/Libretro/LibRetroEmulator.cs b/BizHawk.Emulation.Cores/Libretro/LibRetroEmulator.cs index e67ff90ede..f3028acab3 100644 --- a/BizHawk.Emulation.Cores/Libretro/LibRetroEmulator.cs +++ b/BizHawk.Emulation.Cores/Libretro/LibRetroEmulator.cs @@ -903,7 +903,7 @@ namespace BizHawk.Emulation.Cores #region IInputPollable public int LagCount { get; set; } - public bool IsLagFrame { get; private set; } + public bool IsLagFrame { get; set; } public IInputCallbackSystem InputCallbacks { [FeatureNotImplemented] diff --git a/BizHawk.sln b/BizHawk.sln index a8337f67e5..76fa113292 100644 --- a/BizHawk.sln +++ b/BizHawk.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 +VisualStudioVersion = 14.0.24720.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Version", "Version\Version.csproj", "{0CE8B337-08E3-4602-BF10-C4D4C75D2F13}" EndProject @@ -250,18 +250,18 @@ Global {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}.Debug|Any CPU.Build.0 = Debug|Any CPU {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}.Debug|Win32.ActiveCfg = Debug|Any CPU - {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}.Debug|Win32.Build.0 = Debug|Any CPU + {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}.Debug|Win32.ActiveCfg = Debug|x86 + {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}.Debug|Win32.Build.0 = Debug|x86 {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}.Debug|x86.ActiveCfg = Debug|x86 {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}.Debug|x86.Build.0 = Debug|x86 {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}.Release|Any CPU.ActiveCfg = Release|Any CPU {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}.Release|Any CPU.Build.0 = Release|Any CPU - {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}.Release|Win32.ActiveCfg = Release|Any CPU - {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}.Release|Win32.Build.0 = Release|Any CPU - {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}.Release|x86.ActiveCfg = Release|Any CPU - {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}.Release|x86.Build.0 = Release|Any CPU + {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}.Release|Mixed Platforms.Build.0 = Release|x86 + {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}.Release|Win32.ActiveCfg = Release|x86 + {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}.Release|Win32.Build.0 = Release|x86 + {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}.Release|x86.ActiveCfg = Release|x86 + {8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Dist/BuildAndPackage.bat b/Dist/BuildAndPackage.bat index e67b5f72c7..7a1aa3f293 100644 --- a/Dist/BuildAndPackage.bat +++ b/Dist/BuildAndPackage.bat @@ -32,18 +32,26 @@ rem explicitly list the OK ones here as individual copies. until then.... copy *.dll dll -..\dist\zip.exe -X -r ..\Dist\%NAME% EmuHawk.exe DiscoHawk.exe defctrl.json dll shaders Tools gamedb NES\Palettes Lua Gameboy\Palettes -x *.pdb -x *.lib -x *.pgd -x *.exp -x dll\libsneshawk-64*.exe -x *.ilk +rem Now, we're about to zip and then unzip. Why, you ask? Because that's just the way this evolved. +..\dist\zip.exe -X -r ..\Dist\%NAME% EmuHawk.exe DiscoHawk.exe defctrl.json dll shaders gamedb NES\Palettes Lua Gameboy\Palettes -x *.pdb -x *.lib -x *.pgd -x *.ipdb -x *.iobj -x *.exp -x dll\libsneshawk-64*.exe -x *.ilk -x dll\gpgx.elf -x dll\miniclient.* -x dll\*.xml cd ..\Dist .\unzip.exe %NAME% -d temp del %NAME% +rem Remove things we can't allow the user's junky files to pollute the dist with. We'll export fresh copies from git rmdir /s /q temp\lua rmdir /s /q temp\firmware -rmdir /s /q gitsucks +rmdir /s /q gitsucks git --git-dir ../.git archive --format zip --output lua.zip master output/Lua git --git-dir ../.git archive --format zip --output firmware.zip master output/Firmware +rem Getting externaltools example from my repo +rem I once talked about a dedicated repo for external tools, think about moving the exemple to it it it happend +git clone https://github.com/Hathor86/HelloWorld_BizHawkTool.git +git --git-dir HelloWorld_BizHawkTool/.git archive --format zip --output HelloWorld_BizHawkTool.zip master +rmdir /s /q HelloWorld_BizHawkTool + unzip lua.zip -d gitsucks rem del lua.zip move gitsucks\output\Lua temp @@ -53,15 +61,22 @@ move gitsucks\output\Firmware temp rmdir /s /q gitsucks - cd temp rem remove UPX from any files we have checked in, because people's lousy security software hates it upx -d dll\*.dll upx -d dll\*.exe upx -d *.exe + +rem Patch up working dir with a few other things we want +mkdir ExternalTools +copy ..\HelloWorld_BizHawkTool.dll ExternalTools +copy ..\HelloWorld_BizHawkTool.zip ExternalTools + +rem Build the final zip ..\zip.exe -X -9 -r ..\%NAME% . -i \* cd .. +rem DONE! rmdir /s /q temp goto END diff --git a/Dist/HelloWorld_BizHawkTool.dll b/Dist/HelloWorld_BizHawkTool.dll new file mode 100644 index 0000000000..9aea3925c6 Binary files /dev/null and b/Dist/HelloWorld_BizHawkTool.dll differ diff --git a/Dist/changelog.txt b/Dist/changelog.txt index ea2e21dfd0..adcc8841cf 100644 --- a/Dist/changelog.txt +++ b/Dist/changelog.txt @@ -3,48 +3,76 @@ next ========================================= *EmuHawk -**Add libretro player, compatible with selected cores +**Add libretro player, compatible with selected cores (check wiki) +**Add External Tool system for c#-based tool plugins **Support Code-Data Logger for GB/GBC, SMS/GG, SNES, and Genesis -**Add GameShark cheat converter for N64, GB/GBC, Saturn, GBA, PSX; Action Replay for SMS, SNES, Genesis, GBA; Game Genie for Genesis, SNES, GG, NES **Cheat Dialog: Fix flakiness in value-editing **Add custom exception display box, so exception info can be clipboarded out **Improve main OSD font -**Stop FP precision conflicts between lua scripts and D3D Display method -**DispMethod D3D: More leniency in compilation of optional shaders (so it's able to run on more low spec systems) -**Improvements to Retro shader compatibility **Validate user shaders at selection time **Support user custom AR selection **Add --load-state commandline +**Fix --fullscreen and fullscreenOnLoad options **Streamline editing RAM Watches **Tidy main form context menu **Add more options for U+D/L+R forbid/mutex +**Fix Ram Search, Ram Watch, Cheats recent file lists +**Fix ffmpeg path for AV writer broken a couple of releases ago +**Add menu command to record avi skipping av writer selection +**Remember codec selection between program sessions +**Fix toolbox +**Improvements to Retro shader compatibility +**DispMethod D3D: Stop FP precision conflicts with lua scripts +**DispMethod D3D: More leniency in compilation of optional shaders (so it's able to run on more low spec systems) **Fix #525 - Memorywatch hex textbox now remembers values across memdomain switches **Fix #526 - Hex editor repainting fails and garbage rendering **Fix #535 - domain list does not update when changing cores **Fix #537 - Annoyance with "always on top" **Fix #541 - Heavy CPU usage when emulation is paused +**Fix #546 - Incorrect Lua Documentation -**Tastudio (TODO - editorialize this section) -***color stated frames on WasLag too. -***don't truncate LagLog if the branch's one is shorter, but input is the same. -***clean up garbage lua text and drawings. -***put branch states to a separate greenzone file. -***tsm never actually uses currentBranch, so why should it have it? -***last preparation before new tasproject entry. -***save/load TasSession variables in .tasproj. -***update RowCount before scrolling to frame. -***account for mouse speed when advancing/rewinding. +**Cheats +***Add GameShark converter for N64, GB/GBC, Saturn, GBA, PSX +***Add Action Replay converter for SMS, SNES, Genesis, GBA +***Add Game Genie converter for Genesis, SNES, GG, NES + +**Tastudio +***Color stated frames on WasLag too +***Don't truncate LagLog if the branch's one is shorter, but input is the same +***Clean up garbage lua text and drawings in branches +***Default scroll speed to 3 +***Put branch states to a separate greenzone file +***Save/load TasSession variables (current frame and branch) in .tasproj +***Fix scrolling when loading a branch +***Account for mouse speed when advancing/rewinding +***Fix ALT+ hotkeys +***Update columns on every file load +***ScreenshotControl tweaks and fixes +***UserText in branches, available from lua and menu, is printed in ScreenshotControl +***Add GUI buttons to branch view and marker view +***Rightclick selects rows in branch and marker views +***Hotkeys and shortcuts for input view and branch view +***Add seeking progressbar +***Saving progressbar reports progress gradually +***Allow going to frame 0 for savestate-anchored movies +***Fix #515 - Save and load column settings in projects +***Fix #520 - An item with the same key has already been added +***Fix #504 - TAStudio opened several thousand Set Markers dialogs **Basic Bot ***Monospaced input display ***Get smarter **Lua -**Add tons of new fonts and text rendering options +**Add two new fonts (gens/snes9x and fceux) and text rendering options **Fix gameExtraPadding coordinate translation +**Fix (or at least temporarily banish) floating point math errors when running n64 +**Add CloseEmulatorWithCode (for returning exe process return code from script) **Clarify script pause/stop state in UI and logic +**Autoload recent scripts (unless there's a recent session to autoload) **Fix forms.destroyall() and call it when lua console closes **Fix error in sizing of lua draw buffers with SetGameExtraPadding (and probably ClientExtraPadding) use +**Fix #538 - Ability to pass memory domain to memory read/write functions *PSX **Fix #530 "AV Resizing shows black screen with PSX" @@ -55,7 +83,8 @@ next **Build dlls without msvcrt14 dependencies (to run on more systems) *Genesis -**Fix missing scrollbars in VDP viewer +**Add missing scrollbars in VDP viewer +**Fix #543 (support up to 32MB roms) ========================================= 1.11.3 diff --git a/LuaInterface/Lua/src/lua514.vcxproj b/LuaInterface/Lua/src/lua514.vcxproj index 57e51473af..536d9ff782 100644 --- a/LuaInterface/Lua/src/lua514.vcxproj +++ b/LuaInterface/Lua/src/lua514.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -20,27 +20,25 @@ ManagedCProj lua51 v4.0 + 8.1 DynamicLibrary Unicode - true - v100 + v140_xp true DynamicLibrary Unicode - true - v100 + v140_xp true DynamicLibrary Unicode - true - v100 + v140_xp @@ -86,7 +84,6 @@ - /clr %(AdditionalOptions) Disabled $(ProjectDir)..\src;%(AdditionalIncludeDirectories) LUA_BUILD_AS_DLL;%(PreprocessorDefinitions) @@ -95,9 +92,10 @@ Level3 ProgramDatabase 4996;%(DisableSpecificWarnings) + /Zc:threadSafeInit- %(AdditionalOptions) - ..\..\luaperks.lib;gdi32.lib;opengl32.lib;shell32.lib;user32.lib;comctl32.lib;kernel32.lib;ws2_32.lib;psapi.lib;AdvAPI32.Lib;ole32.lib;mpr.lib;comdlg32.lib;WinSpool.Lib + gdi32.lib;opengl32.lib;shell32.lib;user32.lib;comctl32.lib;kernel32.lib;ws2_32.lib;psapi.lib;AdvAPI32.Lib;ole32.lib;mpr.lib;comdlg32.lib;WinSpool.Lib $(OutDir)$(TargetName).dll true true @@ -107,6 +105,7 @@ $(OutDir)lua51.lib MachineX86 + Windows @@ -118,6 +117,7 @@ 4996;%(DisableSpecificWarnings) Cdecl _WINDLL;%(PreprocessorDefinitions) + /Zc:threadSafeInit- %(AdditionalOptions) .libs\luaperks.lib;gdi32.lib;opengl32.lib;shell32.lib;user32.lib;comctl32.lib;kernel32.lib;ws2_32.lib;psapi.lib;AdvAPI32.Lib;ole32.lib;mpr.lib;comdlg32.lib;WinSpool.Lib @@ -132,6 +132,7 @@ $(OutDir)lua51.lib MachineX86 + Windows @@ -159,6 +160,7 @@ 4996;%(DisableSpecificWarnings) Cdecl LUAPERKS;_WINDLL;%(PreprocessorDefinitions) + /Zc:threadSafeInit- %(AdditionalOptions) .libs\luaperks.lib;gdi32.lib;opengl32.lib;shell32.lib;user32.lib;comctl32.lib;kernel32.lib;ws2_32.lib;psapi.lib;AdvAPI32.Lib;ole32.lib;mpr.lib;comdlg32.lib;WinSpool.Lib @@ -173,6 +175,7 @@ $(OutDir)lua51.lib MachineX86 + Windows @@ -201,6 +204,12 @@ false false + true + true + true + false + false + false diff --git a/LuaInterface/LuaInterface.sln b/LuaInterface/LuaInterface.sln index 50776a5a8e..56fb380ace 100644 --- a/LuaInterface/LuaInterface.sln +++ b/LuaInterface/LuaInterface.sln @@ -1,6 +1,6 @@  Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 +# Visual Studio 2015 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lua51", "Lua\src\lua514.vcxproj", "{0A82CC4C-9A27-461C-8DB0-A65AC6393748}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LuaInterface", "LuaInterface\LuaInterface.csproj", "{F55CABBB-4108-4A39-94E1-581FD46DC021}" diff --git a/References/LuaInterface.dll b/References/LuaInterface.dll index 46bdb94093..bfdd781c34 100644 Binary files a/References/LuaInterface.dll and b/References/LuaInterface.dll differ diff --git a/References/lua51.dll b/References/lua51.dll index 62393ca2aa..22650d2c6f 100644 Binary files a/References/lua51.dll and b/References/lua51.dll differ diff --git a/Version/VersionInfo.cs b/Version/VersionInfo.cs index d795488a31..7b34588790 100644 --- a/Version/VersionInfo.cs +++ b/Version/VersionInfo.cs @@ -1,7 +1,7 @@ static class VersionInfo { - public const string MAINVERSION = "1.11.3"; // Use numbers only or the new version notification won't work - public static readonly string RELEASEDATE = "October 14, 2015"; + public const string MAINVERSION = "1.11.4"; // Use numbers only or the new version notification won't work + public static readonly string RELEASEDATE = "December 20, 2015"; public static readonly bool DeveloperBuild = true; public static readonly string HomePage = "http://tasvideos.org/BizHawk.html"; @@ -9,4 +9,4 @@ static class VersionInfo { return DeveloperBuild ? ("GIT " + SubWCRev.GIT_BRANCH + "#" + SubWCRev.GIT_SHORTHASH) : ("Version " + MAINVERSION); } -} +} diff --git a/genplus-gx/core/loadrom.h b/genplus-gx/core/loadrom.h index 3c292eedfc..e152b18739 100644 --- a/genplus-gx/core/loadrom.h +++ b/genplus-gx/core/loadrom.h @@ -40,7 +40,7 @@ #ifndef _LOADROM_H_ #define _LOADROM_H_ -#define MAXROMSIZE 10485760 +#define MAXROMSIZE (32*1024*1024) typedef struct { diff --git a/libsnes/vs2015/libsnes.vcxproj b/libsnes/vs2015/libsnes.vcxproj index 75f893b5a6..affaca50e4 100644 --- a/libsnes/vs2015/libsnes.vcxproj +++ b/libsnes/vs2015/libsnes.vcxproj @@ -98,6 +98,7 @@ HOOKS;BIZHAWK;PROFILE_PERFORMANCE;GAMEBOY;%(PreprocessorDefinitions) true false + /Zc:threadSafeInit- %(AdditionalOptions) true @@ -113,6 +114,7 @@ HOOKS;BIZHAWK;PROFILE_COMPATIBILITY;GAMEBOY;%(PreprocessorDefinitions) true false + /Zc:threadSafeInit- %(AdditionalOptions) true @@ -136,6 +138,7 @@ StreamingSIMDExtensions Fast MultiThreaded + /Zc:threadSafeInit- %(AdditionalOptions) true @@ -159,6 +162,7 @@ Speed true AnySuitable + /Zc:threadSafeInit- %(AdditionalOptions) true diff --git a/output/Lua/Genesis/Earthworm Jim 2.lua b/output/Lua/Genesis/Earthworm Jim 2.lua new file mode 100644 index 0000000000..7d5d626a82 --- /dev/null +++ b/output/Lua/Genesis/Earthworm Jim 2.lua @@ -0,0 +1,337 @@ +-- feos, 2015 + +--== Globals ==-- +local lastcfg = 0 +local dcfg = 0 +local rngcount = 0 +local rngobject = 0 +local rngroutine = 0 +local rngcolor = "white" +local MsgTime = 16 +local MsgStep = 256/MsgTime +local MsgTable = {} + +--== Slow stuff ==-- +local drawwalls = 1 +local drawfloor = 1 +local drawbg = 1 +local drawrng = 1 + +--== Shortcuts ==-- +local rb = memory.read_u8 +local rbs = memory.read_s8 +local rw = memory.read_u16_be +local rws = memory.read_s16_be +local rl = memory.read_u32_be +local box = gui.drawBox +local text = gui.pixelText +local line = gui.drawLine +local AND = bit.band +local SHIFTL = bit.lshift +local SHIFTR = bit.rshift + +event.onframestart(function() + rngcount = 0 + rngobject = 0 + rngcolor = "white" +end) + +event.onmemorywrite(function() + rngcount = rngcount+1 + rngcolor = "red" + rngobject = emu.getregister("M68K A1") + rngroutine = emu.getregister("M68K A0") + for i = 1, 30 do + if MsgTable[i] == nil then + MsgTable[i] = { + timer_ = MsgTime + emu.framecount(), + object_ = rngobject-0xff0000, + routine_ = rngroutine + } + break + end + end +end, 0xffa1d4) + +local function PostRngRoll(object,x,y) + if drawrng==0 then return end + for i = 1, #MsgTable do + if (MsgTable[i]) then + if object==MsgTable[i].object_ then + local color = 0x00ff0000+SHIFTL((MsgTable[i].timer_-emu.framecount())*MsgStep,24) + line(130,7*i+8,x,y,color) + text(120,7*i+8,string.format("%X",MsgTable[i].routine_),color) + end + if (MsgTable[i].timer_0 and id<130 and hbbase<0x300000) then + -- hitbox -- + local x1 = rb(hbbase+2,"MD CART") + local x2 = rb(hbbase+4,"MD CART") + local y1 = rb(hbbase+3,"MD CART") + local y2 = rb(hbbase+5,"MD CART") + if x1>0 and x2>0 and y1>0 and y2>0 then + if facing==-1 then + x1 = 256-x1 + x2 = 256-x2 + end + if d==-1 then + y1 = 256-y1 + y2 = 256-y2 + end + x1 = x+x1-of + x2 = x+x2-of + y1 = y+y1-of + y2 = y+y2-of + if id>=120 and id<=124 then color = 0xffff0000 end + box(x1,y1,x2,y2,color,0) + if hp>0 and id~=120 then text(x,y-2,hp,color) end + --text(x,y,string.format("%X",id),"yellow") + end + -- whip + if base==0xa20e then + local wx = rb(hbbase+6,"MD CART") + local wy = rb(hbbase+7,"MD CART") + local ww = rb(0xff0c) + local wh = rb(0xff0d) + if facing==-1 then wx = 256-wx end + if d ~= 0 then wy = 256-wy end + wx = wx+x-of + wy = wy+y-of + box(wx-ww,wy-wh,wx+ww,wy+wh,0xffff0000,0) + if invcount>0 then text(x,y,invcount) end + end + end + end + end +end + +local function GetFloor(x, y) + if drawfloor==0 then return {0,0} end + x = x*16+AND(camx,0xfff0) + y = y*16+AND(camy,0xfff0) + local d6 = SHIFTR(AND(y,0xfff0),3) + local a0 = rw(d6+0xb4e8) + local d0 = SHIFTR(x+0x10,4) + local d2 = AND(x,0xf) + local a1 = 0xb806+rw(0xfb9e) + local a2 = 0x273e1e + local d3 = SHIFTR(rw(a0+d0*2),1) + local temp = a1+d3 + if temp>0xffff then return {0,0} end + local d5 = SHIFTL(rb(temp),4)+d2 + local newd5 = SHIFTL(rb(a1+d3),4)+d2+15 + local newd0 = AND(rb(a2+newd5,"MD CART"),0x1f) + return {AND(rb(a2+d5,"MD CART"),0x1f), newd0} +end + +local function GetWall(x, y) + if drawwalls==0 then return 0 end + x = x*16+AND(camx,0xfff0) + y = y*16+AND(camy,0xfff0) + if y<0 then return 0 end + local d6 = SHIFTR(AND(y+6,0xfff0),3) + local a0 = rw(d6+0xb4e6) + local temp = a0+SHIFTR(x,4)*2 + if temp>0xffff then return 0 end + local d0 = rw(temp) + temp = 0xb808+SHIFTR(d0,1) + if temp>0xffff then return 0 end + return rb(temp) +end + +local function DrawBG() + if drawbg==0 then return end + for j=1,15 do + for i=1,21 do + local a0 = GetWall(i,j) + if a0>0 then + x1 = i*16-AND(camx,0xf)-16 + y1 = j*16-AND(camy,0xf)-16 + x2 = i*16-AND(camx,0xf)-1 + y2 = j*16-AND(camy,0xf)-1 + if a0==255 then -- normal + box(x1,y1,x2,y2,0xff00ffff,0x4400ffff) + elseif a0==228 then -- snot + box(x1,y1,x2,y2,0xff00ff00,0x4400ff00) + elseif a0==117 then -- right + box(x1,y1,x2,y2,0x4400ffff,0x4400ffff) + line(x2,y1,x2,y2,0xff00ffff) + elseif a0==116 then -- left + box(x1,y1,x2,y2,0x4400ffff,0x4400ffff) + line(x1,y1,x1,y2,0xff00ffff) + elseif a0==113 or a0==114 then -- grab corner + box(x1,y1,x2,y2,0x66ffff00,0x66ffff00) + elseif a0==60 or a0==61 + or a0>=74 and a0<=77 + or a0==58 or a0==59 then -- stomack + box(x1,y1,x2,y2,0xffff0000,0x44ff0000) + elseif a0==73 then -- stomack + box(x1,y1,x2,y2,0x44ff0000,0x44ff0000) + elseif a0==54 or a0==40 then -- kitchen + box(x1,y1,x2,y2,0xffff0000,0x44ff0000) + elseif a0==41 then -- kitchen + box(x1,y1,x2,y2,0x44ff0000,0x44ff0000) + else -- other occasional crap + box(x1,y1,x2,y2,0x66ffffff,0x66ffffff) + --text(x1,y1,a0) + end + end + + local d0 = GetFloor(i,j)[1] + if d0>0 then + local newd0 = GetFloor(i,j)[2] + if newd0>0 then + x1 = i*16-AND(camx,0xf) + y1 = j*16-AND(camy,0xf)+d0 + x2 = i*16-AND(camx,0xf)+15 + y2 = j*16-AND(camy,0xf)+newd0 + else + for k=-2,2 do + newd0 = GetFloor(i+1,j+k)[1] + if newd0>0 then + local add = 1 + if k==-2 then + k = 0 + add = -1 + elseif k==-1 then + add = 2 + elseif k==2 then + add = 1 + end + x1 = i*16-AND(camx,0xf) + y1 = j*16-AND(camy,0xf)+d0 + x2 = i*16-AND(camx,0xf)+16 + y2 = j*16-AND(camy,0xf)-newd0+k*16+add + --text(x1,y2,k,"red") + end + end + end + line(x1,y1,x2,y2,0xff00ff00) + end + end + end +end + +local function Seek() + bytes = 0 + waves = 0 + steps = 0 + local ret = "" + for bytes=0,10000 do + local cfg = rl(0xfc2a)+bytes + local action = rb(cfg, "MD CART") + local newaction = rb(cfg+1, "MD CART") + if action==0x7a then + waves=waves+1 + steps=steps+1 + end + if action==0x63 or action==0x64 or (action==0 and newaction==0) then + steps=steps+1 + end + if action>=0x30 and action<=0x32 then + if newaction==0x70 then + steps=steps+1 + elseif newaction==0x62 then + ret = string.format("BOMB in %d waves %d steps",waves,steps,bytes) + break + end + elseif action==3 then + ret = string.format("Forth in %d waves %d steps",waves,steps,bytes) + break + elseif action==0xe and newaction==8 then + ret = string.format("Back in %d waves %d steps",waves,steps,bytes) + break + end + end + text(120,7,ret) +end + +local function Bounce() + if rb(0xa515)==0x60 + then offset = 8 + else offset = 0 + end + local counter = rb(0xfc87) + local a0 = 0xfc88 + local d0 = SHIFTL(rb(a0+counter),5)+offset + local vel = rw(0x25d482+d0, "MD CART") + if vel == 0x200 then bounce = 3 + elseif vel == 0x3e0 then bounce = 1 + else bounce = 2 + end + text(60,0,string.format("bounce: %X",bounce)) +end + +local function Configs() + local rng = rl(0xa1d4) + text(120,0,string.format("rng: %08X:%d",rng,rngcount),rngcolor) + local cfg0 = rl(0xfc2a) + if cfg0==0 then return end + local cfg1 = rl(0xfc9a) + text(220,0,string.format("cfg old: %X\ncfg step: %d",cfg1,dcfg)) + if lastcfg~=cfg0 then dcfg = cfg0-lastcfg end + lastcfg = cfg0 + local h = 7 + for i=0,20 do + local config = rl(0xfc2a)+i + local action = rb(config,"MD CART") + local newaction = memory.readbyte(config+1,"MD CART") + if action==0x62 + or (action==0xe and newaction==8) + or action==8 + or action==3 then color = "red" + elseif action>=0x63 and action<=0x64 then color = "orange" + elseif action>=0x30 and action<=0x32 then color = 0xff00ff00 + elseif action>=0x65 and action<=0x70 then color = 0xff00cc00 + elseif action==0x7a then color = "white" + else color = 0xffaaaaaa + end + text(270,i*h+42,string.format("%X:%02X",config,action),color) + if i>0 + and action==0x7a + or action==0x2b + or action==0x2d + then break + end + end + Bounce() + Seek() +end + +while true do + camx = rw(0xa172) + camy = rw(0xa174) + scrx = rw(0xa176)-0x1000 + scry = rw(0xa178)-0x1000 + absx = rw(0xa17e)-0x1000 + absy = rw(0xa180)-0x1000 + invcount = rb(0xfbd6) + if rb(0xa313)==4 and rb(0xa317)~=2 then + DrawBG() + Objects(0xa2ea, 0x23) + Objects(0xa20e, 0) + Configs() + end + emu.frameadvance() +end \ No newline at end of file diff --git a/output/Lua/Genesis/Gargoyles.lua b/output/Lua/Genesis/Gargoyles.lua new file mode 100644 index 0000000000..ffaedf5b66 --- /dev/null +++ b/output/Lua/Genesis/Gargoyles.lua @@ -0,0 +1,287 @@ +-- Gargoyles, Genesis +-- feos, 2015 + +--== Shortcuts ==-- +local rb = memory.read_u8 +local rw = memory.read_u16_be +local rws = memory.read_s16_be +local rl = memory.read_u32_be +local box = gui.drawBox +local text = gui.pixelText +local line = gui.drawLine +local AND = bit.band +local SHIFT= bit.rshift +--== RAM addresses ==-- +local GlobalBase = 0x1c76 +local GolBase = 0x2c76 +local MapA_Buff = 0x4af0 +local mapline_tab = 0x0244 +local LevelFlr = 0x00c0 +local LevelCon = 0x00c4 +local levnum = 0x00ba +--== Camera Hack ==-- +local camhack = false +local div = 1 -- scale +local size = 16/div -- block size +--== Other stuff ==-- +local XposLast = 0 +local YposLast = 0 + +function main() + camx = (rws(0x010c)+16) + camy = (rws(0x010e)+16) + backx = camx + backy = camy + mapw = rw(0x00d4)*8 + maph = rw(0x00d6)*8 +-- text(100,0,mapw.." "..maph) + Xpos = rws(0x0106) + Ypos = rws(0x0108) + health = rws(0x2cc6) + facing = AND(rb(GolBase+0x48),2) -- object flag 1 + working= rb(0x0073) + if camhack then + camx = Xpos-320/2*div + camy = Ypos-224/2*div + end + run = rb(0x1699) + inv = rw(0x16d2) + rnd1 = rl(0x001c) + rnd2 = rw(0x0020) + Xspd = Xpos-XposLast + Yspd = Ypos-YposLast + XposLast = Xpos + YposLast = Ypos + rndlast = rnd1 + --[ [-- + if camhack then box(0,0,320,240,0,0x66000000) end + if working==0 then + box( + (backx-camx- 1)/div, + (backy-camy- 1)/div, + (backx-camx+320)/div, + (backy-camy+224)/div, + 0x0000ffff) + box( 0-camx/div+size, + 0-camy/div+size, + mapw/div-camx/div, + maph/div-camy/div, + 0xff0000ff) + end + for i=0,20*div do + for j=0,14*div do + GetBlock(i,j) + end + end + --]]-- + Objects() + PlayerBoxes() + HUD() + RoomTime() +end + +function RoomTime() + local start11 = 767 + local start12 = 2294 + local start13 = 4101 + local startl4 = 6000 + timer = emu.framecount() + if timer < start11 then room = timer + elseif timer < start12 then room = timer - start11 + elseif timer < start13 then room = timer - start12 + elseif timer < startl4 then room = timer - start13 + end + text(100,217,"room cnt: "..room) +end + +function GetBlock(x,y) + if working>0 then return end + x = camx+x*size*div-AND(camx,0xF) + y = camy+y*size*div-AND(camy,0xF) + if x>0 and x0 and y0 or rb(a1+8,"MD CART")>0 then + box(x1,y1,x2,y2,0x5500ff00,0x5500ff00) + for pixel=0,15 do + retc = rb(a1+pixel,"MD CART") -- contour + if retc>0 then + gui.drawPixel(x1+pixel/div,y1+retc/div-1/div,0xffffff00) + -- text(x1,y1,string.format("%X",retc)) + end + end + end + local lol = 0 + --if lol==0 then return end + if ret>0 then + if ret==0x80 then -- WALL + col = 0x00ffffff -- white + line(x1,y1,x1,y2,col+op) -- left + line(x2,y1,x2,y2,col+op) -- right + elseif ret==0x81 then -- CEILING + col = 0x00ffffff -- white + line(x1,y2,x2,y2,col+op) -- bottom + elseif ret==0x82 then -- CLIMB_U + col = 0x0000ffff -- cyan + line(x1,y2,x2,y2,col+op) -- bottom + elseif ret==0x83 then -- CLIMB_R + -- col = 0x00ffffff -- white + -- line(x2,y1,x2,y2,col+op) -- right + col = 0x0000ffff -- cyan + line(x1,y1,x1,y2,col+op) -- left + elseif ret==0x84 then -- CLIMB_L + -- col = 0x00ffffff -- white + -- line(x1,y1,x1,y2,col+op) -- left + col = 0x0000ffff -- cyan + line(x2,y1,x2,y2,col+op) -- right + elseif ret==0x85 then -- CLIMB_LR + col = 0x0000ffff -- cyan + line(x1,y1,x1,y2,col+op) -- left + line(x2,y1,x2,y2,col+op) -- right + elseif ret==0x86 then -- CLIMB_R_STAND_R + col = 0x00ffffff -- white + line(x1,y1,x2,y1,col+op) -- top + col = 0x0000ffff -- cyan + line(x1,y1,x1,y2,col+op) -- left + elseif ret==0x87 then -- CLIMB_L_STAND_L + col = 0x00ffffff -- white + line(x1,y1,x2,y1,col+op) -- top + col = 0x0000ffff -- cyan + line(x2,y1,x2,y2,col+op) -- right + elseif ret==0x87 then -- CLIMB_LR_STAND_LR + col = 0x00ffffff -- white + line(x1,y1,x2,y1,col+op) -- top + col = 0x00ff00ff -- cyan + line(x1,y1,x1,y2,col+op) -- left + col = 0x0000ffff -- cyan + line(x2,y1,x2,y2,col+op) -- right + elseif ret==0x70 then -- GRAB_SWING + col = 0x0000ff00 -- green + box(x1,y1,x2,y2,col,col+opout) + -- elseif ret==0x72 then -- FORCE_TURN (for enemies) + -- col = 0x0088ff00 -- green + -- box(x1,y1,x2,y2,col,col+opout) + elseif ret==0x7f then -- EXIT + col = 0x00ffff00 -- yellow + elseif ret==0xd0 or ret==0xd1 then -- SPIKES + col = 0x00ff0000 -- red + box(x1,y1,x2,y2,col,col+opout) + else -- LEVEL_SPECIFIC + col = 0x00ff8800 -- orange + box(x1,y1,x2,y2,col+opin,col+opout) + end + box(x1,y1,x2,y2,col+opin,col+opout) + -- text(x1,y1,string.format("%X",ret)) + end + end +end + +function HUD() + if working>0 then return end + if camhack then ch = "on" else ch = "off" end + if rndlast~= rnd1 then rndcol = "red" else rndcol = "white" end + if memory.readbyte(0xF6D4)==0 then text(170,217,"LAG","red") end + text(280,210,string.format("cHack: %s\nscale: %d",ch,div)) + text( 0,217,"rnd: ","yellow") + text( 20,217,string.format("%08X %04X",rnd1,rnd2),rndcol) + text(290, 0,string.format( + "x: %4d\ny: %4d\ndx: %3d\ndy: %3d\nhp: %3d\nrun:%3d\ninv:%3d", + Xpos,Ypos,Xspd,Yspd,health,run,inv),"yellow" + ) +end + +function Objects() + if working>0 then return end + for i=0,63 do + local base = GlobalBase+i*128 + local flag2 = AND(rb(base+0x49),0x10) -- active + if flag2==0x10 then + local xpos = rw(base+0x00) + local ypos = rw(base+0x02) + -- local anm = rl(base+0x20) + local dmg = rb(base+0x10) + local type = rw(base+0x40) + local hp = rw(base+0x50) + local cRAM = rw(base+0x76) -- pointer to 4 collision boxes per object + local col = 0 -- collision color + local xscr = (xpos-camx)/div + local yscr = (ypos-camy)/div + if type==0 then + -- gui.text(xscr,yscr,string.format("%X",anm)) + end + for boxx=0,4 do + local x1 = (rws(cRAM+boxx*8+0)-camx)/div + local y1 = (rws(cRAM+boxx*8+2)-camy)/div + local x2 = (rws(cRAM+boxx*8+4)-camx)/div + local y2 = (rws(cRAM+boxx*8+6)-camy)/div + if boxx==0 then + col = 0xff00ff00 -- body + if type==282 or type==258 then hp = 1 end -- archer hp doesn't matter + if hp>0 and type>0 then + text(x1+2,y1+1,string.format("%d",hp),col) + end + elseif boxx==1 then + col = 0xffffff00 -- floor + elseif boxx==2 then + if dmg>0 then + col = 0xffff0000 -- projectile + else + col = 0xff8800ff -- item + end + if dmg>0 then + text(x1+2,y2+1,string.format("%d",dmg),col) + end + else + col = 0xffffffff -- other + end + if x1~=0x8888 and x2<320 and x1>0 and y2<224 and y1>0 then + box(x1,y1,x2,y2,col) + end + end + end + end +end + +function PlayerBoxes() + if working>0 then return end + xx = (Xpos-camx)/div + yy = (Ypos-camy)/div + local col = 0xff00ffff + local swcol = col -- usual detection + if Yspd>0 then -- gimme swings to grab!!! + swcol = 0xff00ff00 + elseif Yspd==0 then -- can tell that too + swcol = 0xffffffff + end + if facing==2 then + box(xx-0xf /div-2,yy-0x2c/div-1,xx-0xf /div+0,yy-0x2c/div+1,swcol) -- lefttop + else + box(xx+0xf /div-1,yy-0x2c/div-1,xx+0xf /div+1,yy-0x2c/div+1,swcol) -- rightttop + end + box(xx -1,yy-0x2c/div-1,xx +1,yy-0x2c/div+1,col) -- top + box(xx-0xf /div-2,yy-0x1f/div-1,xx-0xf /div+0,yy-0x1f/div+1,col) -- left + box(xx+0x10/div-1,yy-0x1f/div-1,xx+0x10/div+1,yy-0x1f/div+1,col) -- right +-- box(xx -1,yy-0x1f/div-1,xx +1,yy-0x1f/div+1,col) -- center + box(xx -1,yy-0x0f/div-1,xx +1,yy-0x0f/div+1,col) -- bottom + box(xx -1,yy -1,xx +1,yy +1,0xffffff00) -- feet +-- box(xx -1,yy+0x10/div-1,xx +1,yy+0x10/div+1,col) -- ground +end + +--event.onframeend(main) + +while true do + main() + emu.frameadvance() +end \ No newline at end of file diff --git a/output/Lua/tasjudy.bat b/output/Lua/tasjudy.bat new file mode 100644 index 0000000000..13b09c7357 --- /dev/null +++ b/output/Lua/tasjudy.bat @@ -0,0 +1,38 @@ +@echo off +ECHO Hello. I am TASJudy. Prepare to be Judged. +setlocal EnableDelayedExpansion +del results\failed.txt >nul 2>&1 + +for /r %%i in (movies\*) do ( + set currentmovie=%%i + + echo Processing %%i... + start "" /B "F:\competition\bizhawk\EmuHawk.exe" rom\mystery.nes --movie=%%i + + echo Waiting for run to finish... + TIMEOUT /T 1 >nul + call :CheckForExe +) + +echo Done +pause +exit /b + +:CheckForExe +tasklist /FI "IMAGENAME eq EmuHawk.exe" 2>NUL | find /I /N "EmuHawk.exe">NUL + +if %ERRORLEVEL% == 1 goto ResultsAreIn + +TIMEOUT /T 1 >nul +call :CheckForExe +exit /b + + +:ResultsAreIn +echo Results are in for !currentmovie! +call :kill +exit /b + +:kill +taskkill /f /im EmuHawk.exe >nul 2>&1 +exit /b diff --git a/output/Lua/tasjudy.lua b/output/Lua/tasjudy.lua new file mode 100644 index 0000000000..8591a4711a --- /dev/null +++ b/output/Lua/tasjudy.lua @@ -0,0 +1,138 @@ +-- +-- TASJudy - Judges so you don't have to. +-- Author: Raiscan +-- Timestamp: 201508041957 +-- Version: 0.1 +-- To change this template use File | Settings | File Templates. +-- + +local resultsFilePath = "F:\\competition\\results\\results.txt" +local gracePeriod = 10000 +local gracePeriodCounter = 0 +local separator = "," +local exitOnResults = true + +local FAILURE_DOES_NOT_FINISH = "DNF" +local FAILURE_DISQUALIFIED = "DQ" + +-- Main Function -- +function judge() + if movie.startsfromsavestate() then + console.log("Movie starts from savestate, so disqualifying") + + writeFailureToResults(FAILURE_DISQUALIFIED) + + endScript() + return + end + + while not hasCompletedGame() do + + if movieHasFinished() then + if gracePeriodLimiter() then + console.log("Movie does not finish the game :(") + writeFailureToResults(FAILURE_DOES_NOT_FINISH) + + endScript() + return + end + end + + --The show must go on + emu.frameadvance() + end + + --We must have finished! + console.log("Movie finished game.") + writeSuccessToResults(emu.framecount(), getInGameTime()) + + endScript() +end + + +-------- HELPER FUNCTIONS BELOW --------- + +-- Edit this with game completion criteria as necessary -- +function hasCompletedGame() + return mainmemory.read_s8(0x002C) == 1 +end + + +-- Edit this with functionality for in game time -- +function getInGameTime() + local millis = bizstring.hex(mainmemory.read_u8(0x0050)):reverse() + local seconds = bizstring.hex(mainmemory.read_u8(0x004F)):reverse() + local minutes = bizstring.hex(mainmemory.read_u8(0x004E)):reverse() + + return minutes .. ":" .. seconds .. "." .. millis +end + + +-- Ends the script. If exitOnResults set, exits emulator. +function endScript() + client.pause() + if exitOnResults then + client.closerom() + client.exitCode(emu.framecount()) + end +end + +-- Parses the hash of the movie file calculated by RGamma's uploader. +function parseHash() + local moviePath = movie.filename() + local movieFile = moviePath:match("([^\\]+)$") + local hash = movieFile:match("^([^.]+)") + + return hash +end + + +-- Alias for writing results; blanks out times with reason. +function writeFailureToResults(reason) + + writeResults(parseHash(), movie.getheader()["Author"], reason, reason, reason) +end + +-- Alias for writing results; takes in endFrame and in game time -- +function writeSuccessToResults(endFrame, inGameTime) + + writeResults(parseHash(), movie.getheader()["Author"], endFrame, movie.length(), inGameTime) +end + +function movieHasFinished() + return movie.mode() == "FINISHED" or not movie.isloaded() +end + +-- Opens results file and writes a single line of all information gathered -- +function writeResults(hash, author, endFrame, length, inGameTime) + local resultsFile, err = io.open(resultsFilePath, "a") + + if err then + console.log("Could not write results " .. err) + else + local hash = parseHash() + local resultsLine = hash .. + separator .. + author .. + separator .. + endFrame .. + separator .. + length .. + separator .. + inGameTime + + + resultsFile:write(resultsLine .. "\n") + resultsFile:close() + end +end + +function gracePeriodLimiter() + if gracePeriodCounter < gracePeriod then + gracePeriodCounter = gracePeriodCounter + 1 + end + + return gracePeriodCounter >= gracePeriod +end + +judge() diff --git a/output/Lua/tasjudy.py b/output/Lua/tasjudy.py new file mode 100644 index 0000000000..50e334c44e --- /dev/null +++ b/output/Lua/tasjudy.py @@ -0,0 +1,18 @@ +import os +import datetime +from multiprocessing import Pool + +bizhawkPath = "" +romPath = "" +moviePath = "" + +def emu(arg): + ret = os.system(bizhawkPath + " " + romPath + " --movie=" + moviePath) + print("Ending %d with %d at %s" % (arg,ret,datetime.datetime.now().time())) + +if __name__ == '__main__': + print("Starting at %s" % datetime.datetime.now().time()) + p = Pool(processes=4) + p.map(emu,range(1)) + print("Ending parent at %s" % datetime.datetime.now().time()) + diff --git a/output/dll/libgenplusgx.dll b/output/dll/libgenplusgx.dll index f9e8e32a89..5c5d2f008a 100644 Binary files a/output/dll/libgenplusgx.dll and b/output/dll/libgenplusgx.dll differ diff --git a/output/dll/libsneshawk-32-compatibility.dll b/output/dll/libsneshawk-32-compatibility.dll index fea764ec23..36389c49c8 100644 Binary files a/output/dll/libsneshawk-32-compatibility.dll and b/output/dll/libsneshawk-32-compatibility.dll differ diff --git a/output/dll/libsneshawk-32-performance.dll b/output/dll/libsneshawk-32-performance.dll index 1d1e77fbf5..21f1c9a1a5 100644 Binary files a/output/dll/libsneshawk-32-performance.dll and b/output/dll/libsneshawk-32-performance.dll differ diff --git a/output/dll/octoshock.dll b/output/dll/octoshock.dll index 1dadf2281d..751238f81c 100644 Binary files a/output/dll/octoshock.dll and b/output/dll/octoshock.dll differ diff --git a/psx/octoshock/psx/cpu.cpp b/psx/octoshock/psx/cpu.cpp index 4be2a6699e..a62047975b 100644 --- a/psx/octoshock/psx/cpu.cpp +++ b/psx/octoshock/psx/cpu.cpp @@ -29,6 +29,8 @@ //not very organized, is it void* g_ShockTraceCallbackOpaque = NULL; ShockCallback_Trace g_ShockTraceCallback = NULL; +ShockCallback_Mem g_ShockMemCallback; +eShockMemCb g_ShockMemCbType; /* TODO Make sure load delays are correct. @@ -252,6 +254,9 @@ INLINE T PS_CPU::ReadMemory(pscpu_timestamp_t ×tamp, uint32 address, bool D ReadAbsorb[ReadAbsorbWhich] = 0; ReadAbsorbWhich = 0; + if (g_ShockMemCallback && (g_ShockMemCbType & eShockMemCb_Read)) + g_ShockMemCallback(address, eShockMemCb_Read, DS24 ? 24 : 32, 0); + address &= addr_mask[address >> 29]; if(address >= 0x1F800000 && address <= 0x1F8003FF) @@ -296,6 +301,9 @@ INLINE T PS_CPU::ReadMemory(pscpu_timestamp_t ×tamp, uint32 address, bool D template INLINE void PS_CPU::WriteMemory(pscpu_timestamp_t ×tamp, uint32 address, uint32 value, bool DS24) { + if (g_ShockMemCallback && (g_ShockMemCbType & eShockMemCb_Write)) + g_ShockMemCallback(address, eShockMemCb_Write, DS24 ? 24 : 32, value); + if(MDFN_LIKELY(!(CP0.SR & 0x10000))) { address &= addr_mask[address >> 29]; diff --git a/psx/octoshock/psx/dma.cpp b/psx/octoshock/psx/dma.cpp index 145f2d711c..da8ce6c618 100644 --- a/psx/octoshock/psx/dma.cpp +++ b/psx/octoshock/psx/dma.cpp @@ -44,6 +44,7 @@ enum CH_OT = 6, }; +extern bool GpuFrameForLag; // RunChannels(128 - whatevercounter); // @@ -256,7 +257,11 @@ static INLINE void ChRW(const unsigned ch, const uint32 CRModeCache, uint32 *V, case CH_GPU: if(CRModeCache & 0x1) + { + if(DMACH[CH_GPU].ChanControl == 0x01000401) + GpuFrameForLag = true; GPU->WriteDMA(*V); + } else *V = GPU->ReadDMA(); break; diff --git a/psx/octoshock/psx/psx.cpp b/psx/octoshock/psx/psx.cpp index e57a3afe10..b95c9f6b22 100644 --- a/psx/octoshock/psx/psx.cpp +++ b/psx/octoshock/psx/psx.cpp @@ -51,6 +51,7 @@ int16 soundbuf[1024 * 1024]; //how big? big enough. int VTBackBuffer = 0; +bool GpuFrameForLag = false; static MDFN_Rect VTDisplayRects[2]; #include "video/Deinterlacer.h" static bool PrevInterlaced; @@ -547,8 +548,15 @@ template static INLINE void MemRW(pscpu if(!IsWrite) timestamp++; - if(IsWrite) - MDEC_Write(timestamp, A, V); + if (IsWrite) + { + if (A == 0x1F801820) + { + //per pcsx-rr: + GpuFrameForLag = true; + } + MDEC_Write(timestamp, A, V); + } else V = MDEC_Read(timestamp, A); @@ -1407,6 +1415,8 @@ EW_EXPORT s32 shock_Step(void* psx, eShockStep step) static const int ResampleQuality = 5; SPU->StartFrame(espec.SoundRate, ResampleQuality); + GpuFrameForLag = false; + Running = -1; timestamp = CPU->Run(timestamp, psx_dbg_level >= PSX_DBG_BIOS_PRINT, /*psf_loader != NULL*/ false); //huh? assert(timestamp); @@ -2700,6 +2710,8 @@ EW_EXPORT s32 shock_SetRenderOptions(void* pxs, ShockRenderOptions* opts) extern void* g_ShockTraceCallbackOpaque; extern ShockCallback_Trace g_ShockTraceCallback; +extern ShockCallback_Mem g_ShockMemCallback; +extern eShockMemCb g_ShockMemCbType; //Sets the callback to be used for CPU tracing EW_EXPORT s32 shock_SetTraceCallback(void* psx, void* opaque, ShockCallback_Trace callback) @@ -2710,9 +2722,24 @@ EW_EXPORT s32 shock_SetTraceCallback(void* psx, void* opaque, ShockCallback_Trac return SHOCK_OK; } +//Sets the callback to be used for memory hook events +EW_EXPORT s32 shock_SetMemCb(void* psx, ShockCallback_Mem callback, eShockMemCb cbMask) +{ + g_ShockMemCallback = callback; + g_ShockMemCbType = cbMask; + return SHOCK_OK; +} + //Sets whether LEC is enabled (sector level error correction). Defaults to FALSE (disabled) EW_EXPORT s32 shock_SetLEC(void* psx, bool enabled) { CDC->SetLEC(enabled); return SHOCK_OK; +} + +//whether "determine lag from GPU frames" signal is set (GPU did something considered non-lag) +//returns SHOCK_TRUE or SHOCK_FALSE +EW_EXPORT s32 shock_GetGPUUnlagged(void* psx) +{ + return GpuFrameForLag ? SHOCK_TRUE : SHOCK_FALSE; } \ No newline at end of file diff --git a/psx/octoshock/psx/psx.h b/psx/octoshock/psx/psx.h index 44b297e4f7..85267ddf7b 100644 --- a/psx/octoshock/psx/psx.h +++ b/psx/octoshock/psx/psx.h @@ -192,6 +192,13 @@ enum eShockMemcardTransaction eShockMemcardTransaction_CheckDirty = 4, //checks whether the memcard is dirty }; +enum eShockMemCb +{ + eShockMemCb_None = 0, + eShockMemCb_Read = 1, + eShockMemCb_Write = 2, + eShockMemCb_Execute = 4 +}; #define MDFN_MSC_RESET 0 #define MDFN_MSC_POWER 1 @@ -237,7 +244,12 @@ typedef s32 (*ShockDisc_ReadTOC)(void* opaque, ShockTOC *read_target, ShockTOCTr typedef s32 (*ShockDisc_ReadLBA)(void* opaque, s32 lba, void* dst); //The callback to be issued for traces -typedef s32 (*ShockCallback_Trace)(void* opaque, u32 PC, u32 inst, const char* msg); +typedef void (*ShockCallback_Trace)(void* opaque, u32 PC, u32 inst, const char* msg); + +//the callback to be issued for memory hook events +//note: only one callback can be set. the type is sent to mask that one callback, not indicate which event type the callback is fore. +//there isnt one callback per type. +typedef void (*ShockCallback_Mem)(u32 address, eShockMemCb type, u32 size, u32 value); class ShockDiscRef { @@ -416,4 +428,8 @@ EW_EXPORT s32 shock_SetRegister_CPU(void* psx, s32 index, u32 value); EW_EXPORT s32 shock_SetTraceCallback(void* psx, void* opaque, ShockCallback_Trace callback); //Sets whether LEC is enabled (sector level error correction). Defaults to FALSE (disabled) -EW_EXPORT s32 shock_SetLEC(void* psx, bool enabled); \ No newline at end of file +EW_EXPORT s32 shock_SetLEC(void* psx, bool enabled); + +//whether "determine lag from GPU frames" signal is set (GPU did something considered non-lag) +//returns SHOCK_TRUE or SHOCK_FALSE +EW_EXPORT s32 shock_GetGPUUnlagged(void* psx); \ No newline at end of file