This commit is contained in:
Suuper 2016-01-29 12:30:04 -06:00
commit 6f95431637
165 changed files with 8975 additions and 3346 deletions

View File

@ -0,0 +1,92 @@
using System;
namespace BizHawk.Client.ApiHawk
{
/// <summary>
/// This class hold logic interraction for the ExternalToolAttribute
/// This attribute helps BizHawk to handle ExternalTools
/// </summary>
[AttributeUsage(AttributeTargets.Assembly)]
public sealed class BizHawkExternalToolAttribute : Attribute
{
#region Fields
private string _Name;
private string _Description;
private string _IconResourceName;
#endregion
#region cTor(s)
/// <summary>
/// Initialize a new instance of <see cref="BizHawkExternalToolAttribute"/>
/// </summary>
/// <param name="name">Tool's name</param>
/// <param name="description">Small description about the tool itself</param>
/// <param name="iconResourceName">Icon embedded resource name</param>
public BizHawkExternalToolAttribute(string name, string description, string iconResourceName)
{
_Name = name;
_Description = description;
_IconResourceName = iconResourceName;
}
/// <summary>
/// Initialize a new instance of <see cref="BizHawkExternalToolAttribute"/>
/// </summary>
/// <param name="name">Tool's name</param>
/// <param name="description">Small description about the tool itself</param>
public BizHawkExternalToolAttribute(string name, string description)
: this(name, description, string.Empty)
{ }
/// <summary>
/// Initialize a new instance of <see cref="BizHawkExternalToolAttribute"/>
/// </summary>
/// <param name="name">Tool's name</param>
public BizHawkExternalToolAttribute(string name)
:this(name, string.Empty, string.Empty)
{}
#endregion
#region Properties
/// <summary>
/// Gets tool's friendly name
/// </summary>
public string Name
{
get
{
return _Name;
}
}
/// <summary>
/// Gets tool's descriptino
/// </summary>
public string Description
{
get
{
return _Description;
}
}
/// <summary>
/// Get the name of the embedded resource icon
/// </summary>
/// <remarks>Don't forget to set compile => Embedded reource to the icon file in your project</remarks>
public string IconResourceName
{
get
{
return _IconResourceName;
}
}
#endregion
}
}

View File

@ -1,96 +1,102 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}</ProjectGuid> <ProjectGuid>{8E2F11F2-3955-4382-8C3A-CEBA1276CAEA}</ProjectGuid>
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder> <AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>BizHawk.Client.ApiHawk</RootNamespace> <RootNamespace>BizHawk.Client.ApiHawk</RootNamespace>
<AssemblyName>BizHawk.Client.ApiHawk</AssemblyName> <AssemblyName>BizHawk.Client.ApiHawk</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType> <DebugType>full</DebugType>
<Optimize>false</Optimize> <Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath> <OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants> <DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget> <PlatformTarget>x86</PlatformTarget>
</PropertyGroup> <DocumentationFile>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> </DocumentationFile>
<DebugType>pdbonly</DebugType> </PropertyGroup>
<Optimize>true</Optimize> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<OutputPath>bin\Release\</OutputPath> <DebugType>pdbonly</DebugType>
<DefineConstants>TRACE</DefineConstants> <Optimize>true</Optimize>
<ErrorReport>prompt</ErrorReport> <OutputPath>bin\Release\</OutputPath>
<WarningLevel>4</WarningLevel> <DefineConstants>TRACE</DefineConstants>
</PropertyGroup> <ErrorReport>prompt</ErrorReport>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'"> <WarningLevel>4</WarningLevel>
<DebugSymbols>true</DebugSymbols> <DocumentationFile>
<OutputPath>..\output\dll\</OutputPath> </DocumentationFile>
<DefineConstants>DEBUG;TRACE</DefineConstants> </PropertyGroup>
<DebugType>full</DebugType> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<PlatformTarget>x86</PlatformTarget> <DebugSymbols>true</DebugSymbols>
<ErrorReport>prompt</ErrorReport> <OutputPath>..\output\dll\</OutputPath>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <DefineConstants>DEBUG;TRACE</DefineConstants>
</PropertyGroup> <DebugType>full</DebugType>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'"> <PlatformTarget>x86</PlatformTarget>
<OutputPath>..\output\dll\</OutputPath> <ErrorReport>prompt</ErrorReport>
<DefineConstants>TRACE</DefineConstants> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Optimize>true</Optimize> <DocumentationFile>
<DebugType>pdbonly</DebugType> </DocumentationFile>
<PlatformTarget>x86</PlatformTarget> </PropertyGroup>
<ErrorReport>prompt</ErrorReport> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <OutputPath>..\output\dll\</OutputPath>
</PropertyGroup> <DefineConstants>TRACE</DefineConstants>
<ItemGroup> <Optimize>true</Optimize>
<Reference Include="System" /> <DebugType>pdbonly</DebugType>
<Reference Include="System.Core" /> <PlatformTarget>x86</PlatformTarget>
<Reference Include="System.Windows.Forms" /> <ErrorReport>prompt</ErrorReport>
<Reference Include="System.Xml.Linq" /> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Reference Include="System.Data.DataSetExtensions" /> <DocumentationFile>
<Reference Include="Microsoft.CSharp" /> </DocumentationFile>
<Reference Include="System.Data" /> </PropertyGroup>
<Reference Include="System.Xml" /> <ItemGroup>
</ItemGroup> <Reference Include="System" />
<ItemGroup> <Reference Include="System.Core" />
<Compile Include="Attributes\ConfigPersistAttribute.cs" /> <Reference Include="System.Drawing" />
<Compile Include="Interfaces\IToolFormAutoConfig.cs" /> <Reference Include="System.Windows.Forms" />
<Compile Include="Interfaces\IExternalToolForm.cs" /> <Reference Include="System.Xml.Linq" />
<Compile Include="Interfaces\IToolForm.cs" /> <Reference Include="System.Data.DataSetExtensions" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Reference Include="Microsoft.CSharp" />
</ItemGroup> <Reference Include="System.Data" />
<ItemGroup> <Reference Include="System.Xml" />
<ProjectReference Include="..\BizHawk.Client.Common\BizHawk.Client.Common.csproj"> </ItemGroup>
<Project>{24a0aa3c-b25f-4197-b23d-476d6462dba0}</Project> <ItemGroup>
<Name>BizHawk.Client.Common</Name> <Compile Include="Attributes\ExternalToolAttribute.cs" />
</ProjectReference> <Compile Include="Classes\ExternalToolManager.cs" />
<ProjectReference Include="..\BizHawk.Common\BizHawk.Common.csproj"> <Compile Include="Interfaces\IExternalToolForm.cs" />
<Project>{866f8d13-0678-4ff9-80a4-a3993fd4d8a3}</Project> <Compile Include="Properties\AssemblyInfo.cs" />
<Name>BizHawk.Common</Name> </ItemGroup>
</ProjectReference> <ItemGroup>
<ProjectReference Include="..\BizHawk.Emulation.Common\BizHawk.Emulation.Common.csproj"> <ProjectReference Include="..\BizHawk.Client.Common\BizHawk.Client.Common.csproj">
<Project>{e1a23168-b571-411c-b360-2229e7225e0e}</Project> <Project>{24a0aa3c-b25f-4197-b23d-476d6462dba0}</Project>
<Name>BizHawk.Emulation.Common</Name> <Name>BizHawk.Client.Common</Name>
</ProjectReference> </ProjectReference>
</ItemGroup> <ProjectReference Include="..\BizHawk.Common\BizHawk.Common.csproj">
<ItemGroup> <Project>{866f8d13-0678-4ff9-80a4-a3993fd4d8a3}</Project>
<Folder Include="Classes\" /> <Name>BizHawk.Common</Name>
</ItemGroup> </ProjectReference>
<ItemGroup> <ProjectReference Include="..\BizHawk.Emulation.Common\BizHawk.Emulation.Common.csproj">
<None Include="Resources\ApiClassDiagram.cd" /> <Project>{e1a23168-b571-411c-b360-2229e7225e0e}</Project>
</ItemGroup> <Name>BizHawk.Emulation.Common</Name>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> </ProjectReference>
</ItemGroup>
<ItemGroup />
<ItemGroup>
<None Include="Resources\ApiClassDiagram.cd" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild"> <Target Name="BeforeBuild">
</Target> </Target>
<Target Name="AfterBuild"> <Target Name="AfterBuild">
</Target> </Target>
--> -->
</Project> </Project>

View File

@ -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
{
/// <summary>
/// This static class handle all ExternalTools
/// </summary>
public static class ExternalToolManager
{
#region Fields
private static FileSystemWatcher directoryMonitor;
private static List<ToolStripMenuItem> menuItems = new List<ToolStripMenuItem>();
#endregion
#region cTor(s)
/// <summary>
/// Initilization
/// </summary>
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
/// <summary>
/// Build the toolstrip menu
/// </summary>
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));
}
}
}
/// <summary>
/// Generate a <see cref="ToolStripMenuItem"/> from an
/// external tool dll.
/// The assembly must have <see cref="BizHawkExternalToolAttribute"/> in its
/// assembly attributes
/// </summary>
/// <param name="fileName">File that will be reflected</param>
/// <returns>A new <see cref="ToolStripMenuItem"/>; assembly path can be found in the Tag property</returns>
/// <remarks>For the moment, you could only load a dll that have a form (which implements <see cref="IExternalToolForm"/>)</remarks>
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<Type>(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;
}
/// <summary>
/// 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
/// </summary>
/// <param name="sender">Object that raised the event</param>
/// <param name="e">Event arguments</param>
private static void DirectoryMonitor_Created(object sender, FileSystemEventArgs e)
{
menuItems.Add(GenerateToolTipFromFileName(e.FullPath));
}
#endregion
#region Properties
/// <summary>
/// Gets a prebuild <see cref="ToolStripMenuItem"/>
/// This list auto-updated by the <see cref="ExternalToolManager"/> itself
/// </summary>
public static IEnumerable<ToolStripMenuItem> ToolStripMenu
{
get
{
return menuItems;
}
}
#endregion
}
}

View File

@ -1,14 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<ClassDiagram MajorVersion="1" MinorVersion="1" MembersFormat="FullSignature"> <ClassDiagram MajorVersion="1" MinorVersion="1" MembersFormat="FullSignature">
<Class Name="BizHawk.Client.EmuHawk.ConfigPersistAttribute">
<Position X="11.5" Y="0.75" Width="1.75" />
<TypeIdentifier>
<HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
<FileName>Attributes\ConfigPersistAttribute.cs</FileName>
</TypeIdentifier>
</Class>
<Class Name="BizHawk.Client.Common.Watch"> <Class Name="BizHawk.Client.Common.Watch">
<Position X="17" Y="0.75" Width="8.75" /> <Position X="17" Y="0.75" Width="10" />
<Compartments> <Compartments>
<Compartment Name="Nested Types" Collapsed="false" /> <Compartment Name="Nested Types" Collapsed="false" />
</Compartments> </Compartments>
@ -16,19 +9,19 @@
<Lollipop Orientation="Left" Position="0.1" /> <Lollipop Orientation="Left" Position="0.1" />
</Class> </Class>
<Class Name="BizHawk.Client.Common.SeparatorWatch"> <Class Name="BizHawk.Client.Common.SeparatorWatch">
<Position X="6" Y="19" Width="2.75" /> <Position X="6" Y="19" Width="3.25" />
<TypeIdentifier /> <TypeIdentifier />
</Class> </Class>
<Class Name="BizHawk.Client.Common.ByteWatch"> <Class Name="BizHawk.Client.Common.ByteWatch">
<Position X="28.5" Y="19" Width="8.5" /> <Position X="28.5" Y="19" Width="3.25" />
<TypeIdentifier /> <TypeIdentifier />
</Class> </Class>
<Class Name="BizHawk.Client.Common.WordWatch"> <Class Name="BizHawk.Client.Common.WordWatch">
<Position X="9.5" Y="19" Width="8.75" /> <Position X="9.5" Y="19" Width="3.25" />
<TypeIdentifier /> <TypeIdentifier />
</Class> </Class>
<Class Name="BizHawk.Client.Common.DWordWatch"> <Class Name="BizHawk.Client.Common.DWordWatch">
<Position X="19" Y="19" Width="8.75" /> <Position X="19" Y="19" Width="3.25" />
<TypeIdentifier /> <TypeIdentifier />
</Class> </Class>
<Class Name="BizHawk.Client.Common.WatchList"> <Class Name="BizHawk.Client.Common.WatchList">
@ -36,14 +29,27 @@
<Compartments> <Compartments>
<Compartment Name="Nested Types" Collapsed="false" /> <Compartment Name="Nested Types" Collapsed="false" />
</Compartments> </Compartments>
<NestedTypes>
<Enum Name="BizHawk.Client.Common.WatchList.WatchPrevDef">
<TypeIdentifier />
</Enum>
</NestedTypes>
<TypeIdentifier /> <TypeIdentifier />
<Lollipop Orientation="Right" Position="0.1" /> <Lollipop Orientation="Right" Position="0.1" />
</Class> </Class>
<Class Name="BizHawk.Client.EmuHawk.ConfigPersistAttribute">
<Position X="11.5" Y="0.75" Width="2" />
<TypeIdentifier />
</Class>
<Class Name="BizHawk.Client.ApiHawk.ExternalToolManager">
<Position X="4.75" Y="6.75" Width="4.75" />
<TypeIdentifier>
<HashCode>AAAAAQAAAAAAAAAAAAAQAAAAAAgBAAAAAAACAAAAAAI=</HashCode>
<FileName>Classes\ExternalToolManager.cs</FileName>
</TypeIdentifier>
</Class>
<Class Name="BizHawk.Client.ApiHawk.BizHawkExternalToolAttribute">
<Position X="11" Y="2.25" Width="5.75" />
<TypeIdentifier>
<HashCode>AAAAAAAAAAAgAAAAIAAAIAQAAAAAACAEAAAAAAAAAAA=</HashCode>
<FileName>Attributes\ExternalToolAttribute.cs</FileName>
</TypeIdentifier>
</Class>
<Interface Name="BizHawk.Client.EmuHawk.IExternalToolForm"> <Interface Name="BizHawk.Client.EmuHawk.IExternalToolForm">
<Position X="4.5" Y="4.5" Width="2.75" /> <Position X="4.5" Y="4.5" Width="2.75" />
<TypeIdentifier> <TypeIdentifier>
@ -53,24 +59,18 @@
</Interface> </Interface>
<Interface Name="BizHawk.Client.EmuHawk.IToolForm"> <Interface Name="BizHawk.Client.EmuHawk.IToolForm">
<Position X="6" Y="0.75" Width="2.25" /> <Position X="6" Y="0.75" Width="2.25" />
<TypeIdentifier> <TypeIdentifier />
<HashCode>ECAAAAAAAABACAAgAAEAABAAAAAEAAAAAAAAAACAQAA=</HashCode>
<FileName>Interfaces\IToolForm.cs</FileName>
</TypeIdentifier>
</Interface> </Interface>
<Interface Name="BizHawk.Client.EmuHawk.IToolFormAutoConfig"> <Interface Name="BizHawk.Client.EmuHawk.IToolFormAutoConfig">
<Position X="8" Y="4.5" Width="1.75" /> <Position X="8" Y="4.5" Width="1.75" />
<TypeIdentifier> <TypeIdentifier />
<HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
<FileName>Interfaces\IToolFormAutoConfig.cs</FileName>
</TypeIdentifier>
</Interface> </Interface>
<Enum Name="BizHawk.Client.Common.WatchSize"> <Enum Name="BizHawk.Client.Common.WatchSize">
<Position X="26.5" Y="3.75" Width="1.5" /> <Position X="28.5" Y="5.5" Width="1.5" />
<TypeIdentifier /> <TypeIdentifier />
</Enum> </Enum>
<Enum Name="BizHawk.Client.Common.DisplayType"> <Enum Name="BizHawk.Client.Common.DisplayType">
<Position X="26.5" Y="1" Width="1.5" /> <Position X="28.5" Y="2.75" Width="1.5" />
<TypeIdentifier /> <TypeIdentifier />
</Enum> </Enum>
<Enum Name="BizHawk.Client.Common.PreviousType"> <Enum Name="BizHawk.Client.Common.PreviousType">

View File

@ -105,6 +105,7 @@
<Compile Include="BitmapBufferVideoProvider.cs" /> <Compile Include="BitmapBufferVideoProvider.cs" />
<Compile Include="config\Binding.cs" /> <Compile Include="config\Binding.cs" />
<Compile Include="config\Config.cs" /> <Compile Include="config\Config.cs" />
<Compile Include="config\ConfigPersistAttribute.cs" />
<Compile Include="config\ConfigService.cs" /> <Compile Include="config\ConfigService.cs" />
<Compile Include="config\PathEntry.cs" /> <Compile Include="config\PathEntry.cs" />
<Compile Include="config\ToolDialogSettings.cs" /> <Compile Include="config\ToolDialogSettings.cs" />
@ -232,6 +233,8 @@
<Compile Include="SystemInfo.cs" /> <Compile Include="SystemInfo.cs" />
<Compile Include="tools\Cheat.cs" /> <Compile Include="tools\Cheat.cs" />
<Compile Include="tools\CheatList.cs" /> <Compile Include="tools\CheatList.cs" />
<Compile Include="tools\Interfaces\IToolForm.cs" />
<Compile Include="tools\Interfaces\IToolFormAutoConfig.cs" />
<Compile Include="tools\Watch\ByteWatch.cs" /> <Compile Include="tools\Watch\ByteWatch.cs" />
<Compile Include="tools\Watch\DisplayType.cs" /> <Compile Include="tools\Watch\DisplayType.cs" />
<Compile Include="tools\Watch\DWordWatch.cs" /> <Compile Include="tools\Watch\DWordWatch.cs" />
@ -239,9 +242,15 @@
<Compile Include="tools\RamSearchEngine.cs" /> <Compile Include="tools\RamSearchEngine.cs" />
<Compile Include="tools\Watch\SeparatorWatch.cs" /> <Compile Include="tools\Watch\SeparatorWatch.cs" />
<Compile Include="tools\Watch\Watch.cs" /> <Compile Include="tools\Watch\Watch.cs" />
<Compile Include="tools\Watch\WatchList\WatchChangeCountComparer.cs" />
<Compile Include="tools\Watch\WatchList\WatchEqualityComparer.cs" />
<Compile Include="tools\Watch\WatchList\WatchDomainComparer.cs" /> <Compile Include="tools\Watch\WatchList\WatchDomainComparer.cs" />
<Compile Include="tools\Watch\WatchList\WatchAddressComparer.cs" /> <Compile Include="tools\Watch\WatchList\WatchAddressComparer.cs" />
<Compile Include="tools\Watch\WatchList\WatchList.cs" /> <Compile Include="tools\Watch\WatchList\WatchList.cs" />
<Compile Include="tools\Watch\WatchList\WatchNoteComparer.cs" />
<Compile Include="tools\Watch\WatchList\WatchPreviousValueComparer.cs" />
<Compile Include="tools\Watch\WatchList\WatchValueComparer.cs" />
<Compile Include="tools\Watch\WatchList\WatchValueDifferenceComparer.cs" />
<Compile Include="tools\Watch\WatchSize.cs" /> <Compile Include="tools\Watch\WatchSize.cs" />
<Compile Include="tools\Watch\WordWatch.cs" /> <Compile Include="tools\Watch\WordWatch.cs" />
<Compile Include="XmlGame.cs" /> <Compile Include="XmlGame.cs" />

View File

