init commit (v1.0)

This commit is contained in:
2020-09-22 10:50:36 +02:00
commit 720c539d28
36 changed files with 5023 additions and 0 deletions

View File

@@ -0,0 +1,81 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Dieser Code wurde von einem Tool generiert.
// Laufzeitversion:4.0.30319.42000
//
// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
// der Code erneut generiert wird.
// </auto-generated>
//------------------------------------------------------------------------------
namespace PJ64Savestater {
using System;
/// <summary>
/// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
/// </summary>
// Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert
// -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert.
// Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen
// mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class ActionCodes {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal ActionCodes() {
}
/// <summary>
/// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PJ64Savestater.ActionCodes", typeof(ActionCodes).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
/// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die CreateSavestate ähnelt.
/// </summary>
internal static string CreateSavestate {
get {
return ResourceManager.GetString("CreateSavestate", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die LoadSavestate ähnelt.
/// </summary>
internal static string LoadSavestate {
get {
return ResourceManager.GetString("LoadSavestate", resourceCulture);
}
}
}
}

View File

@@ -0,0 +1,126 @@
<?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="CreateSavestate" xml:space="preserve">
<value>CreateSavestate</value>
</data>
<data name="LoadSavestate" xml:space="preserve">
<value>LoadSavestate</value>
</data>
</root>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
</configuration>

View File

@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PJ64Savestater
{
public enum ControllerTypes : byte
{
Keyboard,
DirectInput
}
}

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
<Costura/>
</Weavers>

View File

@@ -0,0 +1,111 @@
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. -->
<xs:element name="Weavers">
<xs:complexType>
<xs:all>
<xs:element name="Costura" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:all>
<xs:element minOccurs="0" maxOccurs="1" name="ExcludeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1" name="IncludeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1" name="Unmanaged32Assemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with line breaks.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1" name="Unmanaged64Assemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of unmanaged 64 bit assembly names to include, delimited with line breaks.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1" name="PreloadOrder" type="xs:string">
<xs:annotation>
<xs:documentation>The order of preloaded assemblies, delimited with line breaks.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:all>
<xs:attribute name="CreateTemporaryAssemblies" type="xs:boolean">
<xs:annotation>
<xs:documentation>This will copy embedded files to disk before loading them into memory. This is helpful for some scenarios that expected an assembly to be loaded from a physical file.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="IncludeDebugSymbols" type="xs:boolean">
<xs:annotation>
<xs:documentation>Controls if .pdbs for reference assemblies are also embedded.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="DisableCompression" type="xs:boolean">
<xs:annotation>
<xs:documentation>Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="DisableCleanup" type="xs:boolean">
<xs:annotation>
<xs:documentation>As part of Costura, embedded assemblies are no longer included as part of the build. This cleanup can be turned off.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="LoadAtModuleInit" type="xs:boolean">
<xs:annotation>
<xs:documentation>Costura by default will load as part of the module initialization. This flag disables that behavior. Make sure you call CosturaUtility.Initialize() somewhere in your code.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="IgnoreSatelliteAssemblies" type="xs:boolean">
<xs:annotation>
<xs:documentation>Costura will by default use assemblies with a name like 'resources.dll' as a satellite resource and prepend the output path. This flag disables that behavior.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="ExcludeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with |</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="IncludeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="Unmanaged32Assemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with |.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="Unmanaged64Assemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of unmanaged 64 bit assembly names to include, delimited with |.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="PreloadOrder" type="xs:string">
<xs:annotation>
<xs:documentation>The order of preloaded assemblies, delimited with |.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:all>
<xs:attribute name="VerifyAssembly" type="xs:boolean">
<xs:annotation>
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="VerifyIgnoreCodes" type="xs:string">
<xs:annotation>
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="GenerateXsd" type="xs:boolean">
<xs:annotation>
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>

253
Project64Savestater/Form1.Designer.cs generated Normal file
View File

@@ -0,0 +1,253 @@
using System;
namespace PJ64Savestater
{
partial class Form1
{
/// <summary>
/// Erforderliche Designervariable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Verwendete Ressourcen bereinigen.
/// </summary>
/// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Vom Windows Form-Designer generierter Code
/// <summary>
/// Erforderliche Methode für die Designerunterstützung.
/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
this.styleManager1 = new DevComponents.DotNetBar.StyleManager(this.components);
this.ComboBoxEx_Pads = new DevComponents.DotNetBar.Controls.ComboBoxEx();
this.panel1 = new System.Windows.Forms.Panel();
this.line3 = new DevComponents.DotNetBar.Controls.Line();
this.line2 = new DevComponents.DotNetBar.Controls.Line();
this.ButtonX_LoadProfile = new DevComponents.DotNetBar.ButtonX();
this.ButtonX_SaveProfile = new DevComponents.DotNetBar.ButtonX();
this.ButtonX_StartStopListening = new DevComponents.DotNetBar.ButtonX();
this.line1 = new DevComponents.DotNetBar.Controls.Line();
this.TextBoxX_LoadSavestate = new DevComponents.DotNetBar.Controls.TextBoxX();
this.TextBoxX_CreateSavestate = new DevComponents.DotNetBar.Controls.TextBoxX();
this.labelX3 = new DevComponents.DotNetBar.LabelX();
this.labelX2 = new DevComponents.DotNetBar.LabelX();
this.labelX1 = new DevComponents.DotNetBar.LabelX();
this.ButtonX_LoadPads = new DevComponents.DotNetBar.ButtonX();
this.panel1.SuspendLayout();
this.SuspendLayout();
//
// styleManager1
//
this.styleManager1.ManagerStyle = DevComponents.DotNetBar.eStyle.Office2016;
this.styleManager1.MetroColorParameters = new DevComponents.DotNetBar.Metro.ColorTables.MetroColorGeneratorParameters(System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))), System.Drawing.Color.FromArgb(((int)(((byte)(164)))), ((int)(((byte)(55)))), ((int)(((byte)(58))))));
//
// ComboBoxEx_Pads
//
this.ComboBoxEx_Pads.DisplayMember = "Text";
this.ComboBoxEx_Pads.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
this.ComboBoxEx_Pads.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.ComboBoxEx_Pads.ForeColor = System.Drawing.Color.Black;
this.ComboBoxEx_Pads.FormattingEnabled = true;
resources.ApplyResources(this.ComboBoxEx_Pads, "ComboBoxEx_Pads");
this.ComboBoxEx_Pads.Name = "ComboBoxEx_Pads";
this.ComboBoxEx_Pads.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.ComboBoxEx_Pads.SelectedIndexChanged += new System.EventHandler(this.ComboBoxEx_Pads_SelectedIndexChanged);
//
// panel1
//
this.panel1.BackColor = System.Drawing.Color.Transparent;
this.panel1.Controls.Add(this.line3);
this.panel1.Controls.Add(this.line2);
this.panel1.Controls.Add(this.ButtonX_LoadProfile);
this.panel1.Controls.Add(this.ButtonX_SaveProfile);
this.panel1.Controls.Add(this.ButtonX_StartStopListening);
this.panel1.Controls.Add(this.line1);
this.panel1.Controls.Add(this.TextBoxX_LoadSavestate);
this.panel1.Controls.Add(this.TextBoxX_CreateSavestate);
this.panel1.Controls.Add(this.labelX3);
this.panel1.Controls.Add(this.labelX2);
this.panel1.Controls.Add(this.labelX1);
this.panel1.Controls.Add(this.ButtonX_LoadPads);
this.panel1.Controls.Add(this.ComboBoxEx_Pads);
resources.ApplyResources(this.panel1, "panel1");
this.panel1.ForeColor = System.Drawing.Color.Black;
this.panel1.Name = "panel1";
//
// line3
//
resources.ApplyResources(this.line3, "line3");
this.line3.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
this.line3.ForeColor = System.Drawing.Color.Black;
this.line3.Name = "line3";
this.line3.VerticalLine = true;
//
// line2
//
this.line2.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
this.line2.ForeColor = System.Drawing.Color.Black;
resources.ApplyResources(this.line2, "line2");
this.line2.Name = "line2";
this.line2.VerticalLine = true;
//
// ButtonX_LoadProfile
//
this.ButtonX_LoadProfile.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
this.ButtonX_LoadProfile.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground;
this.ButtonX_LoadProfile.Image = global::PJ64Savestater.Properties.Resources.icons8_opened_folder_16px;
resources.ApplyResources(this.ButtonX_LoadProfile, "ButtonX_LoadProfile");
this.ButtonX_LoadProfile.Name = "ButtonX_LoadProfile";
this.ButtonX_LoadProfile.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.ButtonX_LoadProfile.Click += new System.EventHandler(this.ButtonX_LoadProfile_Click);
//
// ButtonX_SaveProfile
//
this.ButtonX_SaveProfile.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
this.ButtonX_SaveProfile.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground;
this.ButtonX_SaveProfile.Image = global::PJ64Savestater.Properties.Resources.icons8_save_16px;
resources.ApplyResources(this.ButtonX_SaveProfile, "ButtonX_SaveProfile");
this.ButtonX_SaveProfile.Name = "ButtonX_SaveProfile";
this.ButtonX_SaveProfile.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.ButtonX_SaveProfile.Click += new System.EventHandler(this.ButtonX_SaveProfile_Click);
//
// ButtonX_StartStopListening
//
this.ButtonX_StartStopListening.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
this.ButtonX_StartStopListening.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground;
this.ButtonX_StartStopListening.Image = global::PJ64Savestater.Properties.Resources.icons8_play_button_circled_16px;
resources.ApplyResources(this.ButtonX_StartStopListening, "ButtonX_StartStopListening");
this.ButtonX_StartStopListening.Name = "ButtonX_StartStopListening";
this.ButtonX_StartStopListening.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.ButtonX_StartStopListening.Click += new System.EventHandler(this.ButtonX_StartStopListening_Click);
//
// line1
//
resources.ApplyResources(this.line1, "line1");
this.line1.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
this.line1.ForeColor = System.Drawing.Color.Black;
this.line1.Name = "line1";
//
// TextBoxX_LoadSavestate
//
this.TextBoxX_LoadSavestate.BackColor = System.Drawing.Color.White;
//
//
//
this.TextBoxX_LoadSavestate.Border.Class = "TextBoxBorder";
this.TextBoxX_LoadSavestate.Border.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.TextBoxX_LoadSavestate.DisabledBackColor = System.Drawing.Color.White;
this.TextBoxX_LoadSavestate.ForeColor = System.Drawing.Color.Black;
resources.ApplyResources(this.TextBoxX_LoadSavestate, "TextBoxX_LoadSavestate");
this.TextBoxX_LoadSavestate.Name = "TextBoxX_LoadSavestate";
this.TextBoxX_LoadSavestate.PreventEnterBeep = true;
this.TextBoxX_LoadSavestate.ReadOnly = true;
this.TextBoxX_LoadSavestate.Click += new System.EventHandler(this.TextBoxX_Click);
this.TextBoxX_LoadSavestate.TextChanged += new System.EventHandler(this.TextBoxX_LoadSavestate_TextChanged);
this.TextBoxX_LoadSavestate.LostFocus += new System.EventHandler(this.TextBoxX_LostFocus_TextChanged);
//
// TextBoxX_CreateSavestate
//
this.TextBoxX_CreateSavestate.BackColor = System.Drawing.Color.White;
//
//
//
this.TextBoxX_CreateSavestate.Border.Class = "TextBoxBorder";
this.TextBoxX_CreateSavestate.Border.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.TextBoxX_CreateSavestate.DisabledBackColor = System.Drawing.Color.White;
this.TextBoxX_CreateSavestate.ForeColor = System.Drawing.Color.Black;
resources.ApplyResources(this.TextBoxX_CreateSavestate, "TextBoxX_CreateSavestate");
this.TextBoxX_CreateSavestate.Name = "TextBoxX_CreateSavestate";
this.TextBoxX_CreateSavestate.PreventEnterBeep = true;
this.TextBoxX_CreateSavestate.ReadOnly = true;
this.TextBoxX_CreateSavestate.Click += new System.EventHandler(this.TextBoxX_Click);
this.TextBoxX_CreateSavestate.TextChanged += new System.EventHandler(this.TextBoxX_CreateSavestate_TextChanged);
this.TextBoxX_CreateSavestate.LostFocus += new System.EventHandler(this.TextBoxX_LostFocus_TextChanged);
//
// labelX3
//
//
//
//
this.labelX3.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.labelX3.ForeColor = System.Drawing.Color.Black;
resources.ApplyResources(this.labelX3, "labelX3");
this.labelX3.Name = "labelX3";
//
// labelX2
//
//
//
//
this.labelX2.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.labelX2.ForeColor = System.Drawing.Color.Black;
resources.ApplyResources(this.labelX2, "labelX2");
this.labelX2.Name = "labelX2";
//
// labelX1
//
//
//
//
this.labelX1.BackgroundStyle.CornerType = DevComponents.DotNetBar.eCornerType.Square;
this.labelX1.ForeColor = System.Drawing.Color.Black;
this.labelX1.Image = global::PJ64Savestater.Properties.Resources.icons8_game_controller_16px;
resources.ApplyResources(this.labelX1, "labelX1");
this.labelX1.Name = "labelX1";
//
// ButtonX_LoadPads
//
this.ButtonX_LoadPads.AccessibleRole = System.Windows.Forms.AccessibleRole.PushButton;
this.ButtonX_LoadPads.ColorTable = DevComponents.DotNetBar.eButtonColor.OrangeWithBackground;
this.ButtonX_LoadPads.Image = global::PJ64Savestater.Properties.Resources.icons8_refresh_16px;
resources.ApplyResources(this.ButtonX_LoadPads, "ButtonX_LoadPads");
this.ButtonX_LoadPads.Name = "ButtonX_LoadPads";
this.ButtonX_LoadPads.Style = DevComponents.DotNetBar.eDotNetBarStyle.StyleManagerControlled;
this.ButtonX_LoadPads.Click += new System.EventHandler(this.ButtonX_LoadPads_Click);
//
// Form1
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.panel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Name = "Form1";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
this.Shown += new System.EventHandler(this.Form1_Shown);
this.panel1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private DevComponents.DotNetBar.StyleManager styleManager1;
private DevComponents.DotNetBar.LabelX labelX1;
private DevComponents.DotNetBar.Controls.ComboBoxEx ComboBoxEx_Pads;
private DevComponents.DotNetBar.ButtonX ButtonX_LoadPads;
private System.Windows.Forms.Panel panel1;
private DevComponents.DotNetBar.LabelX labelX2;
private DevComponents.DotNetBar.LabelX labelX3;
private DevComponents.DotNetBar.Controls.TextBoxX TextBoxX_LoadSavestate;
private DevComponents.DotNetBar.Controls.TextBoxX TextBoxX_CreateSavestate;
private DevComponents.DotNetBar.Controls.Line line1;
private DevComponents.DotNetBar.ButtonX ButtonX_StartStopListening;
private DevComponents.DotNetBar.Controls.Line line2;
private DevComponents.DotNetBar.ButtonX ButtonX_LoadProfile;
private DevComponents.DotNetBar.ButtonX ButtonX_SaveProfile;
private DevComponents.DotNetBar.Controls.Line line3;
}
}

