misc code cleanups in BizHawk.Client.Common

This commit is contained in:
adelikat 2017-04-14 14:59:01 -05:00
parent 7ab8455e84
commit b6f335e4c8
81 changed files with 1405 additions and 1587 deletions

View File

@ -3,7 +3,7 @@
/// <summary>
/// Enumeration of each system emulated by BizHawk
/// </summary>
public enum CoreSystem : int
public enum CoreSystem
{
Null = 0,
TI83,

View File

@ -7,7 +7,7 @@ namespace BizHawk.Client.ApiHawk
/// for all existing controllers
/// </summary>
[Flags]
public enum JoypadButton : int
public enum JoypadButton
{
A = 1,
B = 2,
@ -28,6 +28,7 @@ namespace BizHawk.Client.ApiHawk
/// Master system Button 1
/// </summary>
B1 = 16384,
/// <summary>
/// Master system Button 1
/// </summary>
@ -37,18 +38,22 @@ namespace BizHawk.Client.ApiHawk
/// N64 C up
/// </summary>
CUp = 65536,
/// <summary>
/// N64 C down
/// </summary>
CDown = 131072,
/// <summary>
/// N64 C Left
/// </summary>
CLeft = 262144,
/// <summary>
/// N64 C Right
/// </summary>
CRight = 524288,
/// <summary>
/// N64 Analog stick
/// </summary>

View File

@ -5,7 +5,6 @@ using System.Linq;
using System.Reflection;
using ICSharpCode.SharpZipLib.Zip;
//using Ionic.Zip;
namespace BizHawk.Client.Common
{

View File

@ -19,12 +19,9 @@ namespace BizHawk.Client.Common
}
}
public ControllerDefinition Definition
{
get { return _type; }
}
public ControllerDefinition Definition => _type;
public bool IsPressed(string button)
public bool IsPressed(string button)
{
return _buttons[button];
}
@ -105,11 +102,11 @@ namespace BizHawk.Client.Common
}
}
//zero 09-mar-2015 - not sure if adding + 1 here is correct.. but... maybe?
// zero 09-mar-2015 - not sure if adding + 1 here is correct.. but... maybe?
var output = (input * multiplier + 10000.0f) * (range.Max - range.Min + 1) / 20000.0f + range.Min;
//zero 09-mar-2015 - at this point, we should only have integers, since thats all 100% of consoles ever see
//if this becomes a problem we can add flags to the range and update GUIs to be able to display floats
// zero 09-mar-2015 - at this point, we should only have integers, since thats all 100% of consoles ever see
// if this becomes a problem we can add flags to the range and update GUIs to be able to display floats
output = (int)output;
float lbound = Math.Min(range.Min, range.Max);
@ -160,7 +157,7 @@ namespace BizHawk.Client.Common
}
}
//it's not sure where this should happen, so for backwards compatibility.. do it every time
// it's not sure where this should happen, so for backwards compatibility.. do it every time
NormalizeFloats(controller);
}
@ -288,7 +285,10 @@ namespace BizHawk.Client.Common
_buttonStarts.Clear();
}
public float GetFloat(string name) { throw new NotImplementedException(); }
public float GetFloat(string name)
{
throw new NotImplementedException();
}
// look for bindings which are activated by the supplied physical button.
public List<string> SearchBindings(string button)
@ -304,9 +304,9 @@ namespace BizHawk.Client.Common
{
foreach (var kvp in _bindings)
{
foreach (var bound_button in kvp.Value)
foreach (var boundBtn in kvp.Value)
{
if (_buttons[kvp.Key] == false && controller.IsPressed(bound_button))
if (_buttons[kvp.Key] == false && controller.IsPressed(boundBtn))
{
_buttonStarts[kvp.Key] = _emulator.Frame;
}

View File

@ -6,7 +6,6 @@ namespace BizHawk.Client.Common
{
public MoviePlatformMismatchException(string message) : base(message)
{
}
}
}

View File

@ -17,7 +17,7 @@ namespace BizHawk.Client.Common
public string Hash { get; set; }
}
public List<FirmwareEventArgs> RecentlyServed { get; private set; }
public List<FirmwareEventArgs> RecentlyServed { get; }
public class ResolutionInfo
{
@ -53,12 +53,10 @@ namespace BizHawk.Client.Common
public ResolutionInfo Resolve(FirmwareDatabase.FirmwareRecord record, bool forbidScan = false)
{
//purpose of forbidScan: sometimes this is called from a loop in Scan(). we dont want to repeatedly DoScanAndResolve in that case, its already been done.
// purpose of forbidScan: sometimes this is called from a loop in Scan(). we dont want to repeatedly DoScanAndResolve in that case, its already been done.
bool first = true;
RETRY:
ResolutionInfo resolved;
_resolutionDictionary.TryGetValue(record, out resolved);
@ -66,7 +64,10 @@ namespace BizHawk.Client.Common
// NOTE: this could result in bad performance in some cases if the scanning happens repeatedly..
if (resolved == null && first)
{
if(!forbidScan) DoScanAndResolve();
if (!forbidScan)
{
DoScanAndResolve();
}
first = false;
goto RETRY;
}
@ -78,14 +79,19 @@ namespace BizHawk.Client.Common
public string Request(string sysId, string firmwareId)
{
var resolved = Resolve(sysId, firmwareId);
if (resolved == null) return null;
if (resolved == null)
{
return null;
}
RecentlyServed.Add(new FirmwareEventArgs
{
SystemId = sysId,
FirmwareId = firmwareId,
Hash = resolved.Hash,
Size = resolved.Size
});
{
SystemId = sysId,
FirmwareId = firmwareId,
Hash = resolved.Hash,
Size = resolved.Size
});
return resolved.FilePath;
}
@ -119,12 +125,14 @@ namespace BizHawk.Client.Common
public void DoScanAndResolve()
{
//build a list of file sizes. Only those will be checked during scanning
// build a list of file sizes. Only those will be checked during scanning
HashSet<long> sizes = new HashSet<long>();
foreach (var ff in FirmwareDatabase.FirmwareFiles)
{
sizes.Add(ff.size);
}
using(var reader = new RealFirmwareReader())
using (var reader = new RealFirmwareReader())
{
// build a list of files under the global firmwares path, and build a hash for each of them while we're at it
var todo = new Queue<DirectoryInfo>();
@ -135,7 +143,9 @@ namespace BizHawk.Client.Common
var di = todo.Dequeue();
if (!di.Exists)
{
continue;
}
// we're going to allow recursing into subdirectories, now. its been verified to work OK
foreach (var disub in di.GetDirectories())
@ -145,8 +155,10 @@ namespace BizHawk.Client.Common
foreach (var fi in di.GetFiles())
{
if(sizes.Contains(fi.Length))
if (sizes.Contains(fi.Length))
{
reader.Read(fi);
}
}
}
@ -203,6 +215,7 @@ namespace BizHawk.Client.Common
ri = new ResolutionInfo();
_resolutionDictionary[fr] = ri;
}
ri.UserSpecified = true;
ri.KnownFirmwareFile = null;
ri.FilePath = userSpec;
@ -239,11 +252,8 @@ namespace BizHawk.Client.Common
}
}
}
} //foreach(firmware record)
} //using(new RealFirmwareReader())
} //DoScanAndResolve()
} //class FirmwareManager
} //namespace
} // foreach(firmware record)
} // using(new RealFirmwareReader())
} // DoScanAndResolve()
} // class FirmwareManager
} // namespace

View File

@ -29,23 +29,23 @@ namespace BizHawk.Client.Common
public static AutofireController AutofireNullControls;
//the movie will be spliced inbetween these if it is present
// the movie will be spliced inbetween these if it is present
public static CopyControllerAdapter MovieInputSourceAdapter = new CopyControllerAdapter();
public static CopyControllerAdapter MovieOutputHardpoint = new CopyControllerAdapter();
public static MultitrackRewiringControllerAdapter MultitrackRewiringAdapter = new MultitrackRewiringControllerAdapter();
//dont take my word for it, since the final word is actually in RewireInputChain, but here is a guide...
//user -> Input -> ActiveController -> UDLR -> StickyXORPlayerInputAdapter -> TurboAdapter(TBD) -> Lua(?TBD?) -> ..
//.. -> MultitrackRewiringControllerAdapter -> MovieInputSourceAdapter -> (MovieSession) -> MovieOutputAdapter -> ControllerOutput(1) -> Game
//(1)->Input Display
// dont take my word for it, since the final word is actually in RewireInputChain, but here is a guide...
// user -> Input -> ActiveController -> UDLR -> StickyXORPlayerInputAdapter -> TurboAdapter(TBD) -> Lua(?TBD?) -> ..
// .. -> MultitrackRewiringControllerAdapter -> MovieInputSourceAdapter -> (MovieSession) -> MovieOutputAdapter -> ControllerOutput(1) -> Game
// (1)->Input Display
//the original source controller, bound to the user, sort of the "input" port for the chain, i think
// the original source controller, bound to the user, sort of the "input" port for the chain, i think
public static Controller ActiveController;
//rapid fire version on the user controller, has its own key bindings and is OR'ed against ActiveController
public static AutofireController AutoFireController;
//the "output" port for the controller chain.
// the "output" port for the controller chain.
public static CopyControllerAdapter ControllerOutput = new CopyControllerAdapter();
public static UD_LR_ControllerAdapter UD_LR_ControllerAdapter = new UD_LR_ControllerAdapter();
@ -95,7 +95,8 @@ namespace BizHawk.Client.Common
{
return SystemInfo.GG;
}
else if ((Emulator as SMS).IsSG1000)
if ((Emulator as SMS).IsSG1000)
{
return SystemInfo.SG;
}

View File

@ -21,7 +21,7 @@ namespace BizHawk.Client.Common
}
// header verified, loop over patch entries
uint EOF = ('E' * 0x10000 + 'O' * 0x100 + 'F');
uint eof = ('E' * 0x10000) + ('O' * 0x100) + 'F';
var ret = new MemoryStream(rom.Length);
ret.Write(rom, 0, rom.Length);
@ -29,8 +29,11 @@ namespace BizHawk.Client.Common
while (true)
{
uint offset = Read24(patch);
if (offset == EOF)
if (offset == eof)
{
return ret.ToArray();
}
ushort size = Read16(patch);
ret.Seek(offset, SeekOrigin.Begin);
@ -56,17 +59,17 @@ namespace BizHawk.Client.Common
private static ushort Read16(Stream patch)
{
int Upper = patch.ReadByte();
int Lower = patch.ReadByte();
return (ushort)(Upper * 0x100 + Lower);
int upper = patch.ReadByte();
int lower = patch.ReadByte();
return (ushort)((upper * 0x100) + lower);
}
private static uint Read24(Stream patch)
{
int Upper = patch.ReadByte();
int Middle = patch.ReadByte();
int Lower = patch.ReadByte();
return (uint)(Upper * 0x10000 + Middle * 0x100 + Lower);
int upper = patch.ReadByte();
int middle = patch.ReadByte();
int lower = patch.ReadByte();
return (uint)((upper * 0x10000) + (middle * 0x100) + lower);
}
}
}

View File

