BizHawk/BizHawk.Client.Common/cheats/N64GameSharkDecoder.cs

69 lines
1.6 KiB
C#

using System;
using System.Globalization;
namespace BizHawk.Client.Common.cheats
{
// TODO: support comparison cheat codes
public static class N64GameSharkDecoder
{
public static IDecodeResult Decode(string code)
{
if (code == null)
{
throw new ArgumentNullException(nameof(code));
}
if (code.IndexOf(" ") != 8)
{
return new InvalidCheatCode("GameShark Codes need to contain a space after the eighth character.");
}
if (code.Length != 13)
{
return new InvalidCheatCode("GameShark Codes need to be 13 characters in length.");
}
switch (code.Substring(0, 2))
{
case "50":
case "D0":
case "D1":
case "D2":
case "D3":
return new InvalidCheatCode("This code is not yet supported by BizHawk.");
case "EE":
case "DD":
case "CC":
return new InvalidCheatCode("This code is for Disabling the Expansion Pak. This is not allowed.");
case "DE":
// Single Write ON-Boot code.
// Not Necessary? Think so?
case "F0":
case "F1":
case "2A":
case "3C":
case "FF":
return new InvalidCheatCode("This code is not needed by Bizhawk.");
}
var s = code.Remove(0, 2);
return new DecodeResult
{
Size = code.Substring(0, 2) switch
{
"80" => WatchSize.Byte,
"81" => WatchSize.Word,
"88" => WatchSize.Byte,
"89" => WatchSize.Word,
"A0" => WatchSize.Byte,
"A1" => WatchSize.Word,
_ => WatchSize.Byte,
},
Address = int.Parse(s.Remove(6, 5), NumberStyles.HexNumber),
Value = int.Parse(s.Remove(0, 7), NumberStyles.HexNumber)
};
}
}
}