@ -652,13 +652,16 @@ namespace BizHawk.Client.Common
rom = new RomGame(file); rom = new RomGame(file);
game = rom.GameInfo; game = rom.GameInfo;
} }
else if(ext != null) // most extensions else if (ext != null) // most extensions
{ {
rom = new RomGame(file); rom = new RomGame(file);
//hacky for now //hacky for now
if (file.Extension.ToLowerInvariant() == ".exe") if (file.Extension.ToLowerInvariant() == ".exe")
rom.GameInfo.System = "PSX"; rom.GameInfo.System = "PSX";
else if (file.Extension.ToLowerInvariant() == ".nsf")
rom.GameInfo.System = "NES";
if (string.IsNullOrEmpty(rom.GameInfo.System)) if (string.IsNullOrEmpty(rom.GameInfo.System))
{ {

View File

@ -159,7 +159,7 @@ namespace BizHawk.Client.Common
[LuaMethodAttributes( [LuaMethodAttributes(
"islagged", "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() 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( [LuaMethodAttributes(
"lagcount", "lagcount",
"Returns the current lag count" "Returns the current lag count"

View File

@ -7,7 +7,7 @@ using BizHawk.Emulation.Common.IEmulatorExtensions;
namespace BizHawk.Client.Common 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 public sealed class MemoryLuaLibrary : LuaMemoryBase
{ {
//private int _currentMemoryDomain; // Main memory by default probably (index 0 is currently always main memory but may never be) //private int _currentMemoryDomain; // Main memory by default probably (index 0 is currently always main memory but may never be)

View File

@ -219,7 +219,7 @@ namespace BizHawk.Client.Common
{ {
if (Movie.IsActive) if (Movie.IsActive)
{ {
writer.Write(Movie.GetInputLog()); Movie.WriteInputLog(writer);
} }
} }

View File

@ -67,7 +67,7 @@ namespace BizHawk.Client.Common
{ {
if (value) if (value)
{ {
Header.Add(HeaderKeys.STARTSFROMSAVESTATE, "True"); Header[HeaderKeys.STARTSFROMSAVESTATE] = "True";
} }
else else
{ {

View File

@ -183,7 +183,7 @@ namespace BizHawk.Client.Common
bs.PutLump(BinaryStateLump.Subtitles, tw => tw.WriteLine(Subtitles.ToString())); bs.PutLump(BinaryStateLump.Subtitles, tw => tw.WriteLine(Subtitles.ToString()));
bs.PutLump(BinaryStateLump.SyncSettings, tw => tw.WriteLine(_syncSettingsJson)); 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) if (StartsFromSavestate)
{ {

View File

@ -14,14 +14,19 @@ namespace BizHawk.Client.Common
public string GetInputLog() public string GetInputLog()
{ {
var sb = new StringBuilder(); var sb = new StringBuilder();
var writer = new StringWriter(sb);
sb.AppendLine("[Input]"); WriteInputLog(writer);
sb.Append(RawInputLog()); writer.Flush();
sb.AppendLine("[/Input]");
return sb.ToString(); return sb.ToString();
} }
public void WriteInputLog(TextWriter writer)
{
writer.WriteLine("[Input]");
WriteRawInputLog(writer);
writer.WriteLine("[/Input]");
}
public string GetInputLogEntry(int frame) public string GetInputLogEntry(int frame)
{ {
if (frame < FrameCount && frame >= 0) if (frame < FrameCount && frame >= 0)
@ -294,19 +299,17 @@ namespace BizHawk.Client.Common
return true; return true;
} }
protected StringBuilder RawInputLog() protected void WriteRawInputLog(TextWriter writer)
{ {
var lg = new Bk2LogEntryGenerator(LogKey); var lg = new Bk2LogEntryGenerator(LogKey);
lg.SetSource(Global.MovieOutputHardpoint); lg.SetSource(Global.MovieOutputHardpoint);
var sb = new StringBuilder(); writer.WriteLine(lg.GenerateLogKey());
sb.AppendLine(lg.GenerateLogKey());
foreach (var record in _log) foreach (var record in _log)
{ {
sb.AppendLine(record); writer.WriteLine(record);
} }
return sb;
} }
/// <summary> /// <summary>

View File

@ -143,7 +143,7 @@ namespace BizHawk.Client.Common
class Enumerator : IEnumerator<string> class Enumerator : IEnumerator<string>
{ {
public DiskStringLog log; public DiskStringLog log;
int index; int index = -1;
public string Current { get { return log[index]; } } public string Current { get { return log[index]; } }
object System.Collections.IEnumerator.Current { get { return log[index]; } } object System.Collections.IEnumerator.Current { get { return log[index]; } }
bool System.Collections.IEnumerator.MoveNext() bool System.Collections.IEnumerator.MoveNext()
@ -156,7 +156,7 @@ namespace BizHawk.Client.Common
} }
return true; return true;
} }
void System.Collections.IEnumerator.Reset() { index = 0; } void System.Collections.IEnumerator.Reset() { index = -1; }
public void Dispose() { } public void Dispose() { }
} }

View File

@ -13,17 +13,22 @@ namespace BizHawk.Client.Common
public string GetInputLog() public string GetInputLog()
{ {
var sb = new StringBuilder(); 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) foreach (var record in _log)
{ {
sb.AppendLine(record); writer.WriteLine(record);
} }
sb.AppendLine("[/Input]"); writer.WriteLine("[/Input]");
return sb.ToString();
} }
public string GetInputLogEntry(int frame) public string GetInputLogEntry(int frame)

View File

@ -114,6 +114,11 @@ namespace BizHawk.Client.Common
/// <returns>returns a string represntation of the input log in its current state</returns> /// <returns>returns a string represntation of the input log in its current state</returns>
string GetInputLog(); string GetInputLog();
/// <summary>
/// Writes the input log directly to the stream, bypassing the need to load it all into ram as a string
/// </summary>
void WriteInputLog(TextWriter writer);
/// <summary> /// <summary>
/// Gets one frame from the input log. /// Gets one frame from the input log.
/// </summary> /// </summary>

View File

@ -283,6 +283,11 @@ namespace BizHawk.Client.Common
{ {
if (IsRecording || force) if (IsRecording || force)
{ {
if (oldPosition == -1)
name = "Set Marker at frame " + newMarker.Frame;
else
name = "Remove Marker at frame " + oldPosition;
AddMovieAction(name); AddMovieAction(name);
History.Last().Add(new MovieActionMarker(newMarker, oldPosition, old_message)); History.Last().Add(new MovieActionMarker(newMarker, oldPosition, old_message));
} }

View File

@ -17,23 +17,8 @@ namespace BizHawk.Client.Common
public Func<string> ClientSettingsForSave { get; set; } public Func<string> ClientSettingsForSave { get; set; }
public Action<string> GetClientSettingsOnLoad { get; set; } public Action<string> 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) protected override void Write(string fn)
{ {
_totalProgress = 0;
var file = new FileInfo(fn); var file = new FileInfo(fn);
if (!file.Directory.Exists) if (!file.Directory.Exists)
{ {
@ -43,29 +28,21 @@ namespace BizHawk.Client.Common
using (var bs = new BinaryStateSaver(fn, false)) using (var bs = new BinaryStateSaver(fn, false))
{ {
bs.PutLump(BinaryStateLump.Movieheader, tw => tw.WriteLine(Header.ToString())); bs.PutLump(BinaryStateLump.Movieheader, tw => tw.WriteLine(Header.ToString()));
ReportProgress(PROGRESS_STEP);
bs.PutLump(BinaryStateLump.Comments, tw => tw.WriteLine(CommentsString())); bs.PutLump(BinaryStateLump.Comments, tw => tw.WriteLine(CommentsString()));
ReportProgress(PROGRESS_STEP);
bs.PutLump(BinaryStateLump.Subtitles, tw => tw.WriteLine(Subtitles.ToString())); bs.PutLump(BinaryStateLump.Subtitles, tw => tw.WriteLine(Subtitles.ToString()));
ReportProgress(PROGRESS_STEP);
bs.PutLump(BinaryStateLump.SyncSettings, tw => tw.WriteLine(SyncSettingsJson)); bs.PutLump(BinaryStateLump.SyncSettings, tw => tw.WriteLine(SyncSettingsJson));
ReportProgress(PROGRESS_STEP); bs.PutLump(BinaryStateLump.Input, tw => WriteInputLog(tw));
bs.PutLump(BinaryStateLump.Input, tw => tw.WriteLine(RawInputLog()));
ReportProgress(PROGRESS_STEP);
// TasProj extras // TasProj extras
bs.PutLump(BinaryStateLump.StateHistorySettings, tw => tw.WriteLine(StateManager.Settings.ToString())); bs.PutLump(BinaryStateLump.StateHistorySettings, tw => tw.WriteLine(StateManager.Settings.ToString()));
ReportProgress(PROGRESS_STEP);
if (StateManager.Settings.SaveStateHistory) if (StateManager.Settings.SaveStateHistory)
{ {
bs.PutLump(BinaryStateLump.StateHistory, (BinaryWriter bw) => StateManager.Save(bw)); bs.PutLump(BinaryStateLump.StateHistory, (BinaryWriter bw) => StateManager.Save(bw));
} }
ReportProgress(PROGRESS_STEP);
bs.PutLump(BinaryStateLump.LagLog, (BinaryWriter bw) => LagLog.Save(bw)); bs.PutLump(BinaryStateLump.LagLog, (BinaryWriter bw) => LagLog.Save(bw));
ReportProgress(PROGRESS_STEP);
bs.PutLump(BinaryStateLump.Markers, tw => tw.WriteLine(Markers.ToString())); bs.PutLump(BinaryStateLump.Markers, tw => tw.WriteLine(Markers.ToString()));
ReportProgress(PROGRESS_STEP);
if (StartsFromSavestate) if (StartsFromSavestate)
{ {
@ -82,14 +59,12 @@ namespace BizHawk.Client.Common
{ {
bs.PutLump(BinaryStateLump.MovieSaveRam, (BinaryWriter bw) => bw.Write(SaveRam)); bs.PutLump(BinaryStateLump.MovieSaveRam, (BinaryWriter bw) => bw.Write(SaveRam));
} }
ReportProgress(PROGRESS_STEP);
if (ClientSettingsForSave != null) if (ClientSettingsForSave != null)
{ {
var clientSettingsJson = ClientSettingsForSave(); var clientSettingsJson = ClientSettingsForSave();
bs.PutLump(BinaryStateLump.ClientSettings, (TextWriter tw) => tw.Write(clientSettingsJson)); bs.PutLump(BinaryStateLump.ClientSettings, (TextWriter tw) => tw.Write(clientSettingsJson));
} }
ReportProgress(PROGRESS_STEP);
if (VerificationLog.Any()) if (VerificationLog.Any())
{ {
@ -104,7 +79,6 @@ namespace BizHawk.Client.Common
bs.PutLump(BinaryStateLump.BranchStateHistory, (BinaryWriter bw) => StateManager.SaveBranchStates(bw)); bs.PutLump(BinaryStateLump.BranchStateHistory, (BinaryWriter bw) => StateManager.SaveBranchStates(bw));
} }
} }
ReportProgress(PROGRESS_STEP);
bs.PutLump(BinaryStateLump.Session, tw => tw.WriteLine(Session.ToString())); bs.PutLump(BinaryStateLump.Session, tw => tw.WriteLine(Session.ToString()));
} }

View File

@ -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 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(); public readonly TasBranchCollection Branches = new TasBranchCollection();
private BackgroundWorker _progressReportWorker = null; public BackgroundWorker _progressReportWorker = null;
public void NewBGWorker(BackgroundWorker newWorker) public void NewBGWorker(BackgroundWorker newWorker)
{ {
_progressReportWorker = 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 #region Events and Handlers
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler PropertyChanged;

View File

@ -169,7 +169,7 @@ namespace BizHawk.Client.Common
public new void Remove(TasMovieMarker item) 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; return;
_movie.ChangeLog.AddMarkerChange(null, item.Frame, item.Message); _movie.ChangeLog.AddMarkerChange(null, item.Frame, item.Message);
base.Remove(item); base.Remove(item);

View File

@ -138,6 +138,10 @@ namespace BizHawk.Client.Common
{ {
get get
{ {
if (frame == 0) {
return new KeyValuePair<int, byte[]>(0, InitialState);
}
if (States.ContainsKey(frame)) if (States.ContainsKey(frame))
{ {
StateAccessed(frame); StateAccessed(frame);
@ -316,7 +320,7 @@ namespace BizHawk.Client.Common
for (int i = from; i < upTo; i++) for (int i = from; i < upTo; i++)
{ {
if (!_movie[i].Lagged.Value) if (_movie[i].Lagged == null)
return false; return false;
} }
@ -561,6 +565,7 @@ namespace BizHawk.Client.Common
bw.Write(kvp.Key); bw.Write(kvp.Key);
bw.Write(kvp.Value.Length); bw.Write(kvp.Value.Length);
bw.Write(kvp.Value.State); bw.Write(kvp.Value.State);
_movie.ReportProgress((double)100d / States.Count * i);
} }
} }

View File

@ -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) 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) : 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._previous = previous;
this._changecount = changeCount; this._changecount = changeCount;
} }
#endregion #endregion
#region Methods #region Methods
/// <summary> /// <summary>
/// Enumerate wich <see cref="DisplayType"/> are valid for a <see cref="ByteWatch"/> /// Enumerate wich <see cref="DisplayType"/> are valid for a <see cref="ByteWatch"/>
@ -281,7 +288,7 @@ namespace BizHawk.Client.Common
{ {
get get
{ {
return FormatValue(_value); return FormatValue(GetByte());
} }
} }

View File

@ -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) 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) : 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._previous = previous;
this._changecount = changeCount; this._changecount = changeCount;
} }

View File

@ -74,8 +74,13 @@ namespace BizHawk.Client.Common
{ {
get { return string.Empty; } get { return string.Empty; }
} }
public override string ToString() /// <summary>
/// TTransform the current instance into a displayable (short representation) string
/// It's used by the "Display on screen" option in the RamWatch window
/// </summary>
/// <returns>A well formatted string representation</returns>
public override string ToDisplayString()
{ {
return "----"; return "----";
} }

View File

@ -232,7 +232,18 @@ namespace BizHawk.Client.Common
/// <returns>True if they are equals; otherwise, false</returns> /// <returns>True if they are equals; otherwise, false</returns>
public static bool operator ==(Watch a, Cheat b) 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);
}
} }
/// <summary> /// <summary>
@ -547,7 +558,7 @@ namespace BizHawk.Client.Common
public override string ToString() public override string ToString()
{ {
return string.Format("{0}\t{1}\t{2}\t{3}\t{4}\t{5}" 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 , SizeAsChar
, TypeAsChar , TypeAsChar
, Convert.ToInt32(BigEndian) , Convert.ToInt32(BigEndian)
@ -556,6 +567,16 @@ namespace BizHawk.Client.Common
); );
} }
/// <summary>
/// Transform the current instance into a displayable (short representation) string
/// It's used by the "Display on screen" option in the RamWatch window
/// </summary>
/// <returns>A well formatted string representation</returns>
public virtual string ToDisplayString()
{
return string.Format("{0}: {1}", Notes, ValueString);
}
#endregion #endregion
#region Properties #region Properties

View File

@ -12,83 +12,40 @@ namespace BizHawk.Client.Common
/// Netsed private class that define how to compare two <see cref="Watch"/> /// Netsed private class that define how to compare two <see cref="Watch"/>
/// based on their address /// based on their address
/// </summary> /// </summary>
private struct WatchAddressComparer private sealed class WatchAddressComparer
: IEqualityComparer<Watch>, : WatchEqualityComparer,
IComparer<Watch> IComparer<Watch>
{ {
/// <summary> /// <summary>
/// Compare two <see cref="Watch"/> between them /// Compares two <see cref="Watch"/> between them
/// and determine wich one comes first. /// and determines wich one comes first.
/// If they are equals, comapraison will done one the domain and next on size /// If they are equals, comapraison will done one the domain and next on size
/// </summary> /// </summary>
/// <param name="x">First <see cref="Watch"/></param> /// <param name="x">First <see cref="Watch"/></param>
/// <returns>True if <see cref="Watch"/> are equal; otherwise, false</returns> /// <param name="y">Second <see cref="Watch"/></param>
/// <returns></returns> /// <returns>0 for equality, 1 if x comes first; -1 if y comes first</returns>
public int Compare(Watch x, Watch y) public int Compare(Watch x, Watch y)
{
if (Equals(x, y))
{ {
return 0; if (Equals(x, y))
}
else if (x.Address.Equals(y.Address))
{
if (x.Domain.Name.Equals(y.Domain.Name))
{ {
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 else
{ {
return x.Domain.Name.CompareTo(y.Domain.Name); return x.Address.CompareTo(y.Address);
} }
} }
else
{
return x.Address.CompareTo(y.Address);
}
}
/// <summary>
/// Determine if two <see cref="Watch"/> are equals
/// </summary>
/// <param name="x">First <see cref="Watch"/></param>
/// <param name="y">Second <see cref="Watch"/></param>
/// <returns>True if <see cref="Watch"/> are equal; otherwise, false</returns>
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);
}
}
/// <summary>
/// Get the hash value of specified <see cref="Watch"/>
/// </summary>
/// <param name="obj">Watch to get hash</param>
/// <returns>int that can serves as a unique representation of current Watch</returns>
public int GetHashCode(Watch obj)
{
return obj.GetHashCode();
} }
} }
} }
}

View File

@ -0,0 +1,51 @@
using System.Collections.Generic;
namespace BizHawk.Client.Common
{
/// <summary>
/// This class hold a collection <see cref="Watch"/>
/// Different memory domain can be mixed
/// </summary>
public sealed partial class WatchList
{
/// <summary>
/// Netsed private class that define how to compare two <see cref="Watch"/>
/// based on the number of changes
/// </summary>
private sealed class WatchChangeCountComparer
:WatchEqualityComparer
,IComparer<Watch>
{
/// <summary>
/// Compares two <see cref="Watch"/> between them
/// and determines wich one comes first.
/// If they are equals, comapraison will done one the address and next on size
/// </summary>
/// <param name="x">First <see cref="Watch"/></param>
/// <param name="y">Second <see cref="Watch"/></param>
/// <returns>0 for equality, 1 if x comes first; -1 if y comes first</returns>
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);
}
}
}
}
}

View File

@ -12,25 +12,25 @@ namespace BizHawk.Client.Common
/// Netsed private class that define how to compare two <see cref="Watch"/> /// Netsed private class that define how to compare two <see cref="Watch"/>
/// based on their domain /// based on their domain
/// </summary> /// </summary>
private struct WatchDomainComparer private sealed class WatchDomainComparer
: IEqualityComparer<Watch>, : WatchEqualityComparer,
IComparer<Watch> IComparer<Watch>
{ {
/// <summary> /// <summary>
/// Compare two <see cref="Watch"/> between them /// Compares two <see cref="Watch"/> between them
/// and determine wich one comes first. /// and determines wich one comes first.
/// If they are equals, comapraison will done one the address and next on size /// If they are equals, comapraison will done one the address and next on size
/// </summary> /// </summary>
/// <param name="x">First <see cref="Watch"/></param> /// <param name="x">First <see cref="Watch"/></param>
/// <returns>True if <see cref="Watch"/> are equal; otherwise, false</returns> ///<param name="y">Second <see cref="Watch"/></param>
/// <returns></returns> /// <returns>0 for equality, 1 if x comes first; -1 if y comes first</returns>
public int Compare(Watch x, Watch y) public int Compare(Watch x, Watch y)
{ {
if(Equals(x, y)) if (Equals(x, y))
{ {
return 0; 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)) if (x.Address.Equals(y.Address))
{ {
@ -46,49 +46,6 @@ namespace BizHawk.Client.Common
return x.Domain.Name.CompareTo(y.Domain.Name); return x.Domain.Name.CompareTo(y.Domain.Name);
} }
} }
/// <summary>
/// Determine if two <see cref="Watch"/> are equals
/// </summary>
/// <param name="x">First <see cref="Watch"/></param>
/// <param name="y">Second <see cref="Watch"/></param>
/// <returns>True if <see cref="Watch"/> are equal; otherwise, false</returns>
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);
}
}
/// <summary>
/// Get the hash value of specified <see cref="Watch"/>
/// </summary>
/// <param name="obj">Watch to get hash</param>
/// <returns>int that can serves as a unique representation of current Watch</returns>
public int GetHashCode(Watch obj)
{
return obj.GetHashCode();
}
} }
} }
} }

View File

@ -0,0 +1,58 @@
using System.Collections.Generic;
namespace BizHawk.Client.Common
{
/// <summary>
/// This class hold a collection <see cref="Watch"/>
/// Different memory domain can be mixed
/// </summary>
public sealed partial class WatchList
{
private class WatchEqualityComparer
: IEqualityComparer<Watch>
{
/// <summary>
/// Determines if two <see cref="Watch"/> are equals
/// </summary>
/// <param name="x">First <see cref="Watch"/></param>
/// <param name="y">Second <see cref="Watch"/></param>
/// <returns>True if <see cref="Watch"/> are equal; otherwise, false</returns>
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;
}
}
/// <summary>
/// Gets the hash value of specified <see cref="Watch"/>
/// </summary>
/// <param name="obj">Watch to get hash</param>
/// <returns>int that can serves as a unique representation of current Watch</returns>
public int GetHashCode(Watch obj)
{
return obj.GetHashCode();
}
}
}
}

View File

@ -33,6 +33,11 @@ namespace BizHawk.Client.Common
private static readonly WatchDomainComparer domainComparer = new WatchDomainComparer(); private static readonly WatchDomainComparer domainComparer = new WatchDomainComparer();
private static readonly WatchAddressComparer addressComparer = new WatchAddressComparer(); 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; private static IMemoryDomains _memoryDomains;
@ -256,92 +261,58 @@ namespace BizHawk.Client.Common
} }
break; break;
case VALUE: case VALUE:
if (reverse) if (reverse)
{ {
_watchList = _watchList _watchList.Sort(valueComparer);
.OrderByDescending(x => x.Value) _watchList.Reverse();
.ThenBy(x => x.Address)
.ThenBy(x => x.Size)
.ThenBy(x => x.Type)
.ThenBy(x => x.BigEndian)
.ToList();
} }
else else
{ {
_watchList = _watchList _watchList.Sort(valueComparer);
.OrderBy(x => x.Value)
.ThenBy(x => x.Address)
.ThenBy(x => x.Size)
.ThenBy(x => x.Type)
.ThenBy(x => x.BigEndian)
.ToList();
} }
break; break;
case PREV: // Note: these only work if all entries are detailed objects!
case PREV:
if (reverse) if (reverse)
{ {
_watchList = _watchList _watchList.Sort(previousValueComparer);
.OrderByDescending(x => x.PreviousStr) _watchList.Reverse();
.ThenBy(x => x.Address)
.ThenBy(x => x.Size)
.ThenBy(x => x.Type)
.ToList();
} }
else else
{ {
_watchList = _watchList _watchList.Sort(previousValueComparer);
.OrderBy(x => x.PreviousStr)
.ThenBy(x => x.Address)
.ThenBy(x => x.Size)
.ThenBy(x => x.Type)
.ToList();
} }
break; break;
case DIFF: case DIFF:
if (reverse) if (reverse)
{ {
_watchList = _watchList _watchList.Sort(valueDifferenceComparer);
.OrderByDescending(x => x.Diff) _watchList.Reverse();
.ThenBy(x => x.Address)
.ThenBy(x => x.Size)
.ThenBy(x => x.Type)
.ToList();
} }
else else
{ {
_watchList = _watchList _watchList.Sort(valueDifferenceComparer);
.OrderBy(x => x.Diff)
.ThenBy(x => x.Address)
.ThenBy(x => x.Size)
.ThenBy(x => x.Type)
.ToList();
} }
break; break;
case CHANGES: case CHANGES:
if (reverse) if (reverse)
{ {
_watchList = _watchList _watchList.Sort(changeCountComparer);
.OrderByDescending(x => x.ChangeCount) _watchList.Reverse();
.ThenBy(x => x.Address)
.ThenBy(x => x.Size)
.ThenBy(x => x.Type)
.ToList();
} }
else else
{ {
_watchList = _watchList _watchList.Sort(changeCountComparer);
.OrderBy(x => x.ChangeCount)
.ThenBy(x => x.Address)
.ThenBy(x => x.Size)
.ThenBy(x => x.Type)
.ToList();
} }
break; break;
case DOMAIN: case DOMAIN:
if (reverse) if (reverse)
{ {
@ -354,24 +325,16 @@ namespace BizHawk.Client.Common
} }
break; break;
case NOTES: case NOTES:
if (reverse) if (reverse)
{ {
_watchList = _watchList _watchList.Sort(noteComparer);
.OrderByDescending(x => x.Notes) _watchList.Reverse();
.ThenBy(x => x.Address)
.ThenBy(x => x.Size)
.ThenBy(x => x.Type)
.ToList();
} }
else else
{ {
_watchList = _watchList _watchList.Sort(noteComparer);
.OrderBy(x => x.Notes)
.ThenBy(x => x.Address)
.ThenBy(x => x.Size)
.ThenBy(x => x.Type)
.ToList();
} }
break; 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 public int ItemCount
{ {
get 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 #region File handling logic - probably needs to be its own class
public bool Load(string path, bool append) public bool Load(string path, bool append)

View File

@ -0,0 +1,51 @@
using System.Collections.Generic;
namespace BizHawk.Client.Common
{
/// <summary>
/// This class hold a collection <see cref="Watch"/>
/// Different memory domain can be mixed
/// </summary>
public sealed partial class WatchList
{
/// <summary>
/// Netsed private class that define how to compare two <see cref="Watch"/>
/// based on their note
/// </summary>
private sealed class WatchNoteComparer
:WatchEqualityComparer,
IComparer<Watch>
{
/// <summary>
/// Compares two <see cref="Watch"/> between them
/// and determines wich one comes first.
/// If they are equals, comapraison will done one the address and next on size
/// </summary>
/// <param name="x">First <see cref="Watch"/></param>
/// <param name="y">Second <see cref="Watch"/></param>
/// <returns>0 for equality, 1 if x comes first; -1 if y comes first</returns>
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);
}
}
}
}
}

View File

@ -0,0 +1,51 @@
using System.Collections.Generic;
namespace BizHawk.Client.Common
{
/// <summary>
/// This class hold a collection <see cref="Watch"/>
/// Different memory domain can be mixed
/// </summary>
public sealed partial class WatchList
{
/// <summary>
/// Netsed private class that define how to compare two <see cref="Watch"/>
/// based on their previous value
/// </summary>
private sealed class WatchPreviousValueComparer
: WatchEqualityComparer,
IComparer<Watch>
{
/// <summary>
/// Compares two <see cref="Watch"/> between them
/// and determines wich one comes first.
/// If they are equals, comapraison will done one the address and next on size
/// </summary>
/// <param name="x">First <see cref="Watch"/></param>
/// <param name="y">Second <see cref="Watch"/></param>
/// <returns>0 for equality, 1 if x comes first; -1 if y comes first</returns>
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);
}
}
}
}
}

View File

@ -0,0 +1,72 @@
using System.Collections.Generic;
namespace BizHawk.Client.Common
{
/// <summary>
/// This class hold a collection <see cref="Watch"/>
/// Different memory domain can be mixed
/// </summary>
public sealed partial class WatchList
{
/// <summary>
/// Netsed private class that define how to compare two <see cref="Watch"/>
/// based on their values
/// </summary>
private sealed class WatchValueComparer
: WatchEqualityComparer,
IComparer<Watch>
{
/// <summary>
/// Compares two <see cref="Watch"/> between them
/// and determines wich one comes first.
/// If they are equals, comapraison will done one the address and next on size
/// </summary>
/// <param name="x">First <see cref="Watch"/></param>
///<param name="y">Second <see cref="Watch"/></param>
/// <returns>0 for equality, 1 if x comes first; -1 if y comes first</returns>
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);
}
}
}
}
}

View File

@ -0,0 +1,52 @@
using System.Collections.Generic;
namespace BizHawk.Client.Common
{
/// <summary>
/// This class hold a collection <see cref="Watch"/>
/// Different memory domain can be mixed
/// </summary>
public sealed partial class WatchList
{
/// <summary>
/// Netsed private class that define how to compare two <see cref="Watch"/>
/// based on the diffence between current and previous value
/// </summary>
private sealed class WatchValueDifferenceComparer
: WatchEqualityComparer
, IComparer<Watch>
{
/// <summary>
/// Compares two <see cref="Watch"/> between them
/// and determines wich one comes first.
/// If they are equals, comapraison will done one the address and next on size
/// </summary>
/// <param name="x">First <see cref="Watch"/></param>
/// <param name="y">Second <see cref="Watch"/></param>
/// <returns>0 for equality, 1 if x comes first; -1 if y comes first</returns>
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);
}
}
}
}
}

View File

@ -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) 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) : 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._previous = previous;
this._changecount = changeCount; this._changecount = changeCount;
} }

View File

@ -68,25 +68,6 @@ namespace BizHawk.Client.DBMan
DeleteFileW(path + ":Zone.Identifier"); 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) static void WhackAllMOTW(string dllDir)
{ {
var todo = new Queue<DirectoryInfo>(new[] { new DirectoryInfo(dllDir) }); var todo = new Queue<DirectoryInfo>(new[] { new DirectoryInfo(dllDir) });

View File

@ -123,25 +123,6 @@ namespace BizHawk.Client.DiscoHawk
DeleteFileW(path + ":Zone.Identifier"); 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) static void WhackAllMOTW(string dllDir)
{ {
var todo = new Queue<DirectoryInfo>(new[] { new DirectoryInfo(dllDir) }); var todo = new Queue<DirectoryInfo>(new[] { new DirectoryInfo(dllDir) });

View File

@ -228,7 +228,7 @@ namespace BizHawk.Client.EmuHawk
File.Delete(tempfile); File.Delete(tempfile);
tempfile = Path.ChangeExtension(tempfile, "avi"); tempfile = Path.ChangeExtension(tempfile, "avi");
temp.OpenFile(tempfile, temp_params, null); //lastToken); temp.OpenFile(tempfile, temp_params, null); //lastToken);
CodecToken token = (CodecToken)temp.AcquireVideoCodecToken(hwnd.Handle); CodecToken token = (CodecToken)temp.AcquireVideoCodecToken(hwnd.Handle, currVideoCodecToken);
temp.CloseFile(); temp.CloseFile();
File.Delete(tempfile); File.Delete(tempfile);
return token; return token;
@ -346,66 +346,59 @@ namespace BizHawk.Client.EmuHawk
public class CodecToken : IDisposable public class CodecToken : IDisposable
{ {
~CodecToken() public void Dispose() { }
{ private CodecToken() { }
Dispose(); private Win32.AVICOMPRESSOPTIONS comprOptions;
} public string codec;
public static CodecToken TakePossession(Win32.AVICOMPRESSOPTIONS comprOptions) public byte[] Format = new byte[0];
public byte[] Parms = new byte[0];
public static CodecToken CreateFromAVICOMPRESSOPTIONS(ref Win32.AVICOMPRESSOPTIONS opts)
{ {
CodecToken ret = new CodecToken(); CodecToken ret = new CodecToken();
ret.allocated = true; ret.comprOptions = opts;
ret.comprOptions = comprOptions; ret.codec = Win32.decode_mmioFOURCC(opts.fccHandler);
ret.codec = Win32.decode_mmioFOURCC(comprOptions.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; return ret;
} }
private CodecToken() { }
public Win32.AVICOMPRESSOPTIONS comprOptions;
public string codec; [DllImport("kernel32.dll", SetLastError = true)]
/// <summary> public static extern bool HeapFree(IntPtr hHeap, uint dwFlags, int lpMem);
/// true if data was allocated by AviSaveOptions and should be freed by AVISaveOptionsFree [DllImport("kernel32.dll", SetLastError = true)]
/// </summary> public static extern IntPtr GetProcessHeap();
bool allocated = false; [DllImport("kernel32.dll", SetLastError = false)]
/// <summary> public static extern IntPtr HeapAlloc(IntPtr hHeap, uint dwFlags, int dwBytes);
/// true if data was allocated by AllocHGlobal and should be freed by FreeHGlobal
/// </summary> public static void DeallocateAVICOMPRESSOPTIONS(ref Win32.AVICOMPRESSOPTIONS opts)
bool marshaled = false;
public void Dispose()
{ {
if (allocated) //test: increase stability by never freeing anything, ever
{ //if (opts.lpParms != 0) CodecToken.HeapFree(CodecToken.GetProcessHeap(), 0, opts.lpParms);
IntPtr[] infPtrs = new IntPtr[1]; //if (opts.lpFormat != 0) CodecToken.HeapFree(CodecToken.GetProcessHeap(), 0, opts.lpFormat);
IntPtr mem; opts.lpParms = 0;
opts.lpFormat = 0;
// 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;
}
} }
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() byte[] SerializeToByteArray()
{ {
var m = new MemoryStream(); var m = new MemoryStream();
@ -422,17 +415,8 @@ namespace BizHawk.Client.EmuHawk
//b.Write(comprOptions.lpParms); //b.Write(comprOptions.lpParms);
b.Write(comprOptions.cbParms); b.Write(comprOptions.cbParms);
b.Write(comprOptions.dwInterleaveEvery); 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(Format);
b.Write(Params); b.Write(Parms);
b.Close(); b.Close();
return m.ToArray(); return m.ToArray();
} }
@ -445,7 +429,7 @@ namespace BizHawk.Client.EmuHawk
Win32.AVICOMPRESSOPTIONS comprOptions = new Win32.AVICOMPRESSOPTIONS(); Win32.AVICOMPRESSOPTIONS comprOptions = new Win32.AVICOMPRESSOPTIONS();
byte[] Format; byte[] Format;
byte[] Params; byte[] Parms;
try try
{ {
@ -463,7 +447,7 @@ namespace BizHawk.Client.EmuHawk
comprOptions.dwInterleaveEvery = b.ReadInt32(); comprOptions.dwInterleaveEvery = b.ReadInt32();
Format = b.ReadBytes(comprOptions.cbFormat); Format = b.ReadBytes(comprOptions.cbFormat);
Params = b.ReadBytes(comprOptions.cbParms); Parms = b.ReadBytes(comprOptions.cbParms);
} }
catch (IOException) catch (IOException)
{ {
@ -475,27 +459,10 @@ namespace BizHawk.Client.EmuHawk
b.Close(); 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(); CodecToken ret = new CodecToken();
ret.marshaled = true;
ret.comprOptions = comprOptions; ret.comprOptions = comprOptions;
ret.Format = Format;
ret.Parms = Parms;
ret.codec = Win32.decode_mmioFOURCC(comprOptions.fccHandler); ret.codec = Win32.decode_mmioFOURCC(comprOptions.fccHandler);
return ret; return ret;
} }
@ -573,22 +540,15 @@ namespace BizHawk.Client.EmuHawk
public long GetLengthApproximation() { return outStatus.video_bytes + outStatus.audio_bytes; } 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))); fixed (Win32.AVICOMPRESSOPTIONS* _popts = &opts)
{
Marshal.StructureToPtr(opts, mem, false); IntPtr* pStream = &stream;
Win32.AVICOMPRESSOPTIONS* popts = _popts;
IntPtr[] streams = new[] { stream }; Win32.AVICOMPRESSOPTIONS** ppopts = &popts;
IntPtr[] infPtrs = new[] { mem }; return Win32.AVISaveOptions(owner, 0, 1, (void*)pStream, (void*)ppopts);
}
int ret = Win32.AVISaveOptions(owner, 0, 1, streams, infPtrs);
opts = (Win32.AVICOMPRESSOPTIONS)Marshal.PtrToStructure(mem, typeof(Win32.AVICOMPRESSOPTIONS));
Marshal.FreeHGlobal(mem);
return ret;
} }
Parameters parameters; Parameters parameters;
@ -640,23 +600,40 @@ namespace BizHawk.Client.EmuHawk
IsOpen = true; IsOpen = true;
} }
/// <summary> /// <summary>
/// Acquires a video codec configuration from the user /// Acquires a video codec configuration from the user
/// </summary> /// </summary>
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 (!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 //encoder params
Win32.AVICOMPRESSOPTIONS comprOptions = new Win32.AVICOMPRESSOPTIONS(); Win32.AVICOMPRESSOPTIONS comprOptions = new Win32.AVICOMPRESSOPTIONS();
if (currVideoCodecToken != null) 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 and return it
// save to config as well
Global.Config.AVICodecToken = ret.Serialize(); Global.Config.AVICodecToken = ret.Serialize();
return ret; return ret;
} }
@ -673,7 +650,12 @@ namespace BizHawk.Client.EmuHawk
throw new InvalidOperationException("set a video codec token before opening the streams!"); throw new InvalidOperationException("set a video codec token before opening the streams!");
//open compressed video stream //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(); CloseStreams();
throw new InvalidOperationException("Failed making compressed video stream"); throw new InvalidOperationException("Failed making compressed video stream");

