BizHawk/BizHawk.Emulation.Cores/Consoles/Nintendo/N64/N64SyncSettings.cs

154 lines
4.0 KiB
C#

using System.Collections.Generic;
using BizHawk.Emulation.Common;
using BizHawk.Emulation.Cores.Nintendo.N64.NativeApi;
using Newtonsoft.Json;
using System.ComponentModel;
using System.Reflection;
namespace BizHawk.Emulation.Cores.Nintendo.N64
{
public partial class N64SyncSettings
{
public N64SyncSettings()
{
VideoPlugin = PluginType.Jabo;
Core = CoreType.Dynarec;
Rsp = RspType.Rsp_Hle;
DisableExpansionSlot = true;
Controllers = new []
{
new N64ControllerSettings(),
new N64ControllerSettings { IsConnected = false },
new N64ControllerSettings { IsConnected = false },
new N64ControllerSettings { IsConnected = false },
};
RicePlugin = new N64RicePluginSettings();
GlidePlugin = new N64GlidePluginSettings();
Glide64mk2Plugin = new N64Glide64mk2PluginSettings();
JaboPlugin = new N64JaboPluginSettings();
GLideN64Plugin = new N64GLideN64PluginSettings();
}
public CoreType Core { get; set; }
public RspType Rsp { get; set; }
public PluginType VideoPlugin { get; set; }
public bool DisableExpansionSlot { get; set; }
public N64ControllerSettings[] Controllers { get; private set; }
public N64RicePluginSettings RicePlugin { get; private set; }
public N64GlidePluginSettings GlidePlugin { get; private set; }
public N64Glide64mk2PluginSettings Glide64mk2Plugin { get; private set; }
public N64JaboPluginSettings JaboPlugin { get; private set; }
public N64GLideN64PluginSettings GLideN64Plugin { get; private set; }
public N64SyncSettings Clone()
{
return new N64SyncSettings
{
Core = Core,
Rsp = Rsp,
VideoPlugin = VideoPlugin,
DisableExpansionSlot = DisableExpansionSlot,
RicePlugin = RicePlugin.Clone(),
GlidePlugin = GlidePlugin.Clone(),
Glide64mk2Plugin = Glide64mk2Plugin.Clone(),
JaboPlugin = JaboPlugin.Clone(),
GLideN64Plugin = GLideN64Plugin.Clone(),
Controllers = System.Array.ConvertAll(Controllers, a => a.Clone())
};
}
// get mupenapi internal object
public VideoPluginSettings GetVPS(GameInfo game, int videoSizeX, int videoSizeY)
{
var ret = new VideoPluginSettings(VideoPlugin, videoSizeX, videoSizeY);
IPluginSettings ips = null;
switch (VideoPlugin)
{
// clone so per game hacks don't overwrite our settings object
case PluginType.Glide: ips = GlidePlugin.Clone(); break;
case PluginType.GlideMk2: ips = Glide64mk2Plugin.Clone(); break;
case PluginType.Rice: ips = RicePlugin.Clone(); break;
case PluginType.Jabo: ips = JaboPlugin.Clone(); break;
case PluginType.GLideN64: ips = GLideN64Plugin.Clone(); break;
}
ips.FillPerGameHacks(game);
ret.Parameters = ips.GetPluginSettings();
return ret;
}
public enum CoreType
{
[Description("Pure Interpreter")]
Pure_Interpret = 0,
[Description("Interpreter")]
Interpret = 1,
[Description("DynaRec")]
Dynarec = 2,
}
public enum RspType
{
[Description("Hle")]
Rsp_Hle = 0,
[Description("Z64 Hle Video")]
Rsp_Z64_hlevideo = 1,
[Description("cxd4 LLE")]
Rsp_cxd4 = 2
}
}
public enum PluginType
{
[Description("Rice")]
Rice,
[Description("Glide64")]
Glide,
[Description("Glide64 mk2")]
GlideMk2,
[Description("Jabo")]
Jabo,
[Description("GLideN64")]
GLideN64
}
public interface IPluginSettings
{
PluginType GetPluginType();
void FillPerGameHacks(GameInfo game);
}
public static class PluginExtensions
{
public static Dictionary<string, object> GetPluginSettings(this IPluginSettings plugin)
{
// TODO: deal witn the game depedent settings
var dictionary = new Dictionary<string, object>();
var members = plugin.GetType().GetMembers();
foreach (var member in members)
{
if (member.MemberType == MemberTypes.Property)
{
var field = plugin.GetType().GetProperty(member.Name).GetValue(plugin, null);
dictionary.Add(member.Name, field);
}
}
return dictionary;
}
}
}