View File

@@ -0,0 +1,648 @@
using DevComponents.DotNetBar;
using DevComponents.DotNetBar.Controls;
using SharpDX.DirectInput;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Timer = System.Timers.Timer;
namespace PJ64Savestater
{
public partial class Form1 : OfficeForm
{
private const string FILTER_INPUTPROFILE = "Json files (*.json)|*.json";
private const string PROFILE_CODE = "Project64 Savestater";
private const string DEFAULT_PROFILE_FILENAME = "Profile.json";
private Timer myTimer;
private DirectInput DInput = new DirectInput();
private DeviceInstance[] allDevices = Array.Empty<DeviceInstance>();
private Joystick curPad = null;
private TextBoxX focuesTextBox = null;
private InputProfile curProfile;
private bool enableActionExecution = false;
public Form1()
{
InitializeComponent();
UpdateAmbientColors();
myTimer = new Timer(1)
{
SynchronizingObject = this,
AutoReset = true,
Enabled = true
};
myTimer.Elapsed += MyTimer_Elapsed;
}
private void LoadPads()
{
allDevices = DInput.GetDevices(DeviceClass.GameControl, DeviceEnumerationFlags.AttachedOnly).ToArray();
ComboBoxEx_Pads.Items.Clear();
foreach (DeviceInstance d in allDevices)
ComboBoxEx_Pads.Items.Add(d.InstanceName);
}
private void SetCurrentPad(Guid guid)
{
curPad = new Joystick(DInput, guid);
foreach (DeviceObjectInstance doi in curPad.GetObjects(DeviceObjectTypeFlags.Axis))
curPad.GetObjectPropertiesById(doi.ObjectId).Range = new InputRange(-5000, 5000);
curPad.Properties.AxisMode = DeviceAxisMode.Absolute;
curPad.SetCooperativeLevel(Handle, CooperativeLevel.NonExclusive | CooperativeLevel.Background);
curPad.Acquire();
if (curProfile is object)
curProfile.ControllerInstanceGuid = guid;
}
private static string GetDefaultProfileFilePath()
{
return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), DEFAULT_PROFILE_FILENAME);
}
private void CheckForInput()
{
if (curPad is object)
{
var inputCodes = new List<string>();
var state = new JoystickState();
curPad.Poll();
curPad.GetCurrentState(ref state);
for (int i = 0, loopTo = state.Buttons.Length - 1; i <= loopTo; i++)
{
if (state.Buttons[i])
inputCodes.Add("Button " + i);
}
for (int i = 0, loopTo1 = state.PointOfViewControllers.Length - 1; i <= loopTo1; i++)
{
int val = state.PointOfViewControllers[i];
if (val > -1)
inputCodes.Add("Point " + i + " " + val);
}
for (int i = 0, loopTo2 = state.Sliders.Length - 1; i <= loopTo2; i++)
{
int val = state.Sliders[i];
if (val > 0)
inputCodes.Add("Slider " + i + " +");
if (val < 0)
inputCodes.Add("Slider " + i + " -");
}
for (int i = 0, loopTo3 = state.AccelerationSliders.Length - 1; i <= loopTo3; i++)
{
int val = state.AccelerationSliders[i];
if (val > 0)
inputCodes.Add("ASlider " + i + " +");
if (val < 0)
inputCodes.Add("ASlider " + i + " -");
}
for (int i = 0, loopTo4 = state.ForceSliders.Length - 1; i <= loopTo4; i++)
{
int val = state.ForceSliders[i];
if (val > 0)
inputCodes.Add("FSlider " + i + " +");
if (val < 0)
inputCodes.Add("FSlider " + i + " -");
}
for (int i = 0, loopTo5 = state.VelocitySliders.Length - 1; i <= loopTo5; i++)
{
int val = state.VelocitySliders[i];
if (val > 0)
inputCodes.Add("VSlider " + i + " +");
if (val < 0)
inputCodes.Add("VSlider " + i + " -");
}
if (state.X > 0)
inputCodes.Add("X +");
if (state.X < 0)
inputCodes.Add("X -");
if (state.Y > 0)
inputCodes.Add("Y +");
if (state.Y < 0)
inputCodes.Add("Y -");
if (state.Z > 0)
inputCodes.Add("Z +");
if (state.Z < 0)
inputCodes.Add("Z -");
if (state.AccelerationX > 0)
inputCodes.Add("AX +");
if (state.AccelerationX < 0)
inputCodes.Add("AX -");
if (state.AccelerationY > 0)
inputCodes.Add("AY +");
if (state.AccelerationY < 0)
inputCodes.Add("AY -");
if (state.AccelerationZ > 0)
inputCodes.Add("AZ +");
if (state.AccelerationZ < 0)
inputCodes.Add("AZ -");
if (state.AngularAccelerationX > 0)
inputCodes.Add("AAX +");
if (state.AngularAccelerationX < 0)
inputCodes.Add("AAX -");
if (state.AngularAccelerationY > 0)
inputCodes.Add("AAY +");
if (state.AngularAccelerationY < 0)
inputCodes.Add("AAY -");
if (state.AngularAccelerationZ > 0)
inputCodes.Add("AAZ +");
if (state.AngularAccelerationZ < 0)
inputCodes.Add("AAZ -");
if (state.ForceX > 0)
inputCodes.Add("FX +");
if (state.ForceX < 0)
inputCodes.Add("FX -");
if (state.ForceY > 0)
inputCodes.Add("FY +");
if (state.ForceY < 0)
inputCodes.Add("FY -");
if (state.ForceZ > 0)
inputCodes.Add("FZ +");
if (state.ForceZ < 0)
inputCodes.Add("FZ -");
if (state.RotationX > 0)
inputCodes.Add("RX +");
if (state.RotationX < 0)
inputCodes.Add("RX -");
if (state.RotationY > 0)
inputCodes.Add("RY +");
if (state.RotationY < 0)
inputCodes.Add("RY -");
if (state.RotationZ > 0)
inputCodes.Add("RZ +");
if (state.RotationZ < 0)
inputCodes.Add("RZ -");
if (state.TorqueX > 0)
inputCodes.Add("TX +");
if (state.TorqueX < 0)
inputCodes.Add("TX -");
if (state.TorqueY > 0)
inputCodes.Add("TY +");
if (state.TorqueY < 0)
inputCodes.Add("TY -");
if (state.TorqueZ > 0)
inputCodes.Add("TZ +");
if (state.TorqueZ < 0)
inputCodes.Add("TZ -");
if (state.VelocityX > 0)
inputCodes.Add("VX +");
if (state.VelocityX < 0)
inputCodes.Add("VX -");
if (state.VelocityY > 0)
inputCodes.Add("VY +");
if (state.VelocityY < 0)
inputCodes.Add("VY -");
if (state.VelocityZ > 0)
inputCodes.Add("VZ +");
if (state.VelocityZ < 0)
inputCodes.Add("VZ -");
if (inputCodes.Any())
{
if (focuesTextBox is object)
focuesTextBox.Text = inputCodes.Last();
else if (enableActionExecution)
CheckForActions(inputCodes.ToArray());
}
}
}
private void CheckForActions(string[] inputCodes)
{
foreach (var inputCode in inputCodes)
{
var inputControl = GetInputControlFromString(inputCode);
foreach (var ctrl in curProfile.Controls)
{
if (ctrl.Value == inputControl)
ExecuteAction(ctrl.Key);
}
}
}
private static void ExecuteAction(string actionCode)
{
if (actionCode == ActionCodes.CreateSavestate)
SendKeys.Send("{F5}");
else if (actionCode == ActionCodes.LoadSavestate)
SendKeys.Send("{F7}");
}
private void SetAction(string actionCode, string inputCode)
{
if (curProfile is object)
curProfile[actionCode] = GetInputControlFromString(inputCode);
}
public static InputControl GetInputControlFromString(string str)
{
var input = new InputControl();
var p = str.Split(' ');
var switchExpr = p[0];
switch (switchExpr)
{
case "Button":
input.InputKey = InputKeys.Buttons;
input.KeyIndex = Convert.ToInt32(p[1]);
break;
case "Point":
input.InputKey = InputKeys.PointOfViewControllers;
input.KeyIndex = Convert.ToInt32(p[1]);
input.Value = p[2];
break;
case "Slider":
input.InputKey = InputKeys.Sliders;
input.KeyIndex = Convert.ToInt32(p[1]);
break;
case "ASlider":
input.InputKey = InputKeys.AccelerationSliders;
input.KeyIndex = Convert.ToInt32(p[1]);
break;
case "FSlider":
input.InputKey = InputKeys.ForceSliders;
input.KeyIndex = Convert.ToInt32(p[1]);
break;
case "VSlider":
input.InputKey = InputKeys.VelocitySliders;
input.KeyIndex = Convert.ToInt32(p[1]);
break;
case "X":
input.InputKey = InputKeys.X;
input.Value = p[1];
break;
case "Y":
input.InputKey = InputKeys.Y;
input.Value = p[1];
break;
case "Z":
input.InputKey = InputKeys.Z;
input.Value = p[1];
break;
case "AX":
input.InputKey = InputKeys.AccelerationX;
input.Value = p[1];
break;
case "AY":
input.InputKey = InputKeys.AccelerationY;
input.Value = p[1];
break;
case "AZ":
input.InputKey = InputKeys.AccelerationZ;
input.Value = p[1];
break;
case "AAX":
input.InputKey = InputKeys.AngularAccelerationX;
input.Value = p[1];
break;
case "AAY":
input.InputKey = InputKeys.AngularAccelerationY;
input.Value = p[1];
break;
case "AAZ":
input.InputKey = InputKeys.AngularAccelerationZ;
input.Value = p[1];
break;
case "FX":
input.InputKey = InputKeys.ForceX;
input.Value = p[1];
break;
case "FY":
input.InputKey = InputKeys.ForceY;
input.Value = p[1];
break;
case "FZ":
input.InputKey = InputKeys.ForceZ;
input.Value = p[1];
break;
case "RX":
input.InputKey = InputKeys.RotationX;
input.Value = p[1];
break;
case "RY":
input.InputKey = InputKeys.RotationY;
input.Value = p[1];
break;
case "RZ":
input.InputKey = InputKeys.RotationZ;
input.Value = p[1];
break;
case "TX":
input.InputKey = InputKeys.TorqueX;
input.Value = p[1];
break;
case "TY":
input.InputKey = InputKeys.TorqueY;
input.Value = p[1];
break;
case "TZ":
input.InputKey = InputKeys.TorqueZ;
input.Value = p[1];
break;
case "VX":
input.InputKey = InputKeys.VelocityX;
input.Value = p[1];
break;
case "VY":
input.InputKey = InputKeys.VelocityY;
input.Value = p[1];
break;
case "VZ":
input.InputKey = InputKeys.VelocityZ;
input.Value = p[1];
break;
}
return input;
}
public static string GetStringFromInputControl(InputControl input)
{
string str = string.Empty;
if (input.InputKey is null && input.KeyIndex is null && input.Value is null) return string.Empty;
switch (input.InputKey)
{
case var @case when @case == InputKeys.Buttons:
{
return $"Button {input.KeyIndex}";
}
case var case1 when case1 == InputKeys.PointOfViewControllers:
{
return $"Point {input.KeyIndex} {input.Value}";
}
case var case2 when case2 == InputKeys.Sliders:
{
return $"Slider {input.KeyIndex}";
}
case var case3 when case3 == InputKeys.AccelerationSliders:
{
return $"ASlider {input.KeyIndex}";
}
case var case4 when case4 == InputKeys.ForceSliders:
{
return $"FSlider {input.KeyIndex}";
}
case var case5 when case5 == InputKeys.VelocitySliders:
{
return $"VSlider {input.KeyIndex}";
}
case var case6 when case6 == InputKeys.X:
{
return $"X {input.Value}";
}
case var case7 when case7 == InputKeys.Y:
{
return $"Y {input.Value}";
}
case var case8 when case8 == InputKeys.Z:
{
return $"Z {input.Value}";
}
case var case9 when case9 == InputKeys.AccelerationX:
{
return $"AX {input.Value}";
}
case var case10 when case10 == InputKeys.AccelerationY:
{
return $"AY {input.Value}";
}
case var case11 when case11 == InputKeys.AccelerationZ:
{
return $"AZ {input.Value}";
}
case var case12 when case12 == InputKeys.AngularAccelerationX:
{
return $"AAX {input.Value}";
}
case var case13 when case13 == InputKeys.AngularAccelerationY:
{
return $"AAY {input.Value}";
}
case var case14 when case14 == InputKeys.AngularAccelerationZ:
{
return $"AAZ {input.Value}";
}
case var case15 when case15 == InputKeys.ForceX:
{
return $"FX {input.Value}";
}
case var case16 when case16 == InputKeys.ForceY:
{
return $"FY {input.Value}";
}
case var case17 when case17 == InputKeys.ForceZ:
{
return $"FZ {input.Value}";
}
case var case18 when case18 == InputKeys.RotationX:
{
return $"RX {input.Value}";
}
case var case19 when case19 == InputKeys.RotationY:
{
return $"RY {input.Value}";
}
case var case20 when case20 == InputKeys.RotationZ:
{
return $"RZ {input.Value}";
}
case var case21 when case21 == InputKeys.TorqueX:
{
return $"TX {input.Value}";
}
case var case22 when case22 == InputKeys.TorqueY:
{
return $"TY {input.Value}";
}
case var case23 when case23 == InputKeys.TorqueZ:
{
return $"TZ {input.Value}";
}
case var case24 when case24 == InputKeys.VelocityX:
{
return $"VX {input.Value}";
}
case var case25 when case25 == InputKeys.VelocityY:
{
return $"VY {input.Value}";
}
case var case26 when case26 == InputKeys.VelocityZ:
{
return $"VZ {input.Value}";
}
}
return str;
}
private void LoadProfile(string filePath)
{
var p = !string.IsNullOrEmpty(filePath) && System.IO.File.Exists(filePath) ? InputProfile.Load(filePath) : new InputProfile(PROFILE_CODE);
if (p.ProfileCode == PROFILE_CODE)
{
TextBoxX_CreateSavestate.Text = GetStringFromInputControl(p[ActionCodes.CreateSavestate]);
TextBoxX_LoadSavestate.Text = GetStringFromInputControl(p[ActionCodes.LoadSavestate]);
try
{
var tguid = allDevices.FirstOrDefault(n => Globals.CompareTwoByteArrays(n.InstanceGuid.ToByteArray(), p.ControllerInstanceGuid.ToByteArray()));
if (tguid is object)
ComboBoxEx_Pads.SelectedIndex = Array.IndexOf(allDevices, tguid);
}
catch (Exception)
{
}
curProfile = p;
}
else
MessageBoxEx.Show(this, LangRes.MsgBox_WrongProfileCode, LangRes.MsgBox_WrongProfileCode_Title, MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
private void MyTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
CheckForInput();
}
private void TextBoxX_Click(object sender, EventArgs e)
{
if (curPad is object && curProfile is object)
focuesTextBox = (TextBoxX)sender;
}
private void TextBoxX_LostFocus_TextChanged(object sender, EventArgs e)
{
focuesTextBox = null;
}
private void TextBoxX_LoadSavestate_TextChanged(object sender, EventArgs e)
{
SetAction(ActionCodes.LoadSavestate, ((TextBoxX)sender).Text);
}
private void TextBoxX_CreateSavestate_TextChanged(object sender, EventArgs e)
{
SetAction(ActionCodes.CreateSavestate, ((TextBoxX)sender).Text);
}
private void Form1_Shown(object sender, EventArgs e)
{
LoadPads();
LoadProfile(GetDefaultProfileFilePath());
}
private void ButtonX_LoadPads_Click(object sender, EventArgs e)
{
LoadPads();
}
private void ComboBoxEx_Pads_SelectedIndexChanged(object sender, EventArgs e)
{
int index = ComboBoxEx_Pads.SelectedIndex;
if (index >= 0)
SetCurrentPad(allDevices[index].InstanceGuid);
}
private void ButtonX_StartStopListening_Click(object sender, EventArgs e)
{
if (enableActionExecution)
{
ButtonX_StartStopListening.Image = Properties.Resources.icons8_play_button_circled_16px;
ButtonX_StartStopListening.Text = LangRes.Button_StartListening;
enableActionExecution = false;
}
else
{
ButtonX_StartStopListening.Image = Properties.Resources.icons8_stop_squared_16px;
ButtonX_StartStopListening.Text = LangRes.Button_StopListening;
enableActionExecution = true;
}
}
private void ButtonX_SaveProfile_Click(object sender, EventArgs e)
{
var sfd_SaveInputProfile = new SaveFileDialog
{
Filter = FILTER_INPUTPROFILE
};
if (sfd_SaveInputProfile.ShowDialog(this) == DialogResult.OK)
curProfile.Save(sfd_SaveInputProfile.FileName);
}
private void ButtonX_LoadProfile_Click(object sender, EventArgs e)
{
var ofd_SaveInputProfile = new OpenFileDialog
{
Filter = FILTER_INPUTPROFILE
};
if (ofd_SaveInputProfile.ShowDialog(this) == DialogResult.OK)
LoadProfile(ofd_SaveInputProfile.FileName);
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
curProfile.Save(GetDefaultProfileFilePath());
}
}
}