View File

@ -82,7 +82,7 @@ namespace BizHawk.Client.EmuHawk
{ {
ffmpeg = new Process(); ffmpeg = new Process();
#if WINDOWS #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 #else
ffmpeg.StartInfo.FileName = "ffmpeg"; // expecting native version to be in path ffmpeg.StartInfo.FileName = "ffmpeg"; // expecting native version to be in path
#endif #endif

View File

@ -479,6 +479,9 @@
<Compile Include="CustomControls\HexTextBox.cs"> <Compile Include="CustomControls\HexTextBox.cs">
<SubType>Component</SubType> <SubType>Component</SubType>
</Compile> </Compile>
<Compile Include="CustomControls\HexView.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="CustomControls\InputConfigBase.cs"> <Compile Include="CustomControls\InputConfigBase.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
</Compile> </Compile>
@ -501,6 +504,12 @@
<Compile Include="CustomControls\MsgBox.designer.cs"> <Compile Include="CustomControls\MsgBox.designer.cs">
<DependentUpon>MsgBox.cs</DependentUpon> <DependentUpon>MsgBox.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="CustomControls\PrereqsAlert.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="CustomControls\PrereqsAlert.Designer.cs">
<DependentUpon>PrereqsAlert.cs</DependentUpon>
</Compile>
<Compile Include="CustomControls\QuickProgressPopup.cs"> <Compile Include="CustomControls\QuickProgressPopup.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
</Compile> </Compile>
@ -807,6 +816,12 @@
<Compile Include="tools\HexEditor\HexFind.Designer.cs"> <Compile Include="tools\HexEditor\HexFind.Designer.cs">
<DependentUpon>HexFind.cs</DependentUpon> <DependentUpon>HexFind.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="tools\HexEditor\NewHexEditor.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="tools\HexEditor\NewHexEditor.Designer.cs">
<DependentUpon>NewHexEditor.cs</DependentUpon>
</Compile>
<Compile Include="tools\Lua\EnvironmentSandbox.cs" /> <Compile Include="tools\Lua\EnvironmentSandbox.cs" />
<Compile Include="tools\Lua\Libraries\EmuLuaLibrary.Client.cs" /> <Compile Include="tools\Lua\Libraries\EmuLuaLibrary.Client.cs" />
<Compile Include="tools\Lua\Libraries\EmuLuaLibrary.Console.cs" /> <Compile Include="tools\Lua\Libraries\EmuLuaLibrary.Console.cs" />
@ -1318,6 +1333,9 @@
<EmbeddedResource Include="CustomControls\MsgBox.resx"> <EmbeddedResource Include="CustomControls\MsgBox.resx">
<DependentUpon>MsgBox.cs</DependentUpon> <DependentUpon>MsgBox.cs</DependentUpon>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="CustomControls\PrereqsAlert.resx">
<DependentUpon>PrereqsAlert.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="CustomControls\QuickProgressPopup.resx"> <EmbeddedResource Include="CustomControls\QuickProgressPopup.resx">
<DependentUpon>QuickProgressPopup.cs</DependentUpon> <DependentUpon>QuickProgressPopup.cs</DependentUpon>
</EmbeddedResource> </EmbeddedResource>
@ -1421,6 +1439,9 @@
<EmbeddedResource Include="tools\HexEditor\HexFind.resx"> <EmbeddedResource Include="tools\HexEditor\HexFind.resx">
<DependentUpon>HexFind.cs</DependentUpon> <DependentUpon>HexFind.cs</DependentUpon>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="tools\HexEditor\NewHexEditor.resx">
<DependentUpon>NewHexEditor.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="tools\Lua\LuaCanvas.resx"> <EmbeddedResource Include="tools\Lua\LuaCanvas.resx">
<DependentUpon>LuaCanvas.cs</DependentUpon> <DependentUpon>LuaCanvas.cs</DependentUpon>
</EmbeddedResource> </EmbeddedResource>

View File

@ -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
/// <summary>
/// Gets or sets the sets the virtual number of the length of the array to display
/// </summary>
[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()
{
}
}
}

View File

@ -279,6 +279,12 @@ namespace BizHawk.Client.EmuHawk
[Category("Behavior")] [Category("Behavior")]
public bool AlwaysScroll { get; set; } public bool AlwaysScroll { get; set; }
/// <summary>
/// Gets or sets the lowest seek interval to activate the progress bar
/// </summary>
[Category("Behavior")]
public int SeekingCutoffInterval { get; set; }
/// <summary> /// <summary>
/// Returns all columns including those that are not visible /// Returns all columns including those that are not visible
/// </summary> /// </summary>

View File

@ -0,0 +1,168 @@
namespace BizHawk.Client.EmuHawk.CustomControls
{
partial class PrereqsAlert
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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;
}
}

View File

@ -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();
}
}
}

View File

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="textBox2.Text" xml:space="preserve">
<value>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.</value>
</data>
</root>

View File

@ -7,7 +7,7 @@ using Microsoft.Win32.SafeHandles;
namespace BizHawk.Client.EmuHawk 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 Is64BitProcess { get { return (IntPtr.Size == 8); } }
public static bool Is64BitOperatingSystem { get { return Is64BitProcess || InternalCheckIsWow64(); } } 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 // Retrieve the save options for a file and returns them in a buffer
[DllImport("avifil32.dll")] [DllImport("avifil32.dll")]
public static extern int AVISaveOptions( public static extern int AVISaveOptions(IntPtr hwnd, int flags, int streams, void* ppAvi, void* plpOptions);
IntPtr hwnd,
int flags,
int streams,
[In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] IntPtr[] ppavi,
[In, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] IntPtr[] plpOptions);
// Free the resources allocated by the AVISaveOptions function // Free the resources allocated by the AVISaveOptions function
[DllImport("avifil32.dll")] [DllImport("avifil32.dll")]

View File

@ -24,5 +24,7 @@ namespace BizHawk.Client.EmuHawk
public static OSDManager OSD = new OSDManager(); public static OSDManager OSD = new OSDManager();
public static DisplayManager DisplayManager; public static DisplayManager DisplayManager;
public static GLManager GLManager; public static GLManager GLManager;
public static int ExitCode;
} }
} }

View File

@ -2,6 +2,18 @@
{ {
public interface IControlMainform 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; } bool WantsToControlReadOnly { get; }
/// <summary> /// <summary>

View File

@ -181,10 +181,10 @@ namespace BizHawk.Client.EmuHawk
AddItem("LStickLeft", () => state.Gamepad.sThumbLX <= dzn); AddItem("LStickLeft", () => state.Gamepad.sThumbLX <= dzn);
AddItem("LStickRight", () => state.Gamepad.sThumbLX >= dzp); AddItem("LStickRight", () => state.Gamepad.sThumbLX >= dzp);
AddItem("RStickUp", () => state.Gamepad.sThumbLY >= dzp); AddItem("RStickUp", () => state.Gamepad.sThumbRY >= dzp);
AddItem("RStickDown", () => state.Gamepad.sThumbLY <= dzn); AddItem("RStickDown", () => state.Gamepad.sThumbRY <= dzn);
AddItem("RStickLeft", () => state.Gamepad.sThumbLX <= dzn); AddItem("RStickLeft", () => state.Gamepad.sThumbRX <= dzn);
AddItem("RStickRight", () => state.Gamepad.sThumbLX >= dzp); AddItem("RStickRight", () => state.Gamepad.sThumbRX >= dzp);
AddItem("LeftTrigger", () => state.Gamepad.bLeftTrigger > dzt); AddItem("LeftTrigger", () => state.Gamepad.bLeftTrigger > dzt);
AddItem("RightTrigger", () => state.Gamepad.bRightTrigger > dzt); AddItem("RightTrigger", () => state.Gamepad.bRightTrigger > dzt);

File diff suppressed because it is too large Load Diff

View File

@ -23,6 +23,7 @@ using BizHawk.Client.EmuHawk.CustomControls;
using BizHawk.Client.EmuHawk.WinFormExtensions; using BizHawk.Client.EmuHawk.WinFormExtensions;
using BizHawk.Client.EmuHawk.ToolExtensions; using BizHawk.Client.EmuHawk.ToolExtensions;
using BizHawk.Emulation.Cores.Computers.AppleII; using BizHawk.Emulation.Cores.Computers.AppleII;
using BizHawk.Client.ApiHawk;
namespace BizHawk.Client.EmuHawk namespace BizHawk.Client.EmuHawk
{ {
@ -237,6 +238,7 @@ namespace BizHawk.Client.EmuHawk
StopMovieMenuItem.Enabled StopMovieMenuItem.Enabled
= PlayFromBeginningMenuItem.Enabled = PlayFromBeginningMenuItem.Enabled
= SaveMovieMenuItem.Enabled = SaveMovieMenuItem.Enabled
= SaveMovieAsMenuItem.Enabled
= Global.MovieSession.Movie.IsActive; = Global.MovieSession.Movie.IsActive;
ReadonlyMenuItem.Checked = Global.MovieSession.ReadOnly; ReadonlyMenuItem.Checked = Global.MovieSession.ReadOnly;
@ -275,18 +277,20 @@ namespace BizHawk.Client.EmuHawk
private void AVSubMenu_DropDownOpened(object sender, EventArgs e) 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; StopAVIMenuItem.ShortcutKeyDisplayString = Global.Config.HotkeyBindings["Stop A/V"].Bindings;
CaptureOSDMenuItem.Checked = Global.Config.AVI_CaptureOSD; CaptureOSDMenuItem.Checked = Global.Config.AVI_CaptureOSD;
RecordAVMenuItem.Enabled = !string.IsNullOrEmpty(Global.Config.VideoWriter) && _currAviWriter == null;
if (_currAviWriter == null) if (_currAviWriter == null)
{ {
RecordAVMenuItem.Enabled = true; ConfigAndRecordAVMenuItem.Enabled = true;
StopAVIMenuItem.Enabled = false; StopAVIMenuItem.Enabled = false;
} }
else else
{ {
RecordAVMenuItem.Enabled = false; ConfigAndRecordAVMenuItem.Enabled = false;
StopAVIMenuItem.Enabled = true; StopAVIMenuItem.Enabled = true;
} }
} }
@ -548,8 +552,32 @@ namespace BizHawk.Client.EmuHawk
SaveMovie(); 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) private void StopMovieWithoutSavingMenuItem_Click(object sender, EventArgs e)
{ {
if (Global.Config.EnableBackupMovies)
Global.MovieSession.Movie.SaveBackup();
StopMovie(saveChanges: false); StopMovie(saveChanges: false);
} }
@ -583,11 +611,16 @@ namespace BizHawk.Client.EmuHawk
Global.Config.MovieEndAction = MovieEndAction.Pause; Global.Config.MovieEndAction = MovieEndAction.Pause;
} }
private void RecordAVMenuItem_Click(object sender, EventArgs e) private void ConfigAndRecordAVMenuItem_Click(object sender, EventArgs e)
{ {
RecordAv(); 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) private void StopAVMenuItem_Click(object sender, EventArgs e)
{ {
StopAv(); StopAv();
@ -661,6 +694,12 @@ namespace BizHawk.Client.EmuHawk
_exit = true; _exit = true;
} }
public void CloseEmulator(int exitCode)
{
_exit = true;
_exitCode = exitCode;
}
#endregion #endregion
#region Emulation Menu #region Emulation Menu
@ -1174,6 +1213,24 @@ namespace BizHawk.Client.EmuHawk
GlobalWin.OSD.AddMessage("Saved settings"); 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) private void LoadConfigMenuItem_Click(object sender, EventArgs e)
{ {
Global.Config = ConfigService.Load<Config>(PathManager.DefaultIniPath); Global.Config = ConfigService.Load<Config>(PathManager.DefaultIniPath);
@ -1181,6 +1238,25 @@ namespace BizHawk.Client.EmuHawk
GlobalWin.OSD.AddMessage("Config file loaded"); 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<Config>(ofd.FileName);
Global.Config.ResolveDefaults();
GlobalWin.OSD.AddMessage("Config file loaded");
}
}
private void miUnthrottled_Click(object sender, EventArgs e) private void miUnthrottled_Click(object sender, EventArgs e)
{ {
_unthrottled ^= true; _unthrottled ^= true;
@ -1246,82 +1322,45 @@ namespace BizHawk.Client.EmuHawk
batchRunnerToolStripMenuItem.Visible = VersionInfo.DeveloperBuild; batchRunnerToolStripMenuItem.Visible = VersionInfo.DeveloperBuild;
AutoHawkMenuItem.Enabled = GlobalWin.Tools.IsAvailable<AutoHawk>();
AutoHawkMenuItem.Visible = VersionInfo.DeveloperBuild;
BasicBotMenuItem.Enabled = GlobalWin.Tools.IsAvailable<BasicBot>(); BasicBotMenuItem.Enabled = GlobalWin.Tools.IsAvailable<BasicBot>();
gameSharkConverterToolStripMenuItem.Enabled = GlobalWin.Tools.IsAvailable<GameShark>(); gameSharkConverterToolStripMenuItem.Enabled = GlobalWin.Tools.IsAvailable<GameShark>();
ExperimentalToolsSubMenu.Visible = VersionInfo.DeveloperBuild;
} }
private void ExternalToolToolStripMenuItem_DropDownOpening(object sender, EventArgs e) private void ExternalToolToolStripMenuItem_DropDownOpening(object sender, EventArgs e)
{ {
externalToolToolStripMenuItem.DropDownItems.Clear(); 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); if(item.Enabled)
Type[] assemblyTypes;
Assembly externalToolFile;
foreach (FileInfo fi in dInfo.GetFiles("*.dll"))
{ {
try item.Click += delegate
{ {
//externalToolFile = Assembly.ReflectionOnlyLoadFrom(fi.FullName); GlobalWin.Tools.Load<IExternalToolForm>((string)item.Tag);
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<Type>(t => t != null && t.FullName == "BizHawk.Client.EmuHawk.CustomMainForm").ToArray<Type>();
}
catch (ReflectionTypeLoadException ex)
{
assemblyTypes = ex.Types.Where<Type>(t => t != null && t.FullName.Contains("BizHawk.Client.EmuHawk.CustomMainForm")).ToArray<Type>();
}
if (assemblyTypes.Count() == 1)
{
externalToolMenu.Image = Properties.Resources.Debugger;
externalToolMenu.Tag = fi.FullName;
externalToolMenu.Click += delegate (object sender2, EventArgs e2)
{
GlobalWin.Tools.Load<IExternalToolForm>(fi.FullName);
};
}
else
{
externalToolMenu.Image = Properties.Resources.ExclamationRed;
externalToolMenu.ForeColor = Color.Gray;
}
externalToolToolStripMenuItem.DropDownItems.Add(externalToolMenu);
} }
else
{
item.Image = Properties.Resources.ExclamationRed;
}
externalToolToolStripMenuItem.DropDownItems.Add(item);
} }
if (externalToolToolStripMenuItem.DropDownItems.Count == 0) if (externalToolToolStripMenuItem.DropDownItems.Count == 0)
{ {
externalToolToolStripMenuItem.DropDownItems.Add("None"); externalToolToolStripMenuItem.DropDownItems.Add("None");
} }
} }
private void ExperimentalToolsSubMenu_DropDownOpened(object sender, EventArgs e)
{
AutoHawkMenuItem.Enabled = GlobalWin.Tools.IsAvailable<AutoHawk>();
NewHexEditorMenuItem.Enabled = GlobalWin.Tools.IsAvailable<NewHexEditor>();
}
private void AutoHawkMenuItem_Click(object sender, EventArgs e) private void AutoHawkMenuItem_Click(object sender, EventArgs e)
{ {
GlobalWin.Tools.Load<AutoHawk>(); GlobalWin.Tools.Load<AutoHawk>();
@ -1392,6 +1431,11 @@ namespace BizHawk.Client.EmuHawk
new BatchRun().ShowDialog(); new BatchRun().ShowDialog();
} }
private void NewHexEditorMenuItem_Click(object sender, EventArgs e)
{
GlobalWin.Tools.Load<NewHexEditor>();
}
#endregion #endregion
#region NES #region NES
@ -2301,6 +2345,7 @@ namespace BizHawk.Client.EmuHawk
ViewSubtitlesContextMenuItem.Visible = ViewSubtitlesContextMenuItem.Visible =
ViewCommentsContextMenuItem.Visible = ViewCommentsContextMenuItem.Visible =
SaveMovieContextMenuItem.Visible = SaveMovieContextMenuItem.Visible =
SaveMovieAsContextMenuItem.Visible =
Global.MovieSession.Movie.IsActive; Global.MovieSession.Movie.IsActive;
BackupMovieContextMenuItem.Visible = Global.MovieSession.Movie.IsActive; BackupMovieContextMenuItem.Visible = Global.MovieSession.Movie.IsActive;

View File

@ -343,10 +343,10 @@ namespace BizHawk.Client.EmuHawk
//TAStudio //TAStudio
case "Add Branch": case "Add Branch":
GlobalWin.Tools.TAStudio.BookMarkControl.AddBranchExternal(); GlobalWin.Tools.TAStudio.AddBranchExternal();
break; break;
case "Delete Branch": case "Delete Branch":
GlobalWin.Tools.TAStudio.BookMarkControl.RemoveBranchExtrenal(); GlobalWin.Tools.TAStudio.RemoveBranchExtrenal();
break; break;
// SNES // SNES

View File