@ -1,12 +1,9 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace BizHawk.Client.Common
{
interface IZipWriter : IDisposable
public interface IZipWriter : IDisposable
{
void WriteItem(string name, Action<Stream> callback);
}

View File

@ -1,10 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Ionic.Zip;
using System.IO;
namespace BizHawk.Client.Common
{
@ -28,9 +25,14 @@ namespace BizHawk.Client.Common
{
var e = z.PutNextEntry(name);
if (level == 0)
{
e.CompressionMethod = CompressionMethod.None;
}
else
{
e.CompressionMethod = CompressionMethod.Deflate;
}
callback(z);
// there is no CloseEntry() call
}

View File

@ -2,6 +2,10 @@
{
public class TurboKey
{
private int _upTime, _downTime, _timer;
public bool Value { get; set; }
public void Reset(int downTime, int upTime)
{
Value = false;
@ -22,15 +26,15 @@
Value = true;
if (_timer > _downTime)
{
Value = false;
if(_timer > (_upTime+_downTime))
}
if (_timer > _upTime + _downTime)
{
_timer = 0;
Value = true;
}
}
public bool Value;
private int _upTime, _downTime, _timer;
}
}

View File

@ -3,7 +3,6 @@ using System.Linq;
using System.IO;
using System.Reflection;
using BizHawk.Common;
using BizHawk.Common.StringExtensions;
using BizHawk.Emulation.Common;
using BizHawk.Emulation.Common.IEmulatorExtensions;
@ -24,28 +23,27 @@ namespace BizHawk.Client.Common
return path;
}
/// <summary>
/// Makes a path relative to the %exe% dir
/// </summary>
public static string MakeProgramRelativePath(string path) { return MakeAbsolutePath("%exe%/" + path, null); }
/// <summary>
/// Makes a path relative to the %exe% directory
/// </summary>
public static string MakeProgramRelativePath(string path)
{
return MakeAbsolutePath("%exe%/" + path, null);
}
public static string GetDllDirectory() { return Path.Combine(GetExeDirectoryAbsolute(), "dll"); }
public static string GetDllDirectory()
{
return Path.Combine(GetExeDirectoryAbsolute(), "dll");
}
/// <summary>
/// The location of the default INI file
/// </summary>
public static string DefaultIniPath
{
get
{
return MakeProgramRelativePath("config.ini");
}
}
public static string DefaultIniPath => MakeProgramRelativePath("config.ini");
/// <summary>
/// Gets absolute base as derived from EXE
/// </summary>
/// <returns></returns>
public static string GetBasePathAbsolute()
{
if (Global.Config.PathEntries.GlobalBaseFragment.Length < 1) // If empty, then EXE path
@ -105,7 +103,6 @@ namespace BizHawk.Client.Common
}
// This function translates relative path and special identifiers in absolute paths
if (path.Length < 1)
{
return GetBasePathAbsolute();
@ -183,7 +180,7 @@ namespace BizHawk.Client.Common
int z = workingpath.HowMany("\\");
if (y >= z)
{
//Return drive letter only, working path must be absolute?
// Return drive letter only, working path must be absolute?
}
return string.Empty;
@ -259,7 +256,7 @@ namespace BizHawk.Client.Common
var filesystemSafeName = game.Name
.Replace("|", "+")
.Replace(":", " -") // adelikat - Path.GetFileName scraps everything to the left of a colon unfortunately, so we need this hack here
.Replace("\"", ""); // adelikat - Ivan Ironman Stewart's Super Off-Road has quotes in game name
.Replace("\"", string.Empty); // adelikat - Ivan Ironman Stewart's Super Off-Road has quotes in game name
// zero 06-nov-2015 - regarding the below, i changed my mind. for libretro i want subdirectories here.
var filesystemDir = Path.GetDirectoryName(filesystemSafeName);
@ -297,10 +294,10 @@ namespace BizHawk.Client.Common
public static string RetroSaveRAMDirectory(GameInfo game)
{
//hijinx here to get the core name out of the game name
// hijinx here to get the core name out of the game name
var name = FilesystemSafeName(game);
name = Path.GetDirectoryName(name);
if (name == "") name = FilesystemSafeName(game);
if (name == string.Empty) name = FilesystemSafeName(game);
if (Global.MovieSession.Movie.IsActive)
{
@ -316,10 +313,13 @@ namespace BizHawk.Client.Common
public static string RetroSystemPath(GameInfo game)
{
//hijinx here to get the core name out of the game name
// hijinx here to get the core name out of the game name
var name = FilesystemSafeName(game);
name = Path.GetDirectoryName(name);
if(name == "") name = FilesystemSafeName(game);
if (name == string.Empty)
{
name = FilesystemSafeName(game);
}
var pathEntry = Global.Config.PathEntries[game.System, "System"] ??
Global.Config.PathEntries[game.System, "Base"];
@ -403,9 +403,6 @@ namespace BizHawk.Client.Common
/// Takes an absolute path and attempts to convert it to a relative, based on the system,
/// or global base if no system is supplied, if it is not a subfolder of the base, it will return the path unaltered
/// </summary>
/// <param name="absolutePath"></param>
/// <param name="system"></param>
/// <returns></returns>
public static string TryMakeRelative(string absolutePath, string system = null)
{
var parentPath = string.IsNullOrWhiteSpace(system) ?
@ -430,8 +427,8 @@ namespace BizHawk.Client.Common
return absolutePath;
}
//http://stackoverflow.com/questions/3525775/how-to-check-if-directory-1-is-a-subdirectory-of-dir2-and-vice-versa
public static bool IsSubfolder(string parentPath, string childPath)
// http://stackoverflow.com/questions/3525775/how-to-check-if-directory-1-is-a-subdirectory-of-dir2-and-vice-versa
private static bool IsSubfolder(string parentPath, string childPath)
{
var parentUri = new Uri(parentPath);
@ -454,14 +451,12 @@ namespace BizHawk.Client.Common
/// Don't only valid system ids to system ID, pathType is ROM, Screenshot, etc
/// Returns the desired path, if does not exist, returns platform base, else it returns base
/// </summary>
/// <param name="pathType"></param>
/// <param name="systemID"></param>
public static PathEntry GetPathEntryWithFallback(string pathType, string systemID)
private static PathEntry GetPathEntryWithFallback(string pathType, string systemId)
{
var entry = Global.Config.PathEntries[systemID, pathType];
var entry = Global.Config.PathEntries[systemId, pathType];
if (entry == null)
{
entry = Global.Config.PathEntries[systemID, "Base"];
entry = Global.Config.PathEntries[systemId, "Base"];
}
if (entry == null)

View File

@ -1,16 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BizHawk.Emulation.Common;
using System.Runtime.InteropServices;
using System.IO;
using System.Runtime.InteropServices;
using BizHawk.Emulation.Common;
namespace BizHawk.Client.Common
{
public class QuickBmpFile
{
#region structs
#region Structs
[StructLayout(LayoutKind.Sequential, Pack = 1)]
class BITMAPFILEHEADER
{
@ -29,7 +28,10 @@ namespace BizHawk.Client.Common
{
var ret = GetObject<BITMAPFILEHEADER>(s);
if (ret.bfSize != Marshal.SizeOf(typeof(BITMAPFILEHEADER)))
{
throw new InvalidOperationException();
}
return ret;
}
}
@ -58,12 +60,15 @@ namespace BizHawk.Client.Common
{
var ret = GetObject<BITMAPINFOHEADER>(s);
if (ret.biSize != Marshal.SizeOf(typeof(BITMAPINFOHEADER)))
{
throw new InvalidOperationException();
}
return ret;
}
}
enum BitmapCompressionMode : uint
private enum BitmapCompressionMode : uint
{
BI_RGB = 0,
BI_RLE8 = 1,
@ -72,9 +77,10 @@ namespace BizHawk.Client.Common
BI_JPEG = 4,
BI_PNG = 5
}
#endregion
private unsafe static byte[] GetBytes(object o)
private static unsafe byte[] GetBytes(object o)
{
byte[] ret = new byte[Marshal.SizeOf(o)];
fixed (byte* p = ret)
@ -84,7 +90,7 @@ namespace BizHawk.Client.Common
return ret;
}
private unsafe static T GetObject<T>(Stream s)
private static unsafe T GetObject<T>(Stream s)
{
byte[] tmp = new byte[Marshal.SizeOf(typeof(T))];
s.Read(tmp, 0, tmp.Length);
@ -94,35 +100,42 @@ namespace BizHawk.Client.Common
}
}
unsafe struct BMP
private unsafe struct BMP
{
public int* Data;
public int Width;
public int Height;
}
static void Blit(BMP src, BMP dst)
private static void Blit(BMP src, BMP dst)
{
if (src.Width == dst.Width && src.Height == dst.Height)
{
Blit_Same(src, dst);
}
else
{
Blit_Any(src, dst);
}
}
unsafe static void Blit_Same(BMP src, BMP dst)
private static unsafe void Blit_Same(BMP src, BMP dst)
{
int* sp = src.Data + src.Width * (src.Height - 1);
int* sp = src.Data + (src.Width * (src.Height - 1));
int* dp = dst.Data;
for (int j = 0; j < src.Height; j++)
{
for (int i = 0; i < src.Width; i++)
{
dp[i] = sp[i];
}
sp -= src.Width;
dp += src.Width;
}
}
unsafe static void Blit_Any(BMP src, BMP dst)
private static unsafe void Blit_Any(BMP src, BMP dst)
{
int w = dst.Width;
int h = dst.Height;
@ -143,7 +156,7 @@ namespace BizHawk.Client.Common
}
}
unsafe static void Blit_Any_NoFlip(BMP src, BMP dst)
private static unsafe void Blit_Any_NoFlip(BMP src, BMP dst)
{
int w = dst.Width;
int h = dst.Height;
@ -163,7 +176,7 @@ namespace BizHawk.Client.Common
}
}
public unsafe static void Copy(IVideoProvider src, IVideoProvider dst)
public static unsafe void Copy(IVideoProvider src, IVideoProvider dst)
{
if (src.BufferWidth == dst.BufferWidth && src.BufferHeight == dst.BufferHeight)
{
@ -194,16 +207,23 @@ namespace BizHawk.Client.Common
/// </summary>
public class LoadedBMP : IVideoProvider
{
public int[] VideoBuffer { get; set; }
public int[] GetVideoBuffer() { return VideoBuffer; }
public int VirtualWidth { get { return BufferWidth; } }
public int VirtualHeight { get { return BufferHeight; } }
public int BufferWidth { get; set; }
public int[] VideoBuffer { get; set; }
public int[] GetVideoBuffer()
{
return VideoBuffer;
}
public int VirtualWidth => BufferWidth;
public int VirtualHeight => BufferHeight;
public int BufferWidth { get; set; }
public int BufferHeight { get; set; }
public int BackgroundColor { get { return unchecked((int)0xff000000); } }
public int BackgroundColor => unchecked((int)0xff000000);
}
public unsafe static bool Load(IVideoProvider v, Stream s)
public static unsafe bool Load(IVideoProvider v, Stream s)
{
var bf = BITMAPFILEHEADER.FromStream(s);
var bi = BITMAPINFOHEADER.FromStream(s);
@ -212,7 +232,10 @@ namespace BizHawk.Client.Common
|| bi.biPlanes != 1
|| bi.biBitCount != 32
|| bi.biCompression != BitmapCompressionMode.BI_RGB)
{
return false;
}
int in_w = bi.biWidth;
int in_h = bi.biHeight;
@ -225,9 +248,10 @@ namespace BizHawk.Client.Common
l.BufferHeight = in_h;
l.VideoBuffer = new int[in_w * in_h];
}
int[] dst = v.GetVideoBuffer();
fixed (byte *srcp = src)
fixed (byte* srcp = src)
fixed (int* dstp = dst)
{
using (new BizHawk.Common.SimpleTime("Blit"))
@ -248,7 +272,7 @@ namespace BizHawk.Client.Common
return true;
}
public unsafe static void Save(IVideoProvider v, Stream s, int w, int h)
public static unsafe void Save(IVideoProvider v, Stream s, int w, int h)
{
var bf = new BITMAPFILEHEADER();
var bi = new BITMAPINFOHEADER();

View File

@ -9,8 +9,13 @@ namespace BizHawk.Client.Common
[JsonObject]
public class RecentFiles : IEnumerable
{
private List<string> recentlist;
public RecentFiles() : this(8) { }
private readonly List<string> recentlist;
public RecentFiles()
: this(8)
{
}
public RecentFiles(int max)
{
recentlist = new List<string>();
@ -26,27 +31,15 @@ namespace BizHawk.Client.Common
public bool Frozen { get; set; }
[JsonIgnore]
public bool Empty
{
get { return !recentlist.Any(); }
}
public bool Empty => !recentlist.Any();
[JsonIgnore]
public int Count
{
get { return recentlist.Count; }
}
[JsonIgnore]
public int Count => recentlist.Count;
[JsonIgnore]
public string MostRecent
{
get
{
return recentlist.Any() ? recentlist[0] : string.Empty;
}
}
[JsonIgnore]
public string MostRecent => recentlist.Any() ? recentlist[0] : string.Empty;
public string this[int index]
public string this[int index]
{
get
{

View File

@ -9,16 +9,21 @@ namespace BizHawk.Client.Common
{
public class RomGame
{
public byte[] RomData { get; set; }
public byte[] FileData { get; set; }
public GameInfo GameInfo { get; set; }
public string Extension { get; set; }
public byte[] RomData { get; }
public byte[] FileData { get; }
public GameInfo GameInfo { get; }
public string Extension { get; }
private const int BankSize = 1024;
public RomGame() { }
public RomGame()
{
}
public RomGame(HawkFile file) : this(file, null) { }
public RomGame(HawkFile file)
: this(file, null)
{
}
public RomGame(HawkFile file, string patch)
{
@ -101,7 +106,6 @@ namespace BizHawk.Client.Common
{
// SMD files are interleaved in pages of 16k, with the first 8k containing all
// odd bytes and the second 8k containing all even bytes.
int size = source.Length;
if (size > 0x400000)
{
@ -122,7 +126,7 @@ namespace BizHawk.Client.Common
return output;
}
private unsafe static byte[] MutateSwapN64(byte[] source)
private static unsafe byte[] MutateSwapN64(byte[] source)
{
// N64 roms are in one of the following formats:
// .Z64 = No swapping

View File

@ -1,32 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Linq;
using BizHawk.Common;
using BizHawk.Emulation.Common;
using BizHawk.Emulation.Cores;
using BizHawk.Emulation.Cores.Atari.Atari2600;
using BizHawk.Emulation.Cores.Atari.Atari7800;
using BizHawk.Emulation.Cores.Calculators;
using BizHawk.Emulation.Cores.ColecoVision;
using BizHawk.Emulation.Cores.Computers.AppleII;
using BizHawk.Emulation.Cores.Computers.Commodore64;
using BizHawk.Emulation.Cores.Consoles.Nintendo.QuickNES;
using BizHawk.Emulation.Cores.Consoles.Sega.gpgx;
using GPGX64=BizHawk.Emulation.Cores.Consoles.Sega.gpgx64;
using BizHawk.Emulation.Cores.Intellivision;
using BizHawk.Emulation.Cores.Nintendo.Gameboy;
using BizHawk.Emulation.Cores.Nintendo.GBA;
using BizHawk.Emulation.Cores.Nintendo.N64;
using BizHawk.Emulation.Cores.Nintendo.NES;
using BizHawk.Emulation.Cores.Nintendo.SNES;
using BizHawk.Emulation.Cores.PCEngine;
using BizHawk.Emulation.Cores.Sega.MasterSystem;
using BizHawk.Emulation.Cores.Sega.Saturn;
using BizHawk.Emulation.Cores.Sony.PSP;
using BizHawk.Emulation.Cores.Sony.PSX;
using BizHawk.Emulation.DiscSystem;
using BizHawk.Emulation.Cores.WonderSwan;
using BizHawk.Emulation.Cores.Computers.AppleII;
using GPGX64 = BizHawk.Emulation.Cores.Consoles.Sega.gpgx64;
namespace BizHawk.Client.Common
{
@ -50,36 +43,23 @@ namespace BizHawk.Client.Common
private object GetCoreSettings(Type t)
{
var e = new SettingsLoadArgs(t);
if (OnLoadSettings != null)
{
OnLoadSettings(this, e);
}
OnLoadSettings?.Invoke(this, e);
return e.Settings;
}
private object GetCoreSyncSettings(Type t)
{
var e = new SettingsLoadArgs(t);
if (OnLoadSyncSettings != null)
{
OnLoadSyncSettings(this, e);
}
OnLoadSyncSettings?.Invoke(this, e);
return e.Settings;
}
public RomLoader()
{
}
// For not throwing errors but simply outputing information to the screen
public Action<string> MessageCallback { get; set; }
private void DoMessageCallback(string message)
{
if (MessageCallback != null)
{
MessageCallback(message);
}
MessageCallback?.Invoke(message);
}
// TODO: reconsider the need for exposing these;
@ -138,11 +118,13 @@ namespace BizHawk.Client.Common
public Func<RomGame, string> ChoosePlatform { get; set; }
// in case we get sent back through the picker more than once, use the same choice the second time
int? previouschoice;
private int? previouschoice;
private int? HandleArchive(HawkFile file)
{
if (previouschoice.HasValue)
{
return previouschoice;
}
if (ChooseArchive != null)
{
@ -153,21 +135,15 @@ namespace BizHawk.Client.Common
return null;
}
//May want to phase out this method in favor of the overload with more paramaters
// May want to phase out this method in favor of the overload with more paramaters
private void DoLoadErrorCallback(string message, string systemId, LoadErrorType type = LoadErrorType.Unknown)
{
if (OnLoadError != null)
{
OnLoadError(this, new RomErrorArgs(message, systemId, type));
}
OnLoadError?.Invoke(this, new RomErrorArgs(message, systemId, type));
}
private void DoLoadErrorCallback(string message, string systemId, string path, bool det, LoadErrorType type = LoadErrorType.Unknown)
{
if (OnLoadError != null)
{
OnLoadError(this, new RomErrorArgs(message, systemId, path, det, type));
}
OnLoadError?.Invoke(this, new RomErrorArgs(message, systemId, path, det, type));
}
private bool PreferredPlatformIsDefined(string extension)
@ -180,9 +156,9 @@ namespace BizHawk.Client.Common
return false;
}
public bool AsLibretro;
public bool AsLibretro { get; set; }
bool HandleArchiveBinding(HawkFile file)
private bool HandleArchiveBinding(HawkFile file)
{
var romExtensions = new[] { "SMS", "SMC", "SFC", "PCE", "SGX", "GG", "SG", "BIN", "GEN", "MD", "SMD", "GB", "NES", "FDS", "ROM", "INT", "GBC", "UNF", "A78", "CRT", "COL", "XML", "Z64", "V64", "N64", "WS", "WSC", "GBA" };
@ -216,7 +192,7 @@ namespace BizHawk.Client.Common
{
if (recursiveCount > 1) // hack to stop recursive calls from endlessly rerunning if we can't load it
{
DoLoadErrorCallback("Failed multiple attempts to load ROM.", "");
DoLoadErrorCallback("Failed multiple attempts to load ROM.", string.Empty);
return false;
}
@ -230,7 +206,7 @@ namespace BizHawk.Client.Common
using (var file = new HawkFile())
{
//only try mounting a file if a filename was given
// only try mounting a file if a filename was given
if (!string.IsNullOrEmpty(path))
{
// lets not use this unless we need to
@ -261,17 +237,17 @@ namespace BizHawk.Client.Common
var retro = new LibRetroEmulator(nextComm, nextComm.LaunchLibretroCore);
nextEmulator = retro;
//kind of dirty.. we need to stash this, and then we can unstash it in a moment, in case the core doesnt fail
// kind of dirty.. we need to stash this, and then we can unstash it in a moment, in case the core doesnt fail
var oldGame = Global.Game;
if (retro.Description.SupportsNoGame && string.IsNullOrEmpty(path))
{
//must be done before LoadNoGame (which triggers retro_init and the paths to be consumed by the core)
//game name == name of core
// must be done before LoadNoGame (which triggers retro_init and the paths to be consumed by the core)
// game name == name of core
var gameName = codePathPart;
Global.Game = game = new GameInfo { Name = gameName, System = "Libretro" };
//if we are allowed to run NoGame and we dont have a game, boot up the core that way
// if we are allowed to run NoGame and we dont have a game, boot up the core that way
bool ret = retro.LoadNoGame();
Global.Game = oldGame;
@ -287,32 +263,41 @@ namespace BizHawk.Client.Common
{
bool ret;
//must be done before LoadNoGame (which triggers retro_init and the paths to be consumed by the core)
//game name == name of core + extensionless_game_filename
// must be done before LoadNoGame (which triggers retro_init and the paths to be consumed by the core)
// game name == name of core + extensionless_game_filename
var gameName = Path.Combine(codePathPart, Path.GetFileNameWithoutExtension(file.Name));
Global.Game = game = new GameInfo { Name = gameName, System = "Libretro" };
//if the core requires an archive file, then try passing the filename of the archive
//(but do we ever need to actually load the contents of the archive file into ram?)
// if the core requires an archive file, then try passing the filename of the archive
// (but do we ever need to actually load the contents of the archive file into ram?)
if (retro.Description.NeedsArchives)
{
if (file.IsArchiveMember)
{
throw new InvalidOperationException("Should not have bound file member for libretro block_extract core");
}
ret = retro.LoadPath(file.FullPathWithoutMember);
}
else
{
//otherwise load the data or pass the filename, as requested. but..
// otherwise load the data or pass the filename, as requested. but..
if (retro.Description.NeedsRomAsPath && file.IsArchiveMember)
{
throw new InvalidOperationException("Cannot pass archive member to libretro needs_fullpath core");
}
if (retro.Description.NeedsRomAsPath)
{
ret = retro.LoadPath(file.FullPathWithoutMember);
}
else
{
ret = HandleArchiveBinding(file);
if (ret)
{
ret = retro.LoadData(file.ReadAllBytes());
}
}
}
@ -325,31 +310,39 @@ namespace BizHawk.Client.Common
return false;
}
}
}
else
{
//if not libretro:
//do extension checknig
// if not libretro:
// do extension checknig
ext = file.Extension.ToLowerInvariant();
//do the archive binding we had to skip
// do the archive binding we had to skip
if (!HandleArchiveBinding(file))
{
return false;
}
}
if (string.IsNullOrEmpty(ext)) { }
if (string.IsNullOrEmpty(ext))
{
}
else if (ext == ".m3u")
{
//HACK ZONE - currently only psx supports m3u
// HACK ZONE - currently only psx supports m3u
M3U_File m3u;
using(var sr = new StreamReader(path))
using (var sr = new StreamReader(path))
{
m3u = M3U_File.Read(sr);
if(m3u.Entries.Count == 0)
}
if (m3u.Entries.Count == 0)
{
throw new InvalidOperationException("Can't load an empty M3U");
//load discs for all the m3u
}
// load discs for all the m3u
m3u.Rebase(Path.GetDirectoryName(path));
List<Disc> discs = new List<Disc>();
List<string> discNames = new List<string>();
@ -367,15 +360,19 @@ namespace BizHawk.Client.Common
if (discMountJob.OUT_SlowLoadAborted)
{
DoLoadErrorCallback("This disc would take too long to load. Run it through discohawk first, or find a new rip because this one is probably junk", "", LoadErrorType.DiscError);
DoLoadErrorCallback("This disc would take too long to load. Run it through discohawk first, or find a new rip because this one is probably junk", string.Empty, LoadErrorType.DiscError);
return false;
}
if (discMountJob.OUT_ErrorLevel)
{
throw new InvalidOperationException("\r\n" + discMountJob.OUT_Log);
}
if(disc == null)
if (disc == null)
{
throw new InvalidOperationException("Can't load one of the files specified in the M3U");
}
var discName = Path.GetFileNameWithoutExtension(discPath);
discNames.Add(discName);
@ -388,7 +385,9 @@ namespace BizHawk.Client.Common
string discHash = new DiscHasher(disc).Calculate_PSX_BizIDHash().ToString("X8");
game = Database.CheckDatabase(discHash);
if (game == null || game.IsRomStatusBad() || game.Status == RomStatus.NotInDatabase)
{
sw.WriteLine("Disc could not be identified as known-good. Look for a better rip.");
}
else
{
sw.WriteLine("Disc was identified (99.99% confidently) as known good with disc id hash CRC32:{0:X8}",discHash);
@ -402,13 +401,17 @@ namespace BizHawk.Client.Common
{
sw.WriteLine("Not a PSX disc");
}
sw.WriteLine("-------------------------");
}
nextEmulator = new Octoshock(nextComm, discs, discNames, null, GetCoreSettings<Octoshock>(), GetCoreSyncSettings<Octoshock>());
nextEmulator.CoreComm.RomStatusDetails = sw.ToString();
game = new GameInfo { Name = Path.GetFileNameWithoutExtension(file.Name) };
game.System = "PSX";
game = new GameInfo
{
Name = Path.GetFileNameWithoutExtension(file.Name),
System = "PSX"
};
}
else if (ext == ".iso" || ext == ".cue" || ext == ".ccd")
{
@ -420,27 +423,33 @@ namespace BizHawk.Client.Common
string discHash = null;
//--- load the disc in a context which will let us abort if it's going to take too long
var discMountJob = new DiscMountJob { IN_FromPath = path };
discMountJob.IN_SlowLoadAbortThreshold = 8;
var discMountJob = new DiscMountJob { IN_FromPath = path, IN_SlowLoadAbortThreshold = 8 };
discMountJob.Run();
if (discMountJob.OUT_SlowLoadAborted)
{
DoLoadErrorCallback("This disc would take too long to load. Run it through discohawk first, or find a new rip because this one is probably junk", "", LoadErrorType.DiscError);
DoLoadErrorCallback("This disc would take too long to load. Run it through discohawk first, or find a new rip because this one is probably junk", string.Empty, LoadErrorType.DiscError);
return false;
}
if (discMountJob.OUT_ErrorLevel)
{
throw new InvalidOperationException("\r\n" + discMountJob.OUT_Log);
}
var disc = discMountJob.OUT_Disc;
//-----------
//TODO - use more sophisticated IDer
// -----------
// TODO - use more sophisticated IDer
var discType = new DiscIdentifier(disc).DetectDiscType();
if (discType == DiscType.SonyPSX)
{
discHash = new DiscHasher(disc).Calculate_PSX_BizIDHash().ToString("X8");
else discHash = new DiscHasher(disc).OldHash();
}
else
{
discHash = new DiscHasher(disc).OldHash();
}
game = Database.CheckDatabase(discHash);
if (game == null)
@ -493,9 +502,11 @@ namespace BizHawk.Client.Common
nextEmulator = new PSP(nextComm, file.Name);
break;
case "PSX":
nextEmulator = new Octoshock(nextComm, new List<Disc>(new[]{disc}), new List<string>(new[]{Path.GetFileNameWithoutExtension(path)}), null, GetCoreSettings<Octoshock>(), GetCoreSyncSettings<Octoshock>());
nextEmulator = new Octoshock(nextComm, new List<Disc>(new[] { disc }), new List<string>(new[] { Path.GetFileNameWithoutExtension(path) }), null, GetCoreSettings<Octoshock>(), GetCoreSyncSettings<Octoshock>());
if (game.IsRomStatusBad() || game.Status == RomStatus.NotInDatabase)
{
nextEmulator.CoreComm.RomStatusDetails = "Disc could not be identified as known-good. Look for a better rip.";
}
else
{
StringWriter sw = new StringWriter();
@ -554,10 +565,9 @@ namespace BizHawk.Client.Common
case "C64":
nextEmulator = new C64(
nextComm,
xmlGame.Assets.Select(a => a.Value),
xmlGame.Assets.Select(a => a.Value),
(C64.C64Settings)GetCoreSettings<C64>(),
(C64.C64SyncSettings)GetCoreSyncSettings<C64>()
);
(C64.C64SyncSettings)GetCoreSyncSettings<C64>());
break;
case "PSX":
var entries = xmlGame.AssetFullPaths;
@ -570,8 +580,7 @@ namespace BizHawk.Client.Common
string discPath = e;
//--- load the disc in a context which will let us abort if it's going to take too long
var discMountJob = new DiscMountJob { IN_FromPath = discPath };
discMountJob.IN_SlowLoadAbortThreshold = 8;
var discMountJob = new DiscMountJob { IN_FromPath = discPath, IN_SlowLoadAbortThreshold = 8 };
discMountJob.Run();
disc = discMountJob.OUT_Disc;
@ -582,10 +591,14 @@ namespace BizHawk.Client.Common
}
if (discMountJob.OUT_ErrorLevel)
{
throw new InvalidOperationException("\r\n" + discMountJob.OUT_Log);
}
if (disc == null)
{
throw new InvalidOperationException("Can't load one of the files specified in the M3U");
}
var discName = Path.GetFileNameWithoutExtension(discPath);
discNames.Add(discName);
@ -598,7 +611,9 @@ namespace BizHawk.Client.Common
string discHash = new DiscHasher(disc).Calculate_PSX_BizIDHash().ToString("X8");
game = Database.CheckDatabase(discHash);
if (game == null || game.IsRomStatusBad() || game.Status == RomStatus.NotInDatabase)
{
sw.WriteLine("Disc could not be identified as known-good. Look for a better rip.");
}
else
{
sw.WriteLine("Disc was identified (99.99% confidently) as known good with disc id hash CRC32:{0:X8}", discHash);
@ -612,15 +627,18 @@ namespace BizHawk.Client.Common
{
sw.WriteLine("Not a PSX disc");
}
sw.WriteLine("-------------------------");
}
// todo: copy pasta from PSX .cue section
nextEmulator = new Octoshock(nextComm, discs, discNames, null, GetCoreSettings<Octoshock>(), GetCoreSyncSettings<Octoshock>());
nextEmulator.CoreComm.RomStatusDetails = sw.ToString();
game = new GameInfo { Name = Path.GetFileNameWithoutExtension(file.Name) };
game.System = "PSX";
game = new GameInfo
{
Name = Path.GetFileNameWithoutExtension(file.Name),
System = "PSX"
};
break;
default:
return false;
@ -672,11 +690,15 @@ namespace BizHawk.Client.Common
{
rom = new RomGame(file);
//hacky for now
// hacky for now
if (file.Extension.ToLowerInvariant() == ".exe")
{
rom.GameInfo.System = "PSX";
}
else if (file.Extension.ToLowerInvariant() == ".nsf")
{
rom.GameInfo.System = "NES";
}
if (string.IsNullOrEmpty(rom.GameInfo.System))
@ -753,16 +775,24 @@ namespace BizHawk.Client.Common
break;
case "NES":
{
//apply main spur-of-the-moment switcheroo as lowest priority
// apply main spur-of-the-moment switcheroo as lowest priority
string preference = "neshawk";
if(Global.Config.NES_InQuickNES) preference = "quicknes";
if (Global.Config.NES_InQuickNES)
{
preference = "quicknes";
}
//if user has saw fit to override in gamedb, apply that
// if user has saw fit to override in gamedb, apply that
if (Global.Config.CoreForcingViaGameDB && !string.IsNullOrEmpty(game.ForcedCore))
{
preference = game.ForcedCore;
}
//but only neshawk is accurate
if (forceAccurateCore) preference = "neshawk";
// but only neshawk is accurate
if (forceAccurateCore)
{
preference = "neshawk";
}
if (preference == "neshawk")
{
@ -809,7 +839,7 @@ namespace BizHawk.Client.Common
nextEmulator = c64;
break;
case "GBA":
//core = CoreInventory.Instance["GBA", "Meteor"];
// core = CoreInventory.Instance["GBA", "Meteor"];
if (Global.Config.GBA_UsemGBA)
{
core = CoreInventory.Instance["GBA", "mGBA"];
@ -825,10 +855,15 @@ namespace BizHawk.Client.Common
break;
case "GEN":
// discard "Genplus-gx64", auto-added due to implementing IEmulator // HUH?
//core = CoreInventory.Instance["GEN", "Genplus-gx"];
// core = CoreInventory.Instance["GEN", "Genplus-gx"];
if (Environment.Is64BitProcess)
{
core = CoreInventory.Instance["GEN", "Genplus-gx64"];
else core = CoreInventory.Instance["GEN", "Genplus-gx"];
}
else
{
core = CoreInventory.Instance["GEN", "Genplus-gx"];
}
break;
}
@ -845,6 +880,7 @@ namespace BizHawk.Client.Common
{
DoLoadErrorCallback("No core could load the rom.", null);
}
return false;
}
}
@ -859,7 +895,9 @@ namespace BizHawk.Client.Common
// all of the specific exceptions we're trying to catch here aren't expected to have inner exceptions,
// so drill down in case we got a TargetInvocationException or something like that
while (ex.InnerException != null)
{
ex = ex.InnerException;
}
// Specific hack here, as we get more cores of the same system, this isn't scalable
if (ex is UnsupportedGameException)

View File

@ -30,8 +30,7 @@ namespace BizHawk.Client.Common
for (int i = 0; i < 10; i++)
{
var file = new FileInfo(
PathManager.SaveStatePrefix(Global.Game) + "." + "QuickSave" + i + ".State"
);
PathManager.SaveStatePrefix(Global.Game) + "." + "QuickSave" + i + ".State");
if (file.Directory != null && file.Directory.Exists == false)
{
file.Directory.Create();

View File

@ -1,13 +1,10 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using BizHawk.Common;
using BizHawk.Common.BufferExtensions;
using BizHawk.Common.IOExtensions;
using BizHawk.Emulation.Common;
using BizHawk.Emulation.Common.IEmulatorExtensions;
using System.Collections.Generic;
namespace BizHawk.Client.Common
{
@ -16,6 +13,7 @@ namespace BizHawk.Client.Common
public static void SaveStateFile(string filename, string name)
{
var core = Global.Emulator.AsStatable();
// the old method of text savestate save is now gone.
// a text savestate is just like a binary savestate, but with a different core lump
using (var bs = new BinaryStateSaver(filename))
@ -25,13 +23,17 @@ namespace BizHawk.Client.Common
{
// text savestate format
using (new SimpleTime("Save Core"))
{
bs.PutLump(BinaryStateLump.CorestateText, (tw) => core.SaveStateText(tw));
}
}
else
{
// binary core lump format
using (new SimpleTime("Save Core"))
{
bs.PutLump(BinaryStateLump.Corestate, bw => core.SaveStateBinary(bw));
}
}
if (Global.Config.SaveScreenshotWithStates && Global.Emulator.HasVideoProvider())
@ -40,11 +42,11 @@ namespace BizHawk.Client.Common
var buff = vp.GetVideoBuffer();
if (buff.Length == 1)
{
//is a hacky opengl texture ID. can't handle this now!
//need to discuss options
//1. cores must be able to provide a pixels videoprovider in addition to a texture ID, on command (not very hard overall but interface changing and work per core)
//2. SavestateManager must be setup with a mechanism for resolving texture IDs (even less work, but sloppy)
//There are additional problems with AVWriting. They depend on VideoProvider providing pixels.
// is a hacky opengl texture ID. can't handle this now!
// need to discuss options
// 1. cores must be able to provide a pixels videoprovider in addition to a texture ID, on command (not very hard overall but interface changing and work per core)
// 2. SavestateManager must be setup with a mechanism for resolving texture IDs (even less work, but sloppy)
// There are additional problems with AVWriting. They depend on VideoProvider providing pixels.
}
else
{
@ -57,8 +59,11 @@ namespace BizHawk.Client.Common
out_w /= 2;
out_h /= 2;
}
using (new SimpleTime("Save Framebuffer"))
{
bs.PutLump(BinaryStateLump.Framebuffer, (s) => QuickBmpFile.Save(Global.Emulator.AsVideoProvider(), s, out_w, out_h));
}
}
}
@ -104,7 +109,9 @@ namespace BizHawk.Client.Common
try
{
using (new SimpleTime("Load Framebuffer"))
{
QuickBmpFile.Load(Global.Emulator.AsVideoProvider(), br.BaseStream);
}
}
catch
{
@ -160,7 +167,9 @@ namespace BizHawk.Client.Common
}
using (new SimpleTime("Load Core"))
{
bl.GetCoreState(br => core.LoadStateBinary(br), tr => core.LoadStateText(tr));
}
bl.GetLump(BinaryStateLump.Framebuffer, false, PopulateFramebuffer);

View File

@ -1,7 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading.Tasks;
using System.Threading;
@ -26,8 +24,8 @@ namespace BizHawk.Client.Common
ManualResetEvent full = new ManualResetEvent(true);
ManualResetEvent empty = new ManualResetEvent(false);
public Stream W { get; private set; }
public Stream R { get; private set; }
public Stream W { get; }
public Stream R { get; }
public RangBuffer()
{

View File

@ -1,47 +1,49 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using System.IO;
namespace BizHawk.Client.Common
{
public class SharpZipWriter : IZipWriter
{
private ZipOutputStream z;
private int level;
private readonly int _level;
private ZipOutputStream _zipOutputStream;
public SharpZipWriter(string path, int compressionlevel)
{
level = compressionlevel;
z = new ZipOutputStream(new FileStream(path, FileMode.Create, FileAccess.Write))
_level = compressionlevel;
_zipOutputStream = new ZipOutputStream(new FileStream(path, FileMode.Create, FileAccess.Write))
{
IsStreamOwner = true,
UseZip64 = UseZip64.Off
};
z.SetLevel(level);
_zipOutputStream.SetLevel(_level);
}
public void WriteItem(string name, Action<Stream> callback)
{
var e = new ZipEntry(name);
if (level == 0)
if (_level == 0)
{
e.CompressionMethod = CompressionMethod.Stored;
}
else
{
e.CompressionMethod = CompressionMethod.Deflated;
z.PutNextEntry(e);
callback(z);
z.CloseEntry();
}
_zipOutputStream.PutNextEntry(e);
callback(_zipOutputStream);
_zipOutputStream.CloseEntry();
}
public void Dispose()
{
if (z != null)
if (_zipOutputStream != null)
{
z.Dispose();
z = null;
_zipOutputStream.Dispose();
_zipOutputStream = null;
}
}
}

View File

@ -5,7 +5,7 @@ namespace BizHawk.Client.Common
{
/// <summary>
/// This class holds logic for System information.
/// That means specifiactions about a system that BizHawk emulate
/// That means specifications about a system that BizHawk emulates
/// </summary>
public sealed class SystemInfo
{
@ -26,39 +26,43 @@ namespace BizHawk.Client.Common
#region cTor(s)
/// <summary>
/// Initializes static members of the <see cref="SystemInfo"/> class.
/// Global initialization stuff
/// </summary>
/// <remarks>DO NOT CHANGE List order because properties depends on it (and it is hardcoded)</remarks>
/// <remarks>
/// DO NOT CHANGE List order because properties depends on it (and it is hardcoded)
/// </remarks>
static SystemInfo()
{
allSystemInfos = new List<SystemInfo>(26);
allSystemInfos.Add(new SystemInfo(string.Empty));
allSystemInfos.Add(new SystemInfo("NES", CoreSystem.NES, 2, StandardButtons));
allSystemInfos.Add(new SystemInfo("Intellivision", CoreSystem.Intellivision, 2));
allSystemInfos.Add(new SystemInfo("Sega Master System", CoreSystem.MasterSystem, 2, UpDownLeftRight | JoypadButton.B1 | JoypadButton.B2));
allSystemInfos.Add(new SystemInfo("SG-1000", CoreSystem.MasterSystem, 1));
allSystemInfos.Add(new SystemInfo("Game Gear", CoreSystem.MasterSystem, 1, UpDownLeftRight | JoypadButton.B1 | JoypadButton.B2));
allSystemInfos.Add(new SystemInfo("TurboGrafx-16", CoreSystem.PCEngine, 1));
allSystemInfos.Add(new SystemInfo("TurboGrafx - 16(CD)", CoreSystem.PCEngine, 1));
allSystemInfos.Add(new SystemInfo("SuperGrafx", CoreSystem.PCEngine, 1));
allSystemInfos.Add(new SystemInfo("Genesis", CoreSystem.Genesis, 2, UpDownLeftRight | JoypadButton.A | JoypadButton.B | JoypadButton.C | JoypadButton.X | JoypadButton.Y | JoypadButton.Z));
allSystemInfos.Add(new SystemInfo("TI - 83", CoreSystem.TI83, 1));
allSystemInfos.Add(new SystemInfo("SNES", CoreSystem.SNES, 8, StandardButtons | JoypadButton.X | JoypadButton.Y | JoypadButton.L | JoypadButton.R));
allSystemInfos.Add(new SystemInfo("GB", CoreSystem.GameBoy, 1, StandardButtons));
allSystemInfos.Add(new SystemInfo("Gameboy Color", CoreSystem.GameBoy, 1, StandardButtons)); //13 (0 based)
allSystemInfos.Add(new SystemInfo("Atari 2600", CoreSystem.Atari2600, 1));
allSystemInfos.Add(new SystemInfo("Atari 7800", CoreSystem.Atari7800, 1));
allSystemInfos.Add(new SystemInfo("Commodore 64", CoreSystem.Commodore64, 1));
allSystemInfos.Add(new SystemInfo("ColecoVision", CoreSystem.ColecoVision, 1));
allSystemInfos.Add(new SystemInfo("Gameboy Advance", CoreSystem.GameBoyAdvance, 1, StandardButtons | JoypadButton.L | JoypadButton.R));
allSystemInfos.Add(new SystemInfo("Nintendo 64", CoreSystem.Nintendo64, 4, StandardButtons ^ JoypadButton.Select | JoypadButton.Z | JoypadButton.CUp | JoypadButton.CDown | JoypadButton.CLeft | JoypadButton.CRight | JoypadButton.AnalogStick | JoypadButton.L | JoypadButton.R));
allSystemInfos.Add(new SystemInfo("Saturn", CoreSystem.Saturn, 2, UpDownLeftRight | JoypadButton.A | JoypadButton.B | JoypadButton.C | JoypadButton.X | JoypadButton.Y | JoypadButton.Z));
allSystemInfos.Add(new SystemInfo("Game Boy Link", CoreSystem.DualGameBoy, 2, StandardButtons));
allSystemInfos.Add(new SystemInfo("WonderSwan", CoreSystem.WonderSwan, 1));
allSystemInfos.Add(new SystemInfo("Lynx", CoreSystem.Lynx, 1));
allSystemInfos.Add(new SystemInfo("PlayStation", CoreSystem.Playstation, 2));
allSystemInfos.Add(new SystemInfo("Apple II", CoreSystem.AppleII, 1));
allSystemInfos = new List<SystemInfo>(26)
{
new SystemInfo(string.Empty),
new SystemInfo("NES", CoreSystem.NES, 2, StandardButtons),
new SystemInfo("Intellivision", CoreSystem.Intellivision, 2),
new SystemInfo("Sega Master System", CoreSystem.MasterSystem, 2, UpDownLeftRight | JoypadButton.B1 | JoypadButton.B2),
new SystemInfo("SG-1000", CoreSystem.MasterSystem, 1),
new SystemInfo("Game Gear", CoreSystem.MasterSystem, 1, UpDownLeftRight | JoypadButton.B1 | JoypadButton.B2),
new SystemInfo("TurboGrafx-16", CoreSystem.PCEngine, 1),
new SystemInfo("TurboGrafx - 16(CD)", CoreSystem.PCEngine, 1),
new SystemInfo("SuperGrafx", CoreSystem.PCEngine, 1),
new SystemInfo("Genesis", CoreSystem.Genesis, 2, UpDownLeftRight | JoypadButton.A | JoypadButton.B | JoypadButton.C | JoypadButton.X | JoypadButton.Y | JoypadButton.Z),
new SystemInfo("TI - 83", CoreSystem.TI83, 1),
new SystemInfo("SNES", CoreSystem.SNES, 8, StandardButtons | JoypadButton.X | JoypadButton.Y | JoypadButton.L | JoypadButton.R),
new SystemInfo("GB", CoreSystem.GameBoy, 1, StandardButtons),
new SystemInfo("Gameboy Color", CoreSystem.GameBoy, 1, StandardButtons), // 13 (0 based)
new SystemInfo("Atari 2600", CoreSystem.Atari2600, 1),
new SystemInfo("Atari 7800", CoreSystem.Atari7800, 1),
new SystemInfo("Commodore 64", CoreSystem.Commodore64, 1),
new SystemInfo("ColecoVision", CoreSystem.ColecoVision, 1),
new SystemInfo("Gameboy Advance", CoreSystem.GameBoyAdvance, 1, StandardButtons | JoypadButton.L | JoypadButton.R),
new SystemInfo("Nintendo 64", CoreSystem.Nintendo64, 4, StandardButtons ^ JoypadButton.Select | JoypadButton.Z | JoypadButton.CUp | JoypadButton.CDown | JoypadButton.CLeft | JoypadButton.CRight | JoypadButton.AnalogStick | JoypadButton.L | JoypadButton.R),
new SystemInfo("Saturn", CoreSystem.Saturn, 2, UpDownLeftRight | JoypadButton.A | JoypadButton.B | JoypadButton.C | JoypadButton.X | JoypadButton.Y | JoypadButton.Z),
new SystemInfo("Game Boy Link", CoreSystem.DualGameBoy, 2, StandardButtons),
new SystemInfo("WonderSwan", CoreSystem.WonderSwan, 1),
new SystemInfo("Lynx", CoreSystem.Lynx, 1),
new SystemInfo("PlayStation", CoreSystem.Playstation, 2),
new SystemInfo("Apple II", CoreSystem.AppleII, 1)
};
}
/// <summary>
@ -84,7 +88,8 @@ namespace BizHawk.Client.Common
/// <param name="maxControllers">Maximum controller allowed by this system</param>
private SystemInfo(string displayName, CoreSystem system, int maxControllers)
: this(displayName, system, maxControllers, 0)
{ }
{
}
/// <summary>
/// Initialize a new instance of <see cref="SystemInfo"/>
@ -92,324 +97,145 @@ namespace BizHawk.Client.Common
/// <param name="displayName">A <see cref="string"/> that specify how the system name is displayed</param>
private SystemInfo(string displayName)
: this(displayName, CoreSystem.Null, 0, 0)
{ }
{
}
#endregion
#region Methods
#region Methods
#region Get SystemInfo
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for Apple II
/// </summary
public static SystemInfo AppleII
{
get
{
return allSystemInfos[25];
}
}
public static SystemInfo AppleII => allSystemInfos[25];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for Atari 2600
/// </summary
public static SystemInfo Atari2600
{
get
{
return allSystemInfos[14];
}
}
public static SystemInfo Atari2600 => allSystemInfos[14];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for Atari 7800
/// </summary>
public static SystemInfo Atari7800
{
get
{
return allSystemInfos[15];
}
}
public static SystemInfo Atari7800 => allSystemInfos[15];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for Commodore 64
/// </summary>
public static SystemInfo C64
{
get
{
return allSystemInfos[16];
}
}
public static SystemInfo C64 => allSystemInfos[16];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for Coleco Vision
/// </summary>
public static SystemInfo Coleco
{
get
{
return allSystemInfos[17];
}
}
public static SystemInfo Coleco => allSystemInfos[17];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for Dual Gameboy
/// </summary>
public static SystemInfo DualGB
{
get
{
return allSystemInfos[21];
}
}
public static SystemInfo DualGB => allSystemInfos[21];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for Gameboy
/// </summary>
public static SystemInfo GB
{
get
{
return allSystemInfos[12];
}
}
public static SystemInfo GB => allSystemInfos[12];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for Gameboy Advance
/// </summary>
public static SystemInfo GBA
{
get
{
return allSystemInfos[18];
}
}
public static SystemInfo GBA => allSystemInfos[18];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for Gameboy Color
/// </summary>
public static SystemInfo GBC
{
get
{
return allSystemInfos[13];
}
}
public static SystemInfo GBC => allSystemInfos[13];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for Genesis
/// </summary>
public static SystemInfo Genesis
{
get
{
return allSystemInfos[9];
}
}
public static SystemInfo Genesis => allSystemInfos[9];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for Game Gear
/// </summary>
public static SystemInfo GG
{
get
{
return allSystemInfos[5];
}
}
public static SystemInfo GG => allSystemInfos[5];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for Intellivision
/// </summary>
public static SystemInfo Intellivision
{
get
{
return allSystemInfos[2];
}
}
public static SystemInfo Intellivision => allSystemInfos[2];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for Lynx
/// </summary>
public static SystemInfo Lynx
{
get
{
return allSystemInfos[23];
}
}
public static SystemInfo Lynx => allSystemInfos[23];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for NES
/// </summary>
public static SystemInfo Nes
{
get
{
return allSystemInfos[1];
}
}
public static SystemInfo Nes => allSystemInfos[1];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for Nintendo 64
/// </summary>
public static SystemInfo N64
{
get
{
return allSystemInfos[19];
}
}
public static SystemInfo N64 => allSystemInfos[19];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for Null (i.e. nothing is emulated) emulator
/// </summary>
public static SystemInfo Null
{
get
{
return allSystemInfos[0];
}
}
public static SystemInfo Null => allSystemInfos[0];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for PCEngine (TurboGrafx-16)
/// </summary>
public static SystemInfo PCE
{
get
{
return allSystemInfos[6];
}
}
public static SystemInfo PCE => allSystemInfos[6];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for PCEngine (TurboGrafx-16) + CD
/// </summary>
public static SystemInfo PCECD
{
get
{
return allSystemInfos[7];
}
}
public static SystemInfo PCECD => allSystemInfos[7];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for PlayStation
/// </summary>
public static SystemInfo PSX
{
get
{
return allSystemInfos[24];
}
}
public static SystemInfo PSX => allSystemInfos[24];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for Sega Saturn
/// </summary>
public static SystemInfo Saturn
{
get
{
return allSystemInfos[20];
}
}
public static SystemInfo Saturn => allSystemInfos[20];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for SG-1000 (Sega Game 1000)
/// </summary>
public static SystemInfo SG
{
get
{
return allSystemInfos[4];
}
}
public static SystemInfo SG => allSystemInfos[4];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for PCEngine (Supergraph FX)
/// </summary>
public static SystemInfo SGX
{
get
{
return allSystemInfos[8];
}
}
public static SystemInfo SGX => allSystemInfos[8];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for Sega Master System
/// </summary>
public static SystemInfo SMS
{
get
{
return allSystemInfos[3];
}
}
public static SystemInfo SMS => allSystemInfos[3];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for SNES
/// </summary>
public static SystemInfo SNES
{
get
{
return allSystemInfos[11];
}
}
public static SystemInfo SNES => allSystemInfos[11];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for TI-83
/// </summary>
public static SystemInfo TI83
{
get
{
return allSystemInfos[10];
}
}
public static SystemInfo TI83 => allSystemInfos[10];
/// <summary>
/// Gets the <see cref="SystemInfo"/> instance for TI-83
/// </summary>
public static SystemInfo WonderSwan
{
get
{
return allSystemInfos[22];
}
}
public static SystemInfo WonderSwan => allSystemInfos[22];
#endregion Get SystemInfo
/// <summary>
@ -433,10 +259,8 @@ namespace BizHawk.Client.Common
{
return this == (SystemInfo)obj;
}
else
{
return base.Equals(obj);
}
return base.Equals(obj);
}
/// <summary>
@ -490,48 +314,23 @@ namespace BizHawk.Client.Common
/// <summary>
/// Gets <see cref="JoypadButton"/> available for this system
/// </summary>
public JoypadButton AvailableButtons
{
get
{
return _AvailableButtons;
}
}
public JoypadButton AvailableButtons => _AvailableButtons;
/// <summary>
/// <summary>
/// Gets the sytem name as <see cref="string"/>
/// </summary>
public string DisplayName
{
get
{
return _DisplayName;
}
}
public string DisplayName => _DisplayName;
/// <summary>
/// <summary>
/// Gets the maximum amount of controller allowed for this system
/// </summary>
public int MaxControllers
{
get
{
return _MaxControllers;
}
}
public int MaxControllers => _MaxControllers;
/// <summary>
/// <summary>
/// Gets core used for this system as <see cref="CoreSystem"/> enum
/// </summary>
public CoreSystem System
{
get
{
return _System;
}
}
public CoreSystem System => _System;
#endregion
#endregion
}
}

View File

@ -21,9 +21,9 @@ namespace BizHawk.Client.Common
}
public XmlDocument Xml { get; set; }
public GameInfo GI { get; set; }
public IList<KeyValuePair<string, byte[]>> Assets { get; set; }
public IList<string> AssetFullPaths { get; set; } // TODO: Hack work around, to avoid having to refactor Assets into a object array, should be refactored!
public GameInfo GI { get; }
public IList<KeyValuePair<string, byte[]>> Assets { get; }
public IList<string> AssetFullPaths { get; } // TODO: Hack work around, to avoid having to refactor Assets into a object array, should be refactored!
public static XmlGame Create(HawkFile f)
{
@ -38,15 +38,15 @@ namespace BizHawk.Client.Common
}
var ret = new XmlGame
{
GI =
{
GI =
{
System = y.Attributes["System"].Value,
Name = y.Attributes["Name"].Value,
Status = RomStatus.Unknown
},
Xml = x
};
System = y.Attributes["System"].Value,
Name = y.Attributes["Name"].Value,
Status = RomStatus.Unknown
},
Xml = x
};
string fullpath = string.Empty;
var n = y.SelectSingleNode("./LoadAssets");
@ -100,8 +100,6 @@ namespace BizHawk.Client.Common
data = File.ReadAllBytes(fullpath.Split('|').First());
}
}
}
catch
{

View File

@ -2,16 +2,15 @@
using System.Collections.Generic;
using System.Linq;
//TODO [LARP] - It's pointless and annoying to store such a big structure filled with static information
//use this instead
//public class UserBinding
//{
// TODO [LARP] - It's pointless and annoying to store such a big structure filled with static information
// use this instead
// public class UserBinding
// {
// public string DisplayName;
// public string Bindings;
//}
//...also. We should consider using something other than DisplayName for keying, maybe make a KEYNAME distinct from displayname.
//displayname is OK for now though.
// }
// ...also. We should consider using something other than DisplayName for keying, maybe make a KEYNAME distinct from displayname.
// displayname is OK for now though.
namespace BizHawk.Client.Common
{
public class Binding
@ -27,7 +26,7 @@ namespace BizHawk.Client.Common
[Newtonsoft.Json.JsonObject]
public class BindingCollection : IEnumerable<Binding>
{
public List<Binding> Bindings { get; private set; }
public List<Binding> Bindings { get; }
[Newtonsoft.Json.JsonConstructor]
public BindingCollection(List<Binding> Bindings)
@ -75,7 +74,7 @@ namespace BizHawk.Client.Common
{
//TODO - this method is potentially disastrously O(N^2) slow due to linear search nested in loop
//Add missing entries
// Add missing entries
foreach (Binding default_binding in DefaultValues)
{
var binding = Bindings.FirstOrDefault(x => x.DisplayName == default_binding.DisplayName);
@ -85,7 +84,7 @@ namespace BizHawk.Client.Common
}
else
{
//patch entries with updated settings (necessary because of TODO LARP
// patch entries with updated settings (necessary because of TODO LARP
binding.Ordinal = default_binding.Ordinal;
binding.DefaultBinding = default_binding.DefaultBinding;
binding.TabGroup = default_binding.TabGroup;
@ -96,13 +95,11 @@ namespace BizHawk.Client.Common
List<Binding> entriesToRemove = (from entry in Bindings let binding = DefaultValues.FirstOrDefault(x => x.DisplayName == entry.DisplayName) where binding == null select entry).ToList();
//Remove entries that no longer exist in defaults
// Remove entries that no longer exist in defaults
foreach (Binding entry in entriesToRemove)
{
Bindings.Remove(entry);
}
}
static List<Binding> s_DefaultValues;
@ -257,13 +254,14 @@ namespace BizHawk.Client.Common
Bind("Analog", "X Down Large", toolTip: "For Virtual Pad"),
Bind("Tools", "Toggle All Cheats"),
};
//set ordinals based on order in list
// set ordinals based on order in list
for (int i = 0; i < s_DefaultValues.Count; i++)
{
s_DefaultValues[i].Ordinal = i;
} //if (s_DefaultValues == null)
}
} // if (s_DefaultValues == null)
return s_DefaultValues;
}

View File

@ -1,7 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BizHawk.Client.EmuHawk
{

View File

@ -10,7 +10,7 @@ namespace BizHawk.Client.Common
{
public static class ConfigService
{
static JsonSerializer Serializer;
private static JsonSerializer Serializer;
static ConfigService()
{
@ -39,11 +39,13 @@ namespace BizHawk.Client.Common
{
var file = new FileInfo(filepath);
if (file.Exists)
{
using (var reader = file.OpenText())
{
var r = new JsonTextReader(reader);
config = (T)Serializer.Deserialize(r, typeof(T));
}
}
}
catch (Exception ex)
{
@ -51,7 +53,9 @@ namespace BizHawk.Client.Common
}
if (config == null)
{
return new T();
}
return config;
}
@ -74,7 +78,6 @@ namespace BizHawk.Client.Common
}
// movie 1.0 header stuff
private class TypeNameEncapsulator
{
public object o;
@ -86,12 +89,10 @@ namespace BizHawk.Client.Common
using (JsonTextReader jr = new JsonTextReader(tr))
{
TypeNameEncapsulator tne = (TypeNameEncapsulator)Serializer.Deserialize(jr, typeof(TypeNameEncapsulator));
// in the case of trying to deserialize nothing, tne will be nothing
// we want to return nothing
if (tne != null)
return tne.o;
else
return null;
return tne?.o;
}
}

View File

@ -27,7 +27,7 @@ namespace BizHawk.Client.Common
[Newtonsoft.Json.JsonObject]
public class PathEntryCollection : IEnumerable<PathEntry>
{
public List<PathEntry> Paths { get; private set; }
public List<PathEntry> Paths { get; }
public PathEntryCollection()
{
@ -36,9 +36,9 @@ namespace BizHawk.Client.Common
}
[Newtonsoft.Json.JsonConstructor]
public PathEntryCollection(List<PathEntry> Paths)
public PathEntryCollection(List<PathEntry> paths)
{
this.Paths = Paths;
Paths = paths;
}
public void Add(PathEntry p)
@ -78,12 +78,12 @@ namespace BizHawk.Client.Common
Paths.AddRange(new[]
{
new PathEntry { System = system, SystemDisplayName=systemdisp, Type = "Base", Path= Path.Combine(".", systempath), Ordinal = 0 },
new PathEntry { System = system, SystemDisplayName=systemdisp, Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = system, SystemDisplayName=systemdisp, Type = "Savestates", Path= Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = system, SystemDisplayName=systemdisp, Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = system, SystemDisplayName=systemdisp, Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = system, SystemDisplayName=systemdisp, Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }
new PathEntry { System = system, SystemDisplayName = systemdisp, Type = "Base", Path = Path.Combine(".", systempath), Ordinal = 0 },
new PathEntry { System = system, SystemDisplayName = systemdisp, Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = system, SystemDisplayName = systemdisp, Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = system, SystemDisplayName = systemdisp, Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = system, SystemDisplayName = systemdisp, Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = system, SystemDisplayName = systemdisp, Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 }
});
return this[system, type];
@ -91,7 +91,7 @@ namespace BizHawk.Client.Common
public void ResolveWithDefaults()
{
//Add missing entries
// Add missing entries
foreach (PathEntry defaultpath in DefaultValues)
{
var path = Paths.FirstOrDefault(x => x.System == defaultpath.System && x.Type == defaultpath.Type);
@ -103,7 +103,7 @@ namespace BizHawk.Client.Common
List<PathEntry> entriesToRemove = new List<PathEntry>();
//Remove entries that no longer exist in defaults
// Remove entries that no longer exist in defaults
foreach (PathEntry pathEntry in Paths)
{
var path = DefaultValues.FirstOrDefault(x => x.System == pathEntry.System && x.Type == pathEntry.Type);
@ -118,21 +118,15 @@ namespace BizHawk.Client.Common
Paths.Remove(entry);
}
//Add missing displaynames
// Add missing displaynames
var missingDisplayPaths = Paths.Where(x => x.SystemDisplayName == null).ToList();
foreach (PathEntry path in missingDisplayPaths)
{
path.SystemDisplayName = DefaultValues.FirstOrDefault(x => x.System == path.System).SystemDisplayName;
}
}
public string ToolsPathFragment
{
get { return Global.Config.PathEntries["Global", "Tools"].Path; }
}
private static string ResolveToolsPath(string subPath)
private static string ResolveToolsPath(string subPath)
{
if (Path.IsPathRooted(subPath))
{
@ -150,216 +144,206 @@ namespace BizHawk.Client.Common
return Path.Combine(toolsPath, subPath);
}
//Some frequently requested paths, made into a property for convenience
public string WatchPathFragment
// Some frequently requested paths, made into a property for convenience
public string ToolsPathFragment => Global.Config.PathEntries["Global", "Tools"].Path;
public string WatchPathFragment => ResolveToolsPath(Global.Config.PathEntries["Global", "Watch (.wch)"].Path);
public string MultiDiskBundlesFragment => ResolveToolsPath(Global.Config.PathEntries["Global", "Multi-Disk Bundles"].Path);
public string LogPathFragment => ResolveToolsPath(Global.Config.PathEntries["Global", "Debug Logs"].Path);
public string MoviesPathFragment => Global.Config.PathEntries["Global", "Movies"].Path;
public string LuaPathFragment => Global.Config.PathEntries["Global", "Lua"].Path;
public string FirmwaresPathFragment => Global.Config.PathEntries["Global", "Firmware"].Path;
public string AvPathFragment => Global.Config.PathEntries["Global", "A/V Dumps"].Path;
public string GlobalRomFragment => Global.Config.PathEntries["Global", "ROM"].Path;
// this one is special
public string GlobalBaseFragment => Global.Config.PathEntries["Global", "Base"].Path;
public static List<PathEntry> DefaultValues => new List<PathEntry>
{
get { return ResolveToolsPath(Global.Config.PathEntries["Global", "Watch (.wch)"].Path); }
}
new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "Base", Path = ".", Ordinal = 1 },
new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "ROM", Path = ".", Ordinal = 2 },
new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "Firmware", Path = Path.Combine(".", "Firmware"), Ordinal = 3 },
new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "Movies", Path = Path.Combine(".", "Movies"), Ordinal = 4 },
new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "Movie backups", Path = Path.Combine(".", "Movies", "backup"), Ordinal = 5 },
new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "A/V Dumps", Path = ".", Ordinal = 6 },
new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "Tools", Path = Path.Combine(".", "Tools"), Ordinal = 7 },
new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "Lua", Path = Path.Combine(".", "Lua"), Ordinal = 8 },
new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "Watch (.wch)", Path = Path.Combine(".", "."), Ordinal = 9 },
new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "Debug Logs", Path = Path.Combine(".", string.Empty), Ordinal = 10 },
new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "Macros", Path = Path.Combine(".", "Movies", "Macros"), Ordinal = 11 },
new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "TAStudio states", Path = Path.Combine(".", "Movies", "TAStudio states"), Ordinal = 12 },
new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "Multi-Disk Bundles", Path = Path.Combine(".", string.Empty), Ordinal = 13 },
new PathEntry { System = "Global_NULL", SystemDisplayName = "Global", Type = "External Tools", Path = Path.Combine(".", "ExternalTools"), Ordinal = 14 },
public string MultiDiskBundlesFragment
{
get { return ResolveToolsPath(Global.Config.PathEntries["Global", "Multi-Disk Bundles"].Path); }
}
new PathEntry { System = "INTV", SystemDisplayName = "Intellivision", Type = "Base", Path = Path.Combine(".", "Intellivision"), Ordinal = 0 },
new PathEntry { System = "INTV", SystemDisplayName = "Intellivision", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "INTV", SystemDisplayName = "Intellivision", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "INTV", SystemDisplayName = "Intellivision", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "INTV", SystemDisplayName = "Intellivision", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "INTV", SystemDisplayName = "Intellivision", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "INTV", SystemDisplayName = "Intellivision", Type = "Palettes", Path = Path.Combine(".", "Palettes"), Ordinal = 6 },
public string LogPathFragment
{
get { return ResolveToolsPath(Global.Config.PathEntries["Global", "Debug Logs"].Path); }
}
new PathEntry { System = "NES", SystemDisplayName = "NES", Type = "Base", Path = Path.Combine(".", "NES"), Ordinal = 0 },
new PathEntry { System = "NES", SystemDisplayName = "NES", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "NES", SystemDisplayName = "NES", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "NES", SystemDisplayName = "NES", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "NES", SystemDisplayName = "NES", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "NES", SystemDisplayName = "NES", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "NES", SystemDisplayName = "NES", Type = "Palettes", Path = Path.Combine(".", "Palettes"), Ordinal = 6 },
public string MoviesPathFragment { get { return Global.Config.PathEntries["Global", "Movies"].Path; } }
public string LuaPathFragment { get { return Global.Config.PathEntries["Global", "Lua"].Path; } }
public string FirmwaresPathFragment { get { return Global.Config.PathEntries["Global", "Firmware"].Path; } }
public string AvPathFragment { get { return Global.Config.PathEntries["Global", "A/V Dumps"].Path; } }
public string GlobalRomFragment { get { return Global.Config.PathEntries["Global", "ROM"].Path; } }
new PathEntry { System = "SNES_SGB", SystemDisplayName = "SNES", Type = "Base", Path = Path.Combine(".", "SNES"), Ordinal = 0 },
new PathEntry { System = "SNES_SGB", SystemDisplayName = "SNES", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "SNES_SGB", SystemDisplayName = "SNES", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "SNES_SGB", SystemDisplayName = "SNES", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "SNES_SGB", SystemDisplayName = "SNES", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "SNES_SGB", SystemDisplayName = "SNES", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
//this one is special
public string GlobalBaseFragment { get { return Global.Config.PathEntries["Global", "Base"].Path; } }
new PathEntry { System = "GBA", SystemDisplayName = "GBA", Type = "Base", Path = Path.Combine(".", "GBA"), Ordinal = 0 },
new PathEntry { System = "GBA", SystemDisplayName = "GBA", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "GBA", SystemDisplayName = "GBA", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "GBA", SystemDisplayName = "GBA", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "GBA", SystemDisplayName = "GBA", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "GBA", SystemDisplayName = "GBA", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
public static List<PathEntry> DefaultValues
{
get
{
return new List<PathEntry>
{
new PathEntry { System = "Global_NULL", SystemDisplayName="Global", Type = "Base", Path = ".", Ordinal = 1 },
new PathEntry { System = "Global_NULL", SystemDisplayName="Global", Type = "ROM", Path = ".", Ordinal = 2 },
new PathEntry { System = "Global_NULL", SystemDisplayName="Global", Type = "Firmware", Path = Path.Combine(".", "Firmware"), Ordinal = 3 },
new PathEntry { System = "Global_NULL", SystemDisplayName="Global", Type = "Movies", Path = Path.Combine(".", "Movies"), Ordinal = 4 },
new PathEntry { System = "Global_NULL", SystemDisplayName="Global", Type = "Movie backups", Path = Path.Combine(".", "Movies", "backup"), Ordinal = 5 },
new PathEntry { System = "Global_NULL", SystemDisplayName="Global", Type = "A/V Dumps", Path = ".", Ordinal = 6 },
new PathEntry { System = "Global_NULL", SystemDisplayName="Global", Type = "Tools", Path = Path.Combine(".", "Tools"), Ordinal = 7 },
new PathEntry { System = "Global_NULL", SystemDisplayName="Global", Type = "Lua", Path = Path.Combine(".", "Lua"), Ordinal = 8 },
new PathEntry { System = "Global_NULL", SystemDisplayName="Global", Type = "Watch (.wch)", Path = Path.Combine(".", "."), Ordinal = 9 },
new PathEntry { System = "Global_NULL", SystemDisplayName="Global", Type = "Debug Logs", Path = Path.Combine(".", ""), Ordinal = 10 },
new PathEntry { System = "Global_NULL", SystemDisplayName="Global", Type = "Macros", Path = Path.Combine(".", "Movies", "Macros"), Ordinal = 11 },
new PathEntry { System = "Global_NULL", SystemDisplayName="Global", Type = "TAStudio states", Path = Path.Combine(".", "Movies", "TAStudio states"), Ordinal = 12 },
new PathEntry { System = "Global_NULL", SystemDisplayName="Global", Type = "Multi-Disk Bundles", Path = Path.Combine(".", ""), Ordinal = 13 },
new PathEntry { System = "Global_NULL", SystemDisplayName="Global", Type = "External Tools", Path = Path.Combine(".", "ExternalTools"), Ordinal = 14 },
new PathEntry { System = "SMS", SystemDisplayName = "SMS", Type = "Base", Path = Path.Combine(".", "SMS"), Ordinal = 0 },
new PathEntry { System = "SMS", SystemDisplayName = "SMS", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "SMS", SystemDisplayName = "SMS", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "SMS", SystemDisplayName = "SMS", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "SMS", SystemDisplayName = "SMS", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "SMS", SystemDisplayName = "SMS", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "INTV", SystemDisplayName="Intellivision", Type = "Base", Path = Path.Combine(".", "Intellivision"), Ordinal = 0 },
new PathEntry { System = "INTV", SystemDisplayName="Intellivision", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "INTV", SystemDisplayName="Intellivision", Type = "Savestates", Path= Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "INTV", SystemDisplayName="Intellivision", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "INTV", SystemDisplayName="Intellivision", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "INTV", SystemDisplayName="Intellivision", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "INTV", SystemDisplayName="Intellivision", Type = "Palettes", Path = Path.Combine(".", "Palettes"), Ordinal = 6 },
new PathEntry { System = "GG", SystemDisplayName = "GG", Type = "Base", Path = Path.Combine(".", "Game Gear"), Ordinal = 0 },
new PathEntry { System = "GG", SystemDisplayName = "GG", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "GG", SystemDisplayName = "GG", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "GG", SystemDisplayName = "GG", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "GG", SystemDisplayName = "GG", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "GG", SystemDisplayName = "GG", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "NES", SystemDisplayName="NES", Type = "Base", Path = Path.Combine(".", "NES"), Ordinal = 0 },
new PathEntry { System = "NES", SystemDisplayName="NES", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "NES", SystemDisplayName="NES", Type = "Savestates", Path= Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "NES", SystemDisplayName="NES", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "NES", SystemDisplayName="NES", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "NES", SystemDisplayName="NES", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "NES", SystemDisplayName="NES", Type = "Palettes", Path = Path.Combine(".", "Palettes"), Ordinal = 6 },
new PathEntry { System = "SG", SystemDisplayName = "SG", Type = "Base", Path = Path.Combine(".", "SG-1000"), Ordinal = 0 },
new PathEntry { System = "SG", SystemDisplayName = "SG", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "SG", SystemDisplayName = "SG", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "SG", SystemDisplayName = "SG", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "SG", SystemDisplayName = "SG", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "SG", SystemDisplayName = "SG", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "SNES_SGB", SystemDisplayName="SNES", Type = "Base", Path = Path.Combine(".", "SNES"), Ordinal = 0 },
new PathEntry { System = "SNES_SGB", SystemDisplayName="SNES", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "SNES_SGB", SystemDisplayName="SNES", Type = "Savestates", Path= Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "SNES_SGB", SystemDisplayName="SNES", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "SNES_SGB", SystemDisplayName="SNES", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "SNES_SGB", SystemDisplayName="SNES", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "GEN", SystemDisplayName = "Genesis", Type = "Base", Path = Path.Combine(".", "Genesis"), Ordinal = 0 },
new PathEntry { System = "GEN", SystemDisplayName = "Genesis", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "GEN", SystemDisplayName = "Genesis", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "GEN", SystemDisplayName = "Genesis", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "GEN", SystemDisplayName = "Genesis", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "GEN", SystemDisplayName = "Genesis", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "GBA", SystemDisplayName="GBA", Type = "Base", Path = Path.Combine(".", "GBA"), Ordinal = 0 },
new PathEntry { System = "GBA", SystemDisplayName="GBA", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "GBA", SystemDisplayName="GBA", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "GBA", SystemDisplayName="GBA", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "GBA", SystemDisplayName="GBA", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "GBA", SystemDisplayName="GBA", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "PCE_PCECD_SGX", SystemDisplayName = "PC Engine", Type = "Base", Path = Path.Combine(".", "PC Engine"), Ordinal = 0 },
new PathEntry { System = "PCE_PCECD_SGX", SystemDisplayName = "PC Engine", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "PCE_PCECD_SGX", SystemDisplayName = "PC Engine", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "PCE_PCECD_SGX", SystemDisplayName = "PC Engine", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "PCE_PCECD_SGX", SystemDisplayName = "PC Engine", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "PCE_PCECD_SGX", SystemDisplayName = "PC Engine", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "SMS", SystemDisplayName="SMS", Type = "Base", Path= Path.Combine(".", "SMS"), Ordinal = 0 },
new PathEntry { System = "SMS", SystemDisplayName="SMS", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "SMS", SystemDisplayName="SMS", Type = "Savestates", Path= Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "SMS", SystemDisplayName="SMS", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "SMS", SystemDisplayName="SMS", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "SMS", SystemDisplayName="SMS", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "GB_GBC", SystemDisplayName = "Gameboy", Type = "Base", Path = Path.Combine(".", "Gameboy"), Ordinal = 0 },
new PathEntry { System = "GB_GBC", SystemDisplayName = "Gameboy", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "GB_GBC", SystemDisplayName = "Gameboy", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "GB_GBC", SystemDisplayName = "Gameboy", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "GB_GBC", SystemDisplayName = "Gameboy", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "GB_GBC", SystemDisplayName = "Gameboy", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "GB_GBC", SystemDisplayName = "Gameboy", Type = "Palettes", Path = Path.Combine(".", "Palettes"), Ordinal = 6 },
new PathEntry { System = "GG", SystemDisplayName="GG", Type = "Base", Path = Path.Combine(".", "Game Gear"), Ordinal = 0 },
new PathEntry { System = "GG", SystemDisplayName="GG", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "GG", SystemDisplayName="GG", Type = "Savestates", Path= Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "GG", SystemDisplayName="GG", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "GG", SystemDisplayName="GG", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "GG", SystemDisplayName="GG", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "DGB", SystemDisplayName = "Dual Gameboy", Type = "Base", Path = Path.Combine(".", "Dual Gameboy"), Ordinal = 0 },
new PathEntry { System = "DGB", SystemDisplayName = "Dual Gameboy", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "DGB", SystemDisplayName = "Dual Gameboy", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "DGB", SystemDisplayName = "Dual Gameboy", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "DGB", SystemDisplayName = "Dual Gameboy", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "DGB", SystemDisplayName = "Dual Gameboy", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "DGB", SystemDisplayName = "Dual Gameboy", Type = "Palettes", Path = Path.Combine(".", "Palettes"), Ordinal = 6 },
new PathEntry { System = "SG", SystemDisplayName="SG", Type = "Base", Path = Path.Combine(".", "SG-1000"), Ordinal = 0 },
new PathEntry { System = "SG", SystemDisplayName="SG", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "SG", SystemDisplayName="SG", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "SG", SystemDisplayName="SG", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "SG", SystemDisplayName="SG", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "SG", SystemDisplayName="SG", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "TI83", SystemDisplayName = "TI83", Type = "Base", Path = Path.Combine(".", "TI83"), Ordinal = 0 },
new PathEntry { System = "TI83", SystemDisplayName = "TI83", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "TI83", SystemDisplayName = "TI83", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "TI83", SystemDisplayName = "TI83", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "TI83", SystemDisplayName = "TI83", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "TI83", SystemDisplayName = "TI83", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "GEN", SystemDisplayName="Genesis", Type = "Base", Path = Path.Combine(".", "Genesis"), Ordinal = 0 },
new PathEntry { System = "GEN", SystemDisplayName="Genesis", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "GEN", SystemDisplayName="Genesis", Type = "Savestates", Path= Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "GEN", SystemDisplayName="Genesis", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "GEN", SystemDisplayName="Genesis", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "GEN", SystemDisplayName="Genesis", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "A26", SystemDisplayName = "Atari 2600", Type = "Base", Path = Path.Combine(".", "Atari 2600"), Ordinal = 0 },
new PathEntry { System = "A26", SystemDisplayName = "Atari 2600", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "A26", SystemDisplayName = "Atari 2600", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "A26", SystemDisplayName = "Atari 2600", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "A26", SystemDisplayName = "Atari 2600", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "PCE_PCECD_SGX", SystemDisplayName="PC Engine", Type = "Base", Path = Path.Combine(".", "PC Engine"), Ordinal = 0 },
new PathEntry { System = "PCE_PCECD_SGX", SystemDisplayName="PC Engine", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "PCE_PCECD_SGX", SystemDisplayName="PC Engine", Type = "Savestates", Path= Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "PCE_PCECD_SGX", SystemDisplayName="PC Engine", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "PCE_PCECD_SGX", SystemDisplayName="PC Engine", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "PCE_PCECD_SGX", SystemDisplayName="PC Engine", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "A78", SystemDisplayName = "Atari 7800", Type = "Base", Path = Path.Combine(".", "Atari 7800"), Ordinal = 0 },
new PathEntry { System = "A78", SystemDisplayName = "Atari 7800", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "A78", SystemDisplayName = "Atari 7800", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "A78", SystemDisplayName = "Atari 7800", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "A78", SystemDisplayName = "Atari 7800", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "A78", SystemDisplayName = "Atari 7800", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "GB_GBC", SystemDisplayName="Gameboy", Type = "Base", Path= Path.Combine(".", "Gameboy"), Ordinal = 0 },
new PathEntry { System = "GB_GBC", SystemDisplayName="Gameboy", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "GB_GBC", SystemDisplayName="Gameboy", Type = "Savestates", Path= Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "GB_GBC", SystemDisplayName="Gameboy", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "GB_GBC", SystemDisplayName="Gameboy", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "GB_GBC", SystemDisplayName="Gameboy", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "GB_GBC", SystemDisplayName="Gameboy", Type = "Palettes", Path = Path.Combine(".", "Palettes"), Ordinal = 6 },
new PathEntry { System = "C64", SystemDisplayName = "Commodore 64", Type = "Base", Path = Path.Combine(".", "C64"), Ordinal = 0 },
new PathEntry { System = "C64", SystemDisplayName = "Commodore 64", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "C64", SystemDisplayName = "Commodore 64", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "C64", SystemDisplayName = "Commodore 64", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "C64", SystemDisplayName = "Commodore 64", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "DGB", SystemDisplayName="Dual Gameboy", Type = "Base", Path= Path.Combine(".", "Dual Gameboy"), Ordinal = 0 },
new PathEntry { System = "DGB", SystemDisplayName="Dual Gameboy", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "DGB", SystemDisplayName="Dual Gameboy", Type = "Savestates", Path= Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "DGB", SystemDisplayName="Dual Gameboy", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "DGB", SystemDisplayName="Dual Gameboy", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "DGB", SystemDisplayName="Dual Gameboy", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "DGB", SystemDisplayName="Dual Gameboy", Type = "Palettes", Path = Path.Combine(".", "Palettes"), Ordinal = 6 },
new PathEntry { System = "PSX", SystemDisplayName = "Playstation", Type = "Base", Path = Path.Combine(".", "PSX"), Ordinal = 0 },
new PathEntry { System = "PSX", SystemDisplayName = "Playstation", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "PSX", SystemDisplayName = "Playstation", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "PSX", SystemDisplayName = "Playstation", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "PSX", SystemDisplayName = "Playstation", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "PSX", SystemDisplayName = "Playstation", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "TI83", SystemDisplayName="TI83", Type = "Base", Path = Path.Combine(".", "TI83"), Ordinal = 0 },
new PathEntry { System = "TI83", SystemDisplayName="TI83", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "TI83", SystemDisplayName="TI83", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "TI83", SystemDisplayName="TI83", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "TI83", SystemDisplayName="TI83", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "TI83", SystemDisplayName="TI83", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "Coleco", SystemDisplayName = "Coleco", Type = "Base", Path = Path.Combine(".", "Coleco"), Ordinal = 0 },
new PathEntry { System = "Coleco", SystemDisplayName = "Coleco", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "Coleco", SystemDisplayName = "Coleco", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "Coleco", SystemDisplayName = "Coleco", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "Coleco", SystemDisplayName = "Coleco", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "A26", SystemDisplayName="Atari 2600", Type = "Base", Path = Path.Combine(".", "Atari 2600"), Ordinal = 0 },
new PathEntry { System = "A26", SystemDisplayName="Atari 2600", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "A26", SystemDisplayName="Atari 2600", Type = "Savestates", Path= Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "A26", SystemDisplayName="Atari 2600", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "A26", SystemDisplayName="Atari 2600", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "N64", SystemDisplayName = "N64", Type = "Base", Path = Path.Combine(".", "N64"), Ordinal = 0 },
new PathEntry { System = "N64", SystemDisplayName = "N64", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "N64", SystemDisplayName = "N64", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "N64", SystemDisplayName = "N64", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "N64", SystemDisplayName = "N64", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "N64", SystemDisplayName = "N64", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "A78", SystemDisplayName="Atari 7800", Type = "Base", Path = Path.Combine(".", "Atari 7800"), Ordinal = 0 },
new PathEntry { System = "A78", SystemDisplayName="Atari 7800", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "A78", SystemDisplayName="Atari 7800", Type = "Savestates", Path= Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "A78", SystemDisplayName="Atari 7800", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "A78", SystemDisplayName="Atari 7800", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "A78", SystemDisplayName="Atari 7800", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "SAT", SystemDisplayName = "Saturn", Type = "Base", Path = Path.Combine(".", "Saturn"), Ordinal = 0 },
new PathEntry { System = "SAT", SystemDisplayName = "Saturn", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "SAT", SystemDisplayName = "Saturn", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "SAT", SystemDisplayName = "Saturn", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "SAT", SystemDisplayName = "Saturn", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "SAT", SystemDisplayName = "Saturn", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "C64", SystemDisplayName="Commodore 64", Type = "Base", Path = Path.Combine(".", "C64"), Ordinal = 0 },
new PathEntry { System = "C64", SystemDisplayName="Commodore 64", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "C64", SystemDisplayName="Commodore 64", Type = "Savestates", Path= Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "C64", SystemDisplayName="Commodore 64", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "C64", SystemDisplayName="Commodore 64", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "WSWAN", SystemDisplayName = "WonderSwan", Type = "Base", Path = Path.Combine(".", "WonderSwan"), Ordinal = 0 },
new PathEntry { System = "WSWAN", SystemDisplayName = "WonderSwan", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "WSWAN", SystemDisplayName = "WonderSwan", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "WSWAN", SystemDisplayName = "WonderSwan", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "WSWAN", SystemDisplayName = "WonderSwan", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "WSWAN", SystemDisplayName = "WonderSwan", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "PSX", SystemDisplayName="Playstation", Type = "Base", Path = Path.Combine(".", "PSX"), Ordinal = 0 },
new PathEntry { System = "PSX", SystemDisplayName="Playstation", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "PSX", SystemDisplayName="Playstation", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "PSX", SystemDisplayName="Playstation", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "PSX", SystemDisplayName="Playstation", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "PSX", SystemDisplayName="Playstation", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "Lynx", SystemDisplayName = "Lynx", Type = "Base", Path = Path.Combine(".", "Lynx"), Ordinal = 0 },
new PathEntry { System = "Lynx", SystemDisplayName = "Lynx", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "Lynx", SystemDisplayName = "Lynx", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "Lynx", SystemDisplayName = "Lynx", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "Lynx", SystemDisplayName = "Lynx", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "Lynx", SystemDisplayName = "Lynx", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "Coleco", SystemDisplayName = "Coleco", Type = "Base", Path = Path.Combine(".", "Coleco"), Ordinal = 0 },
new PathEntry { System = "Coleco", SystemDisplayName = "Coleco", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "Coleco", SystemDisplayName = "Coleco", Type = "Savestates", Path= Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "Coleco", SystemDisplayName = "Coleco", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "Coleco", SystemDisplayName = "Coleco", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "AppleII", SystemDisplayName = "Apple II", Type = "Base", Path = Path.Combine(".", "Apple II"), Ordinal = 0 },
new PathEntry { System = "AppleII", SystemDisplayName = "Apple II", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "AppleII", SystemDisplayName = "Apple II", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "AppleII", SystemDisplayName = "Apple II", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "AppleII", SystemDisplayName = "Apple II", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "N64", SystemDisplayName = "N64", Type = "Base", Path= Path.Combine(".", "N64"), Ordinal = 0 },
new PathEntry { System = "N64", SystemDisplayName = "N64", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "N64", SystemDisplayName = "N64", Type = "Savestates", Path= Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "N64", SystemDisplayName = "N64", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "N64", SystemDisplayName = "N64", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "N64", SystemDisplayName = "N64", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "SAT", SystemDisplayName = "Saturn", Type = "Base", Path = Path.Combine(".", "Saturn"), Ordinal = 0 },
new PathEntry { System = "SAT", SystemDisplayName = "Saturn", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "SAT", SystemDisplayName = "Saturn", Type = "Savestates", Path= Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "SAT", SystemDisplayName = "Saturn", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "SAT", SystemDisplayName = "Saturn", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "SAT", SystemDisplayName = "Saturn", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "WSWAN", SystemDisplayName = "WonderSwan", Type = "Base", Path = Path.Combine(".", "WonderSwan"), Ordinal = 0 },
new PathEntry { System = "WSWAN", SystemDisplayName = "WonderSwan", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "WSWAN", SystemDisplayName = "WonderSwan", Type = "Savestates", Path= Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "WSWAN", SystemDisplayName = "WonderSwan", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "WSWAN", SystemDisplayName = "WonderSwan", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "WSWAN", SystemDisplayName = "WonderSwan", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "Lynx", SystemDisplayName = "Lynx", Type = "Base", Path = Path.Combine(".", "Lynx"), Ordinal = 0 },
new PathEntry { System = "Lynx", SystemDisplayName = "Lynx", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "Lynx", SystemDisplayName = "Lynx", Type = "Savestates", Path= Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "Lynx", SystemDisplayName = "Lynx", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 3 },
new PathEntry { System = "Lynx", SystemDisplayName = "Lynx", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "Lynx", SystemDisplayName = "Lynx", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "AppleII", SystemDisplayName = "Apple II", Type = "Base", Path = Path.Combine(".", "Apple II"), Ordinal = 0 },
new PathEntry { System = "AppleII", SystemDisplayName = "Apple II", Type = "ROM", Path = ".", Ordinal = 1 },
new PathEntry { System = "AppleII", SystemDisplayName = "Apple II", Type = "Savestates", Path= Path.Combine(".", "State"), Ordinal = 2 },
new PathEntry { System = "AppleII", SystemDisplayName = "Apple II", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 4 },
new PathEntry { System = "AppleII", SystemDisplayName = "Apple II", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 5 },
new PathEntry { System = "Libretro", SystemDisplayName = "Libretro", Type = "Base", Path = Path.Combine(".", "Libretro"), Ordinal = 0 },
new PathEntry { System = "Libretro", SystemDisplayName = "Libretro", Type = "Cores", Path = Path.Combine(".", "Cores"), Ordinal = 1 },
new PathEntry { System = "Libretro", SystemDisplayName = "Libretro", Type = "System", Path = Path.Combine(".", "System"), Ordinal = 2 },
new PathEntry { System = "Libretro", SystemDisplayName = "Libretro", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 3 },
new PathEntry { System = "Libretro", SystemDisplayName = "Libretro", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 4 },
new PathEntry { System = "Libretro", SystemDisplayName = "Libretro", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 5 },
new PathEntry { System = "Libretro", SystemDisplayName = "Libretro", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 6 },
};
}
}
new PathEntry { System = "Libretro", SystemDisplayName = "Libretro", Type = "Base", Path = Path.Combine(".", "Libretro"), Ordinal = 0 },
new PathEntry { System = "Libretro", SystemDisplayName = "Libretro", Type = "Cores", Path = Path.Combine(".", "Cores"), Ordinal = 1 },
new PathEntry { System = "Libretro", SystemDisplayName = "Libretro", Type = "System", Path = Path.Combine(".", "System"), Ordinal = 2 },
new PathEntry { System = "Libretro", SystemDisplayName = "Libretro", Type = "Savestates", Path = Path.Combine(".", "State"), Ordinal = 3 },
new PathEntry { System = "Libretro", SystemDisplayName = "Libretro", Type = "Save RAM", Path = Path.Combine(".", "SaveRAM"), Ordinal = 4 },
new PathEntry { System = "Libretro", SystemDisplayName = "Libretro", Type = "Screenshots", Path = Path.Combine(".", "Screenshots"), Ordinal = 5 },
new PathEntry { System = "Libretro", SystemDisplayName = "Libretro", Type = "Cheats", Path = Path.Combine(".", "Cheats"), Ordinal = 6 },
};
}
}

View File

@ -33,7 +33,11 @@ namespace BizHawk.Client.Common
[JsonIgnore]
public int? Wndx
{
get { return _wndx; }
get
{
return _wndx;
}
set
{
if (value != -32000)
@ -47,7 +51,11 @@ namespace BizHawk.Client.Common
[JsonIgnore]
public int? Wndy
{
get { return _wndy; }
get
{
return _wndy;
}
set
{
if (value != -32000)

View File

@ -12,25 +12,28 @@
/// </summary>
public AutoPatternBool()
{
Pattern = new bool[] { true };
Pattern = new[] { true };
}
/// <summary>
/// Simple on/off pattern.
/// Initializes a new instance of the <see cref="AutoPatternBool"/> class.
/// A simple on/off pattern.
/// </summary>
/// <param name="on"></param>
/// <param name="off"></param>
public AutoPatternBool(int on, int off, bool skip_lag = true, int offset = 0, int loop = 0)
public AutoPatternBool(int on, int off, bool skipLag = true, int offset = 0, int loop = 0)
{
SkipsLag = skip_lag;
SkipsLag = skipLag;
_index = offset;
Pattern = new bool[on + off];
Loop = loop;
for (int i = 0; i < on; i++)
{
Pattern[i] = true;
}
}
public AutoPatternBool(bool[] pattern, bool skip_lag = true, int offset = 0, int loop = 0)
public AutoPatternBool(bool[] pattern, bool skipLag = true, int offset = 0, int loop = 0)
{
SkipsLag = skip_lag;
SkipsLag = skipLag;
Pattern = pattern;
_index = offset;
Loop = loop;
@ -39,7 +42,6 @@
/// <summary>
/// Gets the next value and increments index.
/// </summary>
/// <returns></returns>
public bool GetNextValue(bool isLag = false)
{
bool ret = Pattern[_index];
@ -47,7 +49,9 @@
{
_index++;
if (_index == Pattern.Length)
{
_index = Loop;
}
}
return ret;
@ -56,12 +60,15 @@
/// <summary>
/// Gets the next value without incrementing index.
/// </summary>
/// <returns></returns>
public bool PeekNextValue()
{ return Pattern[_index]; }
{
return Pattern[_index];
}
public void Reset()
{ _index = 0; }
{
_index = 0;
}
}
public class AutoPatternFloat
@ -72,12 +79,14 @@
private int _index;
/// <summary>
/// Initializes a new instance of the <see cref="AutoPatternFloat"/> class.
/// Defaults to 0.
/// </summary>
public AutoPatternFloat()
{
Pattern = new float[] { 0f };
Pattern = new[] { 0f };
}
/// <summary>
/// Sinple on/off pattern, using the given values as on/off.
/// </summary>
@ -88,10 +97,16 @@
Loop = loop;
Pattern = new float[on + off];
for (int i = 0; i < on; i++)
{
Pattern[i] = valueOn;
}
for (int i = on; i < Pattern.Length; i++)
{
Pattern[i] = valueOff;
}
}
public AutoPatternFloat(float[] pattern, bool skip_lag = true, int offset = 0, int loop = 0)
{
SkipsLag = skip_lag;
@ -103,7 +118,6 @@
/// <summary>
/// Gets the next value and increments index.
/// </summary>
/// <returns></returns>
public float GetNextValue(bool isLag = false)
{
float ret = Pattern[_index];
@ -111,7 +125,9 @@
{
_index++;
if (_index == Pattern.Length)
{
_index = Loop;
}
}
return ret;
@ -120,11 +136,14 @@
/// <summary>
/// Gets the next value without incrementing index.
/// </summary>
/// <returns></returns>
public float PeekNextValue()
{ return Pattern[_index]; }
{
return Pattern[_index];
}
public void Reset()
{ _index = 0; }
{
_index = 0;
}
}
}

View File

@ -4,12 +4,9 @@ namespace BizHawk.Client.Common
{
public class AndAdapter : IController
{
public ControllerDefinition Definition
{
get { return Source.Definition; }
}
public ControllerDefinition Definition => Source.Definition;
public bool IsPressed(string button)
public bool IsPressed(string button)
{
if (Source != null && SourceAnd != null)
{
@ -32,15 +29,12 @@ namespace BizHawk.Client.Common
public class ORAdapter : IController
{
public ControllerDefinition Definition
{
get { return Source.Definition; }
}
public ControllerDefinition Definition => Source.Definition;
public bool IsPressed(string button)
public bool IsPressed(string button)
{
return (Source != null ? Source.IsPressed(button) : false)
| (SourceOr != null ? SourceOr.IsPressed(button) : false);
return (Source?.IsPressed(button) ?? false)
| (SourceOr?.IsPressed(button) ?? false);
}
// pass floats solely from the original source

View File

@ -69,5 +69,4 @@ namespace BizHawk.Client.Common
private readonly HashSet<string> _pressed = new HashSet<string>();
}
}

View File

@ -3,16 +3,13 @@
namespace BizHawk.Client.Common
{
/// <summary>
/// Just copies source to sink, or returns whatever a NullController would if it is disconnected. useful for immovable hardpoints.
/// Just copies source to sink, or returns whatever a NullController would if it is disconnected. useful for immovable hard-points.
/// </summary>
public class CopyControllerAdapter : IController
{
public ControllerDefinition Definition
{
get { return Curr.Definition; }
}
public ControllerDefinition Definition => Curr.Definition;
public bool IsPressed(string button)
public bool IsPressed(string button)
{
return Curr.IsPressed(button);
}
@ -24,14 +21,6 @@ namespace BizHawk.Client.Common
public IController Source { get; set; }
private IController Curr
{
get
{
return Source == null
? NullController.Instance
: Source;
}
}
private IController Curr => Source ?? NullController.Instance;
}
}

View File

@ -2,6 +2,7 @@
using BizHawk.Emulation.Common;
using BizHawk.Client.Common.InputAdapterExtensions;
namespace BizHawk.Client.Common
{
public static class InputManager

View File

@ -16,13 +16,13 @@ namespace BizHawk.Client.Common
protected WorkingDictionary<string, bool> Buttons = new WorkingDictionary<string, bool>();
protected WorkingDictionary<string, float> Floats = new WorkingDictionary<string, float>();
public virtual void Clear()
public void Clear()
{
Buttons = new WorkingDictionary<string, bool>();
Floats = new WorkingDictionary<string, float>();
}
public virtual bool this[string button]
public bool this[string button]
{
get { return Buttons[button]; }
set { Buttons[button] = value; }
@ -43,7 +43,7 @@ namespace BizHawk.Client.Common
return Buttons;
}
public virtual void LatchFrom(IController source)
public void LatchFrom(IController source)
{
foreach (var button in source.Definition.BoolButtons)
{

View File

@ -17,12 +17,9 @@ namespace BizHawk.Client.Common
/// </summary>
public class StickyOrAdapter : IController
{
public ControllerDefinition Definition
{
get { return Source.Definition; }
}
public ControllerDefinition Definition => Source.Definition;
public bool IsPressed(string button)
public bool IsPressed(string button)
{
return Source.StickyIsInEffect(button)
|| SourceStickyOr.StickyIsInEffect(button);
@ -56,12 +53,9 @@ namespace BizHawk.Client.Common
return false;
}
public ControllerDefinition Definition
{
get { return Source.Definition; }
}
public ControllerDefinition Definition => Source.Definition;
public bool IsPressed(string button)
public bool IsPressed(string button)
{
var source = Source.IsPressed(button);
source ^= stickySet.Contains(button);
@ -137,13 +131,7 @@ namespace BizHawk.Client.Common
return stickySet.Contains(button);
}
public HashSet<string> CurrentStickies
{
get
{
return stickySet;
}
}
public HashSet<string> CurrentStickies => stickySet;
public void ClearStickies()
{
@ -229,12 +217,13 @@ namespace BizHawk.Client.Common
Off = Global.Config.AutofireOff < 1 ? 0 : Global.Config.AutofireOff;
}
private WorkingDictionary<string, AutoPatternBool> _boolPatterns = new WorkingDictionary<string, AutoPatternBool>();
private WorkingDictionary<string, AutoPatternFloat> _floatPatterns = new WorkingDictionary<string, AutoPatternFloat>();
private readonly WorkingDictionary<string, AutoPatternBool> _boolPatterns = new WorkingDictionary<string, AutoPatternBool>();
private readonly WorkingDictionary<string, AutoPatternFloat> _floatPatterns = new WorkingDictionary<string, AutoPatternFloat>();
public AutoFireStickyXorAdapter()
{
On = 1; Off = 1;
On = 1;
Off = 1;
}
public IController Source { get; set; }
@ -246,7 +235,10 @@ namespace BizHawk.Client.Common
if (value.HasValue)
{
if (pattern == null)
{
pattern = new AutoPatternFloat(value.Value, On, 0, Off);
}
_floatPatterns[name] = pattern;
}
else
@ -265,7 +257,10 @@ namespace BizHawk.Client.Common
if (isSticky)
{
if (pattern == null)
{
pattern = new AutoPatternBool(On, Off);
}
_boolPatterns[button] = pattern;
}
else
@ -285,15 +280,9 @@ namespace BizHawk.Client.Common
return _boolPatterns.ContainsKey(button) || _floatPatterns.ContainsKey(button);
}
public HashSet<string> CurrentStickies
{
get
{
return new HashSet<string>(_boolPatterns.Keys);
}
}
public HashSet<string> CurrentStickies => new HashSet<string>(_boolPatterns.Keys);
public void ClearStickies()
public void ClearStickies()
{
_boolPatterns.Clear();
_floatPatterns.Clear();
@ -302,9 +291,14 @@ namespace BizHawk.Client.Common
public void IncrementLoops(bool lagged)
{
for (int i = 0; i < _boolPatterns.Count; i++)
{
_boolPatterns.ElementAt(i).Value.GetNextValue(lagged);
}
for (int i = 0; i < _floatPatterns.Count; i++)
{
_floatPatterns.ElementAt(i).Value.GetNextValue(lagged);
}
}
private List<string> _justPressed = new List<string>();
@ -313,10 +307,7 @@ namespace BizHawk.Client.Common
{
foreach (var button in buttons.Where(button => !_justPressed.Contains(button)))
{
if (_boolPatterns.ContainsKey(button))
SetSticky(button, false);
else
SetSticky(button, true);
SetSticky(button, !_boolPatterns.ContainsKey(button));
}
_justPressed = buttons;

View File

@ -11,15 +11,10 @@ namespace BizHawk.Client.Common
/// </summary>
public class UD_LR_ControllerAdapter : IController
{
public ControllerDefinition Definition
{
get { return Source.Definition; }
}
public ControllerDefinition Definition => Source.Definition;
public bool IsPressed(string button)
{
bool PriorityUD_LR = !Global.Config.AllowUD_LR && !Global.Config.ForbidUD_LR; // implied by neither of the others being set (left as non-enum for back-compatibility)
if (Global.Config.AllowUD_LR)
{
return Source.IsPressed(button);
@ -27,10 +22,8 @@ namespace BizHawk.Client.Common
string prefix;
//" C " is for N64 "P1 C Up" and the like, which should not be subject to mutexing
//regarding the unpressing and UDLR logic...... don't think about it. don't question it. don't look at it.
// " C " is for N64 "P1 C Up" and the like, which should not be subject to mutexing
// regarding the unpressing and UDLR logic...... don't think about it. don't question it. don't look at it.
if (button.Contains("Down") && !button.Contains(" C "))
{
if (!Source.IsPressed(button))

View File

@ -14,9 +14,9 @@ namespace BizHawk.Client.Common
public BitLuaLibrary(Lua lua, Action<string> logOutputCallback)
: base(lua, logOutputCallback) { }
public override string Name { get { return "bit"; } }
public override string Name => "bit";
[LuaMethodAttributes(
[LuaMethodAttributes(
"band",
"Bitwise AND of 'val' against 'amt'"
)]

View File

@ -1,8 +1,5 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using BizHawk.Emulation.Common;
using BizHawk.Emulation.Common.IEmulatorExtensions;
@ -46,9 +43,9 @@ namespace BizHawk.Client.Common
public EmulatorLuaLibrary(Lua lua, Action<string> logOutputCallback)
: base(lua, logOutputCallback) { }
public override string Name { get { return "emu"; } }
public override string Name => "emu";
[LuaMethodAttributes(
[LuaMethodAttributes(
"displayvsync",
"Sets the display vsync property of the emulator"
)]
@ -157,9 +154,7 @@ namespace BizHawk.Client.Common
}
catch (NotImplementedException)
{
Log(string.Format(
"Error: {0} does not yet implement getregisters()",
Emulator.Attributes().CoreName));
Log($"Error: {Emulator.Attributes().CoreName} does not yet implement getregisters()");
}
return table;
@ -182,9 +177,7 @@ namespace BizHawk.Client.Common
}
catch (NotImplementedException)
{
Log(string.Format(
"Error: {0} does not yet implement setregister()",
Emulator.Attributes().CoreName));
Log($"Error: {Emulator.Attributes().CoreName} does not yet implement setregister()");
}
}
@ -232,11 +225,9 @@ namespace BizHawk.Client.Common
{
return InputPollableCore.IsLagFrame;
}
else
{
Log(string.Format("Can not get lag information, {0} does not implement IInputPollable", Emulator.Attributes().CoreName));
return false;
}
Log($"Can not get lag information, {Emulator.Attributes().CoreName} does not implement IInputPollable");
return false;
}
[LuaMethodAttributes(
@ -251,7 +242,7 @@ namespace BizHawk.Client.Common
}
else
{
Log(string.Format("Can not set lag information, {0} does not implement IInputPollable", Emulator.Attributes().CoreName));
Log($"Can not set lag information, {Emulator.Attributes().CoreName} does not implement IInputPollable");
}
}
@ -265,11 +256,9 @@ namespace BizHawk.Client.Common
{
return InputPollableCore.LagCount;
}
else
{
Log(string.Format("Can not get lag information, {0} does not implement IInputPollable", Emulator.Attributes().CoreName));
return 0;
}
Log($"Can not get lag information, {Emulator.Attributes().CoreName} does not implement IInputPollable");
return 0;
}
[LuaMethodAttributes(
@ -326,12 +315,18 @@ namespace BizHawk.Client.Common
{
var quicknes = Emulator as QuickNES;
var s = quicknes.GetSettings();
// this core doesn't support disabling BG
bool showsp = GetSetting(0, luaParam);
if (showsp && s.NumSprites == 0)
{
s.NumSprites = 8;
}
else if (!showsp && s.NumSprites > 0)
{
s.NumSprites = 0;
}
quicknes.PutSettings(s);
}
else if (Emulator is PCEngine)

View File

@ -30,9 +30,9 @@ namespace BizHawk.Client.Common
public EventLuaLibrary(Lua lua, Action<string> logOutputCallback)
: base(lua, logOutputCallback) { }
public override string Name { get { return "event"; } }
public override string Name => "event";
#region Events Library Helpers
#region Events Library Helpers
public void CallExitEvent(Lua thread)
{
@ -202,11 +202,9 @@ namespace BizHawk.Client.Common
return Guid.Empty.ToString();
}
}
else
{
LogNotImplemented();
return Guid.Empty.ToString();
}
LogNotImplemented();
return Guid.Empty.ToString();
}
private void LogNotImplemented()
@ -237,7 +235,9 @@ namespace BizHawk.Client.Common
DebuggableCore.MemoryCallbacks.ExecuteCallbacksAvailable)
{
if (N64CoreTypeDynarec())
{
return Guid.Empty.ToString();
}
var nlf = new NamedLuaFunction(luaf, "OnMemoryExecute", LogOutputCallback, CurrentThread, name);
_luaFunctions.Add(nlf);
@ -247,7 +247,7 @@ namespace BizHawk.Client.Common
return nlf.Guid.ToString();
}
}
catch(NotImplementedException)
catch (NotImplementedException)
{
LogMemoryExecuteCallbacksNotImplemented();
return Guid.Empty.ToString();
@ -268,7 +268,9 @@ namespace BizHawk.Client.Common
if (DebuggableCore != null && DebuggableCore.MemoryCallbacksAvailable())
{
if (N64CoreTypeDynarec())
{
return Guid.Empty.ToString();
}
var nlf = new NamedLuaFunction(luaf, "OnMemoryRead", LogOutputCallback, CurrentThread, name);
_luaFunctions.Add(nlf);
@ -299,7 +301,9 @@ namespace BizHawk.Client.Common
if (DebuggableCore != null && DebuggableCore.MemoryCallbacksAvailable())
{
if (N64CoreTypeDynarec())
{
return Guid.Empty.ToString();
}
var nlf = new NamedLuaFunction(luaf, "OnMemoryWrite", LogOutputCallback, CurrentThread, name);
_luaFunctions.Add(nlf);

View File

@ -15,9 +15,9 @@ namespace BizHawk.Client.Common
public GameInfoLuaLibrary(Lua lua, Action<string> logOutputCallback)
: base(lua, logOutputCallback) { }
public override string Name { get { return "gameinfo"; } }
public override string Name => "gameinfo";
[LuaMethodAttributes(
[LuaMethodAttributes(
"getromname",
"returns the path of the currently loaded rom, if a rom is loaded"
)]
@ -93,7 +93,7 @@ namespace BizHawk.Client.Common
)]
public string GetBoardType()
{
return Emulator.BoardName ?? "";
return Emulator.BoardName ?? string.Empty;
}
[LuaMethodAttributes(

View File

@ -18,9 +18,9 @@ namespace BizHawk.Client.Common
public GenesisLuaLibrary(Lua lua, Action<string> logOutputCallback)
: base(lua, logOutputCallback) { }
public override string Name { get { return "genesis"; } }
public override string Name => "genesis";
private GPGX.GPGXSettings GetSettings()
private GPGX.GPGXSettings GetSettings()
{
if (Genesis != null)
{
@ -32,10 +32,7 @@ namespace BizHawk.Client.Common
private void PutSettings(GPGX.GPGXSettings settings)
{
if (Genesis != null)
{
Genesis.PutSettings(settings);
}
Genesis?.PutSettings(settings);
}
[LuaMethodAttributes(

View File

@ -11,9 +11,9 @@ namespace BizHawk.Client.Common
public JoypadLuaLibrary(Lua lua, Action<string> logOutputCallback)
: base(lua, logOutputCallback) { }
public override string Name { get { return "joypad"; } }
public override string Name => "joypad";
[LuaMethodAttributes(
[LuaMethodAttributes(
"get",
"returns a lua table of the controller buttons pressed. If supplied, it will only return a table of buttons for the given controller"
)]
@ -109,7 +109,7 @@ namespace BizHawk.Client.Common
bool? theValue;
var theValueStr = buttons[button].ToString();
if (!String.IsNullOrWhiteSpace(theValueStr))
if (!string.IsNullOrWhiteSpace(theValueStr))
{
if (theValueStr.ToLower() == "false")
{
@ -175,11 +175,13 @@ namespace BizHawk.Client.Common
var theValueStr = controls[name].ToString();
float? theValue = null;
if (!String.IsNullOrWhiteSpace(theValueStr))
if (!string.IsNullOrWhiteSpace(theValueStr))
{
float f;
if (float.TryParse(theValueStr, out f))
{
theValue = f;
}
}
if (controller == null)
@ -190,7 +192,6 @@ namespace BizHawk.Client.Common
{
Global.StickyXORAdapter.SetFloat("P" + controller + " " + name, theValue);
}
}
}
catch { /*Eat it*/ }

View File

@ -16,9 +16,9 @@ namespace BizHawk.Client.Common
public MainMemoryLuaLibrary(Lua lua, Action<string> logOutputCallback)
: base(lua, logOutputCallback) { }
public override string Name { get { return "mainmemory"; } }
public override string Name => "mainmemory";
protected override MemoryDomain Domain
protected override MemoryDomain Domain
{
get
{
@ -28,7 +28,7 @@ namespace BizHawk.Client.Common
}
else
{
var error = string.Format("Error: {0} does not implement memory domains", Emulator.Attributes().CoreName);
var error = $"Error: {Emulator.Attributes().CoreName} does not implement memory domains";
Log(error);
throw new NotImplementedException(error);
}

View File

@ -24,9 +24,9 @@ namespace BizHawk.Client.Common
}
public override string Name { get { return "memory"; } }
public override string Name => "memory";
protected override MemoryDomain Domain
protected override MemoryDomain Domain
{
get
{
@ -34,21 +34,16 @@ namespace BizHawk.Client.Common
{
if (_currentMemoryDomain == null)
{
if (MemoryDomainCore.HasSystemBus)
{
_currentMemoryDomain = MemoryDomainCore.SystemBus;
}
else
{
_currentMemoryDomain = MemoryDomainCore.MainMemory;
}
_currentMemoryDomain = MemoryDomainCore.HasSystemBus
? MemoryDomainCore.SystemBus
: MemoryDomainCore.MainMemory;
}
return _currentMemoryDomain;
}
else
{
var error = string.Format("Error: {0} does not implement memory domains", Emulator.Attributes().CoreName);
var error = $"Error: {Emulator.Attributes().CoreName} does not implement memory domains";
Log(error);
throw new NotImplementedException(error);
}
@ -120,14 +115,14 @@ namespace BizHawk.Client.Common
}
else
{
Log(string.Format("Unable to find domain: {0}", domain));
Log($"Unable to find domain: {domain}");
return false;
}
}
catch // Just in case
{
Log(string.Format("Unable to find domain: {0}", domain));
Log($"Unable to find domain: {domain}");
}
return false;

View File

@ -1,84 +1,83 @@
using System;
using System.Collections.Generic;
using System.IO;
using LuaInterface;
using BizHawk.Emulation.Common;
using BizHawk.Emulation.Common.IEmulatorExtensions;
namespace BizHawk.Client.Common
{
public sealed class MemorySavestateEmuLuaLibrary : LuaLibraryBase
{
public MemorySavestateEmuLuaLibrary(Lua lua)
: base(lua) { }
public MemorySavestateEmuLuaLibrary(Lua lua, Action<string> logOutputCallback)
: base(lua, logOutputCallback) { }
public override string Name { get { return "memorysavestate"; } }
private readonly Dictionary<Guid, byte[]> MemorySavestates = new Dictionary<Guid, byte[]>();
[RequiredService]
private IStatable _statableCore { get; set; }
[LuaMethodAttributes(
"savecorestate",
"creates a core savestate and stores it in memory. Note: a core savestate is only the raw data from the core, and not extras such as movie input logs, or framebuffers. Returns a unique identifer for the savestate"
)]
public string SaveCoreStateToMemory()
{
var guid = Guid.NewGuid();
var bytes = (byte[])_statableCore.SaveStateBinary().Clone();
using System;
using System.Collections.Generic;
using System.IO;
using LuaInterface;
using BizHawk.Emulation.Common;
namespace BizHawk.Client.Common
{
public sealed class MemorySavestateEmuLuaLibrary : LuaLibraryBase
{
public MemorySavestateEmuLuaLibrary(Lua lua)
: base(lua) { }
public MemorySavestateEmuLuaLibrary(Lua lua, Action<string> logOutputCallback)
: base(lua, logOutputCallback) { }
public override string Name => "memorysavestate";
private readonly Dictionary<Guid, byte[]> MemorySavestates = new Dictionary<Guid, byte[]>();
[RequiredService]
private IStatable _statableCore { get; set; }
[LuaMethodAttributes(
"savecorestate",
"creates a core savestate and stores it in memory. Note: a core savestate is only the raw data from the core, and not extras such as movie input logs, or framebuffers. Returns a unique identifer for the savestate"
)]
public string SaveCoreStateToMemory()
{
var guid = Guid.NewGuid();
var bytes = (byte[])_statableCore.SaveStateBinary().Clone();
MemorySavestates.Add(guid, bytes);
return guid.ToString();
}
[LuaMethodAttributes(
"loadcorestate",
"loads an in memory state with the given identifier"
)]
public void LoadCoreStateFromMemory(string identifier)
{
var guid = new Guid(identifier);
try
{
var state = MemorySavestates[guid];
using (MemoryStream ms = new MemoryStream(state))
using (BinaryReader br = new BinaryReader(ms))
{
_statableCore.LoadStateBinary(br);
}
}
catch
{
Log("Unable to find the given savestate in memory");
}
}
[LuaMethodAttributes(
"removestate",
"removes the savestate with the given identifier from memory"
)]
public void DeleteState(string identifier)
{
var guid = new Guid(identifier);
MemorySavestates.Remove(guid);
}
[LuaMethodAttributes(
"clearstatesfrommemory",
"clears all savestates stored in memory"
)]
public void ClearInMemoryStates()
{
MemorySavestates.Clear();
}
}
}
return guid.ToString();
}
[LuaMethodAttributes(
"loadcorestate",
"loads an in memory state with the given identifier"
)]
public void LoadCoreStateFromMemory(string identifier)
{
var guid = new Guid(identifier);
try
{
var state = MemorySavestates[guid];
using (var ms = new MemoryStream(state))
using (var br = new BinaryReader(ms))
{
_statableCore.LoadStateBinary(br);
}
}
catch
{
Log("Unable to find the given savestate in memory");
}
}
[LuaMethodAttributes(
"removestate",
"removes the savestate with the given identifier from memory"
)]
public void DeleteState(string identifier)
{
var guid = new Guid(identifier);
MemorySavestates.Remove(guid);
}
[LuaMethodAttributes(
"clearstatesfrommemory",
"clears all savestates stored in memory"
)]
public void ClearInMemoryStates()
{
MemorySavestates.Clear();
}
}
}

View File

@ -13,9 +13,9 @@ namespace BizHawk.Client.Common
: base(lua, logOutputCallback) { }
public override string Name { get { return "movie"; } }
public override string Name => "movie";
[LuaMethodAttributes(
[LuaMethodAttributes(
"startsfromsavestate",
"Returns whether or not the movie is a savestate-anchored movie"
)]
@ -177,7 +177,9 @@ namespace BizHawk.Client.Common
public void Save(string filename = "")
{
if (!Global.MovieSession.Movie.IsActive)
{
return;
}
if (!string.IsNullOrEmpty(filename))
{
@ -185,11 +187,13 @@ namespace BizHawk.Client.Common
var test = new FileInfo(filename);
if (test.Exists)
{
Log(string.Format("File {0} already exists, will not overwrite", filename));
Log($"File {filename} already exists, will not overwrite");
return;
}
Global.MovieSession.Movie.Filename = filename;
}
Global.MovieSession.Movie.Save();
}
@ -210,10 +214,12 @@ namespace BizHawk.Client.Common
{
// Lua numbers are always double, integer precision holds up
// to 53 bits, so throw an error if it's bigger than that.
const double precisionLimit = 9007199254740992d;
const double PrecisionLimit = 9007199254740992d;
if (count > precisionLimit)
if (count > PrecisionLimit)
{
throw new Exception("Rerecord count exceeds Lua integer precision.");
}
Global.MovieSession.Movie.Rerecords = (ulong)count;
}

View File

@ -29,16 +29,16 @@ namespace BizHawk.Client.Common
[OptionalService]
private IMemoryDomains _memoryDomains { get; set; }
private bool NESAvailable { get { return _neshawk != null || _quicknes != null; } }
private bool NESAvailable => _neshawk != null || _quicknes != null;
private bool HasMemoryDOmains { get { return _memoryDomains != null; } }
private bool HasMemoryDOmains => _memoryDomains != null;
public NesLuaLibrary(Lua lua, Action<string> logOutputCallback)
public NesLuaLibrary(Lua lua, Action<string> logOutputCallback)
: base(lua, logOutputCallback) { }
public override string Name { get { return "nes"; } }
public override string Name => "nes";
[LuaMethodAttributes(
[LuaMethodAttributes(
"addgamegenie",
"Adds the specified game genie code. If an NES game is not currently loaded or the code is not a valid game genie code, this will have no effect"
)]
@ -72,6 +72,7 @@ namespace BizHawk.Client.Common
{
return _quicknes.GetSettings().NumSprites != 8;
}
if (_neshawk != null)
{
return _neshawk.GetSettings().AllowMoreThanEightSprites;
@ -210,7 +211,6 @@ namespace BizHawk.Client.Common
var s = _quicknes.GetSettings();
s.NumSprites = allow ? 64 : 8;
_quicknes.PutSettings(s);
}
}

View File

@ -18,9 +18,9 @@ namespace BizHawk.Client.Common
public SnesLuaLibrary(Lua lua, Action<string> logOutputCallback)
: base(lua, logOutputCallback) { }
public override string Name { get { return "snes"; } }
public override string Name => "snes";
private LibsnesCore.SnesSettings GetSettings()
private LibsnesCore.SnesSettings GetSettings()
{
if (Snes != null)
{
@ -32,10 +32,7 @@ namespace BizHawk.Client.Common
private void PutSettings(LibsnesCore.SnesSettings settings)
{
if (Snes != null)
{
Snes.PutSettings(settings);
}
Snes?.PutSettings(settings);
}
[LuaMethodAttributes(

View File

@ -9,9 +9,9 @@ namespace BizHawk.Client.Common
[Description("A library exposing standard .NET string methods")]
public sealed class StringLuaLibrary : LuaLibraryBase
{
public override string Name { get { return "bizstring"; } }
public override string Name => "bizstring";
public StringLuaLibrary(Lua lua)
public StringLuaLibrary(Lua lua)
: base(lua) { }
public StringLuaLibrary(Lua lua, Action<string> logOutputCallback)
@ -23,7 +23,7 @@ namespace BizHawk.Client.Common
)]
public static string Hex(long num)
{
var hex = string.Format("{0:X}", num);
var hex = $"{num:X}";
if (hex.Length == 1)
{
hex = "0" + hex;

View File

@ -19,9 +19,9 @@ namespace BizHawk.Client.EmuHawk
public UserDataLibrary(Lua lua, Action<string> logOutputCallback)
: base(lua, logOutputCallback) { }
public override string Name { get { return "userdata"; } }
public override string Name => "userdata";
[LuaMethodAttributes(
[LuaMethodAttributes(
"set",
"adds or updates the data with the given key with the given value"
)]

View File

@ -1,17 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//TODO - kill this file (or renew the concept as distinct from the LuaSandbox?)
// TODO - kill this file (or renew the concept as distinct from the LuaSandbox?)
namespace BizHawk.Client.Common
{
public class EnvironmentSandbox
{
public static void Sandbox(Action callback)
{
//just a stub for right now
// just a stub for right now
callback();
}
}

View File

@ -11,8 +11,8 @@ namespace BizHawk.Client.Common
Description = description;
}
public string Name { get; set; }
public string Description { get; set; }
public string Name { get; }
public string Description { get; }
}
[AttributeUsage(AttributeTargets.Class)]
@ -23,6 +23,6 @@ namespace BizHawk.Client.Common
Released = released;
}
public bool Released { get; set; }
public bool Released { get; }
}
}

View File

@ -1,5 +1,4 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
@ -10,7 +9,7 @@ namespace BizHawk.Client.Common
public class LuaDocumentation : List<LibraryFunction>
{
public LuaDocumentation()
:base() { }
: base() { }
public string ToTASVideosWikiMarkup()
{
@ -114,7 +113,7 @@ __Types and notation__
if (f.ParameterList.Any())
{
sb
.Append(string.Format("{0}.{1}(", f.Library, f.Name));
.Append($"{f.Library}.{f.Name}(");
var parameters = f.Method.GetParameters()
.ToList();
@ -128,7 +127,7 @@ __Types and notation__
if (parameters[i].IsOptional)
{
sb.Append(string.Format("[{0}]", parameters[i].Name));
sb.Append($"[{parameters[i].Name}]");
}
else
{
@ -147,7 +146,7 @@ __Types and notation__
}
else
{
sb.Append(string.Format("{0}.{1}()", f.Library, f.Name));
sb.Append($"{f.Library}.{f.Name}()");
}
completion.Contents = sb.ToString();
@ -178,22 +177,16 @@ __Types and notation__
LibraryDescription = libraryDescription;
}
public string Library { get; private set; }
public string LibraryDescription { get; private set; }
public string Library { get; }
public string LibraryDescription { get; }
public MethodInfo Method { get { return _method; } }
public MethodInfo Method => _method;
public string Name
{
get { return _luaAttributes.Name; }
}
public string Name => _luaAttributes.Name;
public string Description
{
get { return _luaAttributes.Description; }
}
public string Description => _luaAttributes.Description;
private string _paramterList = null;
private string _paramterList = null;
public string ParameterList
{

View File

@ -30,8 +30,8 @@
public string Name { get; set; }
public string Path { get; set; }
public bool Enabled { get { return State != RunState.Disabled; } }
public bool Paused { get { return State == RunState.Paused; } }
public bool Enabled => State != RunState.Disabled;
public bool Paused => State == RunState.Paused;
public bool IsSeparator { get; set; }
public LuaInterface.Lua Thread { get; set; }
public bool FrameWaiting { get; set; }
@ -44,12 +44,9 @@
public RunState State { get; set; }
public static LuaFile SeparatorInstance
{
get { return new LuaFile(true); }
}
public static LuaFile SeparatorInstance => new LuaFile(true);
public void Stop()
public void Stop()
{
State = RunState.Disabled;
Thread = null;
@ -75,9 +72,13 @@
public void TogglePause()
{
if (State == RunState.Paused)
{
State = RunState.Running;
else if(State == RunState.Running)
}
else if (State == RunState.Running)
{
State = RunState.Paused;
}
}
}
}

View File

@ -105,10 +105,9 @@ namespace BizHawk.Client.Common
Add(new LuaFile(scriptPath)
{
State = (
!Global.Config.DisableLuaScriptsOnLoad
&& line.Substring(0, 1) == "1"
) ? LuaFile.RunState.Running : LuaFile.RunState.Disabled
State = !Global.Config.DisableLuaScriptsOnLoad && line.Substring(0, 1) == "1"
? LuaFile.RunState.Running
: LuaFile.RunState.Disabled
});
}
}

View File

@ -1,7 +1,6 @@
using System.Collections.Generic;
using System.Linq;
using BizHawk.Emulation.Common;
using BizHawk.Emulation.Common.IEmulatorExtensions;
namespace BizHawk.Client.Common
@ -40,8 +39,8 @@ namespace BizHawk.Client.Common
if (Global.Emulator.MemoryCallbacksAvailable())
{
var cbSys = Global.Emulator.AsDebuggable().MemoryCallbacks;
cbSys.RemoveAll(this.Select(x => x.Callback));
var memoryCallbacks = Global.Emulator.AsDebuggable().MemoryCallbacks;
memoryCallbacks.RemoveAll(this.Select(x => x.Callback));
}
Clear();

View File

@ -1,9 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LuaInterface;
using System.Reflection;
using LuaInterface;
namespace BizHawk.Client.Common
{
@ -20,7 +15,7 @@ namespace BizHawk.Client.Common
{
if (method.IsPublic)
{
table[method.Name] = lua.RegisterFunction("", obj, method);
table[method.Name] = lua.RegisterFunction(string.Empty, obj, method);
}
}

View File

@ -43,7 +43,10 @@ namespace BizHawk.Client.Common
lock (ThreadMutex)
{
if (CurrentHostThread != null)
{
throw new InvalidOperationException("Can't have lua running in two host threads at a time!");
}
CurrentHostThread = Thread.CurrentThread;
CurrentThread = luaThread;
}
@ -52,10 +55,7 @@ namespace BizHawk.Client.Common
protected void Log(object message)
{
if (LogOutputCallback != null)
{
LogOutputCallback(message.ToString());
}
LogOutputCallback?.Invoke(message.ToString());
}
public virtual void LuaRegister(Type callingLibrary, LuaDocumentation docs = null)
@ -74,10 +74,7 @@ namespace BizHawk.Client.Common
var luaName = Name + "." + luaMethodAttr.Name;
Lua.RegisterFunction(luaName, this, method);
if (docs != null)
{
docs.Add(new LibraryFunction(Name, callingLibrary.Description(), method));
}
docs?.Add(new LibraryFunction(Name, callingLibrary.Description(), method));
}
}

View File

@ -32,12 +32,10 @@ namespace BizHawk.Client.Common
{
return MemoryDomainCore;
}
else
{
var error = string.Format("Error: {0} does not implement memory domains", Emulator.Attributes().CoreName);
Log(error);
throw new NotImplementedException(error);
}
var error = $"Error: {Emulator.Attributes().CoreName} does not implement memory domains";
Log(error);
throw new NotImplementedException(error);
}
}
@ -47,25 +45,22 @@ namespace BizHawk.Client.Common
{
if (DomainList[domain] == null)
{
Log(string.Format("Unable to find domain: {0}, falling back to current", domain));
Log($"Unable to find domain: {domain}, falling back to current");
return Domain.Name;
}
else
{
return domain;
}
return domain;
}
catch // Just in case
{
Log(string.Format("Unable to find domain: {0}, falling back to current", domain));
Log($"Unable to find domain: {domain}, falling back to current");
}
return Domain.Name;
}
protected uint ReadUnsignedByte(int addr, string domain = null)
{
var d = (string.IsNullOrEmpty(domain)) ? Domain : DomainList[VerifyMemoryDomain(domain)];
var d = string.IsNullOrEmpty(domain) ? Domain : DomainList[VerifyMemoryDomain(domain)];
if (addr < d.Size)
{
return d.PeekByte(addr);
@ -78,7 +73,7 @@ namespace BizHawk.Client.Common
protected void WriteUnsignedByte(int addr, uint v, string domain = null)
{
var d = (string.IsNullOrEmpty(domain)) ? Domain : DomainList[VerifyMemoryDomain(domain)];
var d = string.IsNullOrEmpty(domain) ? Domain : DomainList[VerifyMemoryDomain(domain)];
if (d.CanPoke())
{
if (addr < Domain.Size)
@ -93,7 +88,7 @@ namespace BizHawk.Client.Common
}
else
{
Log(string.Format("Error: the domain {0} is not writable", d.Name));
Log($"Error: the domain {d.Name} is not writable");
}
}
@ -178,12 +173,12 @@ namespace BizHawk.Client.Common
protected LuaTable ReadByteRange(int addr, int length, string domain = null)
{
var d = (string.IsNullOrEmpty(domain)) ? Domain : DomainList[VerifyMemoryDomain(domain)];
var d = string.IsNullOrEmpty(domain) ? Domain : DomainList[VerifyMemoryDomain(domain)];
var lastAddr = length + addr;
var table = Lua.NewTable();
if (lastAddr < d.Size)
{
for (var i = 0; i <length ; i++)
for (var i = 0; i < length; i++)
{
int a = addr + i;
var v = d.PeekByte(a);
@ -201,7 +196,7 @@ namespace BizHawk.Client.Common
protected void WriteByteRange(LuaTable memoryblock, string domain = null)
{
var d = (string.IsNullOrEmpty(domain)) ? Domain : DomainList[VerifyMemoryDomain(domain)];
var d = string.IsNullOrEmpty(domain) ? Domain : DomainList[VerifyMemoryDomain(domain)];
if (d.CanPoke())
{
foreach (var address in memoryblock.Keys)
@ -220,31 +215,29 @@ namespace BizHawk.Client.Common
}
else
{
Log(string.Format("Error: the domain {0} is not writable", d.Name));
Log($"Error: the domain {d.Name} is not writable");
}
}
protected float ReadFloat(int addr, bool bigendian, string domain = null)
{
var d = (string.IsNullOrEmpty(domain)) ? Domain : DomainList[VerifyMemoryDomain(domain)];
var d = string.IsNullOrEmpty(domain) ? Domain : DomainList[VerifyMemoryDomain(domain)];
if (addr < d.Size)
{
var val = d.PeekUint(addr, bigendian);
var bytes = BitConverter.GetBytes(val);
return BitConverter.ToSingle(bytes, 0);
}
else
{
Log("Warning: Attempted read " + addr +
Log("Warning: Attempted read " + addr +
" outside memory size of " + d.Size);
return 0;
}
return 0;
}
protected void WriteFloat(int addr, double value, bool bigendian, string domain = null)
{
var d = (string.IsNullOrEmpty(domain)) ? Domain : DomainList[VerifyMemoryDomain(domain)];
var d = string.IsNullOrEmpty(domain) ? Domain : DomainList[VerifyMemoryDomain(domain)];
if (d.CanPoke())
{
if (addr < d.Size)
@ -262,7 +255,7 @@ namespace BizHawk.Client.Common
}
else
{
Log(string.Format("Error: the domain {0} is not writable", Domain.Name));
Log($"Error: the domain {Domain.Name} is not writable");
}
}

View File

@ -1,24 +1,20 @@
using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LuaInterface;
//TODO - evaluate for re-entrancy problems
namespace BizHawk.Client.Common
{
public unsafe class LuaSandbox
{
using System;
using System.Runtime.InteropServices;
using LuaInterface;
// TODO - evaluate for re-entrancy problems
namespace BizHawk.Client.Common
{
public unsafe class LuaSandbox
{
protected static Action<string> Logger;
static System.Runtime.CompilerServices.ConditionalWeakTable<Lua, LuaSandbox> SandboxForThread = new System.Runtime.CompilerServices.ConditionalWeakTable<Lua, LuaSandbox>();
public static Action<string> DefaultLogger;
public void SetLogger(Action<string> logger)
{
Logger = logger;
public void SetLogger(Action<string> logger)
{
Logger = logger;
}
public void SetSandboxCurrentDirectory(string dir)
@ -39,26 +35,26 @@ namespace BizHawk.Client.Common
{
string target = CurrentDirectory + "\\";
//first we'll bypass it with a general hack: dont do any setting if the value's already there (even at the OS level, setting the directory can be slow)
//yeah I know, not the smoothest move to compare strings here, in case path normalization is happening at some point
//but you got any better ideas?
// first we'll bypass it with a general hack: dont do any setting if the value's already there (even at the OS level, setting the directory can be slow)
// yeah I know, not the smoothest move to compare strings here, in case path normalization is happening at some point
// but you got any better ideas?
if (currDirSpeedHack == null)
currDirSpeedHack = CoolGetCurrentDirectory();
if (currDirSpeedHack == path)
return true;
//WARNING: setting the current directory is SLOW!!! security checks for some reason.
//so we're bypassing it with windows hacks
//so we're bypassing it with windows hacks
#if WINDOWS
fixed (byte* pstr = &System.Text.Encoding.Unicode.GetBytes(target + "\0")[0])
return SetCurrentDirectoryW(pstr);
#else
if(System.IO.Directory.Exists(CurrentDirectory)) //race condition for great justice
{
Environment.CurrentDirectory = CurrentDirectory; //thats right, you can't set a directory as current that doesnt exist because .net's got to do SENSELESS SLOW-ASS SECURITY CHECKS on it and it can't do that on a NONEXISTENT DIRECTORY
return true;
}
else return false
return SetCurrentDirectoryW(pstr);
#else
if(System.IO.Directory.Exists(CurrentDirectory)) //race condition for great justice
{
Environment.CurrentDirectory = CurrentDirectory; //thats right, you can't set a directory as current that doesnt exist because .net's got to do SENSELESS SLOW-ASS SECURITY CHECKS on it and it can't do that on a NONEXISTENT DIRECTORY
return true;
}
else return false
#endif
}
@ -69,43 +65,40 @@ namespace BizHawk.Client.Common
//AS IF ASKING FOR THE CURRENT DIRECTORY IS EQUIVALENT TO TRYING TO ACCESS IT
//SCREW YOU
#if WINDOWS
var buf = new byte[32768];
fixed(byte* pBuf = &buf[0])
var buf = new byte[32768];
fixed(byte* pBuf = &buf[0])
{
uint ret = GetCurrentDirectoryW(32767, pBuf);
return System.Text.Encoding.Unicode.GetString(buf, 0, (int)ret*2);
}
#else
return Environment.CurrentDirectory;
#else
return Environment.CurrentDirectory;
#endif
}
void Sandbox(Action callback, Action exceptionCallback)
{
string savedEnvironmentCurrDir = null;
try
{
string savedEnvironmentCurrDir = null;
try
{
savedEnvironmentCurrDir = Environment.CurrentDirectory;
if (CurrentDirectory != null)
CoolSetCurrentDirectory(CurrentDirectory, savedEnvironmentCurrDir);
EnvironmentSandbox.Sandbox(callback);
}
catch (LuaException ex)
CoolSetCurrentDirectory(CurrentDirectory, savedEnvironmentCurrDir);
EnvironmentSandbox.Sandbox(callback);
}
catch (LuaException ex)
{
Console.WriteLine(ex);
Logger(ex.ToString());
if (exceptionCallback != null)
{
exceptionCallback();
}
}
finally
Console.WriteLine(ex);
Logger(ex.ToString());
exceptionCallback?.Invoke();
}
finally
{
if (CurrentDirectory != null)
CoolSetCurrentDirectory(savedEnvironmentCurrDir);
}
CoolSetCurrentDirectory(savedEnvironmentCurrDir);
}
}
public static LuaSandbox CreateSandbox(Lua thread, string initialDirectory)
@ -119,8 +112,8 @@ namespace BizHawk.Client.Common
public static LuaSandbox GetSandbox(Lua thread)
{
//this is just placeholder.
//we shouldnt be calling a sandbox with no thread--construct a sandbox properly
// this is just placeholder.
// we shouldnt be calling a sandbox with no thread--construct a sandbox properly
if (thread == null)
{
return new LuaSandbox();
@ -133,8 +126,8 @@ namespace BizHawk.Client.Common
return sandbox;
else
{
//for now: throw exception (I want to manually creating them)
//return CreateSandbox(thread);
// for now: throw exception (I want to manually creating them)
// return CreateSandbox(thread);
throw new InvalidOperationException("HOARY GORILLA HIJINX");
}
}
@ -143,6 +136,6 @@ namespace BizHawk.Client.Common
public static void Sandbox(Lua thread, Action callback, Action exceptionCallback = null)
{
GetSandbox(thread).Sandbox(callback, exceptionCallback);
}
}
}
}
}
}

View File

@ -50,7 +50,7 @@ namespace BizHawk.Client.Common
{ "A78", 59.9227510135505 },
{ "Coleco", 59.9227510135505 },
//according to http://problemkaputt.de/psx-spx.htm
// according to http://problemkaputt.de/psx-spx.htm
{ "PSX", 44100.0*768*11/7/263/3413 }, // 59.292862562
{ "PSX_PAL", 44100.0*768*11/7/314/3406 }, // 49.7645593576
@ -60,7 +60,6 @@ namespace BizHawk.Client.Common
{ "C64_DREAN", PAL_N_CARRIER*2/7/312/65 },
{ "INTV", 59.92 }
// according to ryphecha, using
// clocks[2] = { 53.693182e06, 53.203425e06 }; //ntsc console, pal console
// lpf[2][2] = { { 263, 262.5 }, { 314, 312.5 } }; //ntsc,pal; noninterlaced, interlaced

View File

@ -30,7 +30,7 @@ namespace BizHawk.Client.Common
{
var groups = _logKey.Split(new[] { "#" }, StringSplitOptions.RemoveEmptyEntries);
var controls = groups
.Select(@group => @group.Split(new[] { "|" }, StringSplitOptions.RemoveEmptyEntries).ToList())
.Select(group => group.Split(new[] { "|" }, StringSplitOptions.RemoveEmptyEntries).ToList())
.ToList();
_type.ControlsFromLog = controls;
@ -162,7 +162,7 @@ namespace BizHawk.Client.Common
if (!string.IsNullOrWhiteSpace(mnemonic))
{
var def = Global.Emulator.ControllerDefinition;
var trimmed = mnemonic.Replace("|", "");
var trimmed = mnemonic.Replace("|", string.Empty);
var buttons = Definition.ControlsOrdered.SelectMany(x => x).ToList();
var iterator = 0;
@ -177,7 +177,7 @@ namespace BizHawk.Client.Common
{
var temp = trimmed.Substring(iterator, 5);
var val = int.Parse(temp.Trim());
this.MyFloatControls[key] = val;
MyFloatControls[key] = val;
iterator += 6;
}

View File

@ -9,11 +9,11 @@ namespace BizHawk.Client.Common
get
{
var key = button
.Replace("P1 ", "")
.Replace("P2 ", "")
.Replace("P3 ", "")
.Replace("P4 ", "")
.Replace("Key ", "");
.Replace("P1 ", string.Empty)
.Replace("P2 ", string.Empty)
.Replace("P3 ", string.Empty)
.Replace("P4 ", string.Empty)
.Replace("Key ", string.Empty);
if (SystemOverrides.ContainsKey(Global.Emulator.SystemId) && SystemOverrides[Global.Emulator.SystemId].ContainsKey(key))
{

View File

@ -1,8 +1,8 @@
using System.Linq;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BizHawk.Emulation.Common;
using System.Collections.Generic;
namespace BizHawk.Client.Common
{
@ -19,15 +19,9 @@ namespace BizHawk.Client.Common
_logKey = logKey;
}
public IMovieController MovieControllerAdapter
{
get
{
return new Bk2ControllerAdapter(_logKey);
}
}
public IMovieController MovieControllerAdapter => new Bk2ControllerAdapter(_logKey);
#region ILogEntryGenerator Implementation
#region ILogEntryGenerator Implementation
public void SetSource(IController source)
{
@ -39,23 +33,11 @@ namespace BizHawk.Client.Common
return CreateLogEntry(forInputDisplay: true);
}
public bool IsEmpty
{
get
{
return EmptyEntry == GenerateLogEntry();
}
}
public bool IsEmpty => EmptyEntry == GenerateLogEntry();
public string EmptyEntry
{
get
{
return CreateLogEntry(createEmpty: true);
}
}
public string EmptyEntry => CreateLogEntry(createEmpty: true);
public string GenerateLogEntry()
public string GenerateLogEntry()
{
return CreateLogEntry();
}
@ -107,7 +89,9 @@ namespace BizHawk.Client.Common
var sb = new StringBuilder();
if (!forInputDisplay)
{
sb.Append('|');
}
foreach (var group in _source.Definition.ControlsOrdered)
{
@ -131,9 +115,13 @@ namespace BizHawk.Client.Common
}
if (forInputDisplay && val == mid)
{
sb.Append(" ");
}
else
{
sb.Append(val.ToString().PadLeft(5, ' ')).Append(',');
}
}
else if (_source.Definition.BoolButtons.Contains(button))
{
@ -149,7 +137,9 @@ namespace BizHawk.Client.Common
}
if (!forInputDisplay)
{
sb.Append('|');
}
}
}

View File

@ -8,9 +8,11 @@ namespace BizHawk.Client.Common
{
get
{
var key = button.Replace("Key ", "");
var key = button.Replace("Key ", string.Empty);
if (key.StartsWith("P") && key.Length > 1 && key[1] >= '0' && key[1] <= '9')
{
key = key.Substring(3);
}
if (SystemOverrides.ContainsKey(Global.Emulator.SystemId) && SystemOverrides[Global.Emulator.SystemId].ContainsKey(key))
{

View File

@ -8,17 +8,18 @@ namespace BizHawk.Client.Common
protected readonly Bk2Header Header = new Bk2Header();
private string _syncSettingsJson = string.Empty;
public IDictionary<string, string> HeaderEntries
{
get { return Header; }
}
public IDictionary<string, string> HeaderEntries => Header;
public SubtitleList Subtitles { get; private set; }
public IList<string> Comments { get; private set; }
public SubtitleList Subtitles { get; }
public IList<string> Comments { get; }
public string SyncSettingsJson
{
get { return _syncSettingsJson; }
get
{
return _syncSettingsJson;
}
set
{
if (_syncSettingsJson != value)
@ -147,7 +148,11 @@ namespace BizHawk.Client.Common
public string Hash
{
get { return Header[HeaderKeys.SHA1]; }
get
{
return Header[HeaderKeys.SHA1];
}
set
{
if (Header[HeaderKeys.SHA1] != value)
@ -160,7 +165,11 @@ namespace BizHawk.Client.Common
public string Author
{
get { return Header[HeaderKeys.AUTHOR]; }
get
{
return Header[HeaderKeys.AUTHOR];
}
set
{
if (Header[HeaderKeys.AUTHOR] != value)
@ -173,7 +182,11 @@ namespace BizHawk.Client.Common
public string Core
{
get { return Header[HeaderKeys.CORE]; }
get
{
return Header[HeaderKeys.CORE];
}
set
{
if (Header[HeaderKeys.CORE] != value)
@ -186,7 +199,11 @@ namespace BizHawk.Client.Common
public string BoardName
{
get { return Header[HeaderKeys.BOARDNAME]; }
get
{
return Header[HeaderKeys.BOARDNAME];
}
set
{
if (Header[HeaderKeys.BOARDNAME] != value)
@ -199,7 +216,11 @@ namespace BizHawk.Client.Common
public string EmulatorVersion
{
get { return Header[HeaderKeys.EMULATIONVERSION]; }
get
{
return Header[HeaderKeys.EMULATIONVERSION];
}
set
{
if (Header[HeaderKeys.EMULATIONVERSION] != value)
@ -212,7 +233,11 @@ namespace BizHawk.Client.Common
public string FirmwareHash
{
get { return Header[HeaderKeys.FIRMWARESHA1]; }
get
{
return Header[HeaderKeys.FIRMWARESHA1];
}
set
{
if (Header[HeaderKeys.FIRMWARESHA1] != value)
@ -253,7 +278,7 @@ namespace BizHawk.Client.Common
{
var sb = new StringBuilder();
foreach(var comment in Comments)
foreach (var comment in Comments)
{
sb.AppendLine(comment);
}

View File

@ -21,7 +21,7 @@ namespace BizHawk.Client.Common
}
var backupName = Filename;
backupName = backupName.Insert(Filename.LastIndexOf("."), string.Format(".{0:yyyy-MM-dd HH.mm.ss}", DateTime.Now));
backupName = backupName.Insert(Filename.LastIndexOf("."), $".{DateTime.Now:yyyy-MM-dd HH.mm.ss}");
backupName = Path.Combine(Global.Config.PathEntries["Global", "Movie backups"].Path, Path.GetFileName(backupName));
var directory_info = new FileInfo(backupName).Directory;
@ -197,6 +197,7 @@ namespace BizHawk.Client.Common
{
bs.PutLump(BinaryStateLump.Corestate, (BinaryWriter bw) => bw.Write(BinarySavestate));
}
if (SavestateFramebuffer != null)
{
bs.PutLump(BinaryStateLump.Framebuffer,
@ -210,7 +211,9 @@ namespace BizHawk.Client.Common
}
if (!backup)
{
Changes = false;
}
}
protected void ClearBeforeLoad()

View File

@ -77,9 +77,10 @@ namespace BizHawk.Client.Common
{
break;
}
// in BK2, this is part of the input log, and not involved with the core state at all
// accordingly, this case (for special neshawk format frame numbers) is irrelevant
// probably
// in BK2, this is part of the input log, and not involved with the core state at all
// accordingly, this case (for special neshawk format frame numbers) is irrelevant
// probably
else if (line.Contains("Frame 0x")) // NES stores frame count in hex, yay
{
var strs = line.Split('x');
@ -317,7 +318,7 @@ namespace BizHawk.Client.Common
/// If the log key differs from the system's, it will be coverted
/// </summary>
/// <param name="line">a log entry line of text from the input log</param>
/// /// <param name="logKey">a log entry line of text from the input log</param>
/// <param name="logKey">a log entry line of text from the input log</param>
private string ConvertLogEntryFromFile(string line, string logKey)
{
var adapter = new Bk2LogEntryGenerator(logKey).MovieControllerAdapter;

View File

@ -7,27 +7,15 @@ namespace BizHawk.Client.Common
protected enum Moviemode { Inactive, Play, Record, Finished }
protected Moviemode _mode = Moviemode.Inactive;
public bool IsActive
{
get { return _mode != Moviemode.Inactive; }
}
public bool IsActive => _mode != Moviemode.Inactive;
public bool IsPlaying
{
get { return _mode == Moviemode.Play || _mode == Moviemode.Finished; }
}
public bool IsPlaying => _mode == Moviemode.Play || _mode == Moviemode.Finished;
public bool IsRecording
{
get { return _mode == Moviemode.Record; }
}
public bool IsRecording => _mode == Moviemode.Record;
public bool IsFinished
{
get { return _mode == Moviemode.Finished; }
}
public bool IsFinished => _mode == Moviemode.Finished;
public virtual void StartNewRecording()
public virtual void StartNewRecording()
{
_mode = Moviemode.Record;
if (Global.Config.EnableBackupMovies && MakeBackup && _log.Any())

View File

@ -46,8 +46,9 @@ namespace BizHawk.Client.Common
public string Name { get; private set; }
public virtual string PreferredExtension { get { return Extension; } }
public const string Extension = "bk2";
public virtual string PreferredExtension => Extension;
public const string Extension = "bk2";
public virtual bool Changes { get; protected set; }
public bool IsCountingRerecords { get; set; }
@ -70,12 +71,9 @@ namespace BizHawk.Client.Common
}
}
public int InputLogLength
{
get { return _log.Count; }
}
public int InputLogLength => _log.Count;
#region Log Editing
#region Log Editing
public void AppendFrame(IController source)
{
@ -112,8 +110,6 @@ namespace BizHawk.Client.Common
{
_log.RemoveRange(frame, _log.Count - frame);
Changes = true;
}
}
}
@ -122,7 +118,6 @@ namespace BizHawk.Client.Common
{
if (frame < FrameCount && frame >= 0)
{
int getframe;
if (LoopOffset.HasValue)

View File

@ -1,210 +1,225 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using BizHawk.Common;
namespace BizHawk.Client.Common
{
public static class StringLogUtil
{
using System;
using System.Collections.Generic;
using System.IO;
using BizHawk.Common;
namespace BizHawk.Client.Common
{
public static class StringLogUtil
{
public static bool DefaultToDisk;
public static bool DefaultToAWE;
public static IStringLog MakeStringLog()
{
if (DefaultToDisk)
return new StreamStringLog(true);
else if(DefaultToAWE)
return new StreamStringLog(false);
else return new ListStringLog();
}
}
public interface IStringLog : IDisposable, IEnumerable<string>
{
void RemoveAt(int index);
int Count { get; }
void Clear();
void Add(string str);
string this[int index] { get; set; }
void Insert(int index, string val);
void InsertRange(int index, IEnumerable<string> collection);
void AddRange(IEnumerable<string> collection);
void RemoveRange(int index, int count);
IStringLog Clone();
void CopyTo(string[] array);
void CopyTo(int index, string[] array, int arrayIndex, int count);
}
class ListStringLog : List<string>, IStringLog
{
public IStringLog Clone()
{
ListStringLog ret = new ListStringLog();
ret.AddRange(this);
return ret;
}
public void Dispose() { }
}
/// <summary>
/// A dumb-ish IStringLog with storage on disk with no provision for recovering lost space, except upon Clear()
/// The purpose here is to avoid having too complicated buggy logic or a dependency on sqlite or such.
/// It should be faster than those alternatives, but wasteful of disk space.
/// It should also be easier to add new IList<string>-like methods than dealing with a database
/// </summary>
class StreamStringLog : IStringLog
{
List<long> Offsets = new List<long>();
long cursor = 0;
BinaryWriter bw;
public static bool DefaultToAWE;
public static IStringLog MakeStringLog()
{
if (DefaultToDisk)
{
return new StreamStringLog(true);
}
if (DefaultToAWE)
{
return new StreamStringLog(false);
}
return new ListStringLog();
}
}
public interface IStringLog : IDisposable, IEnumerable<string>
{
void RemoveAt(int index);
int Count { get; }
void Clear();
void Add(string str);
string this[int index] { get; set; }
void Insert(int index, string val);
void InsertRange(int index, IEnumerable<string> collection);
void AddRange(IEnumerable<string> collection);
void RemoveRange(int index, int count);
IStringLog Clone();
void CopyTo(string[] array);
void CopyTo(int index, string[] array, int arrayIndex, int count);
}
class ListStringLog : List<string>, IStringLog
{
public IStringLog Clone()
{
ListStringLog ret = new ListStringLog();
ret.AddRange(this);
return ret;
}
public void Dispose() { }
}
/// <summary>
/// A dumb-ish IStringLog with storage on disk with no provision for recovering lost space, except upon Clear()
/// The purpose here is to avoid having too complicated buggy logic or a dependency on sqlite or such.
/// It should be faster than those alternatives, but wasteful of disk space.
/// It should also be easier to add new IList<string>-like methods than dealing with a database
/// </summary>
class StreamStringLog : IStringLog
{
List<long> Offsets = new List<long>();
long cursor = 0;
BinaryWriter bw;
BinaryReader br;
bool mDisk;
Stream stream;
public StreamStringLog(bool disk)
{
mDisk = disk;
if (disk)
{
var path = TempFileCleaner.GetTempFilename("movieOnDisk");
stream = new FileStream(path, FileMode.Create, System.Security.AccessControl.FileSystemRights.FullControl, FileShare.None, 4 * 1024, FileOptions.DeleteOnClose);
}
else
{
stream = new AWEMemoryStream();
}
bw = new BinaryWriter(stream);
br = new BinaryReader(stream);
}
public IStringLog Clone()
bool mDisk;
Stream stream;
public StreamStringLog(bool disk)
{
StreamStringLog ret = new StreamStringLog(mDisk); //doesnt necessarily make sense to copy the mDisk value, they could be designated for different targets...
for (int i = 0; i < Count; i++)
ret.Add(this[i]);
return ret;
}
public void Dispose()
{
stream.Dispose();
}
public int Count { get { return Offsets.Count; } }
public void Clear()
{
stream.SetLength(0);
Offsets.Clear();
cursor = 0;
}
public void Add(string str)
mDisk = disk;
if (disk)
{
var path = TempFileCleaner.GetTempFilename("movieOnDisk");
stream = new FileStream(path, FileMode.Create, System.Security.AccessControl.FileSystemRights.FullControl, FileShare.None, 4 * 1024, FileOptions.DeleteOnClose);
}
else
{
stream = new AWEMemoryStream();
}
bw = new BinaryWriter(stream);
br = new BinaryReader(stream);
}
public IStringLog Clone()
{
stream.Position = stream.Length;
Offsets.Add(stream.Position);
bw.Write(str);
bw.Flush();
}
public void RemoveAt(int index)
{
Offsets.RemoveAt(index);
//no garbage collection in the disk file... oh well.
}
public string this[int index]
{
get
{
stream.Position = Offsets[index];
return br.ReadString();
}
set
{
stream.Position = stream.Length;
Offsets[index] = stream.Position;
bw.Write(value);
bw.Flush();
}
}
public void Insert(int index, string val)
StreamStringLog ret = new StreamStringLog(mDisk); // doesnt necessarily make sense to copy the mDisk value, they could be designated for different targets...
for (int i = 0; i < Count; i++)
{
ret.Add(this[i]);
}
return ret;
}
public void Dispose()
{
stream.Position = stream.Length;
Offsets.Insert(index, stream.Position);
bw.Write(val);
bw.Flush();
}
public void InsertRange(int index, IEnumerable<string> collection)
{
foreach(var item in collection)
Insert(index++,item);
}
public void AddRange(IEnumerable<string> collection)
{
foreach (var item in collection)
Add(item);
}
class Enumerator : IEnumerator<string>
{
public StreamStringLog log;
int index = -1;
public string Current { get { return log[index]; } }
object System.Collections.IEnumerator.Current { get { return log[index]; } }
bool System.Collections.IEnumerator.MoveNext()
{
index++;
if (index >= log.Count)
{
index = log.Count;
return false;
}
return true;
}
void System.Collections.IEnumerator.Reset() { index = -1; }
public void Dispose() { }
}
IEnumerator<string> IEnumerable<string>.GetEnumerator()
{
return new Enumerator() { log = this };
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return new Enumerator() { log = this };
}
public void RemoveRange(int index, int count)
{
int end = index + count - 1;
for (int i = 0; i < count; i++)
{
RemoveAt(end);
end--;
}
}
public void CopyTo(string[] array)
{
for (int i = 0; i < Count; i++)
array[i] = this[i];
}
public void CopyTo(int index, string[] array, int arrayIndex, int count)
{
for (int i = 0; i < count; i++)
array[i + arrayIndex] = this[index + i];
}
}
}
stream.Dispose();
}
public int Count => Offsets.Count;
public void Clear()
{
stream.SetLength(0);
Offsets.Clear();
cursor = 0;
}
public void Add(string str)
{
stream.Position = stream.Length;
Offsets.Add(stream.Position);
bw.Write(str);
bw.Flush();
}
public void RemoveAt(int index)
{
// no garbage collection in the disk file... oh well.
Offsets.RemoveAt(index);
}
public string this[int index]
{
get
{
stream.Position = Offsets[index];
return br.ReadString();
}
set
{
stream.Position = stream.Length;
Offsets[index] = stream.Position;
bw.Write(value);
bw.Flush();
}
}
public void Insert(int index, string val)
{
stream.Position = stream.Length;
Offsets.Insert(index, stream.Position);
bw.Write(val);
bw.Flush();
}
public void InsertRange(int index, IEnumerable<string> collection)
{
foreach (var item in collection)
{
Insert(index++,item);
}
}
public void AddRange(IEnumerable<string> collection)
{
foreach (var item in collection)
{
Add(item);
}
}
class Enumerator : IEnumerator<string>
{
public StreamStringLog log;
int index = -1;
public string Current { get { return log[index]; } }
object System.Collections.IEnumerator.Current { get { return log[index]; } }
bool System.Collections.IEnumerator.MoveNext()
{
index++;
if (index >= log.Count)
{
index = log.Count;
return false;
}
return true;
}
void System.Collections.IEnumerator.Reset() { index = -1; }
public void Dispose() { }
}
IEnumerator<string> IEnumerable<string>.GetEnumerator()
{
return new Enumerator { log = this };
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return new Enumerator { log = this };
}
public void RemoveRange(int index, int count)
{
int end = index + count - 1;
for (int i = 0; i < count; i++)
{
RemoveAt(end);
end--;
}
}
public void CopyTo(string[] array)
{
for (int i = 0; i < Count; i++)
{
array[i] = this[i];
}
}
public void CopyTo(int index, string[] array, int arrayIndex, int count)
{
for (int i = 0; i < count; i++)
{
array[i + arrayIndex] = this[index + i];
}
}
}
}

View File

@ -236,7 +236,7 @@ namespace BizHawk.Client.Common
{
return;
}
string prefix = "";
string prefix = string.Empty;
if (ControlType != "Gameboy Controller" && ControlType != "TI83 Controller")
{
prefix = "P" + player + " ";
@ -277,9 +277,9 @@ namespace BizHawk.Client.Common
MyFloatControls[name] = state;
}
private string ControlType { get { return Definition.Name; } }
private string ControlType => Definition.Name;
private void SetGBAControllersAsMnemonic(string mnemonic)
private void SetGBAControllersAsMnemonic(string mnemonic)
{
MnemonicChecker c = new MnemonicChecker(mnemonic);
MyBoolButtons.Clear();

View File

@ -17,8 +17,8 @@ namespace BizHawk.Client.Common
this[HeaderKeys.RERECORDS] = "0";
}
public List<string> Comments { get; private set; }
public SubtitleList Subtitles { get; private set; }
public List<string> Comments { get; }
public SubtitleList Subtitles { get; }
public string SavestateBinaryBase64Blob
{

View File

@ -163,7 +163,7 @@ namespace BizHawk.Client.Common
for (int player = 1; player <= BkmMnemonicConstants.PLAYERS[_controlType]; player++)
{
var prefix = String.Empty;
var prefix = string.Empty;
if (_controlType != "Gameboy Controller" && _controlType != "TI83 Controller")
{
prefix = "P" + player + " ";
@ -199,19 +199,13 @@ namespace BizHawk.Client.Common
{
return GenerateLogEntry()
.Replace(".", " ")
.Replace("|", "")
.Replace("|", string.Empty)
.Replace(" 000, 000", " ");
}
public bool IsEmpty
{
get
{
return EmptyEntry == GenerateLogEntry();
}
}
public bool IsEmpty => EmptyEntry == GenerateLogEntry();
public string EmptyEntry
public string EmptyEntry
{
get
{
@ -260,15 +254,9 @@ namespace BizHawk.Client.Common
}
}
public IMovieController MovieControllerAdapter
{
get
{
return new BkmControllerAdapter();
}
}
public IMovieController MovieControllerAdapter => new BkmControllerAdapter();
#region Privates
#region Privates
private bool IsBasePressed(string name)
{
@ -511,7 +499,7 @@ namespace BizHawk.Client.Common
input.Append(' ');
}
input.Append(String.Format("{0:000}", val)).Append(',');
input.Append($"{val:000}").Append(',');
}
input.Remove(input.Length - 1, 1);

View File

@ -10,7 +10,7 @@ namespace BizHawk.Client.Common
{
"Gameboy Controller", new Dictionary<string, string>
{
{"Up", "U"}, {"Down", "D"}, {"Left", "L"}, {"Right", "R"}, {"Select", "s"}, {"Start", "S"}, {"B", "B"}, {"A", "A"}
{ "Up", "U" }, { "Down", "D" }, { "Left", "L" }, { "Right", "R" }, { "Select", "s" }, { "Start", "S" }, { "B", "B" }, { "A", "A" }
}
},
{

View File

@ -4,25 +4,13 @@ namespace BizHawk.Client.Common
{
public partial class BkmMovie
{
public IDictionary<string, string> HeaderEntries
{
get
{
return Header;
}
}
public SubtitleList Subtitles
{
get { return Header.Subtitles; }
}
public IDictionary<string, string> HeaderEntries => Header;
public IList<string> Comments
{
get { return Header.Comments; }
}
public SubtitleList Subtitles => Header.Subtitles;
public string SyncSettingsJson
public IList<string> Comments => Header.Comments;
public string SyncSettingsJson
{
get { return Header[HeaderKeys.SYNCSETTINGS]; }
set { Header[HeaderKeys.SYNCSETTINGS] = value; }
@ -41,7 +29,10 @@ namespace BizHawk.Client.Common
}
// Bkm doesn't support saveram anchored movies
public bool StartsFromSaveRam { get { return false; } set { } }
public bool StartsFromSaveRam
{
get { return false; } set { }
}
public string GameName
{

View File

@ -46,7 +46,7 @@ namespace BizHawk.Client.Common
}
var backupName = Filename;
backupName = backupName.Insert(Filename.LastIndexOf("."), string.Format(".{0:yyyy-MM-dd HH.mm.ss}", DateTime.Now));
backupName = backupName.Insert(Filename.LastIndexOf("."), $".{DateTime.Now:yyyy-MM-dd HH.mm.ss}");
backupName = Path.Combine(Global.Config.PathEntries["Global", "Movie backups"].Path, Path.GetFileName(backupName));
var directory_info = new FileInfo(backupName).Directory;
@ -107,8 +107,11 @@ namespace BizHawk.Client.Common
}
}
}
if (Header.SavestateBinaryBase64Blob != null)
{
BinarySavestate = Convert.FromBase64String(Header.SavestateBinaryBase64Blob);
}
Loaded = true;
_changes = false;
@ -138,9 +141,9 @@ namespace BizHawk.Client.Common
// No using block because we're sharing the stream and need to give it back undisposed.
var sr = new StreamReader(hawkFile.GetStream());
for (; ; )
for (;;)
{
//read to first space (key/value delimeter), or pipe, or EOF
// read to first space (key/value delimeter), or pipe, or EOF
int first = sr.Read();
if (first == -1)
@ -148,16 +151,16 @@ namespace BizHawk.Client.Common
break;
} // EOF
if (first == '|') //pipe: begin input log
if (first == '|') // pipe: begin input log
{
//NOTE - this code is a bit convoluted due to its predating the basic outline of the parser which was upgraded in may 2014
// NOTE - this code is a bit convoluted due to its predating the basic outline of the parser which was upgraded in may 2014
var line = '|' + sr.ReadLine();
//how many bytes are left, total?
// how many bytes are left, total?
long remain = sr.BaseStream.Length - sr.BaseStream.Position;
//try to find out whether we use \r\n or \n
//but only look for 1K characters.
// try to find out whether we use \r\n or \n
// but only look for 1K characters.
bool usesR = false;
for (int i = 0; i < 1024; i++)
{
@ -173,19 +176,22 @@ namespace BizHawk.Client.Common
break;
}
int lineLen = line.Length + 1; //account for \n
if (usesR) lineLen++; //account for \r
int lineLen = line.Length + 1; // account for \n
if (usesR)
{
lineLen++; // account for \r
}
_preloadFramecount = (int)(remain / lineLen); //length is remaining bytes / length per line
_preloadFramecount++; //account for the current line
_preloadFramecount = (int)(remain / lineLen); // length is remaining bytes / length per line
_preloadFramecount++; // account for the current line
break;
}
else
{
//a header line. finish reading key token, to make sure it isn't one of the FORBIDDEN keys
// a header line. finish reading key token, to make sure it isn't one of the FORBIDDEN keys
var sbLine = new StringBuilder();
sbLine.Append((char)first);
for (; ; )
for (;;)
{
int c = sr.Read();
if (c == -1) break;
@ -196,21 +202,22 @@ namespace BizHawk.Client.Common
var line = sbLine.ToString();
//ignore these suckers, theyre way too big for preloading. seriously, we will get out of memory errors.
// ignore these suckers, theyre way too big for preloading. seriously, we will get out of memory errors.
var skip = line == HeaderKeys.SAVESTATEBINARYBASE64BLOB;
if (skip)
{
//skip remainder of the line
// skip remainder of the line
sr.DiscardBufferedData();
var stream = sr.BaseStream;
for (; ; )
for (;;)
{
int c = stream.ReadByte();
if (c == -1) break;
if (c == '\n') break;
}
//proceed to next line
// proceed to next line
continue;
}
@ -236,10 +243,9 @@ namespace BizHawk.Client.Common
private void Write(string fn)
{
if (BinarySavestate != null)
Header.SavestateBinaryBase64Blob = Convert.ToBase64String(BinarySavestate);
else
Header.SavestateBinaryBase64Blob = null;
Header.SavestateBinaryBase64Blob = BinarySavestate != null
? Convert.ToBase64String(BinarySavestate)
: null;
using (var fs = new FileStream(fn, FileMode.Create, FileAccess.Write, FileShare.Read))
{

View File

@ -8,27 +8,15 @@ namespace BizHawk.Client.Common
private Moviemode _mode = Moviemode.Inactive;
public bool IsPlaying
{
get { return _mode == Moviemode.Play || _mode == Moviemode.Finished; }
}
public bool IsPlaying => _mode == Moviemode.Play || _mode == Moviemode.Finished;
public bool IsRecording
{
get { return _mode == Moviemode.Record; }
}
public bool IsRecording => _mode == Moviemode.Record;
public bool IsActive
{
get { return _mode != Moviemode.Inactive; }
}
public bool IsActive => _mode != Moviemode.Inactive;
public bool IsFinished
{
get { return _mode == Moviemode.Finished; }
}
public bool IsFinished => _mode == Moviemode.Finished;
public void StartNewRecording()
public void StartNewRecording()
{
_mode = Moviemode.Record;
if (Global.Config.EnableBackupMovies && _makeBackup && _log.Any())

View File

@ -18,8 +18,7 @@ namespace BizHawk.Client.Common
public BkmMovie()
{
Header = new BkmHeader();
Header[HeaderKeys.MOVIEVERSION] = "BizHawk v0.0.1";
Header = new BkmHeader { [HeaderKeys.MOVIEVERSION] = "BizHawk v0.0.1" };
Filename = string.Empty;
_preloadFramecount = 0;
@ -35,20 +34,18 @@ namespace BizHawk.Client.Common
return new BkmLogEntryGenerator();
}
public string PreferredExtension { get { return Extension; } }
public const string Extension = "bkm";
public string PreferredExtension => Extension;
public BkmHeader Header { get; private set; }
public const string Extension = "bkm";
public BkmHeader Header { get; }
public string Filename { get; set; }
public bool IsCountingRerecords { get; set; }
public bool Loaded { get; private set; }
public int InputLogLength
{
get { return _log.Count; }
}
public int InputLogLength => _log.Count;
public double FrameCount
public double FrameCount
{
get
{
@ -66,10 +63,7 @@ namespace BizHawk.Client.Common
}
}
public bool Changes
{
get { return _changes; }
}
public bool Changes => _changes;
#endregion
@ -79,7 +73,6 @@ namespace BizHawk.Client.Common
{
if (frame < FrameCount && frame >= 0)
{
int getframe;
if (_loopOffset.HasValue)

View File

@ -115,7 +115,9 @@ namespace BizHawk.Client.Common.MovieConversionExtensions
bk2.SaveRam = old.SaveRam;
if (!backup)
{
bk2.Save();
}
return bk2;
}
@ -142,7 +144,7 @@ namespace BizHawk.Client.Common.MovieConversionExtensions
}
}
TasMovie tas = new TasMovie(newFilename, true);
var tas = new TasMovie(newFilename, true);
tas.BinarySavestate = savestate;
tas.ClearLagLog();
@ -185,7 +187,9 @@ namespace BizHawk.Client.Common.MovieConversionExtensions
foreach (TasMovieMarker marker in old.Markers)
{
if (marker.Frame > frame)
{
tas.Markers.Add(new TasMovieMarker(marker.Frame - frame, marker.Message));
}
}
tas.TasStateManager.Settings = old.TasStateManager.Settings;
@ -216,7 +220,7 @@ namespace BizHawk.Client.Common.MovieConversionExtensions
}
}
TasMovie tas = new TasMovie(newFilename, true);
var tas = new TasMovie(newFilename, true);
tas.SaveRam = saveRam;
tas.TasStateManager.Clear();
tas.ClearLagLog();

View File

@ -2,10 +2,10 @@
{
public enum ToolFormUpdateType
{
//reserved
// reserved
Legacy, LegacyFast,
//reserved concept: we can run other events through here (should probably rename then)
// reserved concept: we can run other events through here (should probably rename then)
Reset,
/// <summary>
@ -60,7 +60,7 @@
/// </summary>
bool UpdateBefore { get; }
//Necessary winform calls
// Necessary winform calls
bool Focus();
bool ContainsFocus { get; }
void Show();
@ -69,4 +69,3 @@
bool IsHandleCreated { get; }
}
}

View File

@ -16,9 +16,27 @@
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=StyleCop_002ESA1201/@EntryIndexedValue">DO_NOT_SHOW</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=StyleCop_002ESA1202/@EntryIndexedValue">DO_NOT_SHOW</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=StyleCop_002ESA1210/@EntryIndexedValue">DO_NOT_SHOW</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AF/@EntryIndexedValue">AF</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ARGB/@EntryIndexedValue">ARGB</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BMP/@EntryIndexedValue">BMP</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CDL/@EntryIndexedValue">CDL</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CGB/@EntryIndexedValue">CGB</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=DB/@EntryIndexedValue">DB</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IO/@EntryIndexedValue">IO</s:String></wpf:ResourceDictionary>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GB/@EntryIndexedValue">GB</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GBA/@EntryIndexedValue">GBA</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GBC/@EntryIndexedValue">GBC</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GG/@EntryIndexedValue">GG</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=II/@EntryIndexedValue">II</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IO/@EntryIndexedValue">IO</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IPS/@EntryIndexedValue">IPS</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=NES/@EntryIndexedValue">NES</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=OR/@EntryIndexedValue">OR</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PC/@EntryIndexedValue">PC</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PCECD/@EntryIndexedValue">PCECD</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PSP/@EntryIndexedValue">PSP</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PSX/@EntryIndexedValue">PSX</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SG/@EntryIndexedValue">SG</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SGX/@EntryIndexedValue">SGX</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SNES/@EntryIndexedValue">SNES</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TI/@EntryIndexedValue">TI</s:String></wpf:ResourceDictionary>