View File

@@ -0,0 +1,142 @@
<?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="buttonX3.Text" xml:space="preserve">
<value>Profil laden</value>
</data>
<data name="buttonX2.Text" xml:space="preserve">
<value>Profil speichern</value>
</data>
<data name="buttonX1.Text" xml:space="preserve">
<value>Zuhören beginnen</value>
</data>
<data name="labelX3.Text" xml:space="preserve">
<value>Speicherpunkt laden:</value>
</data>
<data name="labelX2.Text" xml:space="preserve">
<value>Speicherpunkt erstellen:</value>
</data>
<data name="labelX1.Text" xml:space="preserve">
<value>Kontroller:</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="$this.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>Inherit</value>
</data>
</root>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PJ64Savestater
{
internal static class Globals
{
public static bool CompareTwoByteArrays(byte[] arr1, byte[] arr2)
{
if (arr2.Count() != arr1.Count())
return false;
for (int i = 0, loopTo = arr1.Count() - 1; i <= loopTo; i++)
{
if (arr1[i] != arr2[i])
return false;
}
return true;
}
}
}

View File

@@ -0,0 +1,43 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PJ64Savestater
{
public class InputControl
{
public InputKeys? InputKey { get; set; } = null;
public int? KeyIndex { get; set; } = null;
public object Value { get; set; } = null;
public static bool operator ==(InputControl left, InputControl right)
{
return left.InputKey == right.InputKey && left.KeyIndex == right.KeyIndex && ((left.Value == null && right.Value == null) || (left.Value != null && right.Value != null && left.Value.Equals(right.Value)));
}
public static bool operator !=(InputControl left, InputControl right)
{
return !(left == right);
}
public override bool Equals(object obj)
{
var control = obj as InputControl;
return control != null &&
EqualityComparer<InputKeys?>.Default.Equals(InputKey, control.InputKey) &&
EqualityComparer<int?>.Default.Equals(KeyIndex, control.KeyIndex) &&
EqualityComparer<object>.Default.Equals(Value, control.Value);
}
public override int GetHashCode()
{
var hashCode = 2070896532;
hashCode = hashCode * -1521134295 + EqualityComparer<InputKeys?>.Default.GetHashCode(InputKey);
hashCode = hashCode * -1521134295 + EqualityComparer<int?>.Default.GetHashCode(KeyIndex);
hashCode = hashCode * -1521134295 + EqualityComparer<object>.Default.GetHashCode(Value);
return hashCode;
}
}
}