@ -405,7 +405,7 @@ namespace BizHawk.Client.EmuHawk
if (startFullscreen || Global.Config.StartFullscreen) if (startFullscreen || Global.Config.StartFullscreen)
{ {
ToggleFullscreen(); _needsFullscreenOnLoad = true;
} }
if (!Global.Game.IsNullInstance) if (!Global.Game.IsNullInstance)
@ -462,11 +462,25 @@ namespace BizHawk.Client.EmuHawk
private bool _supressSyncSettingsWarning = false; private bool _supressSyncSettingsWarning = false;
public void ProgramRunLoop() public int ProgramRunLoop()
{ {
CheckMessages(); CheckMessages(); //can someone leave a note about why this is needed?
LogConsole.PositionConsole(); 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 (;;) for (;;)
{ {
Input.Instance.Update(); Input.Instance.Update();
@ -531,6 +545,7 @@ namespace BizHawk.Client.EmuHawk
} }
Shutdown(); Shutdown();
return _exitCode;
} }
/// <summary> /// <summary>
@ -1308,6 +1323,7 @@ namespace BizHawk.Client.EmuHawk
private bool _avwriterpad; private bool _avwriterpad;
private bool _exit; private bool _exit;
private int _exitCode;
private bool _exitRequestPending; private bool _exitRequestPending;
private bool _runloopFrameProgress; private bool _runloopFrameProgress;
private long _frameAdvanceTimestamp; private long _frameAdvanceTimestamp;
@ -1330,6 +1346,7 @@ namespace BizHawk.Client.EmuHawk
private bool _cursorHidden; private bool _cursorHidden;
private bool _inFullscreen; private bool _inFullscreen;
private Point _windowedLocation; private Point _windowedLocation;
private bool _needsFullscreenOnLoad;
private int _autoDumpLength; private int _autoDumpLength;
private readonly bool _autoCloseOnDump; 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<TAStudio>())
{
GlobalWin.Tools.TAStudio.BookMarkControl.SelectBranchExternal(num);
return;
}
Global.Config.SaveSlot = num;
SaveSlotSelectedMessage();
UpdateStatusSlots();
}
}
private void RewireSound() private void RewireSound()
{ {
if (_dumpProxy != null) if (_dumpProxy != null)
@ -1888,75 +1889,6 @@ namespace BizHawk.Client.EmuHawk
return bb; return bb;
} }
private void SaveStateAs()
{
if (!Global.Emulator.HasSavestates())
{
return;
}
if (GlobalWin.Tools.Has<TAStudio>())
{
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<TAStudio>())
{
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() private void SaveSlotSelectedMessage()
{ {
int slot = Global.Config.SaveSlot; 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) if (Global.Config.SaveWindowPosition)
{ {
@ -2193,63 +2125,10 @@ namespace BizHawk.Client.EmuHawk
LogConsole.SaveConfigSettings(); LogConsole.SaveConfigSettings();
} }
ConfigService.Save(PathManager.DefaultIniPath, Global.Config); if (string.IsNullOrEmpty(path))
} path = PathManager.DefaultIniPath;
private void PreviousSlot() ConfigService.Save(path, Global.Config);
{
if (Global.Emulator.HasSavestates())
{
if (GlobalWin.Tools.Has<TAStudio>())
{
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<TAStudio>())
{
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();
}
} }
private static void ToggleFPS() 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<TAStudio>())
{
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<LuaConsole>())
{
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<TAStudio>())
{
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<TAStudio>())
{
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 // Alt key hacks
protected override void WndProc(ref Message m) protected override void WndProc(ref Message m)
{ {
@ -3075,6 +2848,10 @@ namespace BizHawk.Client.EmuHawk
{ {
PauseEmulator(); PauseEmulator();
PauseOnFrame = null; PauseOnFrame = null;
if (GlobalWin.Tools.IsLoaded<TAStudio>())
{
GlobalWin.Tools.TAStudio.StopSeeking();
}
} }
} }
@ -3128,10 +2905,12 @@ namespace BizHawk.Client.EmuHawk
// select IVideoWriter to use // select IVideoWriter to use
IVideoWriter aw = null; 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); aw = VideoWriterInventory.GetVideoWriter(videowritername);
} }
else else
{ {
@ -3149,6 +2928,8 @@ namespace BizHawk.Client.EmuHawk
try try
{ {
bool usingAvi = aw is AviWriter; //SO GROSS!
if (_dumpaudiosync) if (_dumpaudiosync)
{ {
aw = new VideoStretcher(aw); aw = new VideoStretcher(aw);
@ -3172,12 +2953,17 @@ namespace BizHawk.Client.EmuHawk
// select codec token // select codec token
// do this before save dialog because ffmpeg won't know what extension it wants until it's been configured // 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(); aw.SetDefaultVideoCodecToken();
} }
else 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); var token = aw.AcquireVideoCodecToken(this);
if (token == null) if (token == null)
{ {
@ -3190,7 +2976,7 @@ namespace BizHawk.Client.EmuHawk
} }
// select file to save to // select file to save to
if (unattended) if (unattended && !string.IsNullOrEmpty(filename))
{ {
aw.OpenFile(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<TAStudio>())
{
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<LuaConsole>())
{
GlobalWin.Tools.LuaConsole.LuaImp.CallSaveStateEvent(quickSlotName);
}
}
private static void CommitCoreSettingsToConfig() private static void CommitCoreSettingsToConfig()
{ {
// save settings object // save settings object
@ -3894,11 +3636,315 @@ namespace BizHawk.Client.EmuHawk
// TODO: move me // TODO: move me
public IControlMainform master { get; private set; } public IControlMainform master { get; private set; }
public void RelinquishControl(IControlMainform master) public void RelinquishControl(IControlMainform master)
{ {
this.master = 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<LuaConsole>())
{
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<LuaConsole>())
{
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() private void ToggleReadOnly()
{ {
if (IsSlave && master.WantsToControlReadOnly) 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) private void GBAcoresettingsToolStripMenuItem1_Click(object sender, EventArgs e)
{ {
GenericCoreConfig.DoDialog(this, "Gameboy Advance Settings"); GenericCoreConfig.DoDialog(this, "Gameboy Advance Settings");
@ -3967,7 +4003,7 @@ namespace BizHawk.Client.EmuHawk
{ {
if (Global.ClientControls["Rewind"] || PressRewind) 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(); return master.Rewind();
} }
} }
@ -4061,6 +4097,5 @@ namespace BizHawk.Client.EmuHawk
quickNESToolStripMenuItem.Checked = Global.Config.NES_InQuickNES == true; quickNESToolStripMenuItem.Checked = Global.Config.NES_InQuickNES == true;
nesHawkToolStripMenuItem.Checked = Global.Config.NES_InQuickNES == false; nesHawkToolStripMenuItem.Checked = Global.Config.NES_InQuickNES == false;
} }
} }
} }

View File

@ -123,453 +123,463 @@
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="DisplayConfigMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="DisplayConfigMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
vAAADrwBlbxySQAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTFH80I3AAABpElEQVQ4T52T YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAOuAAA
QUsCURSF33+SDAUxRAyEwQiEksiFUJEMhGEDOcQgRi2UGJBgCkFIZDDbGEGWEsTMItBNrdu3ad3y1Hmk DrgBakH1WwAAAa9JREFUOE+dk0FrGlEUhd9/kloUxCBiQRBLQUglxIXQlspAMdiBKmEIlmahhAEJmBII
VNosvHC4l3u+A2/ezIi/5fP58D1OlJf3qzRNmwCn7TzrZ8AzfGk3kM1mkcvlUCgUUCqVUKlUUK1WwSDF NMiQ2I0hEBOlUMZFwWzadffZdN3lab8HE1pjXEQ43Os539HxzWjMwisWi2nRi96vyv7ruK5750OWefd9
mTt6ZMgyw6zIZDIYDAYziVmRTqfhui5WDhoI7VxAMa6xdvKIDWsgxZk7emTIRiIR2ZkVqVQKvV4Pc1vn kfX/LawsnwbHqtVqqtfrajabarfb6na76vV6oojY8chgYOnQNdVqVfP5/EGiayqVimazmda3j5V680kF
+OI9RYas4ziyMyuSySQ6nQ7mt2s4unuH6XxMFT0yZHkCdmZFIpFAs9lEUK1Drb9g82wIrfWK4s2bFGfu 70wbe1/1oj+3Yscjg4HNZDJ20jXlclmTyUSPXn3UX36lYGDDMLSTrimVShqNRnr8+lAfLn/JD38vFRkM
6JEh2+12ZWdWxONxWJYln3HddBDVWlNFjwxZnoCdWRGNRlEul7Gw20Tm9Amr5YepokeGbLvdlp1ZEQ6H LFfApGuKxaIGg4GSzpGcox96eXAt9+Snds5vrNjxyGBgx+OxnXRNPp9Xv9+3v3HTD5V1T5aKDAaWK2DS
YRgGInl7fPP/iQzZkZgVwWAQ+XweS3s1LO5fyVe2fHiL5PG9FGfu6JEhOxKzwu/3Q1VV6LoO0zRh2zb6 NdlsVp1OR2tbA1X3v+l558tSkcHADodDO+madDotz/OUaQS3Jx/dgcUJAxuJrkkmk2o0Gnr69lBP3n22
/f74Y+HMHT0yZEdiVhQNXQ6BQAChUEheUCwWkxekKIoUZ+7okSHLDLPyf3geuphFQgjxCdiQMGrYYwVf t+zZ+wuVdq+s2PHIYGAj0TXxeFyO46jVasn3fQVBoOl0evtgseORwcBGomt2vJZYEomEUqmUPaBcLmcP
AAAAAElFTkSuQmCC qFAoWLHjkcHA0qFr/zjfr2d6iOj+AdiQMGoJxWWRAAAAAElFTkSuQmCC
</value> </value>
</data> </data>
<data name="FirmwaresMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="FirmwaresMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAQ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
SgAAEEoBNcinnwAAAHBJREFUOE/NkOEKACEIg330e/NOA2PqTqL+XPBpbcMokUfGFUy0xTrFitogNHgG YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAQRgAA
qUJDzs58ERpydua1/OwJiv967hQr4QkfaHJSPDzYICR4OwOOsOK3+c2Oh/I5QMUEDijD1gbMEiKZpaF5 EEYB7r8o6AAAAHVJREFUOE/NkuEKwCAIhN2b781bGsZlarH9aIEEcX2eVxfdVOjTYoCpUhef2d3qWnMR
BBW3kfECg6SiSi9TP3UAAAAASUVORK5CYII= AoTEkV9OMwEMdQTwsxGc9PU19l7BS5qhNVyuOXS4wFlgoXgL4FoMHHUtfqTIgZ6HGaw6I2CCDXMmGagu
BaycvB4hAz9wYIvatCqJLwAAAABJRU5ErkJggg==
</value> </value>
</data> </data>
<data name="gameSharkConverterToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="gameSharkConverterToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
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
AAAASUVORK5CYII= OAUuC2EAD+rGn591rlKKcL+QzTnH1P8XsGzmGf8DfkBfS0tQ1cQAAAAASUVORK5CYII=
</value> </value>
</data> </data>
<data name="N64PluginSettingsMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="N64PluginSettingsMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
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
</value> </value>
</data> </data>
<metadata name="MainStatusBar.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="MainStatusBar.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
@ -580,24 +590,25 @@
</metadata> </metadata>
<data name="toolStripMenuItem8.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="toolStripMenuItem8.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
vAAADrwBlbxySQAAABp0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuMTFH80I3AAABpElEQVQ4T52T YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAOuAAA
QUsCURSF33+SDAUxRAyEwQiEksiFUJEMhGEDOcQgRi2UGJBgCkFIZDDbGEGWEsTMItBNrdu3ad3y1Hmk DrgBakH1WwAAAa9JREFUOE+dk0FrGlEUhd9/kloUxCBiQRBLQUglxIXQlspAMdiBKmEIlmahhAEJmBII
VNosvHC4l3u+A2/ezIi/5fP58D1OlJf3qzRNmwCn7TzrZ8AzfGk3kM1mkcvlUCgUUCqVUKlUUK1WwSDF NMiQ2I0hEBOlUMZFwWzadffZdN3lab8HE1pjXEQ43Os539HxzWjMwisWi2nRi96vyv7ruK5750OWefd9
mTt6ZMgyw6zIZDIYDAYziVmRTqfhui5WDhoI7VxAMa6xdvKIDWsgxZk7emTIRiIR2ZkVqVQKvV4Pc1vn kfX/LawsnwbHqtVqqtfrajabarfb6na76vV6oojY8chgYOnQNdVqVfP5/EGiayqVimazmda3j5V680kF
+OI9RYas4ziyMyuSySQ6nQ7mt2s4unuH6XxMFT0yZHkCdmZFIpFAs9lEUK1Drb9g82wIrfWK4s2bFGfu 70wbe1/1oj+3Yscjg4HNZDJ20jXlclmTyUSPXn3UX36lYGDDMLSTrimVShqNRnr8+lAfLn/JD38vFRkM
6JEh2+12ZWdWxONxWJYln3HddBDVWlNFjwxZnoCdWRGNRlEul7Gw20Tm9Amr5YepokeGbLvdlp1ZEQ6H LFfApGuKxaIGg4GSzpGcox96eXAt9+Snds5vrNjxyGBgx+OxnXRNPp9Xv9+3v3HTD5V1T5aKDAaWK2DS
YRgGInl7fPP/iQzZkZgVwWAQ+XweS3s1LO5fyVe2fHiL5PG9FGfu6JEhOxKzwu/3Q1VV6LoO0zRh2zb6 NdlsVp1OR2tbA1X3v+l558tSkcHADodDO+madDotz/OUaQS3Jx/dgcUJAxuJrkkmk2o0Gnr69lBP3n22
/f74Y+HMHT0yZEdiVhQNXQ6BQAChUEheUCwWkxekKIoUZ+7okSHLDLPyf3geuphFQgjxCdiQMGrYYwVf t+zZ+wuVdq+s2PHIYGAj0TXxeFyO46jVasn3fQVBoOl0evtgseORwcBGomt2vJZYEomEUqmUPaBcLmcP
AAAAAElFTkSuQmCC qFAoWLHjkcHA0qFr/zjfr2d6iOj+AdiQMGoJxWWRAAAAAElFTkSuQmCC
</value> </value>
</data> </data>
<data name="toolStripMenuItem11.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="toolStripMenuItem11.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAQ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
SgAAEEoBNcinnwAAAHBJREFUOE/NkOEKACEIg330e/NOA2PqTqL+XPBpbcMokUfGFUy0xTrFitogNHgG YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAQRgAA
qUJDzs58ERpydua1/OwJiv967hQr4QkfaHJSPDzYICR4OwOOsOK3+c2Oh/I5QMUEDijD1gbMEiKZpaF5 EEYB7r8o6AAAAHVJREFUOE/NkuEKwCAIhN2b781bGsZlarH9aIEEcX2eVxfdVOjTYoCpUhef2d3qWnMR
BBW3kfECg6SiSi9TP3UAAAAASUVORK5CYII= AoTEkV9OMwEMdQTwsxGc9PU19l7BS5qhNVyuOXS4wFlgoXgL4FoMHHUtfqTIgZ6HGaw6I2CCDXMmGagu
BaycvB4hAz9wYIvatCqJLwAAAABJRU5ErkJggg==
</value> </value>
</data> </data>
<metadata name="timerMouseIdle.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="timerMouseIdle.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">

View File

@ -19,6 +19,37 @@ namespace BizHawk.Client.EmuHawk
{ {
//http://www.codeproject.com/Articles/310675/AppDomain-AssemblyResolve-Event-Tips //http://www.codeproject.com/Articles/310675/AppDomain-AssemblyResolve-Event-Tips
#if WINDOWS #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 // this will look in subdirectory "dll" to load pinvoked stuff
string dllDir = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "dll"); string dllDir = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "dll");
SetDllDirectory(dllDir); 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 //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); AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
#endif #endif
} }
[STAThread] [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 //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)] [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, // 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?) // 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) if (thisversion != utilversion || thisversion != emulversion)
{ {
MessageBox.Show("Conflicting revisions found! Don't mix .dll versions!"); MessageBox.Show("Conflicting revisions found! Don't mix .dll versions!");
return; return -1;
} }
} }
@ -138,7 +180,7 @@ namespace BizHawk.Client.EmuHawk
mf.Show(); mf.Show();
mf.Text = title; mf.Text = title;
mf.ProgramRunLoop(); GlobalWin.ExitCode = mf.ProgramRunLoop();
} }
} }
} }
@ -169,13 +211,13 @@ namespace BizHawk.Client.EmuHawk
if (System.Diagnostics.Debugger.IsAttached) if (System.Diagnostics.Debugger.IsAttached)
{ {
mf.ProgramRunLoop(); GlobalWin.ExitCode = mf.ProgramRunLoop();
} }
else else
{ {
try try
{ {
mf.ProgramRunLoop(); GlobalWin.ExitCode = mf.ProgramRunLoop();
} }
catch (Exception e) catch (Exception e)
{ {
@ -227,6 +269,8 @@ namespace BizHawk.Client.EmuHawk
// GlobalWin.GL.Dispose(); // GlobalWin.GL.Dispose();
//((IDisposable)GlobalWin.IGL_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 } //SubMain
//declared here instead of a more usual place to avoid dependencies on the more usual place //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"); 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) static void WhackAllMOTW(string dllDir)
{ {
var todo = new Queue<DirectoryInfo>(new[] { new DirectoryInfo(dllDir) }); var todo = new Queue<DirectoryInfo>(new[] { new DirectoryInfo(dllDir) });
@ -319,7 +344,7 @@ namespace BizHawk.Client.EmuHawk
var title = MainForm.Text; var title = MainForm.Text;
MainForm.Show(); MainForm.Show();
MainForm.Text = title; MainForm.Text = title;
(MainForm as MainForm).ProgramRunLoop(); GlobalWin.ExitCode = (MainForm as MainForm).ProgramRunLoop();
} }
} }

View File

@ -58,7 +58,7 @@ namespace BizHawk.Client.EmuHawk
//notably, if we're frame-advancing, we should be paused. //notably, if we're frame-advancing, we should be paused.
if (signal_paused && !signal_continuousframeAdvancing) 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; skipnextframe = false;
framesskipped = 0; framesskipped = 0;
framestoskip = 0; framestoskip = 0;

View File

@ -64,6 +64,8 @@
this.groupBox4 = new System.Windows.Forms.GroupBox(); this.groupBox4 = new System.Windows.Forms.GroupBox();
this.groupBox5 = new System.Windows.Forms.GroupBox(); this.groupBox5 = new System.Windows.Forms.GroupBox();
this.cbLEC = new System.Windows.Forms.CheckBox(); 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.groupBox1.SuspendLayout();
this.groupBox2.SuspendLayout(); this.groupBox2.SuspendLayout();
this.groupBox3.SuspendLayout(); this.groupBox3.SuspendLayout();
@ -73,6 +75,7 @@
((System.ComponentModel.ISupportInitialize)(this.NTSC_FirstLineNumeric)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.NTSC_FirstLineNumeric)).BeginInit();
this.groupBox4.SuspendLayout(); this.groupBox4.SuspendLayout();
this.groupBox5.SuspendLayout(); this.groupBox5.SuspendLayout();
this.groupBox6.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// //
// btnCancel // btnCancel
@ -454,10 +457,10 @@
this.groupBox5.Controls.Add(this.cbLEC); this.groupBox5.Controls.Add(this.cbLEC);
this.groupBox5.Location = new System.Drawing.Point(12, 306); this.groupBox5.Location = new System.Drawing.Point(12, 306);
this.groupBox5.Name = "groupBox5"; 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.TabIndex = 47;
this.groupBox5.TabStop = false; this.groupBox5.TabStop = false;
this.groupBox5.Text = "Emulation"; this.groupBox5.Text = "Emulation Sync Settings";
// //
// cbLEC // cbLEC
// //
@ -469,6 +472,28 @@
this.cbLEC.Text = "Emulate Sector Error Correction\r\n(usually unneeded; breaks some patches)"; this.cbLEC.Text = "Emulate Sector Error Correction\r\n(usually unneeded; breaks some patches)";
this.cbLEC.UseVisualStyleBackColor = true; 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 // PSXOptions
// //
this.AcceptButton = this.btnOk; this.AcceptButton = this.btnOk;
@ -476,6 +501,7 @@
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.btnCancel; this.CancelButton = this.btnCancel;
this.ClientSize = new System.Drawing.Size(713, 405); this.ClientSize = new System.Drawing.Size(713, 405);
this.Controls.Add(this.groupBox6);
this.Controls.Add(this.groupBox5); this.Controls.Add(this.groupBox5);
this.Controls.Add(this.groupBox4); this.Controls.Add(this.groupBox4);
this.Controls.Add(this.groupBox2); this.Controls.Add(this.groupBox2);
@ -501,6 +527,8 @@
this.groupBox4.PerformLayout(); this.groupBox4.PerformLayout();
this.groupBox5.ResumeLayout(false); this.groupBox5.ResumeLayout(false);
this.groupBox5.PerformLayout(); this.groupBox5.PerformLayout();
this.groupBox6.ResumeLayout(false);
this.groupBox6.PerformLayout();
this.ResumeLayout(false); this.ResumeLayout(false);
} }
@ -541,5 +569,7 @@
private System.Windows.Forms.RadioButton rbBob; private System.Windows.Forms.RadioButton rbBob;
private System.Windows.Forms.GroupBox groupBox5; private System.Windows.Forms.GroupBox groupBox5;
private System.Windows.Forms.CheckBox cbLEC; private System.Windows.Forms.CheckBox cbLEC;
private System.Windows.Forms.CheckBox cbGpuLag;
private System.Windows.Forms.GroupBox groupBox6;
} }
} }

View File

@ -42,6 +42,7 @@ namespace BizHawk.Client.EmuHawk
rbClipToFramebuffer.Checked = _settings.HorizontalClipping == Octoshock.eHorizontalClipping.Framebuffer; rbClipToFramebuffer.Checked = _settings.HorizontalClipping == Octoshock.eHorizontalClipping.Framebuffer;
cbLEC.Checked = _syncSettings.EnableLEC; cbLEC.Checked = _syncSettings.EnableLEC;
cbGpuLag.Checked = _settings.GPULag;
rbWeave.Checked = _settings.DeinterlaceMode == Octoshock.eDeinterlaceMode.Weave; rbWeave.Checked = _settings.DeinterlaceMode == Octoshock.eDeinterlaceMode.Weave;
rbBob.Checked = _settings.DeinterlaceMode == Octoshock.eDeinterlaceMode.Bob; rbBob.Checked = _settings.DeinterlaceMode == Octoshock.eDeinterlaceMode.Bob;
@ -98,6 +99,8 @@ namespace BizHawk.Client.EmuHawk
settings.ScanlineStart_PAL = (int)PAL_FirstLineNumeric.Value; settings.ScanlineStart_PAL = (int)PAL_FirstLineNumeric.Value;
settings.ScanlineEnd_PAL = (int)PAL_LastLineNumeric.Value; settings.ScanlineEnd_PAL = (int)PAL_LastLineNumeric.Value;
settings.GPULag = cbGpuLag.Checked;
syncSettings.EnableLEC = cbLEC.Checked; syncSettings.EnableLEC = cbLEC.Checked;
} }

View File

@ -41,7 +41,7 @@
// Ok // Ok
// //
this.Ok.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); 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.Name = "Ok";
this.Ok.Size = new System.Drawing.Size(75, 23); this.Ok.Size = new System.Drawing.Size(75, 23);
this.Ok.TabIndex = 0; 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.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.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.Name = "Cancel";
this.Cancel.Size = new System.Drawing.Size(75, 23); this.Cancel.Size = new System.Drawing.Size(75, 23);
this.Cancel.TabIndex = 1; this.Cancel.TabIndex = 1;
@ -70,13 +70,13 @@
this.PathTabControl.Multiline = true; this.PathTabControl.Multiline = true;
this.PathTabControl.Name = "PathTabControl"; this.PathTabControl.Name = "PathTabControl";
this.PathTabControl.SelectedIndex = 0; 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; this.PathTabControl.TabIndex = 2;
// //
// SaveBtn // SaveBtn
// //
this.SaveBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); 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.Name = "SaveBtn";
this.SaveBtn.Size = new System.Drawing.Size(75, 23); this.SaveBtn.Size = new System.Drawing.Size(75, 23);
this.SaveBtn.TabIndex = 3; 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.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.label1.AutoSize = true; 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.Name = "label1";
this.label1.Size = new System.Drawing.Size(97, 13); this.label1.Size = new System.Drawing.Size(97, 13);
this.label1.TabIndex = 210; 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.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.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.Name = "SpecialCommandsBtn";
this.SpecialCommandsBtn.Size = new System.Drawing.Size(26, 23); this.SpecialCommandsBtn.Size = new System.Drawing.Size(26, 23);
this.SpecialCommandsBtn.TabIndex = 209; this.SpecialCommandsBtn.TabIndex = 209;
@ -119,7 +119,7 @@
// DefaultsBtn // DefaultsBtn
// //
this.DefaultsBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); 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.Name = "DefaultsBtn";
this.DefaultsBtn.Size = new System.Drawing.Size(75, 23); this.DefaultsBtn.Size = new System.Drawing.Size(75, 23);
this.DefaultsBtn.TabIndex = 211; this.DefaultsBtn.TabIndex = 211;
@ -133,7 +133,7 @@
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.Cancel; 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.DefaultsBtn);
this.Controls.Add(this.label1); this.Controls.Add(this.label1);
this.Controls.Add(this.SpecialCommandsBtn); this.Controls.Add(this.SpecialCommandsBtn);

View File

@ -32,20 +32,22 @@
this.btnCancel = new System.Windows.Forms.Button(); this.btnCancel = new System.Windows.Forms.Button();
this.rbCompatibility = new System.Windows.Forms.RadioButton(); this.rbCompatibility = new System.Windows.Forms.RadioButton();
this.groupBox1 = new System.Windows.Forms.GroupBox(); this.groupBox1 = new System.Windows.Forms.GroupBox();
this.label2 = new System.Windows.Forms.Label();
this.rbAccuracy = new System.Windows.Forms.RadioButton(); this.rbAccuracy = new System.Windows.Forms.RadioButton();
this.rbPerformance = new System.Windows.Forms.RadioButton(); this.rbPerformance = new System.Windows.Forms.RadioButton();
this.cbRingbuf = new System.Windows.Forms.CheckBox(); this.cbRingbuf = new System.Windows.Forms.CheckBox();
this.label1 = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label();
this.cbDoubleSize = new System.Windows.Forms.CheckBox(); this.cbDoubleSize = new System.Windows.Forms.CheckBox();
this.lblDoubleSize = new System.Windows.Forms.Label(); 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.groupBox1.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// //
// btnOk // btnOk
// //
this.btnOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); 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.Name = "btnOk";
this.btnOk.Size = new System.Drawing.Size(75, 23); this.btnOk.Size = new System.Drawing.Size(75, 23);
this.btnOk.TabIndex = 0; 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.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.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.Name = "btnCancel";
this.btnCancel.Size = new System.Drawing.Size(75, 23); this.btnCancel.Size = new System.Drawing.Size(75, 23);
this.btnCancel.TabIndex = 1; this.btnCancel.TabIndex = 1;
@ -89,6 +91,14 @@
this.groupBox1.TabStop = false; this.groupBox1.TabStop = false;
this.groupBox1.Text = "Core Selection"; 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 // rbAccuracy
// //
this.rbAccuracy.AutoSize = true; this.rbAccuracy.AutoSize = true;
@ -152,13 +162,25 @@
"orce the SNES output to stay double-size always. NOTE: The Accuracy core runs as" + "orce the SNES output to stay double-size always. NOTE: The Accuracy core runs as" +
" if this is selected.\r\n"; " if this is selected.\r\n";
// //
// label2 // cbForceDeterminism
// //
this.label2.Location = new System.Drawing.Point(72, 85); this.cbForceDeterminism.AutoSize = true;
this.label2.Name = "label2"; this.cbForceDeterminism.Location = new System.Drawing.Point(19, 271);
this.label2.Size = new System.Drawing.Size(136, 21); this.cbForceDeterminism.Name = "cbForceDeterminism";
this.label2.TabIndex = 8; this.cbForceDeterminism.Size = new System.Drawing.Size(113, 17);
this.label2.Text = "NOT SUPPORTED YET!"; 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 // SNESOptions
// //
@ -166,7 +188,9 @@
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.btnCancel; 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.lblDoubleSize);
this.Controls.Add(this.cbDoubleSize); this.Controls.Add(this.cbDoubleSize);
this.Controls.Add(this.label1); this.Controls.Add(this.label1);
@ -202,5 +226,7 @@
private System.Windows.Forms.Label lblDoubleSize; private System.Windows.Forms.Label lblDoubleSize;
private System.Windows.Forms.RadioButton rbAccuracy; private System.Windows.Forms.RadioButton rbAccuracy;
private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label2;
private System.Windows.Forms.CheckBox cbForceDeterminism;
private System.Windows.Forms.Label label3;
} }
} }

View File

@ -15,6 +15,35 @@ namespace BizHawk.Client.EmuHawk
bool SuppressDoubleSize; bool SuppressDoubleSize;
bool UserDoubleSizeOption; 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 public string Profile
{ {
get get
@ -45,6 +74,39 @@ namespace BizHawk.Client.EmuHawk
set { UserDoubleSizeOption = value; RefreshDoubleSizeOption(); } 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) private void btnOk_Click(object sender, EventArgs e)
{ {
DialogResult = DialogResult.OK; DialogResult = DialogResult.OK;
@ -57,54 +119,5 @@ namespace BizHawk.Client.EmuHawk
Close(); 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;
}
} }
} }

View File

