/// <summary> /// Generate a command for a binary. /// </summary> /// <param name="s2"></param> /// <returns></returns> public CommandBinary.command GenerateCommand(string s) { CommandBinary.command c = new CommandBinary.command(); c.length = 1; //Text ID. if (s.Contains("End;")) { c.length = 0; return(c); } string id = s.Split(':')[0]; if (s.Contains("[")) { id = id.Split('[')[0]; } if (id.Contains("(")) { id = id.Split('(')[0]; } if (id.Contains("{")) { id = id.Split('{')[0]; } //Cam Instruction. if (id == "Cam_Instruction") { c.instruction = 0x4; c.cameraCommand = byte.Parse(NumberInterpreter.ParseValue(s.Split('(')[1].Split(')')[0])); List <byte> param = new List <byte>(); string[] paramS = s.Split('[')[1].Split(']')[0].Split(','); foreach (string s2 in paramS) { if (s2 != "") { param.Add(byte.Parse(NumberInterpreter.ParseValue(s2))); } } c.parameters = param.ToArray(); } //Instruction. else if (id == "Instruction") { c.instruction = byte.Parse(NumberInterpreter.ParseValue(s.Split('(')[1].Split(')')[0])); List <byte> param = new List <byte>(); string[] paramS = s.Split('[')[1].Split(']')[0].Split(','); foreach (string s2 in paramS) { if (s2 != "") { param.Add(byte.Parse(NumberInterpreter.ParseValue(s2))); } } c.parameters = param.ToArray(); } //Custom. else { for (int i = 0; i < kuppaChanges.Count(); i++) { if (id == kuppaChanges[i].textShortcut) { if (kuppaChanges[i].isCamera) { c.instruction = 0x4; c.cameraCommand = (byte)kuppaChanges[i].id; } else if (kuppaChanges[i].isPlayer) { string player = s.Split('{')[1].Split('}')[0]; switch (player.ToLower()) { case "0": case "mario": c.instruction = 0; break; case "1": case "luigi": c.instruction = 1; break; case "2": case "wario": c.instruction = 2; break; case "3": case "yoshi": c.instruction = 3; break; } } else { c.instruction = (byte)kuppaChanges[i].id; } List <int> param = new List <int>(); if (kuppaChanges[i].paramSizes.Length > 0) { string[] paramS = s.Split('[')[1].Split(']')[0].Split(','); foreach (string s2 in paramS) { param.Add(int.Parse(NumberInterpreter.ParseValue(s2))); } } int pos = 0; MemoryStream o = new MemoryStream(); BinaryWriter bw = new BinaryWriter(o); foreach (int num in kuppaChanges[i].paramSizes) { switch (num) { case 1: bw.Write((byte)param[pos]); pos += 1; break; case 2: bw.Write((UInt16)param[pos]); pos += 1; break; case 4: bw.Write((UInt32)param[pos]); pos += 1; break; } } c.parameters = o.ToArray(); if (kuppaChanges[i].isPlayer) { List <byte> newPar = new List <byte>(); newPar.Add((byte)kuppaChanges[i].id); foreach (byte b in o.ToArray()) { newPar.Add(b); } c.parameters = newPar.ToArray(); } } } } if (s.Split(':')[1].Split('(')[1].Split(')')[0].Contains(',')) { c.minFrame = Int16.Parse(NumberInterpreter.ParseValue(s.Split(':')[1].Split('(')[1].Split(')')[0].Split(',')[0])); c.maxFrame = Int16.Parse(NumberInterpreter.ParseValue(s.Split(':')[1].Split('(')[1].Split(')')[0].Split(',')[1])); } else { c.minFrame = Int16.Parse(NumberInterpreter.ParseValue(s.Split(':')[1].Split('(')[1].Split(')')[0])); c.maxFrame = Int16.Parse(NumberInterpreter.ParseValue(s.Split(':')[1].Split('(')[1].Split(')')[0])); } return(c); }
/// <summary> /// Get text command from binary command. /// </summary> /// <param name="c"></param> /// <returns></returns> public string FetchCommand(CommandBinary.command c) { string command = ""; //End Command. if (c.length == 0) { command = "End;"; } //Something Else. else { //Camera-Type. if (c.instruction == 0x4) { //See if shortcut exists. bool shortcutFound = false; foreach (kuppaChange k in kuppaChanges) { if (k.id == c.cameraCommand && k.isCamera && !shortcutFound) { shortcutFound = true; command = k.textShortcut; if (k.paramSizes.Length == 0) { if (c.minFrame != c.maxFrame) { command += " : (" + c.minFrame + ", " + c.maxFrame + ");"; } else { command += " : (" + c.minFrame + ");"; } } else { command += "["; MemoryStream src = new MemoryStream(c.parameters); BinaryReader br = new BinaryReader(src); int count = 0; foreach (int size in k.paramSizes) { long num; string realNum = ""; switch (size) { case 1: num = br.ReadByte(); break; case 2: num = br.ReadInt16(); break; case 4: num = br.ReadInt32(); break; case 8: num = br.ReadInt64(); break; default: throw new Exception("Unsupported Parameter Size!"); break; } switch (k.paramFormats[count]) { case NumberFormats.Decimal: realNum = num.ToString(); break; case NumberFormats.Hex: realNum = IntToHex(num); break; case NumberFormats.Bin: realNum = IntToBinary(num); break; case NumberFormats.Input: realNum = IntToInput(num); break; } command += realNum + ", "; count += 1; } char[] trimChars = { ',', ' ' }; command = command.TrimEnd(trimChars); if (c.minFrame != c.maxFrame) { command += "] : (" + c.minFrame + ", " + c.maxFrame + ");"; } else { command += "] : (" + c.minFrame + ");"; } } } } //No shortcut available. if (!shortcutFound) { command = "Cam_Instruction(" + c.cameraCommand + ")["; foreach (byte b in c.parameters) { command += "" + String.Format("0x{0:X}", b) + ", "; } char[] trimChars = { ',', ' ' }; command = command.TrimEnd(trimChars); if (c.minFrame != c.maxFrame) { command += "] : (" + c.minFrame + ", " + c.maxFrame + ");"; } else { command += "] : (" + c.minFrame + ");"; } } } //Player else if (c.instruction < 4) { //See if shortcut exists. bool shortcutFound = false; foreach (kuppaChange k in kuppaChanges) { if (k.id == c.parameters[0] && k.isPlayer && !shortcutFound) { shortcutFound = true; command = k.textShortcut; string player = "Mario"; switch (c.instruction) { case 1: player = "Luigi"; break; case 2: player = "Wario"; break; case 3: player = "Yoshi"; break; } if (k.paramSizes.Length == 0) { if (c.minFrame != c.maxFrame) { command += "{" + player + "} : (" + c.minFrame + ", " + c.maxFrame + ");"; } else { command += "{" + player + "} : (" + c.minFrame + ");"; } } else { command += "{" + player + "} ["; MemoryStream src = new MemoryStream(c.parameters); BinaryReader br = new BinaryReader(src); br.ReadByte(); int count = 0; foreach (int size in k.paramSizes) { long num; string realNum = ""; switch (size) { case 1: num = br.ReadByte(); break; case 2: num = br.ReadInt16(); break; case 4: num = br.ReadInt32(); break; case 8: num = br.ReadInt64(); break; default: throw new Exception("Unsupported Parameter Size!"); break; } switch (k.paramFormats[count]) { case NumberFormats.Decimal: realNum = num.ToString(); break; case NumberFormats.Hex: realNum = IntToHex(num); break; case NumberFormats.Bin: realNum = IntToBinary(num); break; case NumberFormats.Input: realNum = IntToInput(num); break; } command += realNum + ", "; count += 1; } char[] trimChars = { ',', ' ' }; command = command.TrimEnd(trimChars); if (c.minFrame != c.maxFrame) { command += "] : (" + c.minFrame + ", " + c.maxFrame + ");"; } else { command += "] : (" + c.minFrame + ");"; } } } } //No shortcut available. if (!shortcutFound) { command = "Instruction(" + c.instruction + ")["; foreach (byte b in c.parameters) { command += "" + String.Format("0x{0:X}", b) + ", "; } char[] trimChars = { ',', ' ' }; command = command.TrimEnd(trimChars); if (c.minFrame != c.maxFrame) { command += "] : (" + c.minFrame + ", " + c.maxFrame + ");"; } else { command += "] : (" + c.minFrame + ");"; } } } //Other Type. else { //See if shortcut exists. bool shortcutFound = false; foreach (kuppaChange k in kuppaChanges) { if (k.id == c.instruction && !k.isCamera && !shortcutFound) { shortcutFound = true; command = k.textShortcut; if (k.paramSizes.Length == 0) { if (c.minFrame != c.maxFrame) { command += " : (" + c.minFrame + ", " + c.maxFrame + ");"; } else { command += " : (" + c.minFrame + ");"; } } else { command += "["; MemoryStream src = new MemoryStream(c.parameters); BinaryReader br = new BinaryReader(src); int count = 0; foreach (int size in k.paramSizes) { long num; string realNum = ""; switch (size) { case 1: num = br.ReadByte(); break; case 2: num = br.ReadInt16(); break; case 4: num = br.ReadInt32(); break; case 8: num = br.ReadInt64(); break; default: throw new Exception("Unsupported Parameter Size!"); break; } switch (k.paramFormats[count]) { case NumberFormats.Decimal: realNum = num.ToString(); break; case NumberFormats.Hex: realNum = IntToHex(num); break; case NumberFormats.Bin: realNum = IntToBinary(num); break; case NumberFormats.Input: realNum = IntToInput(num); break; } command += realNum + ", "; count += 1; } char[] trimChars = { ',', ' ' }; command = command.TrimEnd(trimChars); if (c.minFrame != c.maxFrame) { command += "] : (" + c.minFrame + ", " + c.maxFrame + ");"; } else { command += "] : (" + c.minFrame + ");"; } } } } //No shortcut available. if (!shortcutFound) { command = "Instruction(" + c.instruction + ")["; foreach (byte b in c.parameters) { command += "" + String.Format("0x{0:X}", b) + ", "; } char[] trimChars = { ',', ' ' }; command = command.TrimEnd(trimChars); command += "] : (" + c.minFrame + ", " + c.maxFrame + ");"; } } } return(command); }