View File

@@ -0,0 +1,44 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PJ64Savestater
{
public enum InputKeys : byte
{
// Uses Index
Buttons, // Button index 'Default: False
AccelerationSliders, // ASlider index 'Default: 0
ForceSliders, // FSlider index 'Default: 0
PointOfViewControllers, // Point index 'Default: -1
Sliders, // Slider index 'Default: 0
VelocitySliders, // VSlider index 'Default: 0
// Don't uses Index
AccelerationX, // AX 'Default: 0
AccelerationY, // AY 'Default: 0
AccelerationZ, // AZ 'Default: 0
AngularAccelerationX, // AAX 'Default: 0
AngularAccelerationY, // AAY 'Default: 0
AngularAccelerationZ, // AAZ 'Default: 0
ForceX, // FX 'Default: 0
ForceY, // FY 'Default: 0
ForceZ, // FZ 'Default: 0
RotationX, // RX 'Default: 0
RotationY, // RY 'Default: 0
RotationZ, // RZ 'Default: 0
TorqueX, // TX 'Default: 0
TorqueY, // TY 'Default: 0
TorqueZ, // TZ 'Default: 0
VelocityX, // VX 'Default: 0
VelocityY, // VY 'Default: 0
VelocityZ, // VZ 'Default: 0
X, // X 'Default: 0
Y, // Y 'Default: 0
Z // Z 'Default: 0
}
}