@ -150,10 +150,32 @@ namespace BizHawk.Client.EmuHawk
} }
private void BrowseBtn_Click(object sender, EventArgs e) 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 var sfd = new SaveFileDialog
{ {
InitialDirectory = PathManager.MakeAbsolutePath(Global.Config.PathEntries.MoviesPathFragment, null), InitialDirectory = movieFolderPath,
DefaultExt = "." + Global.MovieSession.Movie.PreferredExtension, DefaultExt = "." + Global.MovieSession.Movie.PreferredExtension,
FileName = RecordBox.Text, FileName = RecordBox.Text,
OverwritePrompt = false, OverwritePrompt = false,

File diff suppressed because it is too large Load Diff

View File

@ -44,6 +44,7 @@ namespace BizHawk.Client.EmuHawk
private bool _oldCountingSetting = false; private bool _oldCountingSetting = false;
private BotAttempt _currentBotAttempt = null; private BotAttempt _currentBotAttempt = null;
private BotAttempt _bestBotAttempt = null; private BotAttempt _bestBotAttempt = null;
private BotAttempt _comparisonBotAttempt = null;
private bool _replayMode = false; private bool _replayMode = false;
private int _startFrame = 0; private int _startFrame = 0;
private string _lastRom = string.Empty; private string _lastRom = string.Empty;
@ -93,7 +94,9 @@ namespace BizHawk.Client.EmuHawk
InitializeComponent(); InitializeComponent();
Text = DialogTitle; Text = DialogTitle;
Settings = new BasicBotSettings(); Settings = new BasicBotSettings();
}
_comparisonBotAttempt = new BotAttempt();
}
private void BasicBot_Load(object sender, EventArgs e) private void BasicBot_Load(object sender, EventArgs e)
{ {
@ -288,12 +291,12 @@ namespace BizHawk.Client.EmuHawk
{ {
get get
{ {
return (byte)mainOperator.SelectedIndex; return (byte)MainOperator.SelectedIndex;
} }
set set
{ {
if (value < 5) mainOperator.SelectedIndex = value; if (value < 5) MainOperator.SelectedIndex = value;
else mainOperator.SelectedIndex = 0; else MainOperator.SelectedIndex = 0;
} }
} }
@ -444,12 +447,21 @@ namespace BizHawk.Client.EmuHawk
TieBreaker2Address = 0; TieBreaker2Address = 0;
TieBreaker3Address = 0; TieBreaker3Address = 0;
StartFromSlotBox.SelectedIndex = 0; StartFromSlotBox.SelectedIndex = 0;
mainOperator.SelectedIndex = 0; MainOperator.SelectedIndex = 0;
Tiebreak1Operator.SelectedIndex = 0; Tiebreak1Operator.SelectedIndex = 0;
Tiebreak2Operator.SelectedIndex = 0; Tiebreak2Operator.SelectedIndex = 0;
Tiebreak3Operator.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(); UpdateBestAttempt();
UpdateComparisonBotAttempt();
} }
private void OpenMenuItem_Click(object sender, EventArgs e) private void OpenMenuItem_Click(object sender, EventArgs e)
@ -561,7 +573,10 @@ namespace BizHawk.Client.EmuHawk
private void ClearBestButton_Click(object sender, EventArgs e) private void ClearBestButton_Click(object sender, EventArgs e)
{ {
_bestBotAttempt = null; _bestBotAttempt = null;
Attempts = 0;
Frames = 0;
UpdateBestAttempt(); UpdateBestAttempt();
UpdateComparisonBotAttempt();
} }
private void PlayBestButton_Click(object sender, EventArgs e) private void PlayBestButton_Click(object sender, EventArgs e)
@ -615,17 +630,33 @@ namespace BizHawk.Client.EmuHawk
private class BotData private class BotData
{ {
public BotData()
{
MainCompareToBest = true;
TieBreaker1CompareToBest = true;
TieBreaker2CompareToBest = true;
TieBreaker3CompareToBest = true;
}
public BotAttempt Best { get; set; } public BotAttempt Best { get; set; }
public Dictionary<string, double> ControlProbabilities { get; set; } public Dictionary<string, double> ControlProbabilities { get; set; }
public int Maximize { get; set; } public int Maximize { get; set; }
public int TieBreaker1 { get; set; } public int TieBreaker1 { get; set; }
public int TieBreaker2 { get; set; } public int TieBreaker2 { get; set; }
public int TieBreaker3 { get; set; } public int TieBreaker3 { get; set; }
public byte ComparisonTypeMain { get; set; } public byte ComparisonTypeMain { get; set; }
public byte ComparisonTypeTie1 { get; set; } public byte ComparisonTypeTie1 { get; set; }
public byte ComparisonTypeTie2 { get; set; } public byte ComparisonTypeTie2 { get; set; }
public byte ComparisonTypeTie3 { get; set; } public byte ComparisonTypeTie3 { get; set; }
public int FrameLength { 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 string FromSlot { get; set; }
public long Attempts { get; set; } public long Attempts { get; set; }
public long Frames { get; set; } public long Frames { get; set; }
@ -661,7 +692,6 @@ namespace BizHawk.Client.EmuHawk
_bestBotAttempt = botData.Best; _bestBotAttempt = botData.Best;
var probabilityControls = ControlProbabilityPanel.Controls var probabilityControls = ControlProbabilityPanel.Controls
.OfType<BotControlsRow>() .OfType<BotControlsRow>()
.ToList(); .ToList();
@ -682,14 +712,42 @@ namespace BizHawk.Client.EmuHawk
Tie1ComparisonType = botData.ComparisonTypeTie1; Tie1ComparisonType = botData.ComparisonTypeTie1;
Tie2ComparisonType = botData.ComparisonTypeTie2; Tie2ComparisonType = botData.ComparisonTypeTie2;
Tie3ComparisonType = botData.ComparisonTypeTie3; 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 catch
{ {
MainComparisonType = 0; MainComparisonType = 0;
Tie1ComparisonType = 0; Tie1ComparisonType = 0;
Tie2ComparisonType = 0; Tie2ComparisonType = 0;
Tie3ComparisonType = 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; FrameLength = botData.FrameLength;
FromSlot = botData.FromSlot; FromSlot = botData.FromSlot;
Attempts = botData.Attempts; Attempts = botData.Attempts;
@ -703,6 +761,7 @@ namespace BizHawk.Client.EmuHawk
_dataSize = botData.DataSize > 0 ? botData.DataSize : 1; _dataSize = botData.DataSize > 0 ? botData.DataSize : 1;
UpdateBestAttempt(); UpdateBestAttempt();
UpdateComparisonBotAttempt();
if (_bestBotAttempt != null) if (_bestBotAttempt != null)
{ {
@ -716,20 +775,28 @@ namespace BizHawk.Client.EmuHawk
return true; return true;
} }
private void SaveBotFile(string path) private void SaveBotFile(string path)
{ {
var data = new BotData var data = new BotData
{ {
Best = _bestBotAttempt, Best = _bestBotAttempt,
ControlProbabilities = ControlProbabilities, ControlProbabilities = ControlProbabilities,
Maximize = MaximizeAddress, Maximize = MaximizeAddress,
TieBreaker1 = TieBreaker1Address, TieBreaker1 = TieBreaker1Address,
TieBreaker2 = TieBreaker2Address, TieBreaker2 = TieBreaker2Address,
TieBreaker3 = TieBreaker3Address, TieBreaker3 = TieBreaker3Address,
ComparisonTypeMain = MainComparisonType, ComparisonTypeMain = MainComparisonType,
ComparisonTypeTie1 = Tie1ComparisonType, ComparisonTypeTie1 = Tie1ComparisonType,
ComparisonTypeTie2 = Tie2ComparisonType, ComparisonTypeTie2 = Tie2ComparisonType,
ComparisonTypeTie3 = Tie3ComparisonType, 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, FromSlot = FromSlot,
FrameLength = FrameLength, FrameLength = FrameLength,
Attempts = Attempts, Attempts = Attempts,
@ -857,7 +924,7 @@ namespace BizHawk.Client.EmuHawk
_currentBotAttempt.TieBreak3 = TieBreaker3Value; _currentBotAttempt.TieBreak3 = TieBreaker3Value;
PlayBestButton.Enabled = true; PlayBestButton.Enabled = true;
if (_bestBotAttempt == null || IsBetter(_bestBotAttempt, _currentBotAttempt)) if (IsBetter(_comparisonBotAttempt, _currentBotAttempt))
{ {
_bestBotAttempt = _currentBotAttempt; _bestBotAttempt = _currentBotAttempt;
UpdateBestAttempt(); UpdateBestAttempt();
@ -880,25 +947,25 @@ namespace BizHawk.Client.EmuHawk
MessageLabel.Text = "Replay stopped"; 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; 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; 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; return false;
} }
else if (current.TieBreak2 == best.TieBreak2) else if (current.TieBreak2 == comparison.TieBreak2)
{ {
if (!TestValue(Tie3ComparisonType, current.TieBreak3, current.TieBreak3)) if (!TestValue(Tie3ComparisonType, current.TieBreak3, current.TieBreak3))
{ {
@ -933,8 +1000,6 @@ namespace BizHawk.Client.EmuHawk
{ {
if (_bestBotAttempt != null) if (_bestBotAttempt != null)
{ {
ClearBestButton.Enabled = true; ClearBestButton.Enabled = true;
BestAttemptNumberLabel.Text = _bestBotAttempt.Attempt.ToString(); BestAttemptNumberLabel.Text = _bestBotAttempt.Attempt.ToString();
BestMaximizeBox.Text = _bestBotAttempt.Maximize.ToString(); BestMaximizeBox.Text = _bestBotAttempt.Maximize.ToString();
@ -1101,5 +1166,161 @@ namespace BizHawk.Client.EmuHawk
&& !string.IsNullOrWhiteSpace(MaximizeAddressBox.Text) && !string.IsNullOrWhiteSpace(MaximizeAddressBox.Text)
&& ControlProbabilities.Any(kvp => kvp.Value > 0); && ControlProbabilities.Any(kvp => kvp.Value > 0);
} }
/// <summary>
/// Updates comparison bot attempt with current best bot attempt values for values where the "best" radio button is selected
/// </summary>
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;
}
} }
} }

View File

@ -65,7 +65,7 @@
this.ProbabilitySlider.Location = new System.Drawing.Point(147, -2); this.ProbabilitySlider.Location = new System.Drawing.Point(147, -2);
this.ProbabilitySlider.Maximum = 100; this.ProbabilitySlider.Maximum = 100;
this.ProbabilitySlider.Name = "ProbabilitySlider"; 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.TabIndex = 2;
this.ProbabilitySlider.TickFrequency = 25; this.ProbabilitySlider.TickFrequency = 25;
this.ProbabilitySlider.ValueChanged += new System.EventHandler(this.ProbabilitySlider_ValueChanged); this.ProbabilitySlider.ValueChanged += new System.EventHandler(this.ProbabilitySlider_ValueChanged);
@ -78,7 +78,7 @@
this.Controls.Add(this.ProbabilityUpDown); this.Controls.Add(this.ProbabilityUpDown);
this.Controls.Add(this.ButtonNameLabel); this.Controls.Add(this.ButtonNameLabel);
this.Name = "BotControlsRow"; 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); this.Load += new System.EventHandler(this.BotControlsRow_Load);
((System.ComponentModel.ISupportInitialize)(this.ProbabilityUpDown)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.ProbabilityUpDown)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.ProbabilitySlider)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.ProbabilitySlider)).EndInit();

View File

@ -7,10 +7,6 @@ using System.Linq;
using System.Windows.Forms; using System.Windows.Forms;
using BizHawk.Emulation.Common; 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.Common;
using BizHawk.Client.EmuHawk.ToolExtensions; using BizHawk.Client.EmuHawk.ToolExtensions;
using BizHawk.Client.EmuHawk.WinFormExtensions; using BizHawk.Client.EmuHawk.WinFormExtensions;
@ -172,7 +168,7 @@ namespace BizHawk.Client.EmuHawk
{ {
GameGenieToolbarSeparator.Visible = GameGenieToolbarSeparator.Visible =
LoadGameGenieToolbarItem.Visible = LoadGameGenieToolbarItem.Visible =
GlobalWin.Tools.GameGenieAvailable; GlobalWin.Tools.IsAvailable<GameShark>();
} }
private void AddCheat() private void AddCheat()
@ -443,7 +439,7 @@ namespace BizHawk.Client.EmuHawk
GameGenieSeparator.Visible = GameGenieSeparator.Visible =
OpenGameGenieEncoderDecoderMenuItem.Visible = OpenGameGenieEncoderDecoderMenuItem.Visible =
GlobalWin.Tools.GameGenieAvailable; GlobalWin.Tools.IsAvailable<GameShark>();
} }
private void RemoveCheatMenuItem_Click(object sender, EventArgs e) private void RemoveCheatMenuItem_Click(object sender, EventArgs e)

View File

@ -7,6 +7,18 @@ namespace BizHawk.Client.EmuHawk
{ {
public partial class GenericDebugger : IControlMainform 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 bool WantsToControlReadOnly { get { return false; } }
public void ToggleReadOnly() { } public void ToggleReadOnly() { }

View File

@ -5,11 +5,11 @@ using System.Text.RegularExpressions;
using System.Windows.Forms; using System.Windows.Forms;
using BizHawk.Emulation.Common; using BizHawk.Emulation.Common;
using BizHawk.Emulation.Common.IEmulatorExtensions;
using BizHawk.Client.Common; using BizHawk.Client.Common;
namespace BizHawk.Client.EmuHawk namespace BizHawk.Client.EmuHawk
{ {
[ToolAttributes(false, null)]
public partial class GBGameGenie : Form, IToolFormAutoConfig public partial class GBGameGenie : Form, IToolFormAutoConfig
{ {
// TODO: fix the use of Global.Game.System and Emulator.SystemId // TODO: fix the use of Global.Game.System and Emulator.SystemId

View File

@ -42,12 +42,12 @@
// //
this.mnuGameShark.Location = new System.Drawing.Point(0, 0); this.mnuGameShark.Location = new System.Drawing.Point(0, 0);
this.mnuGameShark.Name = "mnuGameShark"; 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; this.mnuGameShark.TabIndex = 0;
// //
// btnClear // 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.Name = "btnClear";
this.btnClear.Size = new System.Drawing.Size(75, 23); this.btnClear.Size = new System.Drawing.Size(75, 23);
this.btnClear.TabIndex = 4; this.btnClear.TabIndex = 4;
@ -58,7 +58,7 @@
// lblCheat // lblCheat
// //
this.lblCheat.AutoSize = true; 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.Name = "lblCheat";
this.lblCheat.Size = new System.Drawing.Size(63, 13); this.lblCheat.Size = new System.Drawing.Size(63, 13);
this.lblCheat.TabIndex = 11; this.lblCheat.TabIndex = 11;
@ -66,14 +66,14 @@
// //
// txtCheat // 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.Name = "txtCheat";
this.txtCheat.Size = new System.Drawing.Size(100, 20); this.txtCheat.Size = new System.Drawing.Size(100, 20);
this.txtCheat.TabIndex = 2; this.txtCheat.TabIndex = 2;
// //
// btnGo // 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.Name = "btnGo";
this.btnGo.Size = new System.Drawing.Size(75, 24); this.btnGo.Size = new System.Drawing.Size(75, 24);
this.btnGo.TabIndex = 3; this.btnGo.TabIndex = 3;
@ -84,7 +84,7 @@
// lblDescription // lblDescription
// //
this.lblDescription.AutoSize = true; 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.Name = "lblDescription";
this.lblDescription.Size = new System.Drawing.Size(60, 13); this.lblDescription.Size = new System.Drawing.Size(60, 13);
this.lblDescription.TabIndex = 17; this.lblDescription.TabIndex = 17;
@ -92,7 +92,7 @@
// //
// txtDescription // 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.Name = "txtDescription";
this.txtDescription.Size = new System.Drawing.Size(100, 20); this.txtDescription.Size = new System.Drawing.Size(100, 20);
this.txtDescription.TabIndex = 1; this.txtDescription.TabIndex = 1;
@ -101,7 +101,7 @@
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 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.txtDescription);
this.Controls.Add(this.lblDescription); this.Controls.Add(this.lblDescription);
this.Controls.Add(this.btnClear); this.Controls.Add(this.btnClear);
@ -113,6 +113,7 @@
this.MainMenuStrip = this.mnuGameShark; this.MainMenuStrip = this.mnuGameShark;
this.MaximizeBox = false; this.MaximizeBox = false;
this.Name = "GameShark"; this.Name = "GameShark";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "GameShark Converter"; this.Text = "GameShark Converter";
this.Load += new System.EventHandler(this.GameShark_Load); this.Load += new System.EventHandler(this.GameShark_Load);
this.ResumeLayout(false); this.ResumeLayout(false);

File diff suppressed because it is too large Load Diff

View File

@ -12,6 +12,7 @@ using BizHawk.Emulation.Cores.Consoles.Sega.gpgx;
namespace BizHawk.Client.EmuHawk namespace BizHawk.Client.EmuHawk
{ {
[ToolAttributes(false, null)]
public partial class GenGameGenie : Form, IToolFormAutoConfig public partial class GenGameGenie : Form, IToolFormAutoConfig
{ {
#pragma warning disable 675 #pragma warning disable 675

View File

@ -87,8 +87,8 @@
this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
this.viewN64MatrixToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.viewN64MatrixToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.MemoryViewerBox = new System.Windows.Forms.GroupBox(); this.MemoryViewerBox = new System.Windows.Forms.GroupBox();
this.AddressLabel = new System.Windows.Forms.Label();
this.HexScrollBar = new System.Windows.Forms.VScrollBar(); this.HexScrollBar = new System.Windows.Forms.VScrollBar();
this.AddressLabel = new System.Windows.Forms.Label();
this.AddressesLabel = new System.Windows.Forms.Label(); this.AddressesLabel = new System.Windows.Forms.Label();
this.Header = new System.Windows.Forms.Label(); this.Header = new System.Windows.Forms.Label();
this.HexMenuStrip.SuspendLayout(); this.HexMenuStrip.SuspendLayout();
@ -133,7 +133,7 @@
this.SaveMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveAs; this.SaveMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveAs;
this.SaveMenuItem.Name = "SaveMenuItem"; this.SaveMenuItem.Name = "SaveMenuItem";
this.SaveMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); 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.Text = "Save";
this.SaveMenuItem.Click += new System.EventHandler(this.SaveMenuItem_Click); this.SaveMenuItem.Click += new System.EventHandler(this.SaveMenuItem_Click);
// //
@ -142,33 +142,33 @@
this.SaveAsBinaryMenuItem.Name = "SaveAsBinaryMenuItem"; this.SaveAsBinaryMenuItem.Name = "SaveAsBinaryMenuItem";
this.SaveAsBinaryMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) this.SaveAsBinaryMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
| System.Windows.Forms.Keys.S))); | 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.Text = "Save as binary...";
this.SaveAsBinaryMenuItem.Click += new System.EventHandler(this.SaveAsBinaryMenuItem_Click); this.SaveAsBinaryMenuItem.Click += new System.EventHandler(this.SaveAsBinaryMenuItem_Click);
// //
// SaveAsTextMenuItem // SaveAsTextMenuItem
// //
this.SaveAsTextMenuItem.Name = "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.Text = "Save as text...";
this.SaveAsTextMenuItem.Click += new System.EventHandler(this.SaveAsTextMenuItem_Click); this.SaveAsTextMenuItem.Click += new System.EventHandler(this.SaveAsTextMenuItem_Click);
// //
// toolStripSeparator4 // toolStripSeparator4
// //
this.toolStripSeparator4.Name = "toolStripSeparator4"; this.toolStripSeparator4.Name = "toolStripSeparator4";
this.toolStripSeparator4.Size = new System.Drawing.Size(222, 6); this.toolStripSeparator4.Size = new System.Drawing.Size(233, 6);
// //
// LoadTableFileMenuItem // LoadTableFileMenuItem
// //
this.LoadTableFileMenuItem.Name = "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.Text = "&Load .tbl file";
this.LoadTableFileMenuItem.Click += new System.EventHandler(this.LoadTableFileMenuItem_Click); this.LoadTableFileMenuItem.Click += new System.EventHandler(this.LoadTableFileMenuItem_Click);
// //
// CloseTableFileMenuItem // CloseTableFileMenuItem
// //
this.CloseTableFileMenuItem.Name = "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.Text = "Close .tbl file";
this.CloseTableFileMenuItem.Click += new System.EventHandler(this.CloseTableFileMenuItem_Click); this.CloseTableFileMenuItem.Click += new System.EventHandler(this.CloseTableFileMenuItem_Click);
// //
@ -177,26 +177,26 @@
this.RecentTablesSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.RecentTablesSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.noneToolStripMenuItem}); this.noneToolStripMenuItem});
this.RecentTablesSubMenu.Name = "RecentTablesSubMenu"; 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.Text = "Recent";
this.RecentTablesSubMenu.DropDownOpened += new System.EventHandler(this.RecentTablesSubMenu_DropDownOpened); this.RecentTablesSubMenu.DropDownOpened += new System.EventHandler(this.RecentTablesSubMenu_DropDownOpened);
// //
// noneToolStripMenuItem // noneToolStripMenuItem
// //
this.noneToolStripMenuItem.Name = "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"; this.noneToolStripMenuItem.Text = "None";
// //
// toolStripSeparator1 // toolStripSeparator1
// //
this.toolStripSeparator1.Name = "toolStripSeparator1"; this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(222, 6); this.toolStripSeparator1.Size = new System.Drawing.Size(233, 6);
// //
// ExitMenuItem // ExitMenuItem
// //
this.ExitMenuItem.Name = "ExitMenuItem"; this.ExitMenuItem.Name = "ExitMenuItem";
this.ExitMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4))); 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.Text = "E&xit";
this.ExitMenuItem.Click += new System.EventHandler(this.ExitMenuItem_Click); 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.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Duplicate;
this.CopyMenuItem.Name = "CopyMenuItem"; this.CopyMenuItem.Name = "CopyMenuItem";
this.CopyMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C))); 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.Text = "&Copy";
this.CopyMenuItem.Click += new System.EventHandler(this.CopyMenuItem_Click); this.CopyMenuItem.Click += new System.EventHandler(this.CopyMenuItem_Click);
// //
@ -228,7 +228,7 @@
// //
this.ExportMenuItem.Name = "ExportMenuItem"; this.ExportMenuItem.Name = "ExportMenuItem";
this.ExportMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.E))); 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.Text = "&Export";
this.ExportMenuItem.Click += new System.EventHandler(this.ExportMenuItem_Click); 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.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Paste;
this.PasteMenuItem.Name = "PasteMenuItem"; this.PasteMenuItem.Name = "PasteMenuItem";
this.PasteMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.V))); 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.Text = "&Paste";
this.PasteMenuItem.Click += new System.EventHandler(this.PasteMenuItem_Click); this.PasteMenuItem.Click += new System.EventHandler(this.PasteMenuItem_Click);
// //
// toolStripSeparator6 // toolStripSeparator6
// //
this.toolStripSeparator6.Name = "toolStripSeparator6"; this.toolStripSeparator6.Name = "toolStripSeparator6";
this.toolStripSeparator6.Size = new System.Drawing.Size(141, 6); this.toolStripSeparator6.Size = new System.Drawing.Size(152, 6);
// //
// FindMenuItem // FindMenuItem
// //
this.FindMenuItem.Name = "FindMenuItem"; this.FindMenuItem.Name = "FindMenuItem";
this.FindMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F))); 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.Text = "&Find...";
this.FindMenuItem.Click += new System.EventHandler(this.FindMenuItem_Click); this.FindMenuItem.Click += new System.EventHandler(this.FindMenuItem_Click);
// //
@ -258,7 +258,7 @@
// //
this.FindNextMenuItem.Name = "FindNextMenuItem"; this.FindNextMenuItem.Name = "FindNextMenuItem";
this.FindNextMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F3; 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.Text = "Find Next";
this.FindNextMenuItem.Click += new System.EventHandler(this.FindNextMenuItem_Click); this.FindNextMenuItem.Click += new System.EventHandler(this.FindNextMenuItem_Click);
// //
@ -266,7 +266,7 @@
// //
this.FindPrevMenuItem.Name = "FindPrevMenuItem"; this.FindPrevMenuItem.Name = "FindPrevMenuItem";
this.FindPrevMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F2; 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.Text = "Find Prev";
this.FindPrevMenuItem.Click += new System.EventHandler(this.FindPrevMenuItem_Click); this.FindPrevMenuItem.Click += new System.EventHandler(this.FindPrevMenuItem_Click);
// //
@ -292,7 +292,7 @@
this.MemoryDomainsMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.MemoryDomainsMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripSeparator3}); this.toolStripSeparator3});
this.MemoryDomainsMenuItem.Name = "MemoryDomainsMenuItem"; 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.Text = "&Memory Domains";
this.MemoryDomainsMenuItem.DropDownOpened += new System.EventHandler(this.MemoryDomainsMenuItem_DropDownOpened); this.MemoryDomainsMenuItem.DropDownOpened += new System.EventHandler(this.MemoryDomainsMenuItem_DropDownOpened);
// //
@ -308,47 +308,47 @@
this.DataSizeWordMenuItem, this.DataSizeWordMenuItem,
this.DataSizeDWordMenuItem}); this.DataSizeDWordMenuItem});
this.DataSizeSubMenu.Name = "DataSizeSubMenu"; 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"; this.DataSizeSubMenu.Text = "Data Size";
// //
// DataSizeByteMenuItem // DataSizeByteMenuItem
// //
this.DataSizeByteMenuItem.Name = "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.Text = "1 Byte";
this.DataSizeByteMenuItem.Click += new System.EventHandler(this.DataSizeByteMenuItem_Click); this.DataSizeByteMenuItem.Click += new System.EventHandler(this.DataSizeByteMenuItem_Click);
// //
// DataSizeWordMenuItem // DataSizeWordMenuItem
// //
this.DataSizeWordMenuItem.Name = "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.Text = "2 Byte";
this.DataSizeWordMenuItem.Click += new System.EventHandler(this.DataSizeWordMenuItem_Click); this.DataSizeWordMenuItem.Click += new System.EventHandler(this.DataSizeWordMenuItem_Click);
// //
// DataSizeDWordMenuItem // DataSizeDWordMenuItem
// //
this.DataSizeDWordMenuItem.Name = "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.Text = "4 Byte";
this.DataSizeDWordMenuItem.Click += new System.EventHandler(this.DataSizeDWordMenuItem_Click); this.DataSizeDWordMenuItem.Click += new System.EventHandler(this.DataSizeDWordMenuItem_Click);
// //
// BigEndianMenuItem // BigEndianMenuItem
// //
this.BigEndianMenuItem.Name = "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.Text = "Big Endian";
this.BigEndianMenuItem.Click += new System.EventHandler(this.BigEndianMenuItem_Click); this.BigEndianMenuItem.Click += new System.EventHandler(this.BigEndianMenuItem_Click);
// //
// toolStripSeparator2 // toolStripSeparator2
// //
this.toolStripSeparator2.Name = "toolStripSeparator2"; this.toolStripSeparator2.Name = "toolStripSeparator2";
this.toolStripSeparator2.Size = new System.Drawing.Size(203, 6); this.toolStripSeparator2.Size = new System.Drawing.Size(214, 6);
// //
// GoToAddressMenuItem // GoToAddressMenuItem
// //
this.GoToAddressMenuItem.Name = "GoToAddressMenuItem"; this.GoToAddressMenuItem.Name = "GoToAddressMenuItem";
this.GoToAddressMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.G))); 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.Text = "&Go to Address...";
this.GoToAddressMenuItem.Click += new System.EventHandler(this.GoToAddressMenuItem_Click); 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.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.FindHS;
this.AddToRamWatchMenuItem.Name = "AddToRamWatchMenuItem"; this.AddToRamWatchMenuItem.Name = "AddToRamWatchMenuItem";
this.AddToRamWatchMenuItem.ShortcutKeyDisplayString = "Ctrl+W"; 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.Text = "Add to Ram Watch";
this.AddToRamWatchMenuItem.Click += new System.EventHandler(this.AddToRamWatchMenuItem_Click); 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.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Freeze;
this.FreezeAddressMenuItem.Name = "FreezeAddressMenuItem"; this.FreezeAddressMenuItem.Name = "FreezeAddressMenuItem";
this.FreezeAddressMenuItem.ShortcutKeyDisplayString = "Space"; 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.Text = "&Freeze Address";
this.FreezeAddressMenuItem.Click += new System.EventHandler(this.FreezeAddressMenuItem_Click); 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.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Unfreeze;
this.UnfreezeAllMenuItem.Name = "UnfreezeAllMenuItem"; this.UnfreezeAllMenuItem.Name = "UnfreezeAllMenuItem";
this.UnfreezeAllMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Shift | System.Windows.Forms.Keys.Delete))); 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.Text = "Unfreeze All";
this.UnfreezeAllMenuItem.Click += new System.EventHandler(this.UnfreezeAllMenuItem_Click); 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.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.poke;
this.PokeAddressMenuItem.Name = "PokeAddressMenuItem"; this.PokeAddressMenuItem.Name = "PokeAddressMenuItem";
this.PokeAddressMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.P))); 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.Text = "&Poke Address";
this.PokeAddressMenuItem.Click += new System.EventHandler(this.PokeAddressMenuItem_Click); this.PokeAddressMenuItem.Click += new System.EventHandler(this.PokeAddressMenuItem_Click);
// //
@ -403,25 +403,25 @@
this.toolStripSeparator8, this.toolStripSeparator8,
this.ResetColorsToDefaultMenuItem}); this.ResetColorsToDefaultMenuItem});
this.CustomColorsSubMenu.Name = "CustomColorsSubMenu"; 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"; this.CustomColorsSubMenu.Text = "Custom Colors";
// //
// SetColorsMenuItem // SetColorsMenuItem
// //
this.SetColorsMenuItem.Name = "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.Text = "Set Colors";
this.SetColorsMenuItem.Click += new System.EventHandler(this.SetColorsMenuItem_Click); this.SetColorsMenuItem.Click += new System.EventHandler(this.SetColorsMenuItem_Click);
// //
// toolStripSeparator8 // toolStripSeparator8
// //
this.toolStripSeparator8.Name = "toolStripSeparator8"; this.toolStripSeparator8.Name = "toolStripSeparator8";
this.toolStripSeparator8.Size = new System.Drawing.Size(150, 6); this.toolStripSeparator8.Size = new System.Drawing.Size(161, 6);
// //
// ResetColorsToDefaultMenuItem // ResetColorsToDefaultMenuItem
// //
this.ResetColorsToDefaultMenuItem.Name = "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.Text = "Reset to Default";
this.ResetColorsToDefaultMenuItem.Click += new System.EventHandler(this.ResetColorsToDefaultMenuItem_Click); this.ResetColorsToDefaultMenuItem.Click += new System.EventHandler(this.ResetColorsToDefaultMenuItem_Click);
// //
@ -570,19 +570,31 @@
| System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right))); | System.Windows.Forms.AnchorStyles.Right)));
this.MemoryViewerBox.ContextMenuStrip = this.ViewerContextMenuStrip; this.MemoryViewerBox.ContextMenuStrip = this.ViewerContextMenuStrip;
this.MemoryViewerBox.Controls.Add(this.AddressLabel);
this.MemoryViewerBox.Controls.Add(this.HexScrollBar); this.MemoryViewerBox.Controls.Add(this.HexScrollBar);
this.MemoryViewerBox.Controls.Add(this.AddressLabel);
this.MemoryViewerBox.Controls.Add(this.AddressesLabel); 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.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.Location = new System.Drawing.Point(12, 27);
this.MemoryViewerBox.MaximumSize = new System.Drawing.Size(600, 1024); this.MemoryViewerBox.MaximumSize = new System.Drawing.Size(600, 1024);
this.MemoryViewerBox.MinimumSize = new System.Drawing.Size(260, 180); this.MemoryViewerBox.MinimumSize = new System.Drawing.Size(260, 180);
this.MemoryViewerBox.Name = "MemoryViewerBox"; 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.TabIndex = 2;
this.MemoryViewerBox.TabStop = false; this.MemoryViewerBox.TabStop = false;
this.MemoryViewerBox.Paint += new System.Windows.Forms.PaintEventHandler(this.MemoryViewerBox_Paint); 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 // AddressLabel
// //
this.AddressLabel.AutoSize = true; this.AddressLabel.AutoSize = true;
@ -593,22 +605,11 @@
this.AddressLabel.TabIndex = 2; this.AddressLabel.TabIndex = 2;
this.AddressLabel.Text = " "; 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 // AddressesLabel
// //
this.AddressesLabel.AutoSize = true; this.AddressesLabel.AutoSize = true;
this.AddressesLabel.ContextMenuStrip = this.ViewerContextMenuStrip; 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.Name = "AddressesLabel";
this.AddressesLabel.Size = new System.Drawing.Size(31, 13); this.AddressesLabel.Size = new System.Drawing.Size(31, 13);
this.AddressesLabel.TabIndex = 0; this.AddressesLabel.TabIndex = 0;

View File

@ -480,7 +480,7 @@ namespace BizHawk.Client.EmuHawk
addrStr.Append(" "); addrStr.Append(" ");
} }
addrStr.AppendLine(_addr.ToHexString(_numDigits)); addrStr.AppendLine(_addr.ToHexString(_numDigits) + " |");
} }
return addrStr.ToString(); return addrStr.ToString();
@ -516,7 +516,7 @@ namespace BizHawk.Client.EmuHawk
} }
} }
rowStr.Append(" | "); rowStr.Append("| ");
for (var k = 0; k < 16; k++) for (var k = 0; k < 16; k++)
{ {
if (_addr + k < _domain.Size) if (_addr + k < _domain.Size)
@ -669,13 +669,15 @@ namespace BizHawk.Client.EmuHawk
private void UpdateFormText() private void UpdateFormText()
{ {
Text = "Hex Editor";
if (_addressHighlighted >= 0) if (_addressHighlighted >= 0)
{ {
Text = "Hex Editor - Editing Address 0x" + string.Format(_numDigitsStr, _addressHighlighted); Text += " - Editing Address 0x" + string.Format(_numDigitsStr, _addressHighlighted);
} if (_secondaryHighlightedAddresses.Any())
else {
{ Text += string.Format(" (Selected 0x{0:X})", _secondaryHighlightedAddresses.Count() +
Text = "Hex Editor"; (_secondaryHighlightedAddresses.Contains(_addressHighlighted) ? 0 : 1));
}
} }
} }
@ -690,13 +692,13 @@ namespace BizHawk.Client.EmuHawk
switch (DataSize) switch (DataSize)
{ {
case 1: 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; break;
case 2: case 2:
Header.Text = " 0 2 4 6 8 A C E"; Header.Text = " 0 2 4 6 8 A C E";
break; break;
case 4: case 4:
Header.Text = " 0 4 8 C"; Header.Text = " 0 4 8 C";
break; break;
} }
@ -940,10 +942,11 @@ namespace BizHawk.Client.EmuHawk
var column = x / (fontWidth * colWidth); 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) if (x > start)
{ {
column = (x - start) / (fontWidth / DataSize); column = (x - start) / (fontWidth * DataSize);
} }
if (i >= 0 && i <= _maxRow && column >= 0 && column < (16 / DataSize)) if (i >= 0 && i <= _maxRow && column >= 0 && column < (16 / DataSize))
@ -977,6 +980,17 @@ namespace BizHawk.Client.EmuHawk
_secondaryHighlightedAddresses.Add(x); _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); int start = (16 / DataSize) * fontWidth * (DataSize * 2 + 1);
start += AddressesLabel.Location.X + fontWidth / 2; start += AddressesLabel.Location.X + fontWidth / 2;
start += fontWidth * 4; start += fontWidth * 2;
return start; return start;
} }
@ -1043,7 +1057,7 @@ namespace BizHawk.Client.EmuHawk
private void AddToSecondaryHighlights(long address) private void AddToSecondaryHighlights(long address)
{ {
if (address >= 0 && address < _domain.Size) if (address >= 0 && address < _domain.Size && !_secondaryHighlightedAddresses.Contains(address))
{ {
_secondaryHighlightedAddresses.Add(address); _secondaryHighlightedAddresses.Add(address);
} }
@ -2166,8 +2180,8 @@ namespace BizHawk.Client.EmuHawk
} }
else else
{ {
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(0x77FFD4D4)), rect); e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(0x44, Global.Config.HexHighlightColor)), rect);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(0x77FFD4D4)), textrect); e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(0x44, Global.Config.HexHighlightColor)), textrect);
} }
} }
} }
@ -2190,6 +2204,7 @@ namespace BizHawk.Client.EmuHawk
if (_mouseIsDown) if (_mouseIsDown)
{ {
DoShiftClick(); DoShiftClick();
UpdateFormText();
MemoryViewerBox.Refresh(); MemoryViewerBox.Refresh();
} }
} }

View File

@ -0,0 +1,102 @@
namespace BizHawk.Client.EmuHawk
{
partial class NewHexEditor
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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;
}
}

View File

@ -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
}
}

View File

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="HexMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

View File

