BizHawk/BizHawk.Client.Common/config/Config.cs

599 lines
20 KiB
C#

using System;
using System.Collections.Generic;
using System.Drawing;
using BizHawk.Emulation.Common;
namespace BizHawk.Client.Common
{
public class Config
{
public static string ControlDefaultPath
{
get { return PathManager.MakeProgramRelativePath("defctrl.json"); }
}
public void ConfigCheckAllControlDefaults()
{
if (AllTrollers.Count == 0 && AllTrollersAutoFire.Count == 0 && AllTrollersAnalog.Count == 0)
{
var cd = ConfigService.Load<ControlDefaults>(ControlDefaultPath);
AllTrollers = cd.AllTrollers;
AllTrollersAutoFire = cd.AllTrollersAutoFire;
AllTrollersAnalog = cd.AllTrollersAnalog;
}
}
public Config()
{
ConfigCheckAllControlDefaults();
}
public void ResolveDefaults()
{
PathEntries.ResolveWithDefaults();
HotkeyBindings.ResolveWithDefaults();
}
// Core preference for generic file extension, key: file extension, value: a systemID or empty if no preference
public Dictionary<string, string> PreferredPlatformsForExtensions = new Dictionary<string, string>
{
{ ".bin", "" },
{ ".rom", "" },
{ ".iso", "" },
{ ".img", "" },
};
// Path Settings ************************************/
public bool UseRecentForROMs = false;
public string LastRomPath = ".";
public PathEntryCollection PathEntries = new PathEntryCollection();
// BIOS Paths
public Dictionary<string, string> FirmwareUserSpecifications = new Dictionary<string, string>(); // key: sysid+firmwareId; value: absolute path
public string FFMpegPath = "%exe%/dll/ffmpeg.exe";
// General Client Settings
public int Input_Hotkey_OverrideOptions = 0;
public bool StackOSDMessages = true;
public int TargetZoomFactor = 2;
public int TargetScanlineFilterIntensity = 128; // choose between 0 and 256
public int TargetDisplayFilter = 0;
public int DispFinalFilter = 0;
public string DispUserFilterPath = "";
public RecentFiles RecentRoms = new RecentFiles(10);
public bool PauseWhenMenuActivated = true;
public bool SaveWindowPosition = true;
public bool StartPaused = false;
public int MainWndx = -1; // Negative numbers will be ignored
public int MainWndy = -1;
public bool RunInBackground = true;
public bool AcceptBackgroundInput = false;
public bool SingleInstanceMode = false;
public bool AllowUD_LR = false;
public bool ShowContextMenu = true;
public bool EnableBackupMovies = true;
public bool HotkeyConfigAutoTab = true;
public bool InputConfigAutoTab = true;
public bool ShowLogWindow = false;
public bool BackupSavestates = true;
public bool BackupSaveram = true;
public bool SaveScreenshotWithStates = true;
public int BigScreenshotSize = 128 * 1024;
public bool SaveLargeScreenshotWithStates = false;
public int AutofireOn = 1;
public int AutofireOff = 1;
public bool AutofireLagFrames = true;
public int SaveSlot = 0; //currently selected savestate slot
public bool AutoLoadLastSaveSlot = false;
public bool WIN32_CONSOLE = true;
public bool SkipLagFrame = false;
public bool SupressAskSave = false;
public bool AVI_CaptureOSD = false;
public bool Screenshot_CaptureOSD = false;
public enum SaveStateTypeE { Default, Binary, Text };
public SaveStateTypeE SaveStateType = SaveStateTypeE.Default;
// N64
public bool N64UseCircularAnalogConstraint = true;
// Run-Control settings
public int FrameProgressDelayMs = 500; // how long until a frame advance hold turns into a frame progress?
public int FrameSkip = 4;
public int SpeedPercent = 100;
public int SpeedPercentAlternate = 400;
public bool ClockThrottle = true;
public bool AutoMinimizeSkipping = true;
public bool VSyncThrottle = false;
// Rewind settings
public bool Rewind_UseDelta = true;
public bool RewindEnabledSmall = true;
public bool RewindEnabledMedium = false;
public bool RewindEnabledLarge = false;
public int RewindFrequencySmall = 1;
public int RewindFrequencyMedium = 4;
public int RewindFrequencyLarge = 60;
public int Rewind_MediumStateSize = 262144; //256kb
public int Rewind_LargeStateSize = 1048576; //1mb
public int Rewind_BufferSize = 128; //in mb
public bool Rewind_OnDisk = false;
public bool Rewind_IsThreaded = false;
/// <summary>use vsync. if VSyncThrottle = false, this will try to use vsync without throttling to it</summary>
public bool VSync = false;
// Display options
public int MessagesColor = -1;
public int AlertMessageColor = -65536;
public int LastInputColor = -23296;
public int MovieInput = -8355712;
public bool DisplayFPS = false;
public int DispFPSx = 0;
public int DispFPSy = 0;
public int DispFPSanchor = 0; // 0 = UL, 1 = UR, 2 = DL, 3 = DR
public bool DisplayFrameCounter = false;
public int DispFrameCx = 0;
public int DispFrameCy = 14;
public int DispFrameanchor = 0;
public bool DisplayLagCounter = false;
public int DispLagx = 0;
public int DispLagy = 42;
public int DispLaganchor = 0;
public bool DisplayInput = false;
public int DispInpx = 0;
public int DispInpy = 28;
public int DispInpanchor = 0;
public bool DisplayRerecordCount = false;
public int DispRecx = 0;
public int DispRecy = 56;
public int DispRecanchor = 0;
public int DispMultix = 0;
public int DispMultiy = 14;
public int DispMultianchor = 1;
public bool DisplayStatusBar = true;
public int DispRamWatchx = 0;
public int DispRamWatchy = 70;
public bool DisplayRamWatch = false;
public bool ShowMenuInFullscreen = false;
public int DispMessagex = 3;
public int DispMessagey = 0;
public int DispMessageanchor = 2;
public int DispAutoholdx = 0;
public int DispAutoholdy = 0;
public int DispAutoholdanchor = 1;
public bool DispBlurry = false; // make display look ugly
public bool DispFixAspectRatio = true;
public bool DispFixScaleInteger = true;
public bool DispObeyAR = true;
// Sound options
public bool SoundEnabled = true;
public bool MuteFrameAdvance = true;
public int SoundVolume = 100; // Range 0-100
public bool SoundThrottle = false;
public string SoundDevice = "";
// Log Window
public bool LogWindowSaveWindowPosition = true;
public int LogWindowWndx = -1;
public int LogWindowWndy = -1;
public int LogWindowWidth = -1;
public int LogWindowHeight = -1;
// Lua Console
public ToolDialogSettings LuaSettings = new ToolDialogSettings();
public RecentFiles RecentLua = new RecentFiles(8);
public RecentFiles RecentLuaSession = new RecentFiles(8);
public bool AutoLoadLuaConsole = false;
public bool DisableLuaScriptsOnLoad = false;
// RamWatch Settings
public ToolDialogSettings RamWatchSettings = new ToolDialogSettings();
public RecentFiles RecentWatches = new RecentFiles(8);
public bool RamWatchShowChangeColumn = true;
public bool RamWatchShowPrevColumn = false;
public bool RamWatchShowDiffColumn = false;
public bool RamWatchShowDomainColumn = true;
public Dictionary<string, int> RamWatchColumnWidths = new Dictionary<string, int>
{
{ "AddressColumn", -1 },
{ "ValueColumn", -1 },
{ "PrevColumn", -1 },
{ "ChangesColumn", -1 },
{ "DiffColumn", -1 },
{ "DomainColumn", -1 },
{ "NotesColumn",-1 },
};
public Dictionary<string, int> RamWatchColumnIndexes = new Dictionary<string, int>
{
{ "AddressColumn", 0 },
{ "ValueColumn", 1 },
{ "PrevColumn", 2 },
{ "ChangesColumn", 3 },
{ "DiffColumn", 4 },
{ "DomainColumn", 5 },
{ "NotesColumn", 6 },
};
public Watch.PreviousType RamWatchDefinePrevious = Watch.PreviousType.LastFrame;
// RamSearch Settings
public ToolDialogSettings RamSearchSettings = new ToolDialogSettings();
public int RamSearchPrev_Type = 1;
public RecentFiles RecentSearches = new RecentFiles(8);
public int RamSearchPreviousAs = 0;
public bool RamSearchPreviewMode = true;
public bool RamSearchAlwaysExcludeRamWatch = false;
public int RamSearchAddressWidth = -1;
public int RamSearchValueWidth = -1;
public int RamSearchPrevWidth = -1;
public int RamSearchChangesWidth = -1;
public int RamSearchAddressIndex = 0;
public int RamSearchValueIndex = 1;
public int RamSearchPrevIndex = 2;
public int RamSearchChangesIndex = 3;
public bool RamSearchFastMode = false;
public Dictionary<string, int> RamSearchColumnWidths = new Dictionary<string, int>
{
{ "AddressColumn", -1 },
{ "ValueColumn", -1 },
{ "PrevColumn", -1 },
{ "ChangesColumn", -1 },
{ "DiffColumn", -1 },
};
public Dictionary<string, int> RamSearchColumnIndexes = new Dictionary<string, int>
{
{ "AddressColumn", 0 },
{ "ValueColumn", 1 },
{ "PrevColumn", 2 },
{ "ChangesColumn", 3 },
{ "DiffColumn", 4 },
};
public bool RamSearchShowPrevColumn = true;
public bool RamSearchShowChangeColumn = true;
public bool RamSearchShowDiffColumn = false;
// HexEditor Settings
public ToolDialogSettings HexEditorSettings = new ToolDialogSettings();
public bool AutoLoadHexEditor = false;
public bool HexEditorBigEndian = false;
public int HexEditorDataSize = 1;
public RecentFiles RecentTables = new RecentFiles(8);
// Hex Editor Colors
public Color HexBackgrndColor = Color.FromName("Control");
public Color HexForegrndColor = Color.FromName("ControlText");
public Color HexMenubarColor = Color.FromName("Control");
public Color HexFreezeColor = Color.LightBlue;
public Color HexHighlightColor = Color.Pink;
public Color HexHighlightFreezeColor = Color.Violet;
// Trace Logger Settings
public ToolDialogSettings TraceLoggerSettings = new ToolDialogSettings();
public bool TraceLoggerAutoLoad = false;
public int TraceLoggerMaxLines = 100000;
// Video dumping settings
public string VideoWriter = "";
public int JMDCompression = 3;
public int JMDThreads = 3;
public string FFmpegFormat = "";
public string FFmpegCustomCommand = "-c:a foo -c:v bar -f baz";
public string AVICodecToken = "";
public int GifWriterFrameskip = 3;
public int GifWriterDelay = -1;
#region emulation core settings
public Dictionary<string, object> CoreSettings = new Dictionary<string, object>();
public Dictionary<string, object> CoreSyncSettings = new Dictionary<string, object>();
public object GetCoreSettings<T>()
where T : IEmulator
{
return GetCoreSettings(typeof(T));
}
public object GetCoreSettings(Type t)
{
object ret;
CoreSettings.TryGetValue(t.ToString(), out ret);
return ret;
}
public void PutCoreSettings<T>(object o)
where T : IEmulator
{
PutCoreSettings(o, typeof(T));
}
public void PutCoreSettings(object o, Type t)
{
if (o != null)
{
CoreSettings[t.ToString()] = o;
}
else
{
CoreSettings.Remove(t.ToString());
}
}
public object GetCoreSyncSettings<T>()
where T : IEmulator
{
return GetCoreSyncSettings(typeof(T));
}
public object GetCoreSyncSettings(Type t)
{
object ret;
CoreSyncSettings.TryGetValue(t.ToString(), out ret);
return ret;
}
public void PutCoreSyncSettings<T>(object o)
where T : IEmulator
{
PutCoreSyncSettings(o, typeof(T));
}
public void PutCoreSyncSettings(object o, Type t)
{
if (o != null)
{
CoreSyncSettings[t.ToString()] = o;
}
else
{
CoreSyncSettings.Remove(t.ToString());
}
}
#endregion
// SMS VDP Viewer Settings
public ToolDialogSettings SmsVdpSettings = new ToolDialogSettings();
public bool SmsVdpAutoLoad = false;
// PCE VDP Viewer Settings
public ToolDialogSettings PceVdpSettings = new ToolDialogSettings();
public bool PceVdpAutoLoad = false;
// Genesis VDP Viewer Settings
public ToolDialogSettings GenVdpSettings = new ToolDialogSettings();
public bool GenVdpAutoLoad = false;
// NESPPU Settings
public ToolDialogSettings NesPPUSettings = new ToolDialogSettings();
public bool AutoLoadNESPPU = false;
public int NESPPURefreshRate = 4;
public bool NESPPUChrRomView = false;
// NESDebuger Settings
public bool AutoLoadNESDebugger = false;
public bool NESDebuggerSaveWindowPosition = true;
public int NESDebuggerWndx = -1;
public int NESDebuggerWndy = -1;
public int NESDebuggerWidth = -1;
public int NESDebuggerHeight = -1;
// NES NameTableViewer Settings
public ToolDialogSettings NesNameTableSettings = new ToolDialogSettings();
public bool AutoLoadNESNameTable = false;
public int NESNameTableRefreshRate = 4;
// gb gpu view settings
public bool AutoLoadGBGPUView = false;
public bool GBGPUViewSaveWindowPosition = true;
public int GBGPUViewWndx = -1;
public int GBGPUViewWndy = -1;
public Color GBGPUSpriteBack = Color.Lime;
// SNES Graphics Debugger Dialog Settings
public bool AutoLoadSNESGraphicsDebugger = false;
public bool SNESGraphicsDebuggerSaveWindowPosition = true;
public int SNESGraphicsDebuggerWndx = -1;
public int SNESGraphicsDebuggerWndy = -1;
public int SNESGraphicsDebuggerRefreshRate = 4;
public bool SNESGraphicsUseUserBackdropColor = false;
public int SNESGraphicsUserBackdropColor = -1;
// PCE BG Viewer settings
public ToolDialogSettings PceBgViewerSettings = new ToolDialogSettings();
public bool PCEBGViewerAutoload = false;
public int PCEBGViewerRefreshRate = 16;
// PCE CDL settings
public ToolDialogSettings PceCdlSettings = new ToolDialogSettings();
public RecentFiles RecentPceCdlFiles = new RecentFiles(8);
#region Cheats Dialog
public ToolDialogSettings CheatsSettings = new ToolDialogSettings();
public bool Cheats_ValuesAsHex = true;
public bool DisableCheatsOnLoad = false;
public bool LoadCheatFileByGame = true;
public bool CheatsAutoSaveOnClose = true;
public RecentFiles RecentCheats = new RecentFiles(8);
public int CheatsNameWidth = -1;
public int CheatsAddressWidth = -1;
public int CheatsValueWidth = -1;
public int CheatsCompareWidth = -1;
public int CheatsDomainWidth = -1;
public int CheatsOnWidth = -1;
public int CheatsNameIndex = 0;
public int CheatsAddressIndex = 1;
public int CheatsValueIndex = 2;
public int CheatsCompareIndex = 3;
public int CheatsOnIndex = 4;
public int CheatsDomainIndex = 5;
public Dictionary<string, int> CheatsColumnWidths = new Dictionary<string, int>
{
{ "NamesColumn", -1 },
{ "AddressColumn", -1 },
{ "ValueColumn", -1 },
{ "CompareColumn", -1 },
{ "OnColumn", -1 },
{ "DomainColumn", -1 },
{ "SizeColumn", -1 },
{ "EndianColumn", -1 },
{ "DisplayTypeColumn", -1 },
};
public Dictionary<string, int> CheatsColumnIndices = new Dictionary<string, int>
{
{ "NamesColumn", 0 },
{ "AddressColumn", 1 },
{ "ValueColumn", 2 },
{ "CompareColumn", 3 },
{ "OnColumn", 4 },
{ "DomainColumn", 5 },
{ "SizeColumn", 6 },
{ "EndianColumn", 7 },
{ "DisplayTypeColumn", 8 },
};
public Dictionary<string, bool> CheatsColumnShow = new Dictionary<string, bool>
{
{ "NamesColumn", true },
{ "AddressColumn", true },
{ "ValueColumn", true },
{ "CompareColumn", true },
{ "OnColumn", false },
{ "DomainColumn", true },
{ "SizeColumn", true },
{ "EndianColumn", false },
{ "DisplayTypeColumn", false },
};
#endregion
// TAStudio Dialog
public ToolDialogSettings TAStudioSettings = new ToolDialogSettings();
public bool AutoloadTAStudio = false;
public bool AutoloadTAStudioProject = false;
public bool TAStudioDrawInput = true;
public RecentFiles RecentTas = new RecentFiles(8);
// VirtualPad Dialog
public ToolDialogSettings VirtualPadSettings = new ToolDialogSettings();
public bool VirtualPadsUpdatePads = true;
public bool AutoloadVirtualPad = false;
public bool VirtualPadSticky = true;
public bool VirtualPadMultiplayerMode = false;
// NES Game Genie Encoder/Decoder
public ToolDialogSettings NesGGSettings = new ToolDialogSettings();
public bool NESGGAutoload = false;
// SNES Game Genie Encoder/Decoder
public ToolDialogSettings SnesGGSettings = new ToolDialogSettings();
public bool SNESGGAutoload = false;
// GB/GG Game Genie Encoder/Decoder
public ToolDialogSettings GbGGSettings = new ToolDialogSettings();
public bool GBGGAutoload = false;
// GEN Game Genie Encoder/Decoder
public ToolDialogSettings GenGGSettings = new ToolDialogSettings();
public bool GenGGAutoload = false;
// Movie Settings
public RecentFiles RecentMovies = new RecentFiles(8);
public string DefaultAuthor = "default user";
public bool UseDefaultAuthor = true;
public bool DisplaySubtitles = true;
public bool VBAStyleMovieLoadState = false;
public bool MoviePlaybackPokeMode = false;
//Play Movie Dialog
public bool PlayMovie_IncludeSubdir = true;
public bool PlayMovie_ShowStateFiles = false;
public bool PlayMovie_MatchHash = false;
//TI83
public ToolDialogSettings TI83KeypadSettings = new ToolDialogSettings();
public bool TI83autoloadKeyPad = true;
public bool TI83ToolTips = true;
public BindingCollection HotkeyBindings = new BindingCollection();
// Atari 2600 Debugger
public ToolDialogSettings Atari2600DebuggerSettings = new ToolDialogSettings();
public bool Atari2600DebuggerAutoload = false;
// Analog Hotkey values
public int Analog_LargeChange = 10;
public int Analog_SmallChange = 1;
public struct AnalogBind
{
/// <summary>the physical stick that we're bound to</summary>
public string Value;
/// <summary>sensitivity and flip</summary>
public float Mult;
/// <summary>portion of axis to ignore</summary>
public float Deadzone;
public AnalogBind(string Value, float Mult, float Deadzone)
{
this.Value = Value;
this.Mult = Mult;
this.Deadzone = Deadzone;
}
}
// [ControllerType][ButtonName] => Physical Bind
public Dictionary<string, Dictionary<string, string>> AllTrollers = new Dictionary<string, Dictionary<string, string>>();
public Dictionary<string, Dictionary<string, string>> AllTrollersAutoFire = new Dictionary<string, Dictionary<string, string>>();
public Dictionary<string, Dictionary<string, AnalogBind>> AllTrollersAnalog = new Dictionary<string, Dictionary<string, AnalogBind>>();
// Core Pick
// as this setting spans multiple cores and doesn't actually affect the behavior of any core,
// it hasn't been absorbed into the new system
public bool GB_AsSGB = false;
public bool NES_InQuickNES = true;
// LuaWriter Settings
public int LuaDefaultTextColor = -16777216;
public bool LuaDefaultTextBold = false;
public int LuaWriterBackColor = -1;
public int LuaKeyWordColor = -16776961;
public bool LuaKeyWordBold = false;
public int LuaCommentColor = -16744448;
public bool LuaCommentBold = false;
public int LuaStringColor = -8355712;
public bool LuaStringBold = false;
public int LuaSymbolColor = -16777216;
public bool LuaSymbolBold = false;
public int LuaLibraryColor = -16711681;
public bool LuaLibraryBold = false;
public int LuaDecimalColor = -23296;
public bool LuaDecimalBold = false;
public float LuaWriterFontSize = 11;
public string LuaWriterFont = "Courier New";
public float LuaWriterZoom = 1;
public bool LuaWriterStartEmpty = false;
public bool LuaShowLineNumbers = false;
}
// These are used in the defctrl.json or wherever
public class ControlDefaults
{
public Dictionary<string, Dictionary<string, string>> AllTrollers = new Dictionary<string, Dictionary<string, string>>();
public Dictionary<string, Dictionary<string, string>> AllTrollersAutoFire = new Dictionary<string, Dictionary<string, string>>();
public Dictionary<string, Dictionary<string, Config.AnalogBind>> AllTrollersAnalog = new Dictionary<string, Dictionary<string, Config.AnalogBind>>();
}
}