View File

@@ -0,0 +1,82 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PJ64Savestater
{
public class InputProfile
{
public string ProfileCode { get; set; }
public Dictionary<string, InputControl> Controls { get; } = new Dictionary<string, InputControl>();
private byte[] _ControllerInstanceGuid = Array.Empty<byte>();
[JsonConstructor]
public InputProfile()
{
}
public InputProfile(string profileCode)
{
ProfileCode = profileCode;
}
public Guid ControllerInstanceGuid
{
get
{
if (_ControllerInstanceGuid.Count() == 0)
return default;
return new Guid(_ControllerInstanceGuid);
}
set
{
_ControllerInstanceGuid = value.ToByteArray();
}
}
public InputControl this[string name]
{
get
{
if (!Controls.ContainsKey(name))
Controls.Add(name, new InputControl());
return Controls[name];
}
set
{
if (!Controls.ContainsKey(name))
Controls.Add(name, value);
else
Controls[name] = value;
}
}
public void ClearProfile()
{
Controls.Clear();
}
public void Save(string fileName)
{
File.WriteAllText(fileName, JObject.FromObject(this, GetJsonSerializer()).ToString());
}
public static InputProfile Load(string fileName)
{
return (InputProfile)JObject.Parse(File.ReadAllText(fileName)).ToObject(typeof(InputProfile), GetJsonSerializer());
}
private static JsonSerializer GetJsonSerializer()
{
var serializer = JsonSerializer.CreateDefault();
serializer.TypeNameHandling = TypeNameHandling.Auto;
return serializer;
}
}
}

99
Project64Savestater/LangRes.Designer.cs generated Normal file
View File

@@ -0,0 +1,99 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Dieser Code wurde von einem Tool generiert.
// Laufzeitversion:4.0.30319.42000
//
// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
// der Code erneut generiert wird.
// </auto-generated>
//------------------------------------------------------------------------------
namespace PJ64Savestater {
using System;
/// <summary>
/// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
/// </summary>
// Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert
// -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert.
// Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen
// mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class LangRes {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal LangRes() {
}
/// <summary>
/// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PJ64Savestater.LangRes", typeof(LangRes).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
/// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Start Listening ähnelt.
/// </summary>
internal static string Button_StartListening {
get {
return ResourceManager.GetString("Button_StartListening", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Stop Listening ähnelt.
/// </summary>
internal static string Button_StopListening {
get {
return ResourceManager.GetString("Button_StopListening", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die This input profile is for a different program. It can&apos;t be loaded. ähnelt.
/// </summary>
internal static string MsgBox_WrongProfileCode {
get {
return ResourceManager.GetString("MsgBox_WrongProfileCode", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Wrong profile code ähnelt.
/// </summary>
internal static string MsgBox_WrongProfileCode_Title {
get {
return ResourceManager.GetString("MsgBox_WrongProfileCode_Title", resourceCulture);
}
}
}
}

View File

View File

@@ -0,0 +1,132 @@
<?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="Button_StartListening" xml:space="preserve">
<value>Zuhören beginnen</value>
</data>
<data name="Button_StopListening" xml:space="preserve">
<value>Zuhören beenden</value>
</data>
<data name="MsgBox_WrongProfileCode" xml:space="preserve">
<value>Dieses Profil ist für ein anderes Program bzw. für einen anderen Verwendungszweck. Es kann demnach nicht geladen und verwendet werden.</value>
</data>
<data name="MsgBox_WrongProfileCode_Title" xml:space="preserve">
<value>Falscher Profilcode</value>
</data>
</root>

View File

@@ -0,0 +1,132 @@
<?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="Button_StartListening" xml:space="preserve">
<value>Start Listening</value>
</data>
<data name="Button_StopListening" xml:space="preserve">
<value>Stop Listening</value>
</data>
<data name="MsgBox_WrongProfileCode" xml:space="preserve">
<value>This input profile is for a different program. It can't be loaded.</value>
</data>
<data name="MsgBox_WrongProfileCode_Title" xml:space="preserve">
<value>Wrong profile code</value>
</data>
</root>

View File

@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace PJ64Savestater
{
static class Program
{
/// <summary>
/// Der Haupteinstiegspunkt für die Anwendung.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}

View File

@@ -0,0 +1,181 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\Costura.Fody.3.3.3\build\Costura.Fody.props" Condition="Exists('..\packages\Costura.Fody.3.3.3\build\Costura.Fody.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{7554A73A-DC05-4742-A060-42A78A6C4381}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>PJ64Savestater</RootNamespace>
<AssemblyName>Project64 Savestater</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>icons8_data_backup.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="Costura, Version=3.3.3.0, Culture=neutral, PublicKeyToken=9919ef960d84173d, processorArchitecture=MSIL">
<HintPath>..\packages\Costura.Fody.3.3.3\lib\net40\Costura.dll</HintPath>
</Reference>
<Reference Include="DevComponents.DotNetBar.Design">
<HintPath>C:\DotNetBarNew\DevComponents.DotNetBar.Design.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="DevComponents.DotNetBar2">
<HintPath>C:\DotNetBarNew\DevComponents.DotNetBar2.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="SharpDX, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b4dcf0f35e5521f1, processorArchitecture=MSIL">
<HintPath>..\packages\SharpDX.4.2.0\lib\net45\SharpDX.dll</HintPath>
</Reference>
<Reference Include="SharpDX.DirectInput, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b4dcf0f35e5521f1, processorArchitecture=MSIL">
<HintPath>..\packages\SharpDX.DirectInput.4.2.0\lib\net45\SharpDX.DirectInput.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="ActionCodes.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>ActionCodes.resx</DependentUpon>
</Compile>
<Compile Include="ControllerTypes.cs" />
<Compile Include="Form1.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Form1.Designer.cs">
<DependentUpon>Form1.cs</DependentUpon>
</Compile>
<Compile Include="Globals.cs" />
<Compile Include="InputControl.cs" />
<Compile Include="InputKeys.cs" />
<Compile Include="InputProfile.cs" />
<Compile Include="LangRes.de.Designer.cs">
<DependentUpon>LangRes.de.resx</DependentUpon>
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
</Compile>
<Compile Include="LangRes.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>LangRes.resx</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="ActionCodes.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>ActionCodes.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Include="Form1.de.resx">
<DependentUpon>Form1.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Form1.resx">
<DependentUpon>Form1.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="LangRes.de.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>LangRes.de.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Include="LangRes.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>LangRes.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8_refresh_16px.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8_game_controller_16px.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8_play_16px.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8_stop_squared_16px.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8_play_button_circled_16px.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8_save_16px.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\icons8_opened_folder_16px.png" />
</ItemGroup>
<ItemGroup>
<Content Include="FodyWeavers.xml" />
<Content Include="icons8_data_backup.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Verwenden Sie die Wiederherstellung von NuGet-Paketen, um die fehlenden Dateien herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}".</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Costura.Fody.3.3.3\build\Costura.Fody.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Costura.Fody.3.3.3\build\Costura.Fody.props'))" />
<Error Condition="!Exists('..\packages\Fody.4.2.1\build\Fody.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Fody.4.2.1\build\Fody.targets'))" />
</Target>
<Import Project="..\packages\Fody.4.2.1\build\Fody.targets" Condition="Exists('..\packages\Fody.4.2.1\build\Fody.targets')" />
</Project>

View File

@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// Allgemeine Informationen über eine Assembly werden über die folgenden
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
// die einer Assembly zugeordnet sind.
[assembly: AssemblyTitle("PJ64Savestater")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("PJ64Savestater")]
[assembly: AssemblyCopyright("Copyright © Pilzinsel64 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly
// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von
// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen.
[assembly: ComVisible(false)]
// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
[assembly: Guid("7554a73a-dc05-4742-a060-42a78a6c4381")]
// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
//
// Hauptversion
// Nebenversion
// Buildnummer
// Revision
//
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
// übernehmen, indem Sie "*" eingeben:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,123 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Dieser Code wurde von einem Tool generiert.
// Laufzeitversion:4.0.30319.42000
//
// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
// der Code erneut generiert wird.
// </auto-generated>
//------------------------------------------------------------------------------
namespace PJ64Savestater.Properties {
using System;
/// <summary>
/// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
/// </summary>
// Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert
// -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert.
// Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen
// mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PJ64Savestater.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
/// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap icons8_game_controller_16px {
get {
object obj = ResourceManager.GetObject("icons8_game_controller_16px", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap icons8_opened_folder_16px {
get {
object obj = ResourceManager.GetObject("icons8_opened_folder_16px", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap icons8_play_button_circled_16px {
get {
object obj = ResourceManager.GetObject("icons8_play_button_circled_16px", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap icons8_refresh_16px {
get {
object obj = ResourceManager.GetObject("icons8_refresh_16px", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap icons8_save_16px {
get {
object obj = ResourceManager.GetObject("icons8_save_16px", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap icons8_stop_squared_16px {
get {
object obj = ResourceManager.GetObject("icons8_stop_squared_16px", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

View File

@@ -0,0 +1,139 @@
<?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>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="icons8_game_controller_16px" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8_game_controller_16px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8_opened_folder_16px" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8_opened_folder_16px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8_play_button_circled_16px" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8_play_button_circled_16px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8_refresh_16px" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8_refresh_16px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8_save_16px" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8_save_16px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8_stop_squared_16px" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8_stop_squared_16px.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

View File

@@ -0,0 +1,30 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace PJ64Savestater.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
return defaultInstance;
}
}
}
}

View File

@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

Binary file not shown.

After

Width:  |  Height:  |  Size: 642 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 334 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 505 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 491 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Costura.Fody" version="3.3.3" targetFramework="net472" />
<package id="Fody" version="4.2.1" targetFramework="net472" developmentDependency="true" />
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net472" />
<package id="SharpDX" version="4.2.0" targetFramework="net472" />
<package id="SharpDX.DirectInput" version="4.2.0" targetFramework="net472" />
</packages>