@ -45,6 +45,15 @@ namespace BizHawk.Client.EmuHawk
GlobalWin.MainForm.CloseEmulator(); GlobalWin.MainForm.CloseEmulator();
} }
[LuaMethodAttributes(
"exitCode",
"Closes the emulator and returns the provided code"
)]
public void CloseEmulatorWithCode(int exitCode)
{
GlobalWin.MainForm.CloseEmulator(exitCode);
}
[LuaMethodAttributes( [LuaMethodAttributes(
"borderheight", "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." "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() 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<LuaConsole>()).IsRebootingCore = true;
GlobalWin.MainForm.RebootCore(); GlobalWin.MainForm.RebootCore();
((LuaConsole)GlobalWin.Tools.Get<LuaConsole>()).IsRebootingCore = false;
} }
[LuaMethodAttributes( [LuaMethodAttributes(

View File

@ -482,6 +482,10 @@ namespace BizHawk.Client.EmuHawk
{ {
if (form.Handle == ptr) if (form.Handle == ptr)
{ {
if (form.GetType().GetProperty(property).PropertyType.IsEnum)
{
value = Enum.Parse(form.GetType().GetProperty(property).PropertyType, value.ToString(), true);
}
form form
.GetType() .GetType()
.GetProperty(property) .GetProperty(property)
@ -493,6 +497,10 @@ namespace BizHawk.Client.EmuHawk
{ {
if (control.Handle == ptr) if (control.Handle == ptr)
{ {
if (control.GetType().GetProperty(property).PropertyType.IsEnum)
{
value = Enum.Parse(control.GetType().GetProperty(property).PropertyType, value.ToString(), true);
}
control control
.GetType() .GetType()
.GetProperty(property) .GetProperty(property)
@ -557,7 +565,7 @@ namespace BizHawk.Client.EmuHawk
[LuaMethodAttributes( [LuaMethodAttributes(
"textbox", "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( public int Textbox(
int formHandle, int formHandle,
@ -568,7 +576,8 @@ namespace BizHawk.Client.EmuHawk
int? x = null, int? x = null,
int? y = null, int? y = null,
bool multiline = false, bool multiline = false,
bool fixedWidth = false) bool fixedWidth = false,
string scrollbars = null)
{ {
var form = GetForm(formHandle); var form = GetForm(formHandle);
if (form == null) if (form == null)
@ -583,6 +592,26 @@ namespace BizHawk.Client.EmuHawk
} }
textbox.Multiline = multiline; 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); SetText(textbox, caption);
if (x.HasValue && y.HasValue) if (x.HasValue && y.HasValue)

View File

@ -164,7 +164,7 @@ namespace BizHawk.Client.EmuHawk
[LuaMethodAttributes( [LuaMethodAttributes(
"defaultForeground", "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) public void SetDefaultForegroundColor(Color color)
{ {
@ -173,13 +173,22 @@ namespace BizHawk.Client.EmuHawk
[LuaMethodAttributes( [LuaMethodAttributes(
"defaultBackground", "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) public void SetDefaultBackgroundColor(Color color)
{ {
DefaultBackground = 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( [LuaMethodAttributes(
"drawBezier", "drawBezier",
"Draws a Bezier curve using the table of coordinates provided in the given color" "Draws a Bezier curve using the table of coordinates provided in the given color"

View File

@ -144,7 +144,8 @@ namespace BizHawk.Client.EmuHawk
public Lua SpawnCoroutine(string file) public Lua SpawnCoroutine(string file)
{ {
var lua = _lua.NewThread(); 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 lua.Push(main); // push main function on to stack for subsequent resuming
return lua; return lua;
} }

View File

@ -27,6 +27,8 @@ namespace BizHawk.Client.EmuHawk
private List<string> _consoleCommandHistory = new List<string>(); private List<string> _consoleCommandHistory = new List<string>();
private int _consoleCommandHistoryIndex = -1; private int _consoleCommandHistoryIndex = -1;
public bool IsRebootingCore;
public LuaConsole() public LuaConsole()
{ {
_sortReverse = false; _sortReverse = false;

View File

@ -107,6 +107,7 @@
// //
// RemoveButton // RemoveButton
// //
this.RemoveButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.RemoveButton.Enabled = false; this.RemoveButton.Enabled = false;
this.RemoveButton.Location = new System.Drawing.Point(93, 284); this.RemoveButton.Location = new System.Drawing.Point(93, 284);
this.RemoveButton.Name = "RemoveButton"; this.RemoveButton.Name = "RemoveButton";
@ -140,6 +141,7 @@
// //
// RemoveAllBtn // RemoveAllBtn
// //
this.RemoveAllBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.RemoveAllBtn.Enabled = false; this.RemoveAllBtn.Enabled = false;
this.RemoveAllBtn.Location = new System.Drawing.Point(174, 284); this.RemoveAllBtn.Location = new System.Drawing.Point(174, 284);
this.RemoveAllBtn.Name = "RemoveAllBtn"; this.RemoveAllBtn.Name = "RemoveAllBtn";
@ -161,7 +163,7 @@
this.Controls.Add(this.FunctionView); this.Controls.Add(this.FunctionView);
this.Controls.Add(this.OK); this.Controls.Add(this.OK);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 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.Name = "LuaRegisteredFunctionsList";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Active Registered Functions"; this.Text = "Active Registered Functions";

View File

@ -64,6 +64,10 @@ namespace BizHawk.Client.EmuHawk
break; break;
} }
} }
else if (e.KeyData == (Keys.Control | Keys.A))
{
base.SelectAll();
}
else else
{ {
base.OnKeyDown(e); base.OnKeyDown(e);

View File

@ -1,10 +1,5 @@
using System; using System;
using System.Collections.Generic; 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.Windows.Forms;
using System.IO; using System.IO;
@ -15,6 +10,7 @@ using BizHawk.Client.EmuHawk.ToolExtensions;
namespace BizHawk.Client.EmuHawk namespace BizHawk.Client.EmuHawk
{ {
[ToolAttributes(false, null)]
public partial class MacroInputTool : Form, IToolFormAutoConfig public partial class MacroInputTool : Form, IToolFormAutoConfig
{ {
[RequiredService] [RequiredService]

View File

@ -4,11 +4,11 @@ using System.Globalization;
using System.Windows.Forms; using System.Windows.Forms;
using BizHawk.Emulation.Common; using BizHawk.Emulation.Common;
using BizHawk.Emulation.Common.IEmulatorExtensions;
using BizHawk.Client.Common; using BizHawk.Client.Common;
namespace BizHawk.Client.EmuHawk namespace BizHawk.Client.EmuHawk
{ {
[ToolAttributes(false, null)]
public partial class NESGameGenie : Form, IToolFormAutoConfig public partial class NESGameGenie : Form, IToolFormAutoConfig
{ {
[RequiredService] [RequiredService]

View File

@ -164,19 +164,19 @@
this.toolStripSeparator2, this.toolStripSeparator2,
this.ExitMenuItem}); this.ExitMenuItem});
this.FileSubMenu.Name = "FileSubMenu"; 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"; this.FileSubMenu.Text = "&File";
// //
// toolStripSeparator2 // toolStripSeparator2
// //
this.toolStripSeparator2.Name = "toolStripSeparator2"; this.toolStripSeparator2.Name = "toolStripSeparator2";
this.toolStripSeparator2.Size = new System.Drawing.Size(129, 6); this.toolStripSeparator2.Size = new System.Drawing.Size(131, 6);
// //
// ExitMenuItem // ExitMenuItem
// //
this.ExitMenuItem.Name = "ExitMenuItem"; this.ExitMenuItem.Name = "ExitMenuItem";
this.ExitMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4))); 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.Text = "E&xit";
this.ExitMenuItem.Click += new System.EventHandler(this.ExitMenuItem_Click); this.ExitMenuItem.Click += new System.EventHandler(this.ExitMenuItem_Click);
// //
@ -189,9 +189,12 @@
this.Controls.Add(this.groupBox1); this.Controls.Add(this.groupBox1);
this.Controls.Add(this.textBox1); this.Controls.Add(this.textBox1);
this.Controls.Add(this.menuStrip1); this.Controls.Add(this.menuStrip1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "NESMusicRipper"; 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.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.NESMusicRipper_FormClosed);
this.Load += new System.EventHandler(this.NESMusicRipper_Load);
this.groupBox1.ResumeLayout(false); this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout(); this.groupBox1.PerformLayout();
this.groupBox2.ResumeLayout(false); this.groupBox2.ResumeLayout(false);

View File

@ -515,5 +515,9 @@ namespace BizHawk.Client.EmuHawk
apu.DebugCallback = null; apu.DebugCallback = null;
} }
private void NESMusicRipper_Load(object sender, EventArgs e)
{
}
} }
} }

View File

@ -125,4 +125,299 @@ Make sure the template has 5 tracks. There should be pulse waveforms in instrume
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value> <value>17, 17</value>
</metadata> </metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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=
</value>
</data>
</root> </root>

View File

@ -5,12 +5,12 @@ using System.Text.RegularExpressions;
using System.Windows.Forms; using System.Windows.Forms;
using BizHawk.Emulation.Common; using BizHawk.Emulation.Common;
using BizHawk.Emulation.Common.IEmulatorExtensions;
using BizHawk.Emulation.Cores.Nintendo.SNES; using BizHawk.Emulation.Cores.Nintendo.SNES;
using BizHawk.Client.Common; using BizHawk.Client.Common;
namespace BizHawk.Client.EmuHawk namespace BizHawk.Client.EmuHawk
{ {
[ToolAttributes(false, null)]
public partial class SNESGameGenie : Form, IToolFormAutoConfig public partial class SNESGameGenie : Form, IToolFormAutoConfig
{ {
[RequiredService] [RequiredService]

View File

@ -187,6 +187,7 @@ namespace BizHawk.Client.EmuHawk
Markers.Add(new TasMovieMarker(markerFrame, "")); Markers.Add(new TasMovieMarker(markerFrame, ""));
UpdateValues(); UpdateValues();
} }
Tastudio.RefreshDialog();
} }
public void EditMarkerPopUp(TasMovieMarker marker) public void EditMarkerPopUp(TasMovieMarker marker)

View File

@ -82,6 +82,7 @@ namespace BizHawk.Client.EmuHawk
this.ConfigSubMenu = new System.Windows.Forms.ToolStripMenuItem(); this.ConfigSubMenu = new System.Windows.Forms.ToolStripMenuItem();
this.SetMaxUndoLevelsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.SetMaxUndoLevelsMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.SetBranchCellHoverIntervalMenuItem = 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.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator();
this.AutoadjustInputMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.AutoadjustInputMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator();
@ -241,7 +242,7 @@ namespace BizHawk.Client.EmuHawk
// //
this.NewTASMenuItem.Name = "NewTASMenuItem"; this.NewTASMenuItem.Name = "NewTASMenuItem";
this.NewTASMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); 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.Text = "&New";
this.NewTASMenuItem.Click += new System.EventHandler(this.NewTasMenuItem_Click); this.NewTASMenuItem.Click += new System.EventHandler(this.NewTasMenuItem_Click);
// //
@ -251,21 +252,21 @@ namespace BizHawk.Client.EmuHawk
this.NewFromNowMenuItem, this.NewFromNowMenuItem,
this.NewFromCurrentSaveRamMenuItem}); this.NewFromCurrentSaveRamMenuItem});
this.NewFromSubMenu.Name = "NewFromSubMenu"; 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.Text = "New From";
this.NewFromSubMenu.DropDownOpened += new System.EventHandler(this.NewFromSubMenu_DropDownOpened); this.NewFromSubMenu.DropDownOpened += new System.EventHandler(this.NewFromSubMenu_DropDownOpened);
// //
// NewFromNowMenuItem // NewFromNowMenuItem
// //
this.NewFromNowMenuItem.Name = "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.Text = "&Now";
this.NewFromNowMenuItem.Click += new System.EventHandler(this.StartNewProjectFromNowMenuItem_Click); this.NewFromNowMenuItem.Click += new System.EventHandler(this.StartNewProjectFromNowMenuItem_Click);
// //
// NewFromCurrentSaveRamMenuItem // NewFromCurrentSaveRamMenuItem
// //
this.NewFromCurrentSaveRamMenuItem.Name = "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.Text = "&Current SaveRam";
this.NewFromCurrentSaveRamMenuItem.Click += new System.EventHandler(this.StartANewProjectFromSaveRamMenuItem_Click); this.NewFromCurrentSaveRamMenuItem.Click += new System.EventHandler(this.StartANewProjectFromSaveRamMenuItem_Click);
// //
@ -273,7 +274,7 @@ namespace BizHawk.Client.EmuHawk
// //
this.OpenTASMenuItem.Name = "OpenTASMenuItem"; this.OpenTASMenuItem.Name = "OpenTASMenuItem";
this.OpenTASMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); 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.Text = "&Open";
this.OpenTASMenuItem.Click += new System.EventHandler(this.OpenTasMenuItem_Click); this.OpenTASMenuItem.Click += new System.EventHandler(this.OpenTasMenuItem_Click);
// //
@ -281,7 +282,7 @@ namespace BizHawk.Client.EmuHawk
// //
this.SaveTASMenuItem.Name = "SaveTASMenuItem"; this.SaveTASMenuItem.Name = "SaveTASMenuItem";
this.SaveTASMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); 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.Text = "&Save";
this.SaveTASMenuItem.Click += new System.EventHandler(this.SaveTasMenuItem_Click); this.SaveTASMenuItem.Click += new System.EventHandler(this.SaveTasMenuItem_Click);
// //
@ -290,7 +291,7 @@ namespace BizHawk.Client.EmuHawk
this.SaveAsTASMenuItem.Name = "SaveAsTASMenuItem"; this.SaveAsTASMenuItem.Name = "SaveAsTASMenuItem";
this.SaveAsTASMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) this.SaveAsTASMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
| System.Windows.Forms.Keys.S))); | 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.Text = "Save As";
this.SaveAsTASMenuItem.Click += new System.EventHandler(this.SaveAsTasMenuItem_Click); this.SaveAsTASMenuItem.Click += new System.EventHandler(this.SaveAsTasMenuItem_Click);
// //
@ -300,7 +301,7 @@ namespace BizHawk.Client.EmuHawk
this.toolStripSeparator3}); this.toolStripSeparator3});
this.RecentSubMenu.Image = ((System.Drawing.Image)(resources.GetObject("RecentSubMenu.Image"))); this.RecentSubMenu.Image = ((System.Drawing.Image)(resources.GetObject("RecentSubMenu.Image")));
this.RecentSubMenu.Name = "RecentSubMenu"; 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.Text = "Recent";
this.RecentSubMenu.DropDownOpened += new System.EventHandler(this.RecentSubMenu_DropDownOpened); this.RecentSubMenu.DropDownOpened += new System.EventHandler(this.RecentSubMenu_DropDownOpened);
// //
@ -312,19 +313,19 @@ namespace BizHawk.Client.EmuHawk
// toolStripSeparator1 // toolStripSeparator1
// //
this.toolStripSeparator1.Name = "toolStripSeparator1"; this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(187, 6); this.toolStripSeparator1.Size = new System.Drawing.Size(198, 6);
// //
// saveSelectionToMacroToolStripMenuItem // saveSelectionToMacroToolStripMenuItem
// //
this.saveSelectionToMacroToolStripMenuItem.Name = "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.Text = "Save Selection to Macro";
this.saveSelectionToMacroToolStripMenuItem.Click += new System.EventHandler(this.saveSelectionToMacroToolStripMenuItem_Click); this.saveSelectionToMacroToolStripMenuItem.Click += new System.EventHandler(this.saveSelectionToMacroToolStripMenuItem_Click);
// //
// placeMacroAtSelectionToolStripMenuItem // placeMacroAtSelectionToolStripMenuItem
// //
this.placeMacroAtSelectionToolStripMenuItem.Name = "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.Text = "Place Macro at Selection";
this.placeMacroAtSelectionToolStripMenuItem.Click += new System.EventHandler(this.placeMacroAtSelectionToolStripMenuItem_Click); this.placeMacroAtSelectionToolStripMenuItem.Click += new System.EventHandler(this.placeMacroAtSelectionToolStripMenuItem_Click);
// //
@ -334,7 +335,7 @@ namespace BizHawk.Client.EmuHawk
this.toolStripSeparator22}); this.toolStripSeparator22});
this.recentMacrosToolStripMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Recent; this.recentMacrosToolStripMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Recent;
this.recentMacrosToolStripMenuItem.Name = "recentMacrosToolStripMenuItem"; 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.Text = "Recent Macros";
this.recentMacrosToolStripMenuItem.DropDownOpened += new System.EventHandler(this.recentMacrosToolStripMenuItem_DropDownOpened); this.recentMacrosToolStripMenuItem.DropDownOpened += new System.EventHandler(this.recentMacrosToolStripMenuItem_DropDownOpened);
// //
@ -346,25 +347,25 @@ namespace BizHawk.Client.EmuHawk
// toolStripSeparator20 // toolStripSeparator20
// //
this.toolStripSeparator20.Name = "toolStripSeparator20"; this.toolStripSeparator20.Name = "toolStripSeparator20";
this.toolStripSeparator20.Size = new System.Drawing.Size(187, 6); this.toolStripSeparator20.Size = new System.Drawing.Size(198, 6);
// //
// ToBk2MenuItem // ToBk2MenuItem
// //
this.ToBk2MenuItem.Name = "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.Text = "&Export to Bk2";
this.ToBk2MenuItem.Click += new System.EventHandler(this.ToBk2MenuItem_Click); this.ToBk2MenuItem.Click += new System.EventHandler(this.ToBk2MenuItem_Click);
// //
// toolStripSeparator2 // toolStripSeparator2
// //
this.toolStripSeparator2.Name = "toolStripSeparator2"; this.toolStripSeparator2.Name = "toolStripSeparator2";
this.toolStripSeparator2.Size = new System.Drawing.Size(187, 6); this.toolStripSeparator2.Size = new System.Drawing.Size(198, 6);
// //
// ExitMenuItem // ExitMenuItem
// //
this.ExitMenuItem.Name = "ExitMenuItem"; this.ExitMenuItem.Name = "ExitMenuItem";
this.ExitMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4))); 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.Text = "E&xit";
this.ExitMenuItem.Click += new System.EventHandler(this.ExitMenuItem_Click); this.ExitMenuItem.Click += new System.EventHandler(this.ExitMenuItem_Click);
// //
@ -406,7 +407,7 @@ namespace BizHawk.Client.EmuHawk
// //
this.UndoMenuItem.Name = "UndoMenuItem"; this.UndoMenuItem.Name = "UndoMenuItem";
this.UndoMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Z))); 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.Text = "&Undo";
this.UndoMenuItem.Click += new System.EventHandler(this.UndoMenuItem_Click); this.UndoMenuItem.Click += new System.EventHandler(this.UndoMenuItem_Click);
// //
@ -415,14 +416,14 @@ namespace BizHawk.Client.EmuHawk
this.RedoMenuItem.Enabled = false; this.RedoMenuItem.Enabled = false;
this.RedoMenuItem.Name = "RedoMenuItem"; this.RedoMenuItem.Name = "RedoMenuItem";
this.RedoMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Y))); 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.Text = "&Redo";
this.RedoMenuItem.Click += new System.EventHandler(this.RedoMenuItem_Click); this.RedoMenuItem.Click += new System.EventHandler(this.RedoMenuItem_Click);
// //
// showUndoHistoryToolStripMenuItem // showUndoHistoryToolStripMenuItem
// //
this.showUndoHistoryToolStripMenuItem.Name = "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.Text = "Show Undo History";
this.showUndoHistoryToolStripMenuItem.Click += new System.EventHandler(this.showUndoHistoryToolStripMenuItem_Click); this.showUndoHistoryToolStripMenuItem.Click += new System.EventHandler(this.showUndoHistoryToolStripMenuItem_Click);
// //
@ -431,7 +432,7 @@ namespace BizHawk.Client.EmuHawk
this.SelectionUndoMenuItem.Enabled = false; this.SelectionUndoMenuItem.Enabled = false;
this.SelectionUndoMenuItem.Name = "SelectionUndoMenuItem"; this.SelectionUndoMenuItem.Name = "SelectionUndoMenuItem";
this.SelectionUndoMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Q))); 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"; this.SelectionUndoMenuItem.Text = "Selection Undo";
// //
// SelectionRedoMenuItem // SelectionRedoMenuItem
@ -439,18 +440,18 @@ namespace BizHawk.Client.EmuHawk
this.SelectionRedoMenuItem.Enabled = false; this.SelectionRedoMenuItem.Enabled = false;
this.SelectionRedoMenuItem.Name = "SelectionRedoMenuItem"; this.SelectionRedoMenuItem.Name = "SelectionRedoMenuItem";
this.SelectionRedoMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.W))); 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"; this.SelectionRedoMenuItem.Text = "Selection Redo";
// //
// toolStripSeparator5 // toolStripSeparator5
// //
this.toolStripSeparator5.Name = "toolStripSeparator5"; this.toolStripSeparator5.Name = "toolStripSeparator5";
this.toolStripSeparator5.Size = new System.Drawing.Size(277, 6); this.toolStripSeparator5.Size = new System.Drawing.Size(288, 6);
// //
// DeselectMenuItem // DeselectMenuItem
// //
this.DeselectMenuItem.Name = "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.Text = "Deselect";
this.DeselectMenuItem.Click += new System.EventHandler(this.DeselectMenuItem_Click); this.DeselectMenuItem.Click += new System.EventHandler(this.DeselectMenuItem_Click);
// //
@ -458,7 +459,7 @@ namespace BizHawk.Client.EmuHawk
// //
this.SelectBetweenMarkersMenuItem.Name = "SelectBetweenMarkersMenuItem"; this.SelectBetweenMarkersMenuItem.Name = "SelectBetweenMarkersMenuItem";
this.SelectBetweenMarkersMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.A))); 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.Text = "Select between Markers";
this.SelectBetweenMarkersMenuItem.Click += new System.EventHandler(this.SelectBetweenMarkersMenuItem_Click); this.SelectBetweenMarkersMenuItem.Click += new System.EventHandler(this.SelectBetweenMarkersMenuItem_Click);
// //
@ -468,7 +469,7 @@ namespace BizHawk.Client.EmuHawk
this.SelectAllMenuItem.ShortcutKeyDisplayString = ""; this.SelectAllMenuItem.ShortcutKeyDisplayString = "";
this.SelectAllMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) this.SelectAllMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
| System.Windows.Forms.Keys.A))); | 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.Text = "Select &All";
this.SelectAllMenuItem.Click += new System.EventHandler(this.SelectAllMenuItem_Click); this.SelectAllMenuItem.Click += new System.EventHandler(this.SelectAllMenuItem_Click);
// //
@ -476,20 +477,20 @@ namespace BizHawk.Client.EmuHawk
// //
this.ReselectClipboardMenuItem.Name = "ReselectClipboardMenuItem"; this.ReselectClipboardMenuItem.Name = "ReselectClipboardMenuItem";
this.ReselectClipboardMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.B))); 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.Text = "Reselect Clipboard";
this.ReselectClipboardMenuItem.Click += new System.EventHandler(this.ReselectClipboardMenuItem_Click); this.ReselectClipboardMenuItem.Click += new System.EventHandler(this.ReselectClipboardMenuItem_Click);
// //
// toolStripSeparator7 // toolStripSeparator7
// //
this.toolStripSeparator7.Name = "toolStripSeparator7"; this.toolStripSeparator7.Name = "toolStripSeparator7";
this.toolStripSeparator7.Size = new System.Drawing.Size(277, 6); this.toolStripSeparator7.Size = new System.Drawing.Size(288, 6);
// //
// CopyMenuItem // CopyMenuItem
// //
this.CopyMenuItem.Name = "CopyMenuItem"; this.CopyMenuItem.Name = "CopyMenuItem";
this.CopyMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C))); 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.Text = "Copy";
this.CopyMenuItem.Click += new System.EventHandler(this.CopyMenuItem_Click); this.CopyMenuItem.Click += new System.EventHandler(this.CopyMenuItem_Click);
// //
@ -497,7 +498,7 @@ namespace BizHawk.Client.EmuHawk
// //
this.PasteMenuItem.Name = "PasteMenuItem"; this.PasteMenuItem.Name = "PasteMenuItem";
this.PasteMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.V))); 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.Text = "&Paste";
this.PasteMenuItem.Click += new System.EventHandler(this.PasteMenuItem_Click); this.PasteMenuItem.Click += new System.EventHandler(this.PasteMenuItem_Click);
// //
@ -506,7 +507,7 @@ namespace BizHawk.Client.EmuHawk
this.PasteInsertMenuItem.Name = "PasteInsertMenuItem"; this.PasteInsertMenuItem.Name = "PasteInsertMenuItem";
this.PasteInsertMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) this.PasteInsertMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
| System.Windows.Forms.Keys.V))); | 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.Text = "&Paste Insert";
this.PasteInsertMenuItem.Click += new System.EventHandler(this.PasteInsertMenuItem_Click); this.PasteInsertMenuItem.Click += new System.EventHandler(this.PasteInsertMenuItem_Click);
// //
@ -514,21 +515,21 @@ namespace BizHawk.Client.EmuHawk
// //
this.CutMenuItem.Name = "CutMenuItem"; this.CutMenuItem.Name = "CutMenuItem";
this.CutMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.X))); 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.Text = "&Cut";
this.CutMenuItem.Click += new System.EventHandler(this.CutMenuItem_Click); this.CutMenuItem.Click += new System.EventHandler(this.CutMenuItem_Click);
// //
// toolStripSeparator8 // toolStripSeparator8
// //
this.toolStripSeparator8.Name = "toolStripSeparator8"; this.toolStripSeparator8.Name = "toolStripSeparator8";
this.toolStripSeparator8.Size = new System.Drawing.Size(277, 6); this.toolStripSeparator8.Size = new System.Drawing.Size(288, 6);
// //
// ClearMenuItem // ClearMenuItem
// //
this.ClearMenuItem.Name = "ClearMenuItem"; this.ClearMenuItem.Name = "ClearMenuItem";
this.ClearMenuItem.ShortcutKeyDisplayString = ""; this.ClearMenuItem.ShortcutKeyDisplayString = "";
this.ClearMenuItem.ShortcutKeys = System.Windows.Forms.Keys.Delete; 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.Text = "Clear";
this.ClearMenuItem.Click += new System.EventHandler(this.ClearMenuItem_Click); this.ClearMenuItem.Click += new System.EventHandler(this.ClearMenuItem_Click);
// //
@ -536,7 +537,7 @@ namespace BizHawk.Client.EmuHawk
// //
this.InsertFrameMenuItem.Name = "InsertFrameMenuItem"; this.InsertFrameMenuItem.Name = "InsertFrameMenuItem";
this.InsertFrameMenuItem.ShortcutKeys = System.Windows.Forms.Keys.Insert; 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.Text = "&Insert";
this.InsertFrameMenuItem.Click += new System.EventHandler(this.InsertFrameMenuItem_Click); this.InsertFrameMenuItem.Click += new System.EventHandler(this.InsertFrameMenuItem_Click);
// //
@ -544,7 +545,7 @@ namespace BizHawk.Client.EmuHawk
// //
this.DeleteFramesMenuItem.Name = "DeleteFramesMenuItem"; this.DeleteFramesMenuItem.Name = "DeleteFramesMenuItem";
this.DeleteFramesMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Delete))); 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.Text = "&Delete";
this.DeleteFramesMenuItem.Click += new System.EventHandler(this.DeleteFramesMenuItem_Click); this.DeleteFramesMenuItem.Click += new System.EventHandler(this.DeleteFramesMenuItem_Click);
// //
@ -552,7 +553,7 @@ namespace BizHawk.Client.EmuHawk
// //
this.CloneMenuItem.Name = "CloneMenuItem"; this.CloneMenuItem.Name = "CloneMenuItem";
this.CloneMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Insert))); 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.Text = "&Clone";
this.CloneMenuItem.Click += new System.EventHandler(this.CloneMenuItem_Click); this.CloneMenuItem.Click += new System.EventHandler(this.CloneMenuItem_Click);
// //
@ -562,40 +563,40 @@ namespace BizHawk.Client.EmuHawk
this.InsertNumFramesMenuItem.ShortcutKeyDisplayString = ""; this.InsertNumFramesMenuItem.ShortcutKeyDisplayString = "";
this.InsertNumFramesMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) this.InsertNumFramesMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
| System.Windows.Forms.Keys.Insert))); | 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.Text = "Insert # of Frames";
this.InsertNumFramesMenuItem.Click += new System.EventHandler(this.InsertNumFramesMenuItem_Click); this.InsertNumFramesMenuItem.Click += new System.EventHandler(this.InsertNumFramesMenuItem_Click);
// //
// toolStripSeparator6 // toolStripSeparator6
// //
this.toolStripSeparator6.Name = "toolStripSeparator6"; this.toolStripSeparator6.Name = "toolStripSeparator6";
this.toolStripSeparator6.Size = new System.Drawing.Size(277, 6); this.toolStripSeparator6.Size = new System.Drawing.Size(288, 6);
// //
// TruncateMenuItem // TruncateMenuItem
// //
this.TruncateMenuItem.Name = "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.Text = "&Truncate Movie";
this.TruncateMenuItem.Click += new System.EventHandler(this.TruncateMenuItem_Click); this.TruncateMenuItem.Click += new System.EventHandler(this.TruncateMenuItem_Click);
// //
// ClearGreenzoneMenuItem // ClearGreenzoneMenuItem
// //
this.ClearGreenzoneMenuItem.Name = "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.Text = "&Clear Savestate History";
this.ClearGreenzoneMenuItem.Click += new System.EventHandler(this.ClearGreenzoneMenuItem_Click); this.ClearGreenzoneMenuItem.Click += new System.EventHandler(this.ClearGreenzoneMenuItem_Click);
// //
// GreenzoneICheckSeparator // GreenzoneICheckSeparator
// //
this.GreenzoneICheckSeparator.Name = "GreenzoneICheckSeparator"; this.GreenzoneICheckSeparator.Name = "GreenzoneICheckSeparator";
this.GreenzoneICheckSeparator.Size = new System.Drawing.Size(277, 6); this.GreenzoneICheckSeparator.Size = new System.Drawing.Size(288, 6);
// //
// StateHistoryIntegrityCheckMenuItem // StateHistoryIntegrityCheckMenuItem
// //
this.StateHistoryIntegrityCheckMenuItem.Name = "StateHistoryIntegrityCheckMenuItem"; this.StateHistoryIntegrityCheckMenuItem.Name = "StateHistoryIntegrityCheckMenuItem";
this.StateHistoryIntegrityCheckMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) this.StateHistoryIntegrityCheckMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
| System.Windows.Forms.Keys.I))); | 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.Text = "State History Integrity Check";
this.StateHistoryIntegrityCheckMenuItem.Click += new System.EventHandler(this.StateHistoryIntegrityCheckMenuItem_Click); 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.ConfigSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.SetMaxUndoLevelsMenuItem, this.SetMaxUndoLevelsMenuItem,
this.SetBranchCellHoverIntervalMenuItem, this.SetBranchCellHoverIntervalMenuItem,
this.SetSeekingCutoffIntervalMenuItem,
this.toolStripSeparator9, this.toolStripSeparator9,
this.AutoadjustInputMenuItem, this.AutoadjustInputMenuItem,
this.toolStripSeparator11, this.toolStripSeparator11,
@ -629,38 +631,45 @@ namespace BizHawk.Client.EmuHawk
// SetMaxUndoLevelsMenuItem // SetMaxUndoLevelsMenuItem
// //
this.SetMaxUndoLevelsMenuItem.Name = "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.Text = "Set max Undo Levels";
this.SetMaxUndoLevelsMenuItem.Click += new System.EventHandler(this.SetMaxUndoLevelsMenuItem_Click); this.SetMaxUndoLevelsMenuItem.Click += new System.EventHandler(this.SetMaxUndoLevelsMenuItem_Click);
// //
// SetBranchCellHoverIntervalMenuItem // SetBranchCellHoverIntervalMenuItem
// //
this.SetBranchCellHoverIntervalMenuItem.Name = "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.Text = "Set Branch Cell Hover Interval";
this.SetBranchCellHoverIntervalMenuItem.Click += new System.EventHandler(this.SetBranchCellHoverIntervalMenuItem_Click); 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 // toolStripSeparator9
// //
this.toolStripSeparator9.Name = "toolStripSeparator9"; this.toolStripSeparator9.Name = "toolStripSeparator9";
this.toolStripSeparator9.Size = new System.Drawing.Size(239, 6); this.toolStripSeparator9.Size = new System.Drawing.Size(250, 6);
// //
// AutoadjustInputMenuItem // AutoadjustInputMenuItem
// //
this.AutoadjustInputMenuItem.CheckOnClick = true; this.AutoadjustInputMenuItem.CheckOnClick = true;
this.AutoadjustInputMenuItem.Name = "AutoadjustInputMenuItem"; 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"; this.AutoadjustInputMenuItem.Text = "Auto-adjust Input according to Lag";
// //
// toolStripSeparator11 // toolStripSeparator11
// //
this.toolStripSeparator11.Name = "toolStripSeparator11"; this.toolStripSeparator11.Name = "toolStripSeparator11";
this.toolStripSeparator11.Size = new System.Drawing.Size(239, 6); this.toolStripSeparator11.Size = new System.Drawing.Size(250, 6);
// //
// DrawInputByDraggingMenuItem // DrawInputByDraggingMenuItem
// //
this.DrawInputByDraggingMenuItem.Name = "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.Text = "Draw Input by dragging";
this.DrawInputByDraggingMenuItem.Click += new System.EventHandler(this.DrawInputByDraggingMenuItem_Click); this.DrawInputByDraggingMenuItem.Click += new System.EventHandler(this.DrawInputByDraggingMenuItem_Click);
// //
@ -668,7 +677,7 @@ namespace BizHawk.Client.EmuHawk
// //
this.applyPatternToPaintedInputToolStripMenuItem.CheckOnClick = true; this.applyPatternToPaintedInputToolStripMenuItem.CheckOnClick = true;
this.applyPatternToPaintedInputToolStripMenuItem.Name = "applyPatternToPaintedInputToolStripMenuItem"; 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.Text = "Apply Pattern to painted input";
this.applyPatternToPaintedInputToolStripMenuItem.CheckedChanged += new System.EventHandler(this.applyPatternToPaintedInputToolStripMenuItem_CheckedChanged); 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.CheckState = System.Windows.Forms.CheckState.Checked;
this.onlyOnAutoFireColumnsToolStripMenuItem.Enabled = false; this.onlyOnAutoFireColumnsToolStripMenuItem.Enabled = false;
this.onlyOnAutoFireColumnsToolStripMenuItem.Name = "onlyOnAutoFireColumnsToolStripMenuItem"; 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"; this.onlyOnAutoFireColumnsToolStripMenuItem.Text = "Only on Auto-Fire columns";
// //
// UseInputKeysItem // UseInputKeysItem
// //
this.UseInputKeysItem.Enabled = false; this.UseInputKeysItem.Enabled = false;
this.UseInputKeysItem.Name = "UseInputKeysItem"; 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"; this.UseInputKeysItem.Text = "Use Input keys for Column Set";
// //
// toolStripSeparator4 // toolStripSeparator4
// //
this.toolStripSeparator4.Name = "toolStripSeparator4"; this.toolStripSeparator4.Name = "toolStripSeparator4";
this.toolStripSeparator4.Size = new System.Drawing.Size(239, 6); this.toolStripSeparator4.Size = new System.Drawing.Size(250, 6);
// //
// BindMarkersToInputMenuItem // BindMarkersToInputMenuItem
// //
@ -700,52 +709,52 @@ namespace BizHawk.Client.EmuHawk
this.BindMarkersToInputMenuItem.CheckOnClick = true; this.BindMarkersToInputMenuItem.CheckOnClick = true;
this.BindMarkersToInputMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; this.BindMarkersToInputMenuItem.CheckState = System.Windows.Forms.CheckState.Checked;
this.BindMarkersToInputMenuItem.Name = "BindMarkersToInputMenuItem"; 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.Text = "Bind Markers to Input";
this.BindMarkersToInputMenuItem.Click += new System.EventHandler(this.BindMarkersToInputMenuItem_Click); this.BindMarkersToInputMenuItem.Click += new System.EventHandler(this.BindMarkersToInputMenuItem_Click);
// //
// EmptyNewMarkerNotesMenuItem // EmptyNewMarkerNotesMenuItem
// //
this.EmptyNewMarkerNotesMenuItem.Name = "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.Text = "Empty new Marker Notes";
this.EmptyNewMarkerNotesMenuItem.Click += new System.EventHandler(this.EmptyNewMarkerNotesMenuItem_Click); this.EmptyNewMarkerNotesMenuItem.Click += new System.EventHandler(this.EmptyNewMarkerNotesMenuItem_Click);
// //
// toolStripSeparator13 // toolStripSeparator13
// //
this.toolStripSeparator13.Name = "toolStripSeparator13"; this.toolStripSeparator13.Name = "toolStripSeparator13";
this.toolStripSeparator13.Size = new System.Drawing.Size(239, 6); this.toolStripSeparator13.Size = new System.Drawing.Size(250, 6);
// //
// BranchesRestoreEntireMovieMenuItem // BranchesRestoreEntireMovieMenuItem
// //
this.BranchesRestoreEntireMovieMenuItem.Enabled = false; this.BranchesRestoreEntireMovieMenuItem.Enabled = false;
this.BranchesRestoreEntireMovieMenuItem.Name = "BranchesRestoreEntireMovieMenuItem"; 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"; this.BranchesRestoreEntireMovieMenuItem.Text = "Branches restore entire Movie";
// //
// OsdInBranchScreenshotsMenuItem // OsdInBranchScreenshotsMenuItem
// //
this.OsdInBranchScreenshotsMenuItem.Enabled = false; this.OsdInBranchScreenshotsMenuItem.Enabled = false;
this.OsdInBranchScreenshotsMenuItem.Name = "OsdInBranchScreenshotsMenuItem"; 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"; this.OsdInBranchScreenshotsMenuItem.Text = "OSD in Branch screenshots";
// //
// toolStripSeparator14 // toolStripSeparator14
// //
this.toolStripSeparator14.Name = "toolStripSeparator14"; this.toolStripSeparator14.Name = "toolStripSeparator14";
this.toolStripSeparator14.Size = new System.Drawing.Size(239, 6); this.toolStripSeparator14.Size = new System.Drawing.Size(250, 6);
// //
// AutopauseAtEndOfMovieMenuItem // AutopauseAtEndOfMovieMenuItem
// //
this.AutopauseAtEndOfMovieMenuItem.Name = "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.Text = "Autopause at end of Movie";
this.AutopauseAtEndOfMovieMenuItem.Click += new System.EventHandler(this.AutopauseAtEndMenuItem_Click); this.AutopauseAtEndOfMovieMenuItem.Click += new System.EventHandler(this.AutopauseAtEndMenuItem_Click);
// //
// sepToolStripMenuItem // sepToolStripMenuItem
// //
this.sepToolStripMenuItem.Name = "sepToolStripMenuItem"; this.sepToolStripMenuItem.Name = "sepToolStripMenuItem";
this.sepToolStripMenuItem.Size = new System.Drawing.Size(239, 6); this.sepToolStripMenuItem.Size = new System.Drawing.Size(250, 6);
// //
// autoHoldFireToolStripMenuItem // autoHoldFireToolStripMenuItem
// //
@ -758,20 +767,20 @@ namespace BizHawk.Client.EmuHawk
this.setpToolStripMenuItem, this.setpToolStripMenuItem,
this.setCustomsToolStripMenuItem}); this.setCustomsToolStripMenuItem});
this.autoHoldFireToolStripMenuItem.Name = "autoHoldFireToolStripMenuItem"; 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"; this.autoHoldFireToolStripMenuItem.Text = "Auto Hold/Fire";
// //
// keepSetPatternsToolStripMenuItem // keepSetPatternsToolStripMenuItem
// //
this.keepSetPatternsToolStripMenuItem.CheckOnClick = true; this.keepSetPatternsToolStripMenuItem.CheckOnClick = true;
this.keepSetPatternsToolStripMenuItem.Name = "keepSetPatternsToolStripMenuItem"; 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"; this.keepSetPatternsToolStripMenuItem.Text = "Keep set patterns";
// //
// sepToolStripMenuItem1 // sepToolStripMenuItem1
// //
this.sepToolStripMenuItem1.Name = "sepToolStripMenuItem1"; this.sepToolStripMenuItem1.Name = "sepToolStripMenuItem1";
this.sepToolStripMenuItem1.Size = new System.Drawing.Size(157, 6); this.sepToolStripMenuItem1.Size = new System.Drawing.Size(168, 6);
// //
// autoHoldToolStripMenuItem // autoHoldToolStripMenuItem
// //
@ -779,7 +788,7 @@ namespace BizHawk.Client.EmuHawk
this.autoHoldToolStripMenuItem.CheckOnClick = true; this.autoHoldToolStripMenuItem.CheckOnClick = true;
this.autoHoldToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; this.autoHoldToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked;
this.autoHoldToolStripMenuItem.Name = "autoHoldToolStripMenuItem"; 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.Text = "Auto-Hold";
this.autoHoldToolStripMenuItem.CheckedChanged += new System.EventHandler(this.autoHoldToolStripMenuItem_CheckedChanged); this.autoHoldToolStripMenuItem.CheckedChanged += new System.EventHandler(this.autoHoldToolStripMenuItem_CheckedChanged);
// //
@ -787,7 +796,7 @@ namespace BizHawk.Client.EmuHawk
// //
this.autoFireToolStripMenuItem.CheckOnClick = true; this.autoFireToolStripMenuItem.CheckOnClick = true;
this.autoFireToolStripMenuItem.Name = "autoFireToolStripMenuItem"; 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.Text = "Auto-Fire";
this.autoFireToolStripMenuItem.CheckedChanged += new System.EventHandler(this.autoFireToolStripMenuItem_CheckedChanged); this.autoFireToolStripMenuItem.CheckedChanged += new System.EventHandler(this.autoFireToolStripMenuItem_CheckedChanged);
// //
@ -795,19 +804,19 @@ namespace BizHawk.Client.EmuHawk
// //
this.customPatternToolStripMenuItem.CheckOnClick = true; this.customPatternToolStripMenuItem.CheckOnClick = true;
this.customPatternToolStripMenuItem.Name = "customPatternToolStripMenuItem"; 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.Text = "Custom Pattern";
this.customPatternToolStripMenuItem.CheckedChanged += new System.EventHandler(this.customPatternToolStripMenuItem_CheckedChanged); this.customPatternToolStripMenuItem.CheckedChanged += new System.EventHandler(this.customPatternToolStripMenuItem_CheckedChanged);
// //
// setpToolStripMenuItem // setpToolStripMenuItem
// //
this.setpToolStripMenuItem.Name = "setpToolStripMenuItem"; this.setpToolStripMenuItem.Name = "setpToolStripMenuItem";
this.setpToolStripMenuItem.Size = new System.Drawing.Size(157, 6); this.setpToolStripMenuItem.Size = new System.Drawing.Size(168, 6);
// //
// setCustomsToolStripMenuItem // setCustomsToolStripMenuItem
// //
this.setCustomsToolStripMenuItem.Name = "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.Text = "Set Customs...";
this.setCustomsToolStripMenuItem.Click += new System.EventHandler(this.setCustomsToolStripMenuItem_Click); this.setCustomsToolStripMenuItem.Click += new System.EventHandler(this.setCustomsToolStripMenuItem_Click);
// //
@ -827,40 +836,40 @@ namespace BizHawk.Client.EmuHawk
// HeaderMenuItem // HeaderMenuItem
// //
this.HeaderMenuItem.Name = "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.Text = "&Header...";
this.HeaderMenuItem.Click += new System.EventHandler(this.HeaderMenuItem_Click); this.HeaderMenuItem.Click += new System.EventHandler(this.HeaderMenuItem_Click);
// //
// StateHistorySettingsMenuItem // StateHistorySettingsMenuItem
// //
this.StateHistorySettingsMenuItem.Name = "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.Text = "&Savestate History Settings...";
this.StateHistorySettingsMenuItem.Click += new System.EventHandler(this.StateHistorySettingsMenuItem_Click); this.StateHistorySettingsMenuItem.Click += new System.EventHandler(this.StateHistorySettingsMenuItem_Click);
// //
// CommentsMenuItem // CommentsMenuItem
// //
this.CommentsMenuItem.Name = "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.Text = "&Comments...";
this.CommentsMenuItem.Click += new System.EventHandler(this.CommentsMenuItem_Click); this.CommentsMenuItem.Click += new System.EventHandler(this.CommentsMenuItem_Click);
// //
// SubtitlesMenuItem // SubtitlesMenuItem
// //
this.SubtitlesMenuItem.Name = "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.Text = "&Subtitles...";
this.SubtitlesMenuItem.Click += new System.EventHandler(this.SubtitlesMenuItem_Click); this.SubtitlesMenuItem.Click += new System.EventHandler(this.SubtitlesMenuItem_Click);
// //
// toolStripSeparator21 // toolStripSeparator21
// //
this.toolStripSeparator21.Name = "toolStripSeparator21"; this.toolStripSeparator21.Name = "toolStripSeparator21";
this.toolStripSeparator21.Size = new System.Drawing.Size(226, 6); this.toolStripSeparator21.Size = new System.Drawing.Size(237, 6);
// //
// DefaultStateSettingsMenuItem // DefaultStateSettingsMenuItem
// //
this.DefaultStateSettingsMenuItem.Name = "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.Text = "&Default State History Settings...";
this.DefaultStateSettingsMenuItem.Click += new System.EventHandler(this.DefaultStateSettingsMenuItem_Click); this.DefaultStateSettingsMenuItem.Click += new System.EventHandler(this.DefaultStateSettingsMenuItem_Click);
// //
@ -882,7 +891,7 @@ namespace BizHawk.Client.EmuHawk
// RotateMenuItem // RotateMenuItem
// //
this.RotateMenuItem.Name = "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.Text = "Rotate";
this.RotateMenuItem.Click += new System.EventHandler(this.RotateMenuItem_Click); this.RotateMenuItem.Click += new System.EventHandler(this.RotateMenuItem_Click);
// //
@ -896,7 +905,7 @@ namespace BizHawk.Client.EmuHawk
this.toolStripSeparator12, this.toolStripSeparator12,
this.hideWasLagFramesToolStripMenuItem}); this.hideWasLagFramesToolStripMenuItem});
this.HideLagFramesSubMenu.Name = "HideLagFramesSubMenu"; 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.Text = "Hide Lag Frames";
this.HideLagFramesSubMenu.DropDownOpened += new System.EventHandler(this.HideLagFramesSubMenu_DropDownOpened); this.HideLagFramesSubMenu.DropDownOpened += new System.EventHandler(this.HideLagFramesSubMenu_DropDownOpened);
// //
@ -906,7 +915,7 @@ namespace BizHawk.Client.EmuHawk
this.HideLagFrames0.CheckOnClick = true; this.HideLagFrames0.CheckOnClick = true;
this.HideLagFrames0.CheckState = System.Windows.Forms.CheckState.Checked; this.HideLagFrames0.CheckState = System.Windows.Forms.CheckState.Checked;
this.HideLagFrames0.Name = "HideLagFrames0"; 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.Tag = 0;
this.HideLagFrames0.Text = "Don\'t Hide"; this.HideLagFrames0.Text = "Don\'t Hide";
this.HideLagFrames0.Click += new System.EventHandler(this.HideLagFramesX_Click); this.HideLagFrames0.Click += new System.EventHandler(this.HideLagFramesX_Click);
@ -915,7 +924,7 @@ namespace BizHawk.Client.EmuHawk
// //
this.HideLagFrames1.CheckOnClick = true; this.HideLagFrames1.CheckOnClick = true;
this.HideLagFrames1.Name = "HideLagFrames1"; 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.Tag = 1;
this.HideLagFrames1.Text = "1 (30 fps)"; this.HideLagFrames1.Text = "1 (30 fps)";
this.HideLagFrames1.Click += new System.EventHandler(this.HideLagFramesX_Click); this.HideLagFrames1.Click += new System.EventHandler(this.HideLagFramesX_Click);
@ -923,7 +932,7 @@ namespace BizHawk.Client.EmuHawk
// HideLagFrames2 // HideLagFrames2
// //
this.HideLagFrames2.Name = "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.Tag = 2;
this.HideLagFrames2.Text = "2 (20 fps)"; this.HideLagFrames2.Text = "2 (20 fps)";
this.HideLagFrames2.Click += new System.EventHandler(this.HideLagFramesX_Click); this.HideLagFrames2.Click += new System.EventHandler(this.HideLagFramesX_Click);
@ -932,7 +941,7 @@ namespace BizHawk.Client.EmuHawk
// //
this.HideLagFrames3.CheckOnClick = true; this.HideLagFrames3.CheckOnClick = true;
this.HideLagFrames3.Name = "HideLagFrames3"; 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.Tag = 3;
this.HideLagFrames3.Text = "3 (15fps)"; this.HideLagFrames3.Text = "3 (15fps)";
this.HideLagFrames3.Click += new System.EventHandler(this.HideLagFramesX_Click); this.HideLagFrames3.Click += new System.EventHandler(this.HideLagFramesX_Click);
@ -940,13 +949,13 @@ namespace BizHawk.Client.EmuHawk
// toolStripSeparator12 // toolStripSeparator12
// //
this.toolStripSeparator12.Name = "toolStripSeparator12"; this.toolStripSeparator12.Name = "toolStripSeparator12";
this.toolStripSeparator12.Size = new System.Drawing.Size(171, 6); this.toolStripSeparator12.Size = new System.Drawing.Size(182, 6);
// //
// hideWasLagFramesToolStripMenuItem // hideWasLagFramesToolStripMenuItem
// //
this.hideWasLagFramesToolStripMenuItem.CheckOnClick = true; this.hideWasLagFramesToolStripMenuItem.CheckOnClick = true;
this.hideWasLagFramesToolStripMenuItem.Name = "hideWasLagFramesToolStripMenuItem"; 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.Text = "Hide WasLag Frames";
this.hideWasLagFramesToolStripMenuItem.Click += new System.EventHandler(this.hideWasLagFramesToolStripMenuItem_Click); this.hideWasLagFramesToolStripMenuItem.Click += new System.EventHandler(this.hideWasLagFramesToolStripMenuItem_Click);
// //
@ -958,7 +967,7 @@ namespace BizHawk.Client.EmuHawk
this.denoteMarkersWithIconsToolStripMenuItem, this.denoteMarkersWithIconsToolStripMenuItem,
this.denoteMarkersWithBGColorToolStripMenuItem}); this.denoteMarkersWithBGColorToolStripMenuItem});
this.iconsToolStripMenuItem.Name = "iconsToolStripMenuItem"; 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.Text = "Icons";
this.iconsToolStripMenuItem.DropDownOpened += new System.EventHandler(this.iconsToolStripMenuItem_DropDownOpened); this.iconsToolStripMenuItem.DropDownOpened += new System.EventHandler(this.iconsToolStripMenuItem_DropDownOpened);
// //
@ -966,7 +975,7 @@ namespace BizHawk.Client.EmuHawk
// //
this.denoteStatesWithIconsToolStripMenuItem.CheckOnClick = true; this.denoteStatesWithIconsToolStripMenuItem.CheckOnClick = true;
this.denoteStatesWithIconsToolStripMenuItem.Name = "denoteStatesWithIconsToolStripMenuItem"; 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.Text = "Denote States With Icons";
this.denoteStatesWithIconsToolStripMenuItem.Click += new System.EventHandler(this.denoteStatesWithIconsToolStripMenuItem_Click); this.denoteStatesWithIconsToolStripMenuItem.Click += new System.EventHandler(this.denoteStatesWithIconsToolStripMenuItem_Click);
// //
@ -974,7 +983,7 @@ namespace BizHawk.Client.EmuHawk
// //
this.denoteStatesWithBGColorToolStripMenuItem.CheckOnClick = true; this.denoteStatesWithBGColorToolStripMenuItem.CheckOnClick = true;
this.denoteStatesWithBGColorToolStripMenuItem.Name = "denoteStatesWithBGColorToolStripMenuItem"; 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.Text = "Denote States With BG Color";
this.denoteStatesWithBGColorToolStripMenuItem.Click += new System.EventHandler(this.denoteStatesWithBGColorToolStripMenuItem_Click); this.denoteStatesWithBGColorToolStripMenuItem.Click += new System.EventHandler(this.denoteStatesWithBGColorToolStripMenuItem_Click);
// //
@ -982,7 +991,7 @@ namespace BizHawk.Client.EmuHawk
// //
this.denoteMarkersWithIconsToolStripMenuItem.CheckOnClick = true; this.denoteMarkersWithIconsToolStripMenuItem.CheckOnClick = true;
this.denoteMarkersWithIconsToolStripMenuItem.Name = "denoteMarkersWithIconsToolStripMenuItem"; 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.Text = "Denote Markers With Icons";
this.denoteMarkersWithIconsToolStripMenuItem.Click += new System.EventHandler(this.denoteMarkersWithIconsToolStripMenuItem_Click); this.denoteMarkersWithIconsToolStripMenuItem.Click += new System.EventHandler(this.denoteMarkersWithIconsToolStripMenuItem_Click);
// //
@ -990,14 +999,14 @@ namespace BizHawk.Client.EmuHawk
// //
this.denoteMarkersWithBGColorToolStripMenuItem.CheckOnClick = true; this.denoteMarkersWithBGColorToolStripMenuItem.CheckOnClick = true;
this.denoteMarkersWithBGColorToolStripMenuItem.Name = "denoteMarkersWithBGColorToolStripMenuItem"; 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.Text = "Denote Markers With BG Color";
this.denoteMarkersWithBGColorToolStripMenuItem.Click += new System.EventHandler(this.denoteMarkersWithBGColorToolStripMenuItem_Click); this.denoteMarkersWithBGColorToolStripMenuItem.Click += new System.EventHandler(this.denoteMarkersWithBGColorToolStripMenuItem_Click);
// //
// toolStripSeparator23 // toolStripSeparator23
// //
this.toolStripSeparator23.Name = "toolStripSeparator23"; this.toolStripSeparator23.Name = "toolStripSeparator23";
this.toolStripSeparator23.Size = new System.Drawing.Size(174, 6); this.toolStripSeparator23.Size = new System.Drawing.Size(185, 6);
// //
// followCursorToolStripMenuItem // followCursorToolStripMenuItem
// //
@ -1009,7 +1018,7 @@ namespace BizHawk.Client.EmuHawk
this.scrollToBottomToolStripMenuItem, this.scrollToBottomToolStripMenuItem,
this.scrollToCenterToolStripMenuItem}); this.scrollToCenterToolStripMenuItem});
this.followCursorToolStripMenuItem.Name = "followCursorToolStripMenuItem"; 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.Text = "Follow Cursor";
this.followCursorToolStripMenuItem.DropDownOpened += new System.EventHandler(this.followCursorToolStripMenuItem_DropDownOpened); this.followCursorToolStripMenuItem.DropDownOpened += new System.EventHandler(this.followCursorToolStripMenuItem_DropDownOpened);
// //
@ -1017,14 +1026,14 @@ namespace BizHawk.Client.EmuHawk
// //
this.alwaysScrollToolStripMenuItem.CheckOnClick = true; this.alwaysScrollToolStripMenuItem.CheckOnClick = true;
this.alwaysScrollToolStripMenuItem.Name = "alwaysScrollToolStripMenuItem"; 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.Text = "Always Scroll";
this.alwaysScrollToolStripMenuItem.Click += new System.EventHandler(this.alwaysScrollToolStripMenuItem_Click); this.alwaysScrollToolStripMenuItem.Click += new System.EventHandler(this.alwaysScrollToolStripMenuItem_Click);
// //
// toolStripSeparator24 // toolStripSeparator24
// //
this.toolStripSeparator24.Name = "toolStripSeparator24"; this.toolStripSeparator24.Name = "toolStripSeparator24";
this.toolStripSeparator24.Size = new System.Drawing.Size(146, 6); this.toolStripSeparator24.Size = new System.Drawing.Size(157, 6);
// //
// scrollToViewToolStripMenuItem // scrollToViewToolStripMenuItem
// //
@ -1032,7 +1041,7 @@ namespace BizHawk.Client.EmuHawk
this.scrollToViewToolStripMenuItem.CheckOnClick = true; this.scrollToViewToolStripMenuItem.CheckOnClick = true;
this.scrollToViewToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; this.scrollToViewToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked;
this.scrollToViewToolStripMenuItem.Name = "scrollToViewToolStripMenuItem"; 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.Text = "Scroll to View";
this.scrollToViewToolStripMenuItem.Click += new System.EventHandler(this.scrollToViewToolStripMenuItem_Click); this.scrollToViewToolStripMenuItem.Click += new System.EventHandler(this.scrollToViewToolStripMenuItem_Click);
// //
@ -1040,7 +1049,7 @@ namespace BizHawk.Client.EmuHawk
// //
this.scrollToTopToolStripMenuItem.CheckOnClick = true; this.scrollToTopToolStripMenuItem.CheckOnClick = true;
this.scrollToTopToolStripMenuItem.Name = "scrollToTopToolStripMenuItem"; 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.Text = "Scroll to Top";
this.scrollToTopToolStripMenuItem.Click += new System.EventHandler(this.scrollToTopToolStripMenuItem_Click); this.scrollToTopToolStripMenuItem.Click += new System.EventHandler(this.scrollToTopToolStripMenuItem_Click);
// //
@ -1048,7 +1057,7 @@ namespace BizHawk.Client.EmuHawk
// //
this.scrollToBottomToolStripMenuItem.CheckOnClick = true; this.scrollToBottomToolStripMenuItem.CheckOnClick = true;
this.scrollToBottomToolStripMenuItem.Name = "scrollToBottomToolStripMenuItem"; 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.Text = "Scroll to Bottom";
this.scrollToBottomToolStripMenuItem.Click += new System.EventHandler(this.scrollToBottomToolStripMenuItem_Click); this.scrollToBottomToolStripMenuItem.Click += new System.EventHandler(this.scrollToBottomToolStripMenuItem_Click);
// //
@ -1056,19 +1065,19 @@ namespace BizHawk.Client.EmuHawk
// //
this.scrollToCenterToolStripMenuItem.CheckOnClick = true; this.scrollToCenterToolStripMenuItem.CheckOnClick = true;
this.scrollToCenterToolStripMenuItem.Name = "scrollToCenterToolStripMenuItem"; 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.Text = "Scroll to Center";
this.scrollToCenterToolStripMenuItem.Click += new System.EventHandler(this.scrollToCenterToolStripMenuItem_Click); this.scrollToCenterToolStripMenuItem.Click += new System.EventHandler(this.scrollToCenterToolStripMenuItem_Click);
// //
// toolStripSeparator25 // toolStripSeparator25
// //
this.toolStripSeparator25.Name = "toolStripSeparator25"; this.toolStripSeparator25.Name = "toolStripSeparator25";
this.toolStripSeparator25.Size = new System.Drawing.Size(174, 6); this.toolStripSeparator25.Size = new System.Drawing.Size(185, 6);
// //
// wheelScrollSpeedToolStripMenuItem // wheelScrollSpeedToolStripMenuItem
// //
this.wheelScrollSpeedToolStripMenuItem.Name = "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.Text = "Wheel Scroll Speed...";
this.wheelScrollSpeedToolStripMenuItem.Click += new System.EventHandler(this.wheelScrollSpeedToolStripMenuItem_Click); this.wheelScrollSpeedToolStripMenuItem.Click += new System.EventHandler(this.wheelScrollSpeedToolStripMenuItem_Click);
// //
@ -1099,19 +1108,19 @@ namespace BizHawk.Client.EmuHawk
// //
this.EnableTooltipsMenuItem.Enabled = false; this.EnableTooltipsMenuItem.Enabled = false;
this.EnableTooltipsMenuItem.Name = "EnableTooltipsMenuItem"; 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"; this.EnableTooltipsMenuItem.Text = "&Enable Tooltips";
// //
// toolStripSeparator10 // toolStripSeparator10
// //
this.toolStripSeparator10.Name = "toolStripSeparator10"; this.toolStripSeparator10.Name = "toolStripSeparator10";
this.toolStripSeparator10.Size = new System.Drawing.Size(143, 6); this.toolStripSeparator10.Size = new System.Drawing.Size(154, 6);
// //
// aboutToolStripMenuItem // aboutToolStripMenuItem
// //
this.aboutToolStripMenuItem.Enabled = false; this.aboutToolStripMenuItem.Enabled = false;
this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; 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"; this.aboutToolStripMenuItem.Text = "&About";
// //
// TasView // TasView
@ -1674,7 +1683,7 @@ namespace BizHawk.Client.EmuHawk
private System.Windows.Forms.ToolStripMenuItem scrollToCenterToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem scrollToCenterToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem applyPatternToPaintedInputToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem applyPatternToPaintedInputToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem onlyOnAutoFireColumnsToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem onlyOnAutoFireColumnsToolStripMenuItem;
public BookmarksBranchesBox BookMarkControl; private BookmarksBranchesBox BookMarkControl;
private System.Windows.Forms.ToolStripMenuItem BranchContextMenuItem; private System.Windows.Forms.ToolStripMenuItem BranchContextMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator25; private System.Windows.Forms.ToolStripSeparator toolStripSeparator25;
private System.Windows.Forms.ToolStripMenuItem wheelScrollSpeedToolStripMenuItem; 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 NewFromCurrentSaveRamMenuItem;
private System.Windows.Forms.ToolStripMenuItem SetBranchCellHoverIntervalMenuItem; private System.Windows.Forms.ToolStripMenuItem SetBranchCellHoverIntervalMenuItem;
private System.Windows.Forms.ToolStripMenuItem SetMarkerWithTextContextMenuItem; private System.Windows.Forms.ToolStripMenuItem SetMarkerWithTextContextMenuItem;
private System.Windows.Forms.ToolStripMenuItem SetSeekingCutoffIntervalMenuItem;
} }
} }

View File

@ -6,7 +6,47 @@ namespace BizHawk.Client.EmuHawk
{ {
private bool _suppressAskSave = false; 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 bool WantsToControlReadOnly { get { return false; } }
public void ToggleReadOnly() public void ToggleReadOnly()
{ {
GlobalWin.OSD.AddMessage("TAStudio does not allow manual readonly toggle"); GlobalWin.OSD.AddMessage("TAStudio does not allow manual readonly toggle");
@ -31,7 +71,7 @@ namespace BizHawk.Client.EmuHawk
public bool Rewind() public bool Rewind()
{ {
GoToPreviousFrame(); GoToPreviousFrame(); // todo: behave as normal rewind in differentiating between hitting rewind once and holding it.
return true; return true;
} }

View File

@ -45,6 +45,8 @@ namespace BizHawk.Client.EmuHawk
private bool _triggerAutoRestore; // If true, autorestore will be called on mouse up 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 int? _autoRestoreFrame; // The frame auto-restore will restore to, if set
private bool? _autoRestorePaused = null; private bool? _autoRestorePaused = null;
private int? _seekStartFrame = null;
private void JumpToGreenzone() private void JumpToGreenzone()
{ {
if (Global.Emulator.Frame > CurrentTasMovie.LastValidFrame) if (Global.Emulator.Frame > CurrentTasMovie.LastValidFrame)
@ -57,11 +59,33 @@ namespace BizHawk.Client.EmuHawk
} }
GoToLastEmulatedFrameIfNecessary(CurrentTasMovie.LastValidFrame); GoToLastEmulatedFrameIfNecessary(CurrentTasMovie.LastValidFrame);
GlobalWin.MainForm.PauseOnFrame = _autoRestoreFrame; StartSeeking(_autoRestoreFrame, true);
GlobalWin.MainForm.PauseEmulator();
} }
} }
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_FrameCol = Color.FromArgb(0xCFEDFC); Why?
public static Color CurrentFrame_InputLog = Color.FromArgb(0xB5E7F7); public static Color CurrentFrame_InputLog = Color.FromArgb(0xB5E7F7);

View File

@ -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) private void ConfigSubMenu_DropDownOpened(object sender, EventArgs e)
{ {
DrawInputByDraggingMenuItem.Checked = Settings.DrawInput; DrawInputByDraggingMenuItem.Checked = Settings.DrawInput;
@ -1097,7 +1119,7 @@ namespace BizHawk.Client.EmuHawk
index, (byte[])StatableEmulator.SaveStateBinary().Clone()); index, (byte[])StatableEmulator.SaveStateBinary().Clone());
GlobalWin.MainForm.PauseEmulator(); GlobalWin.MainForm.PauseEmulator();
LoadFile(new FileInfo(newProject.Filename)); LoadFile(new FileInfo(newProject.Filename), true);
} }
} }
@ -1112,7 +1134,7 @@ namespace BizHawk.Client.EmuHawk
SaveRamEmulator.CloneSaveRam()); SaveRamEmulator.CloneSaveRam());
GlobalWin.MainForm.PauseEmulator(); GlobalWin.MainForm.PauseEmulator();
LoadFile(new FileInfo(newProject.Filename)); LoadFile(new FileInfo(newProject.Filename), true);
} }
} }

View File

@ -38,8 +38,6 @@ namespace BizHawk.Client.EmuHawk
StartAtNearestFrameAndEmulate(frame); StartAtNearestFrameAndEmulate(frame);
MaybeFollowCursor(); 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 else // Emulate to a future frame
{ {
@ -58,8 +56,7 @@ namespace BizHawk.Client.EmuHawk
if (lastState > Emulator.Frame) if (lastState > Emulator.Frame)
LoadState(CurrentTasMovie.TasStateManager[lastState]); // STATE ACCESS LoadState(CurrentTasMovie.TasStateManager[lastState]); // STATE ACCESS
GlobalWin.MainForm.UnpauseEmulator(); StartSeeking(frame);
GlobalWin.MainForm.PauseOnFrame = frame;
} }
} }

View File

@ -26,6 +26,7 @@ namespace BizHawk.Client.EmuHawk
private readonly List<TasClipboardEntry> _tasClipboard = new List<TasClipboardEntry>(); private readonly List<TasClipboardEntry> _tasClipboard = new List<TasClipboardEntry>();
private BackgroundWorker _saveBackgroundWorker; private BackgroundWorker _saveBackgroundWorker;
private BackgroundWorker _seekBackgroundWorker;
private MovieEndAction _originalEndAction; // The movie end behavior selected by the user (that is overridden by TAStudio) private MovieEndAction _originalEndAction; // The movie end behavior selected by the user (that is overridden by TAStudio)
private Dictionary<string, string> GenerateColumnNames() private Dictionary<string, string> GenerateColumnNames()
@ -64,6 +65,7 @@ namespace BizHawk.Client.EmuHawk
FollowCursorAlwaysScroll = false; FollowCursorAlwaysScroll = false;
FollowCursorScrollMethod = "near"; FollowCursorScrollMethod = "near";
BranchCellHoverInterval = 1; BranchCellHoverInterval = 1;
SeekingCutoffInterval = 2;
// default to taseditor fashion // default to taseditor fashion
denoteStatesWithIcons = false; denoteStatesWithIcons = false;
denoteStatesWithBGColor = true; denoteStatesWithBGColor = true;
@ -81,6 +83,7 @@ namespace BizHawk.Client.EmuHawk
public bool FollowCursorAlwaysScroll { get; set; } public bool FollowCursorAlwaysScroll { get; set; }
public string FollowCursorScrollMethod { get; set; } public string FollowCursorScrollMethod { get; set; }
public int BranchCellHoverInterval { get; set; } public int BranchCellHoverInterval { get; set; }
public int SeekingCutoffInterval { get; set; }
public bool denoteStatesWithIcons { get; set; } public bool denoteStatesWithIcons { get; set; }
public bool denoteStatesWithBGColor { get; set; } public bool denoteStatesWithBGColor { get; set; }
@ -127,6 +130,7 @@ namespace BizHawk.Client.EmuHawk
this.SavingProgressBar.Visible = false; this.SavingProgressBar.Visible = false;
InitializeSaveWorker(); InitializeSaveWorker();
InitializeSeekWorker();
WantsToControlStopMovie = true; WantsToControlStopMovie = true;
TasPlaybackBox.Tastudio = this; TasPlaybackBox.Tastudio = this;
@ -178,6 +182,57 @@ namespace BizHawk.Client.EmuHawk
CurrentTasMovie.NewBGWorker(_saveBackgroundWorker); 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 bool _initialized = false;
private void Tastudio_Load(object sender, EventArgs e) private void Tastudio_Load(object sender, EventArgs e)
{ {
@ -207,6 +262,7 @@ namespace BizHawk.Client.EmuHawk
TasView.ScrollSpeed = Settings.ScrollSpeed; TasView.ScrollSpeed = Settings.ScrollSpeed;
TasView.AlwaysScroll = Settings.FollowCursorAlwaysScroll; TasView.AlwaysScroll = Settings.FollowCursorAlwaysScroll;
TasView.ScrollMethod = Settings.FollowCursorScrollMethod; TasView.ScrollMethod = Settings.FollowCursorScrollMethod;
TasView.SeekingCutoffInterval = Settings.SeekingCutoffInterval;
BookMarkControl.HoverInterval = Settings.BranchCellHoverInterval; BookMarkControl.HoverInterval = Settings.BranchCellHoverInterval;
TasView.denoteStatesWithIcons = Settings.denoteStatesWithIcons; TasView.denoteStatesWithIcons = Settings.denoteStatesWithIcons;
@ -296,10 +352,12 @@ namespace BizHawk.Client.EmuHawk
return true; return true;
} }
private void SetTasMovieCallbacks() private void SetTasMovieCallbacks(TasMovie movie = null)
{ {
CurrentTasMovie.ClientSettingsForSave = ClientSettingsForSave; if (movie == null)
CurrentTasMovie.GetClientSettingsOnLoad = GetClientSettingsOnLoad; movie = CurrentTasMovie;
movie.ClientSettingsForSave = ClientSettingsForSave;
movie.GetClientSettingsOnLoad = GetClientSettingsOnLoad;
} }
private string ClientSettingsForSave() private string ClientSettingsForSave()
@ -343,8 +401,7 @@ namespace BizHawk.Client.EmuHawk
column.Visible = false; column.Visible = false;
} }
TasView.AllColumns.ColumnsChanged(); TasView.AllColumns.ColumnsChanged();
// Patterns // Patterns
int bStart = 0; int bStart = 0;
@ -420,7 +477,7 @@ namespace BizHawk.Client.EmuHawk
Settings.RecentTas.Add(Global.MovieSession.Movie.Filename); Settings.RecentTas.Add(Global.MovieSession.Movie.Filename);
} }
private bool LoadFile(FileInfo file) private bool LoadFile(FileInfo file, bool startsFromSavestate = false)
{ {
if (!file.Exists) if (!file.Exists)
{ {
@ -428,7 +485,7 @@ namespace BizHawk.Client.EmuHawk
return false; return false;
} }
TasMovie newMovie = new TasMovie(false, _saveBackgroundWorker); TasMovie newMovie = new TasMovie(startsFromSavestate, _saveBackgroundWorker);
newMovie.TasStateManager.InvalidateCallback = GreenzoneInvalidated; newMovie.TasStateManager.InvalidateCallback = GreenzoneInvalidated;
newMovie.Filename = file.FullName; newMovie.Filename = file.FullName;
@ -437,8 +494,13 @@ namespace BizHawk.Client.EmuHawk
if (!HandleMovieLoadStuff(newMovie)) if (!HandleMovieLoadStuff(newMovie))
return false; return false;
SetUpColumns(); if (TasView.AllColumns.Count() == 0)
GoToFrame(CurrentTasMovie.Session.CurrentFrame); SetUpColumns();
if (startsFromSavestate)
GoToFrame(0);
else
GoToFrame(CurrentTasMovie.Session.CurrentFrame);
CurrentTasMovie.PropertyChanged += new PropertyChangedEventHandler(this.TasMovie_OnPropertyChanged);
CurrentTasMovie.CurrentBranch = CurrentTasMovie.Session.CurrentBranch; CurrentTasMovie.CurrentBranch = CurrentTasMovie.Session.CurrentBranch;
// clear all selections // clear all selections
@ -476,9 +538,9 @@ namespace BizHawk.Client.EmuHawk
private bool HandleMovieLoadStuff(TasMovie movie = null) private bool HandleMovieLoadStuff(TasMovie movie = null)
{ {
WantsToControlStopMovie = false;
bool result; bool result;
WantsToControlStopMovie = false;
if (movie == null) if (movie == null)
{ {
movie = CurrentTasMovie; movie = CurrentTasMovie;
@ -486,8 +548,10 @@ namespace BizHawk.Client.EmuHawk
} }
else else
result = StartNewMovieWrapper(false, movie); result = StartNewMovieWrapper(false, movie);
if (!result) if (!result)
return false; return false;
WantsToControlStopMovie = true; WantsToControlStopMovie = true;
CurrentTasMovie.ChangeLog.ClearLog(); CurrentTasMovie.ChangeLog.ClearLog();
@ -503,6 +567,7 @@ namespace BizHawk.Client.EmuHawk
_initializing = true; _initializing = true;
if (movie == null) if (movie == null)
movie = CurrentTasMovie; movie = CurrentTasMovie;
SetTasMovieCallbacks(movie as TasMovie);
bool result = GlobalWin.MainForm.StartNewMovie(movie, record); bool result = GlobalWin.MainForm.StartNewMovie(movie, record);
_initializing = false; _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 if (_autoRestoreFrame > Emulator.Frame) // Don't unpause if we are already on the desired frame, else runaway seek
{ {
GlobalWin.MainForm.PauseOnFrame = _autoRestoreFrame; StartSeeking(_autoRestoreFrame);
GlobalWin.MainForm.UnpauseEmulator();
} }
} }
else else
@ -643,8 +707,6 @@ namespace BizHawk.Client.EmuHawk
_autoRestorePaused = null; _autoRestorePaused = null;
GlobalWin.MainForm.PauseOnFrame = null; // Cancel seek to autorestore point GlobalWin.MainForm.PauseOnFrame = null; // Cancel seek to autorestore point
} }
_autoRestoreFrame = null; _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 if (GlobalWin.MainForm.EmulatorPaused || GlobalWin.MainForm.IsSeeking) // make seek frame keep up with emulation on fast scrolls
{ {
GlobalWin.MainForm.PauseOnFrame = frame; StartSeeking(frame);
GlobalWin.MainForm.UnpauseEmulator();
} }
} }
} }
@ -686,6 +747,16 @@ namespace BizHawk.Client.EmuHawk
_hackyDontUpdate = false; _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 private void UpdateOtherTools() // a hack probably, surely there is a better way to do this
{ {
_hackyDontUpdate = true; _hackyDontUpdate = true;

View File

@ -124,18 +124,18 @@
<data name="RecentSubMenu.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="RecentSubMenu.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALCQAA YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAALBwAA
CwkBEvpHPgAAAk1JREFUOE+VkktvUlEUhVsfsdHoREcOHJr4C/RPONHoXzBxoOlAJybOlAZtkdSa2piY CwcBtnMLwAAAAllJREFUOE+VU8tuUlEUFR+x0ehEB40DhyZ+gQ78BSca/QUTB5oOdGLiTGnQFkmtqY2J
NsjjFiiX8qY8ChYL+ECB2lKB8rq0k5bEmiiRbtc+6b2B6MTBR/ZZa+919j3tEBH9RbudHD6E63/2qAwc aYO8CpRLeVMehRYL+ECB2lKB8qYTS2JNlAjbtU96b2h1IskiZ6+19jr7HA4qIjp08NNuL6v2OCEOD1/5
treT58BVRVnWl8vBbLEg7wNC/QPaMrwb4GT/jFa024mzQLe56c9GwjM7klXXlcw6ksyPSbLoKByc/lUq y6MQHCCj3Y6fBa42m0uaYtGfzuekXYCw/gFuCdoN4MRgj9LcasXOAOrNTW86FJzetpjUXYtBTRbDY7IY
+TbQMwrODARAGAF3SxtexSMbf8vOCVp9ZyK+/euaW9TO+SfksOlprSjvoteAjU5rAYqSuFyvR1PR8Ewv 1RT0T/0qFDwb8IwAp+UQEQBiCLhb2HA3XZLut2Qfp9W3euLdv6w5xdo+94RsZg2t5aVv8Gox0SlxfP5q
GJii8rcAoYFSb+d4gDAgNI/8jGTHOFUroT3410QAHuk4Am4Vi/KOzz2JGxfFcLMZI3wK5T7ZqaXEhcYb NmOXqtVwIhyc7vl9k1T86iMYKLE8yw2EBsG5pGck2caoXArsQL8mAlqt+DEE3MrnpW2PcwI7Lojmej1C
WU2PKJM2H7Ra8XE14AQO91dTpk4k9JLq9YgYHghoxcWZPa/bSCH/C2o0orPaBo1GbDQee9VJxF+zoYFP OAplPlqp0YwKjicy6R9RKmnoNxrRMTngOIr7qwl9JxR4SdVqSDTvC2hERc2a26mjgPcF1WrhGWWCWi0y
wtpGWgpN0/uMRWgcyiG1WsSkBhxFwG0E7AV8z2lrKyxuYvgBs2kLr4z1XcLj4SA2gD+nBhxB8p1sxtKZ Eo286sSir1lQgCNhbB0tBqboXcooeJ6KQyqVkF4OOIKA2wjY8Xme09ZWUOzE4AtMJ408MsZ3CI2b/ZgA
t4xR/otTDNdqS1oQw7ezx2/AfxVok1oAmh+WSt7v/MKLLgOtr3tEQD+sseeyPyX0dqHdVAOGq9XQPazX +qwccBjJd9IpY2fOOErZz3bRXKksKkFc8+6s8R3wrwJuQgmA+WGh4P7ON7zg0NL6uksEDII51hzWpwRv
/JyzH9itY+SQ9LSSnKV8fkHANWvsoYc/JYaZERHAPzicBw9AoZBf+BnwTZEN/4G2N4egZg1eDz05cIHn F9pNOUBVLgfuYbz6p4y1bzWNks2ioZX4DGWz8wK8Zo41ePgoEfQMKe8AxTngAZDLZed/+jyTZMYLNL/Z
tACmUgmeAtdhRsvlwH6x6Dr4+EESoO5B68JLo+eSOjMQwKDpGLgCJtDoBysgBXzQDOBifz8zcPh/aOgP A9bMQevBkwHO73uJXJRK/pPAdYjhYtG3m887+h/eWwSw7oHrQkvCc/Gf/wUmYToKXAbGYfQCK0AC8IDT
7nYTiVA2JaoAAAAASUVORK5CYII= AhcGm5UjHCT/p/4DPvHsVpirf9UAAAAASUVORK5CYII=
</value> </value>
</data> </data>
<metadata name="TasStatusStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="TasStatusStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">

View File

@ -44,9 +44,9 @@ namespace BizHawk.Client.EmuHawk
return; return;
if (row == log.UndoIndex) if (row == log.UndoIndex)
color = Color.Green; color = TAStudio.GreenZone_InputLog;
else if (row > log.UndoIndex) else if (row > log.UndoIndex)
color = Color.Red; color = TAStudio.LagZone_InputLog;
} }
private string _lastUndoAction = null; private string _lastUndoAction = null;
@ -55,7 +55,7 @@ namespace BizHawk.Client.EmuHawk
HistoryView.ItemCount = log.Names.Count; HistoryView.ItemCount = log.Names.Count;
if (AutoScrollCheck.Checked && _lastUndoAction != log.NextUndoStepName) if (AutoScrollCheck.Checked && _lastUndoAction != log.NextUndoStepName)
{ {
HistoryView.ensureVisible(log.UndoIndex - 1); HistoryView.ensureVisible(log.UndoIndex);
HistoryView.clearSelection(); HistoryView.clearSelection();
HistoryView.SelectItem(log.UndoIndex - 1, true); HistoryView.SelectItem(log.UndoIndex - 1, true);
} }

Some files were not shown because too many files have changed in this diff Show More