diff --git a/PS4CheaterNeo/Main.cs b/PS4CheaterNeo/Main.cs index 1901e86..d45952a 100644 --- a/PS4CheaterNeo/Main.cs +++ b/PS4CheaterNeo/Main.cs @@ -6,11 +6,15 @@ using System.IO; using System.Linq; using System.Runtime.Serialization.Json; +using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; +using System.Web; using System.Windows.Forms; +using System.Xml; +using System.Xml.Serialization; namespace PS4CheaterNeo { @@ -19,6 +23,7 @@ public partial class Main : Form private Option option; private SendPayload sendPayload; private CheatJson cheatJson = null; + private CheatTrainer cheatTrainer = null; private Brush cheatGridViewRowIndexForeBrush; private bool VerifySectionWhenLock; private bool VerifySectionWhenRefresh; @@ -44,6 +49,7 @@ public class CheatRow public string GameVer { get; private set; } public Dictionary LocalHiddenSections { get; private set; } public string ProcessName; + public string ProcessContentid; public int ProcessPid; public Main() { @@ -68,6 +74,21 @@ public Main() CheatGridView.RowCount = 0; } + public void ParseLanguageJson() + { + string codes = Properties.Settings.Default.UILanguage.Value.ToString(); + string path = "languages\\LanguageFile_" + codes + ".json"; + + if (!File.Exists(path)) return; + + using (StreamReader sr = new StreamReader(path)) + using (Stream stream = sr.BaseStream) + { + DataContractJsonSerializer deseralizer = new DataContractJsonSerializer(typeof(LanguageJson)); + langJson = (LanguageJson)deseralizer.ReadObject(stream); + } + } + public void ApplyUI() { try @@ -201,11 +222,13 @@ private void ToolStripSend_Click(object sender, EventArgs e) } #region ToolStripOpenAndSave + private const string dialogFilter = "Cheat (*.cht)|*.cht|Cheat Relative (*.chtr)|*.chtr|Cheat Json (*.json)|*.json|Cheat Shn (*.shn)|*.shn"; private void ToolStripOpen_Click(object sender, EventArgs e) { try { - OpenCheatDialog.Filter = "Cheat files(*.cht;*.chtr;*.json;eboot.bin)|*.cht;*.chtr;*.json;eboot.bin|Cheat (*.cht)|*.cht|Cheat Relative (*.chtr)|*.chtr|Cheat Json (*.json)|*.json|eboot.bin (eboot.bin)|*.bin"; + OpenCheatDialog.Filter = + "Cheat files(*.cht;*.chtr;*.json;*.shn;*.mc4;eboot.bin)|*.cht;*.chtr;*.json;*.shn;*.mc4;eboot.bin|" + dialogFilter + "|Cheat MC4 (*.mc4)|*.mc4|eboot.bin (eboot.bin)|*.bin"; OpenCheatDialog.AddExtension = true; OpenCheatDialog.RestoreDirectory = true; @@ -216,6 +239,8 @@ private void ToolStripOpen_Click(object sender, EventArgs e) using (StreamReader sr = new StreamReader(OpenCheatDialog.FileName)) { if (OpenCheatDialog.FileName.ToUpper().EndsWith("JSON")) count = ParseCheatJson(sr.BaseStream); + else if (OpenCheatDialog.FileName.ToUpper().EndsWith("SHN")) count = ParseCheatSHN(sr.ReadToEnd()); + else if (OpenCheatDialog.FileName.ToUpper().EndsWith("MC4")) count = ParseCheatMC4(sr); else if (OpenCheatDialog.FileName.ToUpper().EndsWith("BIN")) count = ParseExecutableBIN(sr.BaseStream); else { @@ -250,12 +275,7 @@ private void ToolStripOpen_Click(object sender, EventArgs e) string PS4FWVersion = Properties.Settings.Default.PS4FWVersion.Value ?? ""; string FWVer = PS4FWVersion != "" ? PS4FWVersion : Constant.Versions[0]; - InitGameInfo(); - - if (GameID != cheatGameID && MessageBox.Show(string.Format("Your Game ID({0}) is different with cheat file({1}), still load?", GameID, cheatGameID), - "GameID", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != DialogResult.Yes) return; - if (GameVer != cheatGameVer && MessageBox.Show(string.Format("Your Game version({0}) is different with cheat file({1}), still load?", GameVer, cheatGameVer), - "GameVer", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != DialogResult.Yes) return; + if (!LoadCheatGameValid(cheatGameID, cheatGameVer)) return; if (FWVer != cheatFWVer && MessageBox.Show(string.Format("Your Firmware version({0}) is different with cheat file({1}), still load?", FWVer, cheatFWVer), "FWVer", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != DialogResult.Yes) return; #endregion @@ -268,7 +288,7 @@ private void ToolStripOpen_Click(object sender, EventArgs e) if (string.IsNullOrWhiteSpace(cheatStr)) continue; - string[] cheatElements = cheatStr.Split('|'); + string[] cheatElements = cheatStr.Split(new Char[] { '|' }, 10); if (cheatElements.Length < 5) continue; @@ -276,6 +296,7 @@ private void ToolStripOpen_Click(object sender, EventArgs e) bool isRelativeV1a = cheatElements[5].StartsWith("++"); if (isRelativeV1a) cheatElements[5] = cheatElements[5].Substring(1); bool isPointer = !cheatElements[5].Contains("[") && Regex.IsMatch(cheatElements[5], "[0-9A-F]+_", RegexOptions.IgnoreCase); + int relativeOffset = isRelative ? int.Parse(cheatElements[5].Substring(1), NumberStyles.HexNumber) : -1; uint sid = isRelative ? preData.sid : uint.Parse(cheatElements[0]); string name = isRelative ? preData.name : cheatElements[2]; uint prot = isRelative ? preData.prot : uint.Parse(cheatElements[3], NumberStyles.HexNumber); @@ -283,7 +304,14 @@ private void ToolStripOpen_Click(object sender, EventArgs e) bool cheatLock = bool.Parse(cheatElements[7]); string cheatValue = cheatElements[8]; string cheatDesc = cheatElements[9]; - int relativeOffset = isRelative ? int.Parse(cheatElements[5].Substring(1), NumberStyles.HexNumber) : -1; + string onValue = null; + string offValue = null; + if (Regex.Match(cheatDesc, @"(.*)\|([0-9A-Fa-f]+)\|([0-9A-Fa-f]+)") is Match m1 && m1.Success) + { + cheatDesc = m1.Groups[1].Value; + onValue = m1.Groups[2].Value; + offValue = m1.Groups[3].Value; + } Section section = isSIDv1 ? sectionTool.GetSectionBySIDv1(sid, name, prot) : sectionTool.GetSection(sid, name, prot); if (section == null && (ToolStripLockEnable.Checked || ToolStripAutoRefresh.Checked)) @@ -313,7 +341,7 @@ private void ToolStripOpen_Click(object sender, EventArgs e) } else offsetAddr = uint.Parse(cheatElements[5], NumberStyles.HexNumber); - CheatRow row = AddToCheatGrid(section, offsetAddr, cheatScanType, cheatValue, cheatLock, cheatDesc, pointerOffsets, pointerCaches, isRelative ? (int)preData.offsetAddr : -1, false); + CheatRow row = AddToCheatGrid(section, offsetAddr, cheatScanType, cheatValue, cheatLock, cheatDesc, pointerOffsets, pointerCaches, isRelative ? (int)preData.offsetAddr : -1, false, onValue, offValue); if (row.Cells == null || row.Cells.Count == 0) { preData = (0, "", 0, 0, 0); @@ -335,8 +363,7 @@ private void ToolStripOpen_Click(object sender, EventArgs e) if (cheatGridRowList.Count < CheatGridGroupRefreshThreshold && CheatGridView.GroupByEnabled) CheatGridView.GroupRefresh(); CheatGridView.ResumeLayout(); SaveCheatDialog.FileName = OpenCheatDialog.FileName; - SaveCheatDialog.FilterIndex = OpenCheatDialog.FilterIndex; - + if (OpenCheatDialog.FilterIndex < 6) SaveCheatDialog.FilterIndex = OpenCheatDialog.FilterIndex; ToolStripMsg.Text = string.Format("Successfully loaded {0} cheat items.", count); } catch (Exception ex) @@ -345,6 +372,7 @@ private void ToolStripOpen_Click(object sender, EventArgs e) } } + #region ParseLoadCheat /// /// PS4 Cheat Files Example: /// 1.5|eboot.bin|ID:CUSA99999|VER:09.99|FM:672 @@ -381,13 +409,13 @@ private void ParseCheatFiles(ref string[] cheatStrArr) { if (cheatElements[1] != "data") continue; - sequence = int.Parse(cheatElements[2]); - offsetAddrStr = cheatElements[3]; - section = sequence < sections.Length ? sections[sequence] : null; + sequence = int.Parse(cheatElements[2]); + offsetAddrStr = cheatElements[3]; + section = sequence < sections.Length ? sections[sequence] : null; string cheatCode = cheatElements[6]; - cheatLockStr = cheatElements[7]; - cheatDesc = cheatElements[8]; - string[] datas = cheatCode.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); + cheatLockStr = cheatElements[7]; + cheatDesc = cheatElements[8]; + string[] datas = cheatCode.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries); sectionStr = string.Format("{0}|{1}|{2}|{3}|{4}", section.SID, @@ -424,26 +452,26 @@ private void ParseCheatFiles(ref string[] cheatStrArr) } if (isPointer) { - string[] pointerList = cheatElements[3].Split('+'); + string[] pointerList = cheatElements[3].Split('+'); string[] addressElements = pointerList[0].Split('_'); - sequence = int.Parse(addressElements[1]); - offsetAddrStr = addressElements[2]; - section = sequence < sections.Length ? sections[sequence] : null; - for (int offsetIdx = 1; offsetIdx < pointerList.Length; ++offsetIdx) offsetAddrStr += "_" + pointerList[offsetIdx]; - scanTypeStr = cheatElements[5]; - cheatValue = cheatElements[6]; - cheatLockStr = cheatElements[7]; - cheatDesc = cheatElements[8]; + sequence = int.Parse(addressElements[1]); + offsetAddrStr = addressElements[2]; + section = sequence < sections.Length ? sections[sequence] : null; + for (int offsetIdx = 1; offsetIdx < pointerList.Length; ++offsetIdx) offsetAddrStr += "_" + pointerList[offsetIdx]; + scanTypeStr = cheatElements[5]; + cheatValue = cheatElements[6]; + cheatLockStr = cheatElements[7]; + cheatDesc = cheatElements[8]; } else { - sequence = int.Parse(cheatElements[1]); + sequence = int.Parse(cheatElements[1]); offsetAddrStr = cheatElements[2]; - section = sequence < sections.Length ? sections[sequence] : null; - scanTypeStr = cheatElements[3]; - cheatValue = cheatElements[4]; - cheatLockStr = cheatElements[5]; - cheatDesc = cheatElements[6]; + section = sequence < sections.Length ? sections[sequence] : null; + scanTypeStr = cheatElements[3]; + cheatValue = cheatElements[4]; + cheatLockStr = cheatElements[5]; + cheatDesc = cheatElements[6]; } sectionStr = string.Format("{0}|{1}|{2}|{3}|{4}", section.SID, @@ -517,25 +545,9 @@ private void ParseCheatFiles(ref string[] cheatStrArr) return code; } - public void ParseLanguageJson() - { - string codes = Properties.Settings.Default.UILanguage.Value.ToString(); - string path = "languages\\LanguageFile_" + codes + ".json"; - - if (!File.Exists(path)) return; - - using (StreamReader sr = new StreamReader(path)) - using (Stream stream = sr.BaseStream) - { - DataContractJsonSerializer deseralizer = new DataContractJsonSerializer(typeof(LanguageJson)); - langJson = (LanguageJson)deseralizer.ReadObject(stream); - } - } - /// /// Load a Cheat file in JSON format. /// - /// /// private int ParseCheatJson(Stream stream) { @@ -547,18 +559,7 @@ private int ParseCheatJson(Stream stream) ProcessName = cheatJson.Process; if (!InitSections(ProcessName)) return 0; - - #region cheatHeaderItems Check - string cheatGameID = cheatJson.Id; - string cheatGameVer = cheatJson.Version; - - InitGameInfo(); - - if (GameID != cheatGameID && MessageBox.Show(string.Format("Your Game ID({0}) is different with cheat file({1}), still load?", GameID, cheatGameID), - "GameID", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != DialogResult.Yes) return 0; - if (GameVer != cheatGameVer && MessageBox.Show(string.Format("Your Game version({0}) is different with cheat file({1}), still load?", GameVer, cheatGameVer), - "GameVer", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != DialogResult.Yes) return 0; - #endregion + if (!LoadCheatGameValid(cheatJson.Id, cheatJson.Version)) return 0; Section section; Section sectionFirst = sectionTool.GetSectionSortByAddr()[0]; @@ -566,11 +567,14 @@ private int ParseCheatJson(Stream stream) foreach (CheatJson.Mod cheatMod in cheatJson.Mods) { bool cheatLock = false; - string cheatDesc = cheatMod.Name; ScanType cheatScanType = ScanType.Hex; section = sectionFirst; - foreach (CheatJson.Memory memory in cheatMod.Memory) + for (int idx = 0; idx < cheatMod.Memory.Count; idx++) { + CheatJson.Memory memory = cheatMod.Memory[idx]; + string cheatDesc = cheatMod.Name; + if (cheatMod.Memory.Count > 1) cheatDesc += string.Format("_{0:00}", idx); + string cheatValue = memory.On; ulong offsetAddr = ulong.Parse(memory.Offset, NumberStyles.HexNumber); if (offsetAddr >= (ulong)sectionFirst.Length) @@ -594,6 +598,76 @@ private int ParseCheatJson(Stream stream) return count; } + private int ParseCheatSHN(string shnXML) + { + int count = 0; + using (StringReader readerXml = new StringReader(shnXML)) + { + XmlSerializer serializer = new XmlSerializer(typeof(CheatTrainer)); + cheatTrainer = (CheatTrainer)serializer.Deserialize(readerXml); + + ProcessName = cheatTrainer.Process; + if (!InitSections(ProcessName)) return 0; + if (!LoadCheatGameValid(cheatTrainer.Cusa, cheatTrainer.Version)) return 0; + + Section[] sections = sectionTool.GetSectionSortByAddr(); + CheatGridViewRowCountUpdate(false); + foreach (CheatTrainer.Cheat startUP in cheatTrainer.StartUPs) + { + ParseCheatline(startUP.Text, startUP.Description, startUP.Cheatlines, sections); + count++; + } + foreach (CheatTrainer.Cheat cheat in cheatTrainer.Cheats) + { + ParseCheatline(cheat.Text, cheat.Description, cheat.Cheatlines, sections); + count++; + } + CheatGridViewRowCountUpdate(); + } + void ParseCheatline(string text, string desc, List cheatlines, Section[] sections) + { + bool cheatLock = false; + ScanType cheatScanType = ScanType.Hex; + for (int idx = 0; idx < cheatlines.Count; idx++) + { + CheatTrainer.Cheatline cheatline = cheatlines[idx]; + Section section = sections[cheatline.SectionId]; + string onValue = cheatline.ValueOn.Replace("-", ""); + string offValue = cheatline.ValueOff.Replace("-", ""); + ulong offsetAddr = ulong.Parse(cheatline.Offset, NumberStyles.HexNumber); + + string cheatDesc = text; + if (cheatlines.Count > 1) cheatDesc += string.Format("_{0:00}", idx); + + AddToCheatGrid(section, (uint)offsetAddr, cheatScanType, onValue, cheatLock, cheatDesc, null, null, -1, false, onValue, offValue); + } + } + return count; + } + + private int ParseCheatMC4(StreamReader reader) + { + /// Decrypted by bucanero/save-decrypters. + /// https://github.com/bucanero/save-decrypters + byte[] aes256cbcKey = Encoding.ASCII.GetBytes("304c6528f659c766110239a51cl5dd9c"); + byte[] aes256cbcIv = Encoding.ASCII.GetBytes("u@}kzW2u[u(8DWar"); + + int count = 0; + using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider()) + { + string raw = reader.ReadToEnd(); + byte[] rawData = Convert.FromBase64String(raw); + var decryptor = aes.CreateDecryptor(aes256cbcKey, aes256cbcIv); + byte[] decBytes = decryptor.TransformFinalBlock(rawData, 0, rawData.Length); + string decXml = Encoding.UTF8.GetString(decBytes); + decXml = HttpUtility.HtmlDecode(decXml); + decXml = Regex.Unescape(decXml); + Console.WriteLine(decXml); + count = ParseCheatSHN(decXml); + } + return count; + } + private int ParseExecutableBIN(Stream stream) { if (!InitSections(Properties.Settings.Default.DefaultProcess.Value)) return 0; @@ -623,7 +697,7 @@ private int ParseExecutableBIN(Stream stream) if (seEntry0.props >> 20 == 0) break; } - if (seEntry0.fileSz == 0 && seEntry0.props >> 20 != 0 && MessageBox.Show("The information of Segment00 in the loaded \"eboot.bin\" file cannot be parsed.", "Load eboot.bin", MessageBoxButtons.OK, MessageBoxIcon.Warning) == DialogResult.OK) return 0; + if (seEntry0.fileSz == 0 && seEntry0.props >> 20 != 0 && MessageBox.Show("The information of Segment00 in the loaded \"eboot.bin\" file cannot be parsed.", "Load eboot.bin", MessageBoxButtons.OK, MessageBoxIcon.Warning) == DialogResult.OK) return 0; Section section = sectionTool.GetSection("executable", 5); byte[] checkBytes = PS4Tool.ReadMemory(ProcessPid, section.Start, 48); @@ -682,71 +756,48 @@ private int ParseExecutableBIN(Stream stream) return count; } + private bool LoadCheatGameValid(string cheatGameID, string cheatGameVer) + { + InitGameInfo(); + + if (GameID != cheatGameID && MessageBox.Show(string.Format("Your Game ID({0}) is different with cheat file({1}), still load?", GameID, cheatGameID), + "GameID", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != DialogResult.Yes) return false; + if (GameVer != cheatGameVer && MessageBox.Show(string.Format("Your Game version({0}) is different with cheat file({1}), still load?", GameVer, cheatGameVer), + "GameVer", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != DialogResult.Yes) return false; + + return true; + } + #endregion + private void ToolStripSave_Click(object sender, EventArgs e) { if (cheatGridRowList.Count == 0) return; string FWVer = Properties.Settings.Default.PS4FWVersion.Value; InitGameInfo(); - SaveCheatDialog.Filter = "Cheat (*.cht)|*.cht|Cheat Relative (*.chtr)|*.chtr|Cheat Json (*.json)|*.json"; + SaveCheatDialog.Filter = "Cheat files(*.cht;*.chtr;*.json;*.shn)|*.cht;*.chtr;*.json;*.shn|" + dialogFilter; SaveCheatDialog.AddExtension = true; SaveCheatDialog.RestoreDirectory = true; - if (string.IsNullOrWhiteSpace(SaveCheatDialog.FileName)) SaveCheatDialog.FileName = GameID; - - if (SaveCheatDialog.ShowDialog() != DialogResult.OK) return; - if (!InitSections(ProcessName)) return; - - if (SaveCheatDialog.FileName.ToUpper().EndsWith("JSON")) + if (string.IsNullOrWhiteSpace(SaveCheatDialog.FileName)) { - if (cheatJson == null || cheatJson.Id != GameID) cheatJson = new CheatJson(GameID, GameID, GameVer, ProcessName); - else cheatJson.Mods = new List(); - - CheatJson.Mod modBak = null; - Section sectionFirst = sectionTool.GetSectionSortByAddr()[0]; - for (int cIdx = 0; cIdx < cheatGridRowList.Count; cIdx++) + if (string.IsNullOrWhiteSpace(ProcessContentid)) { - CheatRow row = cheatGridRowList[cIdx]; - - (Section section, ulong offsetAddr) = (row.Section_, row.OffsetAddr); - if (section.SID != sectionFirst.SID) offsetAddr += section.Start - sectionFirst.Start; - - string cheatDesc = row.Cells[(int)ChertCol.CheatListDesc].ToString(); - ScanType scanType = this.ParseFromDescription(row.Cells[(int)ChertCol.CheatListType].ToString()); - string on = row.Cells[(int)ChertCol.CheatListValue].ToString(); - if (scanType != ScanType.Hex) - { - byte[] bytes = ScanTool.ValueStringToByte(scanType, on); - on = ScanTool.BytesToString(scanType, bytes, true, on.StartsWith("-")); - on = ScanTool.ReverseHexString(on); - } - string off = on; - if (Regex.Match(cheatDesc, @"(.*) *__ *\[ *on: *([0-9a-zA-Z]+) *off: *([0-9a-zA-Z]+)") is Match m1 && m1.Success) - { //Attempt to restore off value from desc - cheatDesc = m1.Groups[1].Value; - off = m1.Groups[3].Value; - } - - if (modBak != null && modBak.Name == cheatDesc) cheatJson.Mods[cheatJson.Mods.Count - 1].Memory.Add(new CheatJson.Memory(offsetAddr.ToString("X"), on, off)); - else + try { - CheatJson.Mod mod = new CheatJson.Mod(cheatDesc, "checkbox"); - mod.Memory.Add(new CheatJson.Memory(offsetAddr.ToString("X"), on, off)); - - cheatJson.Mods.Add(mod); - modBak = mod; + var processInfo = PS4Tool.GetProcessInfo(ProcessName); + ProcessPid = processInfo.pid; + ProcessContentid = processInfo.contentid; } - - } - - DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(CheatJson)); - using (var msObj = new MemoryStream()) - { - serializer.WriteObject(msObj, cheatJson); - var bytes = msObj.ToArray(); - string json = Encoding.UTF8.GetString(bytes, 0, bytes.Length); - using (var myStream = new StreamWriter(SaveCheatDialog.FileName)) myStream.Write(json); + catch {} } + SaveCheatDialog.FileName = string.IsNullOrWhiteSpace(ProcessContentid) ? GameID : ProcessContentid; } + + if (SaveCheatDialog.ShowDialog() != DialogResult.OK) return; + if (!InitSections(ProcessName)) return; + + if (SaveCheatDialog.FileName.ToUpper().EndsWith("JSON")) SaveCheatJson(); + else if (SaveCheatDialog.FileName.ToUpper().EndsWith("SHN")) SaveCheatShn(); else { string processName = ProcessName; @@ -770,8 +821,8 @@ private void ToolStripSave_Click(object sender, EventArgs e) newSection = sectionTool.GetSection(sid, sectionArr[1], uint.Parse(sectionArr[2])); addressStr = sectionArr[sectionArr.Length - 1]; } - else if (SaveCheatDialog.FilterIndex == 2 && isRelative) - { + else if (SaveCheatDialog.FilterIndex == 3 && isRelative) + { //Cheat Relative (*.chtr) addressStr = "+" + (offsetAddr - preAddr).ToString("X"); sectionStr = "||||"; } @@ -783,7 +834,7 @@ private void ToolStripSave_Click(object sender, EventArgs e) newSection.Prot.ToString("X"), newSection.Offset.ToString("X")); - saveBuf.AppendLine(string.Format("{0}|{1}|{2}|{3}|{4}|{5}", + saveBuf.Append(string.Format("{0}|{1}|{2}|{3}|{4}|{5}", sectionStr, addressStr, row.Cells[(int)ChertCol.CheatListType], @@ -791,7 +842,13 @@ private void ToolStripSave_Click(object sender, EventArgs e) row.Cells[(int)ChertCol.CheatListValue], row.Cells[(int)ChertCol.CheatListDesc] )); - if (SaveCheatDialog.FilterIndex == 2 && !isRelative) preAddr = offsetAddr; + if (!string.IsNullOrWhiteSpace((string)row.Cells[(int)ChertCol.CheatListOn])) + saveBuf.AppendLine(string.Format("|{0}|{1}", + row.Cells[(int)ChertCol.CheatListOn], + row.Cells[(int)ChertCol.CheatListOff] + )); + else saveBuf.AppendLine(); + if (SaveCheatDialog.FilterIndex == 3 && !isRelative) preAddr = offsetAddr; //Cheat Relative (*.chtr) } using (var myStream = new StreamWriter(SaveCheatDialog.FileName)) myStream.Write(saveBuf.ToString()); @@ -800,6 +857,120 @@ private void ToolStripSave_Click(object sender, EventArgs e) OpenCheatDialog.FileName = SaveCheatDialog.FileName; OpenCheatDialog.FilterIndex = SaveCheatDialog.FilterIndex; } + + private void SaveCheatJson() + { + if (cheatJson == null || cheatJson.Id != GameID) cheatJson = new CheatJson(ProcessContentid, GameID, GameVer, ProcessName); + else cheatJson.Mods = new List(); + + CheatJson.Mod modBak = null; + Section sectionFirst = sectionTool.GetSectionSortByAddr()[0]; + for (int cIdx = 0; cIdx < cheatGridRowList.Count; cIdx++) + { + CheatRow row = cheatGridRowList[cIdx]; + + (Section section, ulong offsetAddr) = (row.Section_, row.OffsetAddr); + if (section.SID != sectionFirst.SID) offsetAddr += section.Start - sectionFirst.Start; + + string cheatDesc = row.Cells[(int)ChertCol.CheatListDesc].ToString(); + ScanType scanType = this.ParseFromDescription(row.Cells[(int)ChertCol.CheatListType].ToString()); + string on = row.Cells[(int)ChertCol.CheatListValue].ToString(); + if (scanType != ScanType.Hex) + { + byte[] bytes = ScanTool.ValueStringToByte(scanType, on); + on = ScanTool.BytesToString(scanType, bytes, true, on.StartsWith("-")); + on = ScanTool.ReverseHexString(on); + } + string off = row.Cells[(int)ChertCol.CheatListOff].ToString(); + if (Regex.Match(cheatDesc, @"(.*) *__ *\[ *on: *([0-9a-zA-Z]+) *off: *([0-9a-zA-Z]+)") is Match m1 && m1.Success) + { //Attempt to restore off value from desc + cheatDesc = m1.Groups[1].Value; + off = m1.Groups[3].Value; + } + cheatDesc = Regex.Replace(cheatDesc, @"_\d+$", ""); + + if (modBak != null && modBak.Name == cheatDesc) cheatJson.Mods[cheatJson.Mods.Count - 1].Memory.Add(new CheatJson.Memory(offsetAddr.ToString("X"), on, off)); + else + { + CheatJson.Mod mod = new CheatJson.Mod(cheatDesc, "checkbox"); + mod.Memory.Add(new CheatJson.Memory(offsetAddr.ToString("X"), on, off)); + + cheatJson.Mods.Add(mod); + modBak = mod; + } + } + + using (var myStream = new FileStream(SaveCheatDialog.FileName, FileMode.Create)) + using (var writer = JsonReaderWriterFactory.CreateJsonWriter(myStream, Encoding.UTF8, true, true, " ")) + { + var serializer = new DataContractJsonSerializer(typeof(CheatJson)); + serializer.WriteObject(writer, cheatJson); + writer.Flush(); + } + } + + private void SaveCheatShn() + { + if (cheatTrainer == null || cheatTrainer.Cusa != GameID) cheatTrainer = new CheatTrainer(ProcessContentid, GameID, GameVer, ProcessName); + else + { + cheatTrainer.StartUPs = new List(); + cheatTrainer.Cheats = new List(); + cheatTrainer.Genress = new List(); + } + + + CheatTrainer.Cheat cheatBak = null; + Section[] sections = sectionTool.GetSectionSortByAddr(); + for (int idx = 0; idx < sections.Length; idx++) + { + Section section = sections[idx]; + section.SN = idx; + } + for (int cIdx = 0; cIdx < cheatGridRowList.Count; cIdx++) + { + CheatRow row = cheatGridRowList[cIdx]; + + (Section section, ulong offsetAddr) = (row.Section_, row.OffsetAddr); + + string cheatDesc = row.Cells[(int)ChertCol.CheatListDesc].ToString(); + ScanType scanType = this.ParseFromDescription(row.Cells[(int)ChertCol.CheatListType].ToString()); + string on = row.Cells[(int)ChertCol.CheatListValue].ToString(); + if (scanType != ScanType.Hex) + { + byte[] bytes = ScanTool.ValueStringToByte(scanType, on); + on = ScanTool.BytesToString(scanType, bytes, true, on.StartsWith("-")); + on = ScanTool.ReverseHexString(on); + } + string off = row.Cells[(int)ChertCol.CheatListOff].ToString(); + if (Regex.Match(cheatDesc, @"(.*) *__ *\[ *on: *([0-9a-zA-Z]+) *off: *([0-9a-zA-Z]+)") is Match m1 && m1.Success) + { //Attempt to restore off value from desc + cheatDesc = m1.Groups[1].Value; + off = m1.Groups[3].Value; + } + on = Regex.Replace(on, @"(\w\w)(?=\w)", @"$1-"); + off = Regex.Replace(off, @"(\w\w)(?=\w)", @"$1-"); + cheatDesc = Regex.Replace(cheatDesc, @"_\d+$", ""); + + if (cheatBak != null && cheatBak.Text == cheatDesc) cheatTrainer.Cheats[cheatTrainer.Cheats.Count - 1].Cheatlines.Add(new CheatTrainer.Cheatline(offsetAddr.ToString("X"), section.SN, on, off)); + else + { + CheatTrainer.Cheat cheat = new CheatTrainer.Cheat(cheatDesc); + cheat.Cheatlines.Add(new CheatTrainer.Cheatline(offsetAddr.ToString("X"), section.SN, on, off)); + + cheatTrainer.Cheats.Add(cheat); + cheatBak = cheat; + } + } + XmlSerializer serializer = new XmlSerializer(typeof(CheatTrainer)); + using (var myStream = new StreamWriter(SaveCheatDialog.FileName)) + using (XmlTextWriter xmlWriter = new XmlTextWriter(myStream)) + { + xmlWriter.Formatting = Formatting.Indented; + xmlWriter.Indentation = 2; + serializer.Serialize(xmlWriter, cheatTrainer); + } + } #endregion private void ToolStripNewQuery_Click(object sender, EventArgs e) @@ -1491,7 +1662,7 @@ private void CheatGridMenu_Opening(object sender, System.ComponentModel.CancelEv if (rows == null || rows.Count == 0) return; DataGridViewRow row = rows[0]; - bool isOnOffVisible = row.Cells[(int)ChertCol.CheatListOn] != null && row.Cells[(int)ChertCol.CheatListOn].ToString().Trim() != ""; + bool isOnOffVisible = !string.IsNullOrWhiteSpace((string)row.Cells[(int)ChertCol.CheatListOn].Value); CheatGridMenuOnValue.Visible = isOnOffVisible; CheatGridMenuOffValue.Visible = isOnOffVisible; } @@ -1904,6 +2075,7 @@ public bool InitSections(string processName, bool force = false) ProcessPid = processInfo.pid; ProcessName = processInfo.name; + ProcessContentid = processInfo.contentid; if (pMap == null) sectionTool.InitSections(processInfo.pid, ProcessName); else sectionTool.InitSections(pMap, processInfo.pid, ProcessName); diff --git a/PS4CheaterNeo/NewAddress.Designer.cs b/PS4CheaterNeo/NewAddress.Designer.cs index 9a108ea..2f3b817 100644 --- a/PS4CheaterNeo/NewAddress.Designer.cs +++ b/PS4CheaterNeo/NewAddress.Designer.cs @@ -57,60 +57,63 @@ private void InitializeComponent() this.AddressBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(36)))), ((int)(((byte)(36)))), ((int)(((byte)(36))))); this.AddressBox.Dock = System.Windows.Forms.DockStyle.Fill; this.AddressBox.ForeColor = System.Drawing.Color.White; - this.AddressBox.Location = new System.Drawing.Point(62, 3); + this.AddressBox.Location = new System.Drawing.Point(65, 3); this.AddressBox.Margin = new System.Windows.Forms.Padding(0, 3, 0, 0); this.AddressBox.Name = "AddressBox"; - this.AddressBox.Size = new System.Drawing.Size(121, 22); + this.AddressBox.Size = new System.Drawing.Size(114, 22); this.AddressBox.TabIndex = 0; this.AddressBox.Leave += new System.EventHandler(this.AddressBox_Leave); // // AddressLabel // - this.AddressLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.AddressLabel.AutoSize = true; + this.AddressLabel.Dock = System.Windows.Forms.DockStyle.Fill; this.AddressLabel.ForeColor = System.Drawing.Color.White; - this.AddressLabel.Location = new System.Drawing.Point(19, 5); - this.AddressLabel.Margin = new System.Windows.Forms.Padding(3, 5, 1, 0); + this.AddressLabel.Location = new System.Drawing.Point(8, 3); + this.AddressLabel.Margin = new System.Windows.Forms.Padding(3); this.AddressLabel.Name = "AddressLabel"; - this.AddressLabel.Size = new System.Drawing.Size(42, 12); + this.AddressLabel.Size = new System.Drawing.Size(54, 19); this.AddressLabel.TabIndex = 1; this.AddressLabel.Text = "Address"; + this.AddressLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // ValueLabel // this.ValueLabel.AutoSize = true; - this.ValueLabel.Dock = System.Windows.Forms.DockStyle.Right; + this.ValueLabel.Dock = System.Windows.Forms.DockStyle.Fill; this.ValueLabel.ForeColor = System.Drawing.Color.White; - this.ValueLabel.Location = new System.Drawing.Point(194, 5); - this.ValueLabel.Margin = new System.Windows.Forms.Padding(11, 5, 1, 0); + this.ValueLabel.Location = new System.Drawing.Point(182, 3); + this.ValueLabel.Margin = new System.Windows.Forms.Padding(3); this.ValueLabel.Name = "ValueLabel"; - this.ValueLabel.Size = new System.Drawing.Size(32, 20); + this.ValueLabel.Size = new System.Drawing.Size(44, 19); this.ValueLabel.TabIndex = 3; this.ValueLabel.Text = "Value"; + this.ValueLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // ValueBox // this.ValueBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(36)))), ((int)(((byte)(36)))), ((int)(((byte)(36))))); this.ValueBox.Dock = System.Windows.Forms.DockStyle.Fill; this.ValueBox.ForeColor = System.Drawing.Color.White; - this.ValueBox.Location = new System.Drawing.Point(227, 3); + this.ValueBox.Location = new System.Drawing.Point(229, 3); this.ValueBox.Margin = new System.Windows.Forms.Padding(0, 3, 0, 0); this.ValueBox.Name = "ValueBox"; - this.ValueBox.Size = new System.Drawing.Size(121, 22); + this.ValueBox.Size = new System.Drawing.Size(115, 22); this.ValueBox.TabIndex = 2; this.ValueBox.Text = "0"; // // TypeLabel // - this.TypeLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.TypeLabel.AutoSize = true; + this.TypeLabel.Dock = System.Windows.Forms.DockStyle.Fill; this.TypeLabel.ForeColor = System.Drawing.Color.White; - this.TypeLabel.Location = new System.Drawing.Point(32, 30); - this.TypeLabel.Margin = new System.Windows.Forms.Padding(3, 5, 1, 0); + this.TypeLabel.Location = new System.Drawing.Point(8, 28); + this.TypeLabel.Margin = new System.Windows.Forms.Padding(3); this.TypeLabel.Name = "TypeLabel"; - this.TypeLabel.Size = new System.Drawing.Size(29, 12); + this.TypeLabel.Size = new System.Drawing.Size(54, 17); this.TypeLabel.TabIndex = 4; this.TypeLabel.Text = "Type"; + this.TypeLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // ScanTypeBox // @@ -119,10 +122,10 @@ private void InitializeComponent() this.ScanTypeBox.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.ScanTypeBox.ForeColor = System.Drawing.Color.White; this.ScanTypeBox.FormattingEnabled = true; - this.ScanTypeBox.Location = new System.Drawing.Point(62, 28); + this.ScanTypeBox.Location = new System.Drawing.Point(65, 28); this.ScanTypeBox.Margin = new System.Windows.Forms.Padding(0, 3, 0, 0); this.ScanTypeBox.Name = "ScanTypeBox"; - this.ScanTypeBox.Size = new System.Drawing.Size(121, 20); + this.ScanTypeBox.Size = new System.Drawing.Size(114, 20); this.ScanTypeBox.TabIndex = 5; this.ScanTypeBox.SelectedIndexChanged += new System.EventHandler(this.ScanTypeBox_SelectedIndexChanged); // @@ -131,7 +134,7 @@ private void InitializeComponent() this.LockBox.AutoSize = true; this.LockBox.Dock = System.Windows.Forms.DockStyle.Left; this.LockBox.ForeColor = System.Drawing.Color.White; - this.LockBox.Location = new System.Drawing.Point(227, 28); + this.LockBox.Location = new System.Drawing.Point(229, 28); this.LockBox.Margin = new System.Windows.Forms.Padding(0, 3, 0, 0); this.LockBox.Name = "LockBox"; this.LockBox.Size = new System.Drawing.Size(48, 20); @@ -142,14 +145,15 @@ private void InitializeComponent() // DescriptionLabel // this.DescriptionLabel.AutoSize = true; - this.DescriptionLabel.Dock = System.Windows.Forms.DockStyle.Right; + this.DescriptionLabel.Dock = System.Windows.Forms.DockStyle.Fill; this.DescriptionLabel.ForeColor = System.Drawing.Color.White; - this.DescriptionLabel.Location = new System.Drawing.Point(3, 53); - this.DescriptionLabel.Margin = new System.Windows.Forms.Padding(3, 5, 1, 0); + this.DescriptionLabel.Location = new System.Drawing.Point(5, 51); + this.DescriptionLabel.Margin = new System.Windows.Forms.Padding(0, 3, 0, 3); this.DescriptionLabel.Name = "DescriptionLabel"; - this.DescriptionLabel.Size = new System.Drawing.Size(58, 20); + this.DescriptionLabel.Size = new System.Drawing.Size(60, 19); this.DescriptionLabel.TabIndex = 7; this.DescriptionLabel.Text = "Description"; + this.DescriptionLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // DescriptionBox // @@ -157,10 +161,10 @@ private void InitializeComponent() this.TableLayoutBase.SetColumnSpan(this.DescriptionBox, 3); this.DescriptionBox.Dock = System.Windows.Forms.DockStyle.Fill; this.DescriptionBox.ForeColor = System.Drawing.Color.White; - this.DescriptionBox.Location = new System.Drawing.Point(62, 51); + this.DescriptionBox.Location = new System.Drawing.Point(65, 51); this.DescriptionBox.Margin = new System.Windows.Forms.Padding(0, 3, 0, 0); this.DescriptionBox.Name = "DescriptionBox"; - this.DescriptionBox.Size = new System.Drawing.Size(286, 22); + this.DescriptionBox.Size = new System.Drawing.Size(279, 22); this.DescriptionBox.TabIndex = 8; // // SaveBtn @@ -171,7 +175,7 @@ private void InitializeComponent() this.SaveBtn.ForeColor = System.Drawing.Color.White; this.SaveBtn.Location = new System.Drawing.Point(3, 4); this.SaveBtn.Name = "SaveBtn"; - this.SaveBtn.Size = new System.Drawing.Size(137, 23); + this.SaveBtn.Size = new System.Drawing.Size(133, 23); this.SaveBtn.TabIndex = 13; this.SaveBtn.Text = "Save"; this.SaveBtn.UseVisualStyleBackColor = false; @@ -183,9 +187,9 @@ private void InitializeComponent() this.CloseBtn.Dock = System.Windows.Forms.DockStyle.Top; this.CloseBtn.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.CloseBtn.ForeColor = System.Drawing.Color.White; - this.CloseBtn.Location = new System.Drawing.Point(146, 4); + this.CloseBtn.Location = new System.Drawing.Point(142, 4); this.CloseBtn.Name = "CloseBtn"; - this.CloseBtn.Size = new System.Drawing.Size(137, 23); + this.CloseBtn.Size = new System.Drawing.Size(134, 23); this.CloseBtn.TabIndex = 14; this.CloseBtn.Text = "Close"; this.CloseBtn.UseVisualStyleBackColor = false; @@ -194,10 +198,11 @@ private void InitializeComponent() // PointerBox // this.PointerBox.AutoSize = true; + this.PointerBox.Dock = System.Windows.Forms.DockStyle.Fill; this.PointerBox.ForeColor = System.Drawing.Color.White; - this.PointerBox.Location = new System.Drawing.Point(65, 76); + this.PointerBox.Location = new System.Drawing.Point(68, 76); this.PointerBox.Name = "PointerBox"; - this.PointerBox.Size = new System.Drawing.Size(57, 16); + this.PointerBox.Size = new System.Drawing.Size(108, 16); this.PointerBox.TabIndex = 15; this.PointerBox.Text = "Pointer"; this.PointerBox.UseVisualStyleBackColor = true; @@ -211,12 +216,11 @@ private void InitializeComponent() // // TableLayoutBase // - this.TableLayoutBase.ColumnCount = 5; - this.TableLayoutBase.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.TableLayoutBase.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.TableLayoutBase.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.TableLayoutBase.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.TableLayoutBase.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.TableLayoutBase.ColumnCount = 4; + this.TableLayoutBase.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 60F)); + this.TableLayoutBase.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.TableLayoutBase.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 50F)); + this.TableLayoutBase.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); this.TableLayoutBase.Controls.Add(this.AddressLabel, 0, 0); this.TableLayoutBase.Controls.Add(this.PointerBox, 1, 4); this.TableLayoutBase.Controls.Add(this.AddressBox, 1, 0); @@ -231,8 +235,9 @@ private void InitializeComponent() this.TableLayoutBase.Controls.Add(this.OnOffBox, 3, 4); this.TableLayoutBase.Dock = System.Windows.Forms.DockStyle.Fill; this.TableLayoutBase.Location = new System.Drawing.Point(0, 0); - this.TableLayoutBase.Margin = new System.Windows.Forms.Padding(0, 3, 0, 0); + this.TableLayoutBase.Margin = new System.Windows.Forms.Padding(0); this.TableLayoutBase.Name = "TableLayoutBase"; + this.TableLayoutBase.Padding = new System.Windows.Forms.Padding(5, 0, 20, 0); this.TableLayoutBase.RowCount = 6; this.TableLayoutBase.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.TableLayoutBase.RowStyles.Add(new System.Windows.Forms.RowStyle()); @@ -254,14 +259,14 @@ private void InitializeComponent() this.TableLayoutBottom.Controls.Add(this.CloseBtn, 1, 2); this.TableLayoutBottom.Controls.Add(this.TableLayoutBottomBox, 0, 1); this.TableLayoutBottom.Dock = System.Windows.Forms.DockStyle.Fill; - this.TableLayoutBottom.Location = new System.Drawing.Point(62, 95); + this.TableLayoutBottom.Location = new System.Drawing.Point(65, 95); this.TableLayoutBottom.Margin = new System.Windows.Forms.Padding(0); this.TableLayoutBottom.Name = "TableLayoutBottom"; this.TableLayoutBottom.RowCount = 3; this.TableLayoutBottom.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.TableLayoutBottom.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.TableLayoutBottom.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.TableLayoutBottom.Size = new System.Drawing.Size(286, 41); + this.TableLayoutBottom.Size = new System.Drawing.Size(279, 41); this.TableLayoutBottom.TabIndex = 16; // // TableLayoutBottomLabel @@ -269,12 +274,12 @@ private void InitializeComponent() this.TableLayoutBottomLabel.ColumnCount = 1; this.TableLayoutBottomLabel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); this.TableLayoutBottomLabel.Dock = System.Windows.Forms.DockStyle.Fill; - this.TableLayoutBottomLabel.Location = new System.Drawing.Point(143, 0); + this.TableLayoutBottomLabel.Location = new System.Drawing.Point(139, 0); this.TableLayoutBottomLabel.Margin = new System.Windows.Forms.Padding(0); this.TableLayoutBottomLabel.Name = "TableLayoutBottomLabel"; this.TableLayoutBottomLabel.RowCount = 1; this.TableLayoutBottomLabel.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.TableLayoutBottomLabel.Size = new System.Drawing.Size(143, 1); + this.TableLayoutBottomLabel.Size = new System.Drawing.Size(140, 1); this.TableLayoutBottomLabel.TabIndex = 16; // // TableLayoutBottomBox @@ -287,15 +292,16 @@ private void InitializeComponent() this.TableLayoutBottomBox.Name = "TableLayoutBottomBox"; this.TableLayoutBottomBox.RowCount = 1; this.TableLayoutBottomBox.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.TableLayoutBottomBox.Size = new System.Drawing.Size(143, 1); + this.TableLayoutBottomBox.Size = new System.Drawing.Size(139, 1); this.TableLayoutBottomBox.TabIndex = 15; // // OnOffBox // this.OnOffBox.AutoSize = true; - this.OnOffBox.Location = new System.Drawing.Point(230, 76); + this.OnOffBox.Dock = System.Windows.Forms.DockStyle.Fill; + this.OnOffBox.Location = new System.Drawing.Point(232, 76); this.OnOffBox.Name = "OnOffBox"; - this.OnOffBox.Size = new System.Drawing.Size(81, 16); + this.OnOffBox.Size = new System.Drawing.Size(109, 16); this.OnOffBox.TabIndex = 17; this.OnOffBox.Text = "OnOffValue"; this.OnOffBox.UseVisualStyleBackColor = true; @@ -309,7 +315,6 @@ private void InitializeComponent() this.ClientSize = new System.Drawing.Size(364, 134); this.Controls.Add(this.TableLayoutBase); this.ForeColor = System.Drawing.Color.White; - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; this.Name = "NewAddress"; this.Text = "NewAddress"; this.Load += new System.EventHandler(this.NewAddress_Load); diff --git a/PS4CheaterNeo/NewAddress.cs b/PS4CheaterNeo/NewAddress.cs index e72da20..b413f1a 100644 --- a/PS4CheaterNeo/NewAddress.cs +++ b/PS4CheaterNeo/NewAddress.cs @@ -43,19 +43,21 @@ public NewAddress(Main mainForm, Section addrSection, Section baseSection, ulong OnBox = new TextBox(); OffBox = new TextBox(); - OnLabel.Anchor = AnchorStyles.Top | AnchorStyles.Right; OnLabel.AutoSize = true; + OnLabel.Dock = DockStyle.Fill; OnLabel.Margin = AddressLabel.Margin; OnLabel.Name = "OnLabel"; OnLabel.TabIndex = 1; OnLabel.Text = "On"; + OnLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; OffLabel.AutoSize = true; - OffLabel.Dock = DockStyle.Right; + OffLabel.Dock = DockStyle.Fill; OffLabel.ForeColor = ForeColor; OffLabel.Margin = ValueLabel.Margin; OffLabel.Name = "OffLabel"; OffLabel.Text = "Off"; + OffLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; OnBox.BackColor = BackColor; OnBox.ForeColor = ForeColor; @@ -160,6 +162,7 @@ public void ApplyUI(LanguageJson langJson) DescriptionLabel.ForeColor = ForeColor; LockBox.ForeColor = ForeColor; PointerBox.ForeColor = ForeColor; + OnOffBox.ForeColor = ForeColor; AddressBox.ForeColor = ForeColor; AddressBox.BackColor = BackColor; @@ -209,12 +212,12 @@ private void SaveBtn_Click(object sender, EventArgs e) CheatType = (ScanType)((ComboItem)(ScanTypeBox.SelectedItem)).Value; ScanTool.ValueStringToULong(CheatType, ValueBox.Text); Value = ValueBox.Text; - OnValue = OnBox.Text; - OffValue = OffBox.Text; + OnValue = string.IsNullOrWhiteSpace(OnBox.Text) ? null : OnBox.Text; + OffValue = string.IsNullOrWhiteSpace(OffBox.Text) ? null : OffBox.Text; IsLock = LockBox.Checked; Descriptioin = DescriptionBox.Text; - if (!AddressBox.ReadOnly) mainForm.AddToCheatGrid(AddrSection, (uint)(Address - AddrSection.Start), CheatType, Value, IsLock, Descriptioin, PointerOffsets); + if (!AddressBox.ReadOnly) mainForm.AddToCheatGrid(AddrSection, (uint)(Address - AddrSection.Start), CheatType, Value, IsLock, Descriptioin, PointerOffsets, null, -1, true, OnValue, OffValue); DialogResult = DialogResult.OK; Close(); @@ -320,24 +323,26 @@ private void SetOffsetBoxs(bool isAdd) { TextBox textBox = new TextBox { - Text = "0", - Location = AddOffsetBtn.Location, + Text = "0", + Location = AddOffsetBtn.Location, ForeColor = ForeColor, BackColor = BackColor, - Dock = DockStyle.Fill, - Margin = new Padding(3) + Dock = DockStyle.Fill, + Margin = new Padding(3) }; - Label label = new Label + TextBox label = new TextBox { - Text = "", - Location = DelOffsetBtn.Location, - ForeColor = ForeColor, - BackColor = BackColor, - Dock = DockStyle.Fill, - Margin = new Padding(3) - }; - + Text = "", + Location = DelOffsetBtn.Location, + ForeColor = ForeColor, + BackColor = BackColor, + Dock = DockStyle.Fill, + Margin = new Padding(3, 6, 3, 3), + ReadOnly = true, + BorderStyle = BorderStyle.None, + }; + PointerOffsets.Add(0); TableLayoutBottomBox.RowCount += 1; TableLayoutBottomBox.RowStyles.Add(new RowStyle(SizeType.Percent, 100F)); TableLayoutBottomBox.Controls.Add(textBox, 0, TableLayoutBottomBox.Controls.Count); @@ -351,6 +356,7 @@ private void SetOffsetBoxs(bool isAdd) { if (TableLayoutBottomBox.Controls.Count == 0) return; + PointerOffsets.RemoveAt(PointerOffsets.Count - 1); Height -= TableLayoutBottomBox.Controls[TableLayoutBottomBox.Controls.Count - 1].Height; TableLayoutBottomBox.Controls.RemoveAt(TableLayoutBottomBox.Controls.Count - 1); TableLayoutBottomBox.RowCount -= 1; @@ -366,27 +372,42 @@ private void ScanTypeBox_SelectedIndexChanged(object sender, EventArgs e) if (IsPointer || PointerOffsets != null) return; var newCheatType = (ScanType)((ComboItem)(ScanTypeBox.SelectedItem)).Value; - if (newCheatType == ScanType.String_) return; - else if (CheatType == ScanType.Hex && ValueBox.Text.Length > 32) + if (CheatType == ScanType.Hex && ValueBox.Text.Length > 16) { ScanTypeBox.SelectedIndex = ScanTypeBox.FindStringExact(CheatType.GetDescription()); return; } + else if (newCheatType == ScanType.String_) return; try { var newValue = ScanTool.ValueStringToULong(CheatType, ValueBox.Text); if (newValue == 0) return; - if (newCheatType == ScanType.Byte_ && newValue > byte.MaxValue) return; - else if (newCheatType == ScanType.Bytes_2 && newValue > UInt16.MaxValue) return; - else if (newCheatType == ScanType.Bytes_4 && newValue > UInt32.MaxValue) return; + if (newCheatType == ScanType.Byte_ && newValue > byte.MaxValue || + newCheatType == ScanType.Bytes_2 && newValue > UInt16.MaxValue || + newCheatType == ScanType.Bytes_4 && newValue > UInt32.MaxValue || + newCheatType == ScanType.Float_ && newValue > float.MaxValue) + { + ScanTypeBox.SelectedIndex = ScanTypeBox.FindStringExact(CheatType.GetDescription()); + return; + } var newText = ScanTool.ULongToString(newCheatType, newValue); if (newText == "0") return; Value = newValue.ToString(); ValueBox.Text = newText; + + //var newOnValue = ScanTool.ValueStringToULong(CheatType, OnBox.Text); + //var newOnText = ScanTool.ULongToString(newCheatType, newOnValue); + //OnValue = newOnValue.ToString(); + //OnBox.Text = newOnText; + + //var newOffValue = ScanTool.ValueStringToULong(CheatType, OffBox.Text); + //var newOffText = ScanTool.ULongToString(newCheatType, newOffValue); + //OffValue = newOffValue.ToString(); + //OffBox.Text = newOffText; } catch (Exception ex) { @@ -417,26 +438,30 @@ private void RefreshPointerChecker_Tick(object sender, EventArgs e) if (BaseSection == null) break; - if (TableLayoutBottomBox.Controls.Count > PointerOffsets.Count) PointerOffsets.Add(address); - else PointerOffsets[idx] = address; + PointerOffsets[idx] = address; if (idx != TableLayoutBottomBox.Controls.Count - 1) { if (AddrSection == null || AddrSection.SID == 0) AddrSection = mainForm.sectionTool.GetSection(mainForm.sectionTool.GetSectionID((ulong)(address + baseAddress))); byte[] nextAddress = PS4Tool.ReadMemory(AddrSection.PID, (ulong)(address + baseAddress), 8); baseAddress = BitConverter.ToInt64(nextAddress, 0); - TableLayoutBottomLabel.Controls[idx].Text = baseAddress.ToString("X"); + TableLayoutBottomLabel.Controls[idx].Text = string.Format("=> {0:X2} +", baseAddress); } else { if (address == 0 && baseAddress == 0) continue; - byte[] data = PS4Tool.ReadMemory(BaseSection.PID, (ulong)(address + baseAddress), ScanTool.ScanTypeLengthDict[CheatType]); - TableLayoutBottomLabel.Controls[idx].Text = ScanTool.BytesToString(CheatType, data); + int length = 0; + if (CheatType != ScanType.Hex) length = ScanTool.ScanTypeLengthDict[CheatType]; + else if (ValueBox.Text.Length > 1) length = ValueBox.Text.Length / 2; + else length = 8; + byte[] data = PS4Tool.ReadMemory(BaseSection.PID, (ulong)(address + baseAddress), length); + string value = ScanTool.BytesToString(CheatType, data); + TableLayoutBottomLabel.Controls[idx].Text = string.Format("=> {0}", value); AddressBox.Text = (address + baseAddress).ToString("X"); if (!ValueBox.Enabled || changedCheatType) { ValueBox.Enabled = true; - ValueBox.Text = TableLayoutBottomLabel.Controls[idx].Text; + ValueBox.Text = value; } } } diff --git a/PS4CheaterNeo/PS4CheaterNeo.csproj b/PS4CheaterNeo/PS4CheaterNeo.csproj index 69985ed..7dddcf8 100644 --- a/PS4CheaterNeo/PS4CheaterNeo.csproj +++ b/PS4CheaterNeo/PS4CheaterNeo.csproj @@ -71,6 +71,7 @@ + @@ -83,6 +84,7 @@ + Component @@ -181,6 +183,12 @@ SendPayload.cs Designer + + Always + + + Always + Always diff --git a/PS4CheaterNeo/Properties/AssemblyInfo.cs b/PS4CheaterNeo/Properties/AssemblyInfo.cs index 551c9cd..9cfb515 100644 --- a/PS4CheaterNeo/Properties/AssemblyInfo.cs +++ b/PS4CheaterNeo/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.2.1")] -[assembly: AssemblyFileVersion("1.0.2.1")] +[assembly: AssemblyVersion("1.0.2.2")] +[assembly: AssemblyFileVersion("1.0.2.2")] diff --git a/PS4CheaterNeo/Query.cs b/PS4CheaterNeo/Query.cs index 8bbdd18..90273d2 100644 --- a/PS4CheaterNeo/Query.cs +++ b/PS4CheaterNeo/Query.cs @@ -298,13 +298,18 @@ private void ProcessesBox_SelectedIndexChanged(object sender, EventArgs e) ComboItem process = (ComboItem)ProcessesBox.SelectedItem; sectionTool.InitSections((int)process.Value, (string)process.Text); - mainForm.ProcessPid = (int)process.Value; - mainForm.ProcessName = (string)process.Text; + if (mainForm.GameID != null) + { + mainForm.ProcessPid = (int)process.Value; + mainForm.ProcessName = (string)process.Text; + } + else mainForm.InitSections((string)process.Text); Section[] sections = sectionTool.GetSectionSortByAddr(); for (int sectionIdx = 0; sectionIdx < sections.Length; sectionIdx++) { Section section = sections[sectionIdx]; + section.SN = sectionIdx; if ((IsFilterBox.Checked && section.IsFilter) || (IsFilterSizeBox.Checked && section.IsFilterSize)) continue; string start = String.Format("{0:X9}", section.Start); diff --git a/PS4CheaterNeo/common/CheatTrainer.cs b/PS4CheaterNeo/common/CheatTrainer.cs new file mode 100644 index 0000000..daaaaac --- /dev/null +++ b/PS4CheaterNeo/common/CheatTrainer.cs @@ -0,0 +1,176 @@ +using System.Collections.Generic; +using System.Xml.Serialization; + +/// XML to C# Online Converter +/// https://json2csharp.com/code-converters/xml-to-csharp +namespace PS4CheaterNeo +{ + [XmlRoot(ElementName = "Trainer")] + public class CheatTrainer + { + public CheatTrainer() { } + public CheatTrainer(string name, string id, string version, string process) + { + Game = name; + Cusa = id; + Version = version; + Process = process; + StartUPs = new List(); + Cheats = new List(); + Moder = "PS4CheaterNeo"; + } + + [XmlAttribute(AttributeName = "Game")] + public string Game { get; set; } + + [XmlAttribute(AttributeName = "Moder")] + public string Moder { get; set; } + + [XmlAttribute(AttributeName = "Cusa")] + public string Cusa { get; set; } + + [XmlAttribute(AttributeName = "Version")] + public string Version { get; set; } + + [XmlAttribute(AttributeName = "Process")] + public string Process { get; set; } + + [XmlElement(ElementName = "StartUP")] + public List StartUPs { get; set; } + + [XmlElement(ElementName = "Cheat")] + public List Cheats { get; set; } + + [XmlElement(ElementName = "Genres")] + public List Genress { get; set; } + + [XmlElement(ElementName = "inventory")] + public Inventory Inventory_ { get; set; } + + [XmlElement(ElementName = "Items")] + public Items Items_ { get; set; } + + [XmlText] + public string TextXml { get; set; } + + #region XmlRoot + [XmlRoot(ElementName = "Genres")] + public class Genres + { + [XmlAttribute(AttributeName = "Name")] + public string Name { get; set; } + } + + public class Cheat + { + public Cheat() { } + public Cheat(string text, string description = "") + { + Text = text; + Description = description; + Cheatlines = new List(); + } + + [XmlElement(ElementName = "Cheatline")] + public List Cheatlines { get; set; } + + [XmlAttribute(AttributeName = "Text")] + public string Text { get; set; } + + [XmlAttribute(AttributeName = "Description")] + public string Description { get; set; } + + [XmlText] + public string TextXml { get; set; } + } + + [XmlRoot(ElementName = "Cheatline")] + public class Cheatline + { + public Cheatline() { } + public Cheatline(string offset, int sectionId, string valueOn, string valueOff, bool absolute = false) + { + Offset = offset; + SectionId = sectionId; + ValueOn = valueOn; + ValueOff = valueOff; + Absolute = absolute ? "True" : null; + } + + [XmlElement(ElementName = "Offset")] + public string Offset { get; set; } + + [XmlElement(ElementName = "Section")] + public int SectionId { get; set; } + + [XmlElement(ElementName = "ValueOn")] + public string ValueOn { get; set; } + + [XmlElement(ElementName = "ValueOff")] + public string ValueOff { get; set; } + + [XmlElement(ElementName = "Absolute")] + public string Absolute { get; set; } + } + + [XmlRoot(ElementName = "inventory")] + public class Inventory + { + [XmlElement(ElementName = "value")] + public List Values { get; set; } + + [XmlAttribute(AttributeName = "section")] + public int Section { get; set; } + + [XmlAttribute(AttributeName = "offset")] + public string Offset { get; set; } + + [XmlAttribute(AttributeName = "step")] + public int Step { get; set; } + + [XmlAttribute(AttributeName = "name")] + public string Name { get; set; } + + [XmlAttribute(AttributeName = "EmptyID")] + public string EmptyID { get; set; } + + [XmlAttribute(AttributeName = "Length")] + public int Length { get; set; } + + [XmlAttribute(AttributeName = "Size")] + public int Size { get; set; } + } + + [XmlRoot(ElementName = "value")] + public class Value + { + [XmlAttribute(AttributeName = "Name")] + public string Name { get; set; } + + [XmlAttribute(AttributeName = "offset")] + public string Offset { get; set; } + + [XmlAttribute(AttributeName = "Type")] + public string Type { get; set; } + } + + [XmlRoot(ElementName = "Items")] + public class Items + { + [XmlElement(ElementName = "item")] + public List Items_ { get; set; } + } + + [XmlRoot(ElementName = "item")] + public class Item + { + [XmlElement(ElementName = "id")] + public string Id { get; set; } + + [XmlElement(ElementName = "name")] + public string Name { get; set; } + } + #endregion + } + +} diff --git a/PS4CheaterNeo/common/Constant.cs b/PS4CheaterNeo/common/Constant.cs index 8ba4da9..f1f95e0 100644 --- a/PS4CheaterNeo/common/Constant.cs +++ b/PS4CheaterNeo/common/Constant.cs @@ -11,6 +11,8 @@ public enum LanguageCodes Russian, French, German, + Korean, + Italian, } public enum SectionCol diff --git a/PS4CheaterNeo/common/SectionTool.cs b/PS4CheaterNeo/common/SectionTool.cs index acccb6d..a70e706 100644 --- a/PS4CheaterNeo/common/SectionTool.cs +++ b/PS4CheaterNeo/common/SectionTool.cs @@ -111,27 +111,32 @@ public class Section /// Whether the length of the section is a filtering target. /// public bool IsFilterSize; + /// + /// The sequence number of the section. + /// + public int SN = -1; public Section Clone() { Section section = new Section { - PID = PID, - SID = SID, - SIDv1 = SIDv1, - Start = Start, - Length = Length, - Name = Name, - Check = Check, - Prot = Prot, - Offset = Offset, - IsFilter = IsFilter, - IsFilterSize = IsFilterSize + PID = PID, + SID = SID, + SIDv1 = SIDv1, + Start = Start, + Length = Length, + Name = Name, + Check = Check, + Prot = Prot, + Offset = Offset, + IsFilter = IsFilter, + IsFilterSize = IsFilterSize, + SN = SN, }; return section; } - public override string ToString() => $"{Start:X},{(float)Length / 1024} KB,{Name},{Prot:X},{Offset:X},{IsFilter},{IsFilterSize},{Check},{PID},{SID}"; + public override string ToString() => $"{Start:X},{(float)Length / 1024} KB,{Name},{Prot:X},{Offset:X},{IsFilter},{IsFilterSize},{Check},{PID},{SID},{SN}"; } /// diff --git a/PS4CheaterNeo/languages/LanguageFile_Italian.json b/PS4CheaterNeo/languages/LanguageFile_Italian.json new file mode 100644 index 0000000..13c4f43 --- /dev/null +++ b/PS4CheaterNeo/languages/LanguageFile_Italian.json @@ -0,0 +1,338 @@ +{ + "MainForm": { + "ToolStripLockEnable": "Abilita Blocco", + "ToolStripAutoRefresh": "Aggiornamento Automatico", + "ToolStripSendToolTipText": "Invia", + "ToolStripOpenToolTipText": "Apri", + "ToolStripSaveToolTipText": "Salva", + "ToolStripNewQueryToolTipText": "Nuova Query", + "ToolStripAddToolTipText": "Aggiungi", + "ToolStripHexViewToolTipText": "Vista Hex", + "ToolStripRefreshCheatToolTipText": "Aggiorna Trucchi", + "ToolStripExpandAllToolTipText": "Espandi Tutto", + "ToolStripCollapseAllToolTipText": "Comprimi Tutto", + "ToolStripLockEnableToolTipText": "Abilita Blocco Trucchi", + "ToolStripAutoRefreshToolTipText": "Abilita Aggiornamento Automatico", + "ToolStripSettingsToolTipText": "Impostazioni", + "ToolStripProcessInfoMsg": "Processo Attuale: ", + + "CheatGridViewDel": "Elimina", + "CheatGridViewAddress": "Indirizzo", + "CheatGridViewType": "Tipo", + "CheatGridViewActive": "Attivo", + "CheatGridViewValue": "Valore", + "CheatGridViewSection": "Sezione", + "CheatGridViewSID": "SID", + "CheatGridViewLock": "Blocca", + "CheatGridViewDescription": "Descrizione", + + "CheatGridMenuHexEditor": "Editor Hex", + "CheatGridMenuLock": "Blocca", + "CheatGridMenuUnlock": "Sblocca", + "CheatGridMenuActive": "Attiva", + "CheatGridMenuEdit": "Modifica", + "CheatGridMenuCopyAddress": "Copia Indirizzo", + "CheatGridMenuFindPointer": "Trova Puntatore", + "CheatGridMenuDelete": "Elimina" + }, + "SendPayloadForm": { + "SendPayloadBtn": "Invia Payload", + "OKBtn": "OK" + }, + "NewAddressForm": { + "AddressLabel": "Indirizzo", + "ValueLabel": "Valore", + "TypeLabel": "Tipo", + "LockBox": "Blocco", + "DescriptionLabel": "Descrizione", + "PointerBox": "Puntatore", + "SaveBtn": "Salva", + "CloseBtn": "Chiudi" + }, + "QueryForm": { + "ResultViewAddress": "Indirizzo", + "ResultViewType": "Tipo", + "ResultViewValue": "Valore", + "ResultViewHex": "Hex", + "ResultViewSection": "Sezione", + + "ResultViewAddToCheatGrid": "Aggiungi alla Griglia Trucchi", + "ResultViewSelectAll": "Seleziona Tutto", + "ResultViewHexEditor": "Editor Hex", + "ResultViewCopyAddress": "Copia Indirizzo", + "ResultViewDump": "Dump", + "ResultViewFindPointer": "Trova Puntatore", + + "GetProcessesBtn": "Aggiorna Lista Processi", + "SectionViewAddress": "Indirizzo", + "SectionViewName": "Nome", + "SectionViewProt": "Prot", + "SectionViewLength": "Lunghezza", + "SectionViewSID": "SID", + "SectionViewOffset": "Offset", + "SectionViewEnd": "Fine", + + "SectionViewHexEditor": "Editor Hex", + "SectionViewCheck": "Seleziona", + "SectionViewCheckAll": "Seleziona Tutto", + "SectionViewUnCheckAll": "Deseleziona Tutto", + "SectionViewInvertChecked": "Inverti Selezione", + "SectionViewCheckContains": "Seleziona Contiene:", + "SectionViewUnCheckContains": "Deseleziona Contiene:", + "SectionViewCheckProt": "Seleziona Prot:", + "SectionViewUnCheckProt": "Deseleziona Non Prot:", + "SectionViewCheckAllHidden": "Seleziona Nascosto", + "SectionViewUnCheckAllHidden": "Deseleziona Non Nascosto", + "SectionViewDump": "Dump", + "SectionViewImport": "Importa", + + "AddrMinLabel": "Minimo:", + "AddrMaxLabel": "Massimo:", + "AddrIsFilterBox": "Filtro", + "SelectAllBox": "Seleziona Tutto", + "AlignmentBox": "Allineamento", + "IsFilterSizeBox": "Filtro Dimensione", + "IsFilterBox": "Filtro", + "CloneScanBtn": "Clona", + "AutoPauseBox": "Pausa Automatica", + "AutoResumeBox": "Riprendi Automaticamente", + "SlowMotionBox": "Movimento Lento", + "SimpleValuesBox": "Valori Semplici", + "NotBox": "Not", + "Value0Label": "Valore:", + "Value1Label": "Valore:", + "ValueAndLabel": "E", + "HexBox": "Hex", + "CompareFirstBox": "Confronta con Prima Scansione", + "NewBtn": "Nuovo", + "RefreshBtn": "Aggiorna", + "ScanBtn": "Scansione Iniziale", + "NextScan": "Prossima Scansione" + }, + "HexEditorForm": { + "PreviousBtn": "Precedente", + "NextBtn": "Successivo", + "AutoRefreshBox": "Aggiorna Automaticamente", + "RefreshBtn": "Aggiorna", + "CommitBtn": "Conferma", + "AddToCheatGridBtn": "Aggiungi alla Griglia Trucchi", + "HexBox": "Hex", + "LittleEndianBox": "Little Endian", + "ForwardBox": "Avanti", + "FindBtn": "Trova", + "SwapBytesBox": "Scambia Byte", + "AssemblerBtn": "Assemblaggio", + "GroupBoxAsm": "Informazioni Assemblaggio", + "HexViewMenuByteGroup": "Gruppo Byte Vista Hex", + "HexViewMenuGroupSize": "Dimensione Gruppo Vista Hex", + "HexViewMenuCopyAddress": "Copia Indirizzo", + "HexViewMenuJumpToAddress": "Vai a Indirizzo", + "HexViewMenuJumpToOffset": "Vai a Offset" + }, + "PointerFinderForm": { + "LevelLabel": "Livello:", + "AddressLabel": "Indirizzo:", + "ScanBtn": "Scansione", + "NewBtn": "Nuovo", + "MaxRangeLabel": "Raggio Massimo:", + "IsInitScan": "Scansione Iniziale", + "FastScanBox": "Scansione Veloce", + "NegativeOffsetBox": "Offset Negativo", + "IsFilterBox": "Filtra", + "FilterRuleBtn": "Regola", + "IsFilterSizeBox": "Filtra Dimensione", + "FilterSizeRuleBtn": "Regola", + "SaveBtn": "Salva", + "LoadBtn": "Carica", + + "PointerListViewAddToCheatGrid": "Aggiungi alla Griglia Trucchi", + "PointerListViewSelectAll": "Seleziona Tutto" + }, + "OptionForm": { + "tree_General": "Generale", + "tree_Cheat": "Trucchi", + "tree_Query": "Query", + "tree_HexEditor": "Editor Hex", + "tree_UI": "Interfaccia Utente", + "group_Connect": "Connessione", + "group_SendPayload": "Invia Payload", + "group_UI": "Interfaccia Utente", + "group_PS4Tool": "Strumento PS4", + "group_Option": "Opzione", + "group_Cheat": "Trucchi", + "group_CheatLock": "Blocco Trucchi", + "group_CheatRefresh": "Aggiornamento Trucchi", + "group_Query": "Query", + "group_Floating": "Fluttuante", + "group_Filter": "Filtro", + "group_Result": "Risultato", + "group_SectionView": "Vista Sezione", + "group_Find": "Trova", + "group_Hex": "Hex", + "group_Color Theme": "Tema Colore", + "group_Color Ui": "Interfaccia Utente Colore", + "group_Color Main": "Colore Principale", + "group_Color Query": "Colore Query", + "group_Color HexEditor": "Colore Editor Hex", + "group_Color PointerFinder": "Colore Ricerca Puntatore", + "group_Color SendPayload": "Colore Invia Payload", + + "PS4IP": "Indirizzo IP PS4", + "PS4Port": "Porta di Connessione PS4", + "PS4FWVersion": "Versione Firmware PS4", + "CollapsibleContainer": "Contenitore Pieghevole", + "UILanguage": "Lingua UI", + "UIFont": "Carattere UI", + "UIOpacity": "Opacità UI", + "CheatGridViewGroupByEnabled": "Gruppo Abilitato Vista Trucchi", + "CheatGridGroupRefreshThreshold": "Soglia Aggiornamento Gruppo Vista Trucchi", + "PS4DBGMutexFactor": "Fattore Mutua Esclusione PS4DBG", + "DisplayChangesListWhenSaving": "Visualizza Elenco Modifiche durante il Salvataggio", + "CheatCellDirtyValueCommit": "Conferma Valore Sporco Cella Trucchi", + "CheatLock": "Blocco Trucchi", + "VerifySectionWhenLock": "Verifica Sezione durante il Blocco", + "CheatAutoRefresh": "Aggiornamento Automatico Trucchi", + "CheatAutoRefreshShowStatus": "Mostra Stato Aggiornamento Automatico Trucchi", + "CheatAutoRefreshTimerInterval": "Intervallo Timer Aggiornamento Automatico Trucchi", + "VerifySectionWhenRefresh": "Verifica Sezione durante l'Aggiornamento", + "AutoPerformGetProcesses": "Esegui Automaticamente Ottenere Processi", + "DefaultProcess": "Processo Predefinito", + "MaxQueryThreads": "Massimo Thread di Query", + "QueryBufferSize": "Dimensione Buffer di Query", + "MinResultAccessFactor": "Fattore di Accesso Minimo ai Risultati", + "MinResultAccessFactorThreshold": "Soglia Fattore di Accesso Minimo ai Risultati", + "UndoScan": "Annulla Scansione", + "ScanAutoPause": "Pausa Automatica Scansione", + "ScanAutoResume": "Ripresa Automatica Scansione", + "ShowSearchSizeFirstScan": "Mostra Dimensione Ricerca Prima Scansione", + "UnknownInitialScanDoNotSkip0": "Scansione Iniziale Sconosciuta, Non Saltare 0", + "FloatingResultExact": "Risultato Fluttuante Esatto", + "FloatingSimpleValueExponents": "Esponenti Valori Semplici Fluttuanti", + "FilterQuery": "Filtro Query", + "SectionFilterKeys": "Chiavi Filtro Sezione", + "FilterSizeQuery": "Filtro Dimensione Query", + "SectionFilterSize": "Filtro Dimensione Sezione", + "MaxResultShow": "Massimo Risultato Mostrato", + "SectionViewFullRowSelect": "Selezione Interfila Vista Sezione", + "SectionViewDetectHiddenSection": "Rileva Sezione Nascosta Vista Sezione", + "LastHiddenSectionLengthHex": "Lunghezza Ultima Sezione Nascosta (Esadecimale)", + "HiddenSectionStartAtPreviousEnd": "Inizio Sezione Nascosta Dalla Fine Precedente", + "WriteHiddenSectionConf": "Scrivi Configurazione Sezione Nascosta", + "AutoRefresh": "Aggiornamento Automatico", + "AutoRefreshTimerInterval": "Intervallo Timer Aggiornamento Automatico", + "HexInfoDash": "Trattino Informazioni Esadecimali", + "AutoFindClosestChangedPosition": "Trova Automaticamente Posizione Cambiata più Vicina", + "InputIsHexFormat": "Input è Formato Esadecimale", + "UsingLittleEndian": "Utilizzo di Little Endian", + "ColorTheme": "Tema Colore", + "UiForeColor": "Colore Testo UI", + "UiBackColor": "Colore Sfondo UI", + "MainForeColor": "Colore Testo Principale", + "MainBackColor": "Colore Sfondo Principale", + "MainToolStrip1BackColor": "Colore Sfondo Barra degli Strumenti Principale 1", + "MainCheatGridViewRowIndexForeColor": "Colore Testo Indice Riga Vista Trucchi Principale", + "MainCheatGridViewBackgroundColor": "Colore Sfondo Vista Trucchi Principale", + "MainCheatGridViewBaseRowColor": "Colore Riga Base Vista Trucchi Principale", + "MainCheatGridViewGridColor": "Colore Griglia Vista Trucchi Principale", + "MainCheatGridCellForeColor": "Colore Testo Cellula Griglia Trucchi Principale", + "MainCheatGridCellBackColor": "Colore Sfondo Cellula Griglia Trucchi Principale", + "QueryStatusStrip1BackColor": "Colore Sfondo Barra di Stato Query 1", + "QueryAlignmentBoxForeColor": "Colore Testo Casella Allineamento Query", + "QueryScanBtnBackColor": "Colore Sfondo Pulsante Scansione Query", + "QuerySectionViewFilterForeColor": "Colore Testo Filtro Vista Sezione Query", + "QuerySectionViewFilterBackColor": "Colore Sfondo Filtro Vista Sezione Query", + "QuerySectionViewFilterSizeForeColor": "Colore Testo Filtro Dimensione Vista Sezione Query", + "QuerySectionViewFilterSizeBackColor": "Colore Sfondo Filtro Dimensione Vista Sezione Query", + "QuerySectionViewExecutableForeColor": "Colore Testo Eseguibile Vista Sezione Query", + "QuerySectionViewNoNameForeColor": "Colore Testo Senza Nome Vista Sezione Query", + "QuerySectionViewNoName2ForeColor": "Colore Testo Senza Nome 2 Vista Sezione Query", + "QuerySectionViewHiddenForeColor": "Colore Testo Nascosto Vista Sezione Query", + "QuerySectionViewItemCheck1BackColor": "Colore Sfondo Controllo Elemento Vista Sezione Query 1", + "QuerySectionViewItemCheck2BackColor": "Colore Sfondo Controllo Elemento Vista Sezione Query 2", + "HexEditorChangedFinishForeColor": "Colore Testo Termine Modifica Editor Esadecimale", + "HexEditorShadowSelectionColor": "Colore Selezione Ombra Editor Esadecimale", + "HexEditorZeroBytesForeColor": "Colore Testo Zero Byte Editor Esadecimale", + "PointerFinderStatusStrip1BackColor": "Colore Sfondo Barra di Stato Ricerca Puntatore 1", + "PointerFinderScanBtnBackColor": "Colore Sfondo Pulsante Scansione Ricerca Puntatore", + "SendPayloadStatusStrip1BackColor": "Colore Sfondo Barra di Stato Invio Payload 1", + + "description_PS4IP": "Inserisci l'indirizzo IP della PS4.", + "description_PS4Port": "Inserisci la porta della PS4.", + "description_PS4FWVersion": "Inserisci la versione del firmware della PS4 (utilizzata solo durante l'esecuzione di SendPayload).", + "description_CollapsibleContainer": "Decide se abilitare i pannelli divisori (SplitContainer) pieghevoli nell'interfaccia utente delle finestre Query, HexEditor e PointerFinder.\nImpostazione predefinita: abilitata.", + "description_UILanguage": "Decide la lingua dell'interfaccia utente.\nImpostazione predefinita: inglese.", + "description_UIFont": "Decide il tipo di carattere dell'interfaccia utente.\nImpostazione predefinita: SystemFonts.DefaultFont.", + "description_UIOpacity": "Determina l'opacità della finestra, con un massimo di 1 (opaco).\nImpostazione predefinita: 0.95.", + "description_CheatGridViewGroupByEnabled": "Decide se abilitare la funzione di raggruppamento (GroupByEnabled) nella CheatGridView.\nQuando abilitata, i trucchi verranno raggruppati.\nSe si caricano un gran numero di trucchi, è consigliabile disabilitare questa opzione per velocizzare il caricamento.\nLe modifiche a questa opzione richiedono il riavvio del programma per essere applicate.\nImpostazione predefinita: abilitata.", + "description_CheatGridGroupRefreshThreshold": "Per evitare tempi di attesa eccessivi durante il refresh dei gruppi nella GridView, il refresh del gruppo verrà eseguito solo se il numero di trucchi caricati è inferiore a questo valore.\nImpostazione predefinita: 10000.", + "description_PS4DBGMutexFactor": "Modificare questo valore non è consigliato e richiede il riavvio del programma per essere applicato.\nIl fattore Mutex determina il numero di connessioni e l'uso delle risorse durante l'inizializzazione di PS4DBG.\nIl numero di connessioni per la lettura della memoria va da 0 a Mutex Factor (escluso).\nIl numero di connessioni per la scrittura della memoria va da Mutex Factor a 2 * Mutex Factor (escluso).\nImpostazione predefinita: 3.", + "description_DisplayChangesListWhenSaving": "Decide se visualizzare l'elenco delle opzioni modificate durante il salvataggio delle impostazioni nell'Opzione.\nImpostazione predefinita: abilitato.", + "description_CheatCellDirtyValueCommit": "Decide se inviare automaticamente i valori modificati dei trucchi alla PS4 quando si utilizza l'UpDown per modificarli.\nImpostazione predefinita: abilitato.", + "description_CheatLock": "Decide se abilitare il blocco dei trucchi nella finestra principale.\nImpostazione predefinita: abilitato.", + "description_VerifySectionWhenLock": "Decide se verificare i valori della sezione quando si bloccano i trucchi.\nImpostazione predefinita: abilitato.", + "description_CheatAutoRefresh": "Decide se abilitare l'aggiornamento automatico nella finestra principale.\nImpostazione predefinita: disabilitato.", + "description_CheatAutoRefreshShowStatus": "Decide se visualizzare lo stato di errore nella finestra principale quando l'aggiornamento automatico dei trucchi è abilitato.\nImpostazione predefinita: disabilitato.", + "description_CheatAutoRefreshTimerInterval": "Quando l'aggiornamento automatico dei trucchi è abilitato, determina l'intervallo di tempo in millisecondi per l'aggiornamento automatico.\nImpostazione predefinita: 2500.", + "description_VerifySectionWhenRefresh": "Determina se verificare i valori della sezione durante l'aggiornamento dell'elenco dei trucchi.\nImpostazione predefinita: abilitato.", + "description_AutoPerformGetProcesses": "Determina se eseguire automaticamente l'acquisizione dell'elenco di tutti i processi quando si apre la finestra di query.\nImpostazione predefinita: abilitato.", + "description_DefaultProcess": "Imposta il nome del processo predefinito da selezionare durante l'acquisizione dell'elenco di tutti i processi.\nImpostazione predefinita: eboot.bin.", + "description_MaxQueryThreads": "Specifica il numero massimo di thread da utilizzare durante la scansione delle query.\nImpostazione predefinita: 3 thread.", + "description_QueryBufferSize": "Imposta la dimensione minima del buffer (in MB) da utilizzare durante la scansione delle query e la ricerca dei puntatori.\nImmettere 0 per disabilitare il buffering. Se il numero di sezioni del gioco è molto basso, inserire 0 potrebbe essere preferibile. Quando il numero di sezioni del gioco supera le mille, impostare una dimensione del buffer potrebbe essere preferibile.\nImpostazione predefinita: 50.", + "description_MinResultAccessFactor": "Quando il numero di risultati di query nella stessa sezione è inferiore a questo fattore, i valori verranno letti direttamente dagli indirizzi. Questo fattore viene utilizzato per determinare se leggere i valori completi della sezione o solo gli indirizzi.\nImpostazione predefinita: 50.", + "description_MinResultAccessFactorThreshold": "Imposta la dimensione minima della sezione (in byte) per il fattore MinResultAccessFactor. Questo fattore avrà effetto solo quando le dimensioni della sezione superano questa soglia.\nImpostazione predefinita: 1048576 (1 MB).", + "description_UndoScan": "Decide se abilitare lo scansionamento di annullamento (ripristino dei risultati della scansione precedente). Se abilitato, l'utilizzo della memoria durante la scansione delle query sarà maggiore.\nImpostazione predefinita: abilitato.", + "description_ScanAutoPause": "Decide se mettere automaticamente in pausa il gioco quando inizia la scansione delle query.\nImpostazione predefinita: disabilitato.", + "description_ScanAutoResume": "Decide se riprendere automaticamente il gioco quando la scansione delle query è completata.\nImpostazione predefinita: disabilitato.", + "description_ShowSearchSizeFirstScan": "Decide se mostrare un messaggio di conferma della dimensione della scansione durante la prima scansione delle query.\nImpostazione predefinita: abilitato.", + "description_UnknownInitialScanDoNotSkip0": "Quando il tipo di confronto nella finestra di query è 'sconosciuto iniziale' (UnknownInitial), decide se abilitare 'non escludere i byte con valore 0' nei risultati.\nNota: abilitare questa opzione aumenterà significativamente il numero di risultati della scansione.\nÈ necessario aprire una nuova finestra di query affinché le modifiche abbiano effetto.\nImpostazione predefinita: disabilitato.", + "description_FloatingResultExact": "Decide se rendere esatti i risultati dei calcoli in virgola mobile (float, double) nella finestra di query.\nSe disabilitato, i risultati dei confronti in virgola mobile inferiori a 0.0001 saranno considerati identici.\nImpostazione predefinita: abilitato.", + "description_FloatingSimpleValueExponents": "Decide gli esponenti dei valori in virgola mobile semplici (SimpleValues).\nCheat Engine è impostato su 11 (2^11 = 2048 positivo o negativo).\nImpostazione predefinita: 11.", + "description_FilterQuery": "Decide se abilitare il filtro delle sezioni quando si apre la finestra di query.\nImpostazione predefinita: abilitato.", + "description_SectionFilterKeys": "Inserire i valori di filtro. Le condizioni di filtro delle sezioni saranno basate su questa impostazione.", + "description_FilterSizeQuery": "Decide se abilitare il filtro per la dimensione delle sezioni quando si apre la finestra di query.\nImpostazione predefinita: disabilitato.", + "description_SectionFilterSize": "Specifica il valore al di sotto del quale le sezioni verranno filtrate (in byte).", + "description_MaxResultShow": "Inserisci il numero massimo di risultati della scansione delle query visualizzabili.\nInfluenza solo il numero di risultati mostrati nella vista risultati.\nImpostazione predefinita: 8192.", + "description_SectionViewFullRowSelect": "Decide se abilitare la selezione completa della riga nella vista sezione nella finestra di query.\nImpostazione predefinita: disabilitato.", + "description_SectionViewDetectHiddenSection": "Decide se abilitare il rilevamento automatico delle sezioni nascoste.\nAttualmente è ancora una funzionalità sperimentale.\nImpostazione predefinita: disabilitato.", + "description_LastHiddenSectionLengthHex": "Specifica la lunghezza in formato esadecimale dell'ultima sezione nascosta.\nQuesta opzione è efficace solo dopo aver abilitato SectionViewDetectHiddenSection.\nValore predefinito: 0x40000000.", + "description_HiddenSectionStartAtPreviousEnd": "Decide se abilitare l'avvio della sezione nascosta dall'indirizzo finale della sezione precedente.\nQuando non è abilitato, l'indirizzo di inizio sarà l'indirizzo finale della sezione precedente più 1.\nImpostazione predefinita: abilitato.", + "description_WriteHiddenSectionConf": "Decide se abilitare la scrittura delle configurazioni della sezione nascosta rilevata nel percorso 'PS4CheaterNeo\\sections\\[GAME_ID].conf'.\nÈ necessario abilitare questa opzione quando si esegue il tipo di scansione 'SCAN for Hidden Sections' nella finestra di query.\nNota: abilitando questa opzione, il tempo di attesa per l'apertura della finestra di query sarà più lungo perché richiede l'accesso alle informazioni [GAME_ID].\nImpostazione predefinita: disabilitato.", + "description_AutoRefresh": "Decide se abilitare il ricaricamento automatico nell'editor esadecimale.\nImpostazione predefinita: disabilitato.", + "description_AutoRefreshTimerInterval": "Quando il ricaricamento automatico è abilitato, decide l'intervallo di tempo in millisecondi per il ricaricamento automatico nell'editor esadecimale.\nDopo aver impostato questo valore, è necessario riavviare l'editor esadecimale per renderlo effettivo.\nValore predefinito: 2500.", + "description_HexInfoDash": "Decide il simbolo del trattino utilizzato per separare i valori esadecimali visualizzati nella parte destra dell'editor esadecimale.\nValore predefinito: \"-\".", + "description_AutoFindClosestChangedPosition": "Decide se abilitare la selezione automatica della posizione più vicina che ha subito una modifica quando non viene inserito un valore di ricerca.\nImpostazione predefinita: abilitato.", + "description_InputIsHexFormat": "Decide se il valore di input nella ricerca dell'editor esadecimale è in formato esadecimale.\nImpostazione predefinita: abilitato.", + "description_UsingLittleEndian": "Decide se il tipo di input nella ricerca dell'editor esadecimale è little-endian.\nSe disabilitato, sarà big-endian.\nImpostazione predefinita: disabilitato.", + "description_ColorTheme": "Decide il tema colore della finestra.", + "description_UiForeColor": "Specifica il colore del testo dell'interfaccia utente.", + "description_UiBackColor": "Specifica il colore di sfondo dell'interfaccia utente.", + "description_MainForeColor": "Specifica il colore del testo principale.", + "description_MainBackColor": "Specifica il colore di sfondo principale.", + "description_MainToolStrip1BackColor": "Specifica il colore di sfondo del ToolStrip1 principale.", + "description_MainCheatGridViewRowIndexForeColor": "Specifica il colore del testo dell'indice riga del Main CheatGridView.", + "description_MainCheatGridViewBackgroundColor": "Specifica il colore di sfondo del Main CheatGridView.", + "description_MainCheatGridViewBaseRowColor": "Specifica il colore della riga di base del Main CheatGridView.", + "description_MainCheatGridViewGridColor": "Specifica il colore della griglia del Main CheatGridView.", + "description_MainCheatGridCellForeColor": "Specifica il colore del testo delle celle del Main CheatGrid.", + "description_MainCheatGridCellBackColor": "Specifica il colore di sfondo delle celle del Main CheatGrid.", + "description_QueryStatusStrip1BackColor": "Specifica il colore di sfondo del StatusStrip1 della query.", + "description_QueryAlignmentBoxForeColor": "Specifica il colore del testo della casella di allineamento della query.", + "description_QueryScanBtnBackColor": "Specifica il colore di sfondo del pulsante di scansione della query.", + "description_QuerySectionViewFilterForeColor": "Specifica il colore del testo del filtro della sezione di visualizzazione della query.", + "description_QuerySectionViewFilterBackColor": "Specifica il colore di sfondo del filtro della sezione di visualizzazione della query.", + "description_QuerySectionViewFilterSizeForeColor": "Specifica il colore del testo del filtro delle dimensioni della sezione di visualizzazione della query.", + "description_QuerySectionViewFilterSizeBackColor": "Specifica il colore di sfondo del filtro delle dimensioni della sezione di visualizzazione della query.", + "description_QuerySectionViewExecutableForeColor": "Specifica il colore del testo dell'eseguibile della sezione di visualizzazione della query.", + "description_QuerySectionViewNoNameForeColor": "Specifica il colore del testo del nome non disponibile della sezione di visualizzazione della query.", + "description_QuerySectionViewNoName2ForeColor": "Specifica il colore del testo del secondo nome non disponibile della sezione di visualizzazione della query.", + "description_QuerySectionViewHiddenForeColor": "Specifica il colore del testo della sezione nascosta della sezione di visualizzazione della query.", + "description_QuerySectionViewItemCheck1BackColor": "Specifica il colore di sfondo dell'elemento di controllo 1 della sezione di visualizzazione della query.", + "description_QuerySectionViewItemCheck2BackColor": "Specifica il colore di sfondo dell'elemento di controllo 2 della sezione di visualizzazione della query.", + "description_HexEditorChangedFinishForeColor": "Specifica il colore del testo di modifica finita dell'editor esadecimale.", + "description_HexEditorShadowSelectionColor": "Specifica il colore di selezione ombra dell'editor esadecimale.", + "description_HexEditorZeroBytesForeColor": "Specifica il colore del testo dei byte zero dell'editor esadecimale.", + "description_PointerFinderStatusStrip1BackColor": "Specifica il colore di sfondo del StatusStrip1 del PointerFinder.", + "description_PointerFinderScanBtnBackColor": "Specifica il colore di sfondo del pulsante di scansione del PointerFinder.", + "description_SendPayloadStatusStrip1BackColor": "Specifica il colore di sfondo del StatusStrip1 dell'invio del payload." + } +} \ No newline at end of file diff --git a/PS4CheaterNeo/languages/LanguageFile_Korean.json b/PS4CheaterNeo/languages/LanguageFile_Korean.json new file mode 100644 index 0000000..0e90797 --- /dev/null +++ b/PS4CheaterNeo/languages/LanguageFile_Korean.json @@ -0,0 +1,339 @@ +{ + "MainForm": { + "ToolStripLockEnable": "잠금 활성화", + "ToolStripAutoRefresh": "자동 새로 고침", + "ToolStripSendToolTipText": "보내기", + "ToolStripOpenToolTipText": "열기", + "ToolStripSaveToolTipText": "저장", + "ToolStripNewQueryToolTipText": "쿼리", + "ToolStripAddToolTipText": "추가", + "ToolStripHexViewToolTipText": "Hex보기", + "ToolStripRefreshCheatToolTipText": "치트 새로 고침", + "ToolStripExpandAllToolTipText": "모두 펼치기", + "ToolStripCollapseAllToolTipText": "모두 축소", + "ToolStripLockEnableToolTipText": "치트 잠금 활성화 여부", + "ToolStripAutoRefreshToolTipText": "자동 새로 고침 활성화 여부", + "ToolStripSettingsToolTipText": "설정", + "ToolStripProcessInfoMsg": "현재 프로세스: ", + + "CheatGridViewDel": "삭제", + "CheatGridViewAddress": "주소", + "CheatGridViewType": "유형", + "CheatGridViewActive": "X", + "CheatGridViewValue": "값", + "CheatGridViewSection": "섹션", + "CheatGridViewSID": "SID", + "CheatGridViewLock": "잠금", + "CheatGridViewDescription": "설명", + + "CheatGridMenuHexEditor": "Hex편집기", + "CheatGridMenuLock": "잠금", + "CheatGridMenuUnlock": "잠금 해제", + "CheatGridMenuActive": "활성화", + "CheatGridMenuEdit": "편집", + "CheatGridMenuCopyAddress": "주소 복사", + "CheatGridMenuFindPointer": "포인터 찾기", + "CheatGridMenuDelete": "삭제" + }, + "SendPayloadForm": { + "SendPayloadBtn": "페이로드 보내기", + "OKBtn": "저장" + }, + "NewAddressForm": { + "AddressLabel": "주소", + "ValueLabel": "값", + "TypeLabel": "유형", + "LockBox": "잠금", + "DescriptionLabel": "설명", + "PointerBox": "포인터", + "SaveBtn": "저장", + "CloseBtn": "닫기" + }, + "QueryForm": { + "ResultViewAddress": "주소", + "ResultViewType": "유형", + "ResultViewValue": "값", + "ResultViewHex": "Hex", + "ResultViewSection": "섹션", + + "ResultViewAddToCheatGrid": "치트 그리드에 추가", + "ResultViewSelectAll": "모두 선택", + "ResultViewHexEditor": "Hex편집기", + "ResultViewCopyAddress": "주소 복사", + "ResultViewDump": "덤프", + "ResultViewFindPointer": "포인터 찾기", + + "GetProcessesBtn": "프로세스 목록 새로고침", + "SectionViewAddress": "주소", + "SectionViewName": "이름", + "SectionViewProt": "Prot", + "SectionViewLength": "길이", + "SectionViewSID": "SID", + "SectionViewOffset": "오프셋", + "SectionViewEnd": "끝", + + "SectionViewHexEditor": "Hex편집기", + "SectionViewCheck": "확인", + "SectionViewCheckAll": "모두 확인", + "SectionViewUnCheckAll": "모두 해제", + "SectionViewInvertChecked": "확인 반전", + "SectionViewCheckContains": "포함된 항목 확인:", + "SectionViewUnCheckContains": "포함되지 않은 항목 확인:", + "SectionViewCheckProt": "Prot확인:", + "SectionViewUnCheckProt": "비Prot확인:", + "SectionViewCheckAllHidden": "숨겨진 모두 확인", + "SectionViewUnCheckAllHidden": "숨겨진 모두 해제", + "SectionViewDump": "덤프", + "SectionViewImport": "가져오기", + + "AddrMinLabel": "최소:", + "AddrMaxLabel": "최대:", + "AddrIsFilterBox": "필터링", + "SelectAllBox": "모두 선택", + "AlignmentBox": "정렬", + "IsFilterSizeBox": "크기 필터링", + "IsFilterBox": "필터링", + "CloneScanBtn": "Clone", + "AutoPauseBox": "자동 일시 중지", + "AutoResumeBox": "자동 재개", + "SlowMotionBox": "슬로우 모션", + "SimpleValuesBox": "간단한 값", + "NotBox": "Not", + "Value0Label": "값:", + "Value1Label": "값:", + "ValueAndLabel": "및", + "HexBox": "Hex", + "CompareFirstBox": "첫 번째 스캔과 비교", + "NewBtn": "새로운", + "RefreshBtn": "새로 고침", + "ScanBtn": "첫 번째 스캔", + "NextScan": "다음 스캔" + }, + "HexEditorForm": { + "PreviousBtn": "이전", + "NextBtn": "다음", + "AutoRefreshBox": "자동", + "RefreshBtn": "새로 고침", + "CommitBtn": "커밋", + "AddToCheatGridBtn": "치트 그리드에 추가", + "HexBox": "Hex", + "LittleEndianBox": "리틀 엔디안", + "ForwardBox": "앞으로", + "FindBtn": "찾기", + "SwapBytesBox": "바이트 교환", + "AssemblerBtn": "어셈블리", + "GroupBoxAsm": "어셈블리 정보", + + "HexViewMenuByteGroup": "Hex뷰 바이트 그룹", + "HexViewMenuGroupSize": "Hex뷰 그룹 크기", + "HexViewMenuCopyAddress": "주소 복사", + "HexViewMenuJumpToAddress": "주소로 이동", + "HexViewMenuJumpToOffset": "오프셋으로 이동" + }, + "PointerFinderForm": { + "LevelLabel": "레벨:", + "AddressLabel": "주소:", + "ScanBtn": "스캔", + "NewBtn": "새로운", + "MaxRangeLabel": "최대 범위:", + "IsInitScan": "초기 스캔", + "FastScanBox": "빠른 스캔", + "NegativeOffsetBox": "음수 오프셋", + "IsFilterBox": "필터링", + "FilterRuleBtn": "규칙", + "IsFilterSizeBox": "크기 필터링", + "FilterSizeRuleBtn": "규칙", + "SaveBtn": "저장", + "LoadBtn": "로드", + + "PointerListViewAddToCheatGrid": "치트 그리드에 추가", + "PointerListViewSelectAll": "모두 선택" + }, + "OptionForm": { + "tree_General": "일반", + "tree_Cheat": "치트", + "tree_Query": "쿼리", + "tree_HexEditor": "Hex편집기", + "tree_UI": "사용자 인터페이스", + "group_Connect": "연결", + "group_SendPayload": "페이로드 보내기", + "group_UI": "사용자 인터페이스", + "group_PS4Tool": "PS4 도구", + "group_Option": "옵션", + "group_Cheat": "치트", + "group_CheatLock": "치트 잠금", + "group_CheatRefresh": "치트 새로 고침", + "group_Query": "쿼리", + "group_Floating": "부동", + "group_Filter": "필터", + "group_Result": "결과", + "group_SectionView": "섹션 뷰", + "group_Find": "찾기", + "group_Hex": "Hex", + "group_Color Theme": "색상 테마", + "group_Color Ui": "UI 색상", + "group_Color Main": "기본 색상", + "group_Color Query": "쿼리 색상", + "group_Color HexEditor": "Hex편집기 색상", + "group_Color PointerFinder": "포인터 찾기기 색상", + "group_Color SendPayload": "페이로드 보내기 색상", + + "PS4IP": "PS4 IP", + "PS4Port": "PS4 포트", + "PS4FWVersion": "PS4 펌웨어 버전", + "CollapsibleContainer": "접을 수 있는 컨테이너", + "UILanguage": "UI 언어", + "UIFont": "UI 글꼴", + "UIOpacity": "UI 불투명도", + "CheatGridViewGroupByEnabled": "치트 뷰 그룹화 활성화", + "CheatGridGroupRefreshThreshold": "치트 그룹 새로 고침 임계 값", + "PS4DBGMutexFactor": "PS4DBG 뮤텍스 팩터", + "DisplayChangesListWhenSaving": "저장할 때 변경 목록 표시", + "CheatCellDirtyValueCommit": "치트 셀 더러운 값 커밋", + "CheatLock": "치트 잠금", + "VerifySectionWhenLock": "잠금 시 섹션 확인", + "CheatAutoRefresh": "치트 자동 새로 고침", + "CheatAutoRefreshShowStatus": "치트 자동 새로 고침 상태 표시", + "CheatAutoRefreshTimerInterval": "치트 자동 새로 고침 타이머 간격", + "VerifySectionWhenRefresh": "새로 고칠 때 섹션 확인", + "AutoPerformGetProcesses": "자동으로 프로세스 가져오기 수행", + "DefaultProcess": "기본 프로세스", + "MaxQueryThreads": "최대 쿼리 스레드", + "QueryBufferSize": "쿼리 버퍼 크기", + "MinResultAccessFactor": "최소 결과 액세스 팩터", + "MinResultAccessFactorThreshold": "최소 결과 액세스 팩터 임계 값", + "UndoScan": "스캔 취소", + "ScanAutoPause": "자동 스캔 일시 중지", + "ScanAutoResume": "자동 스캔 재개", + "ShowSearchSizeFirstScan": "검색 크기 표시 첫 스캔", + "UnknownInitialScanDoNotSkip0": "알 수없는 초기 스캔을 건너 뛰지 마세요.", + "FloatingResultExact": "부동 결과 정확", + "FloatingSimpleValueExponents": "부동 단순 값 지수", + "FilterQuery": "쿼리 필터", + "SectionFilterKeys": "섹션 필터 키", + "FilterSizeQuery": "크기 쿼리 필터", + "SectionFilterSize": "섹션 필터 크기", + "MaxResultShow": "최대 결과 표시", + "SectionViewFullRowSelect": "섹션 뷰 전체 행 선택", + "SectionViewDetectHiddenSection": "숨겨진 섹션 감지 섹션 뷰", + "LastHiddenSectionLengthHex": "마지막 숨겨진 섹션 길이 (Hex)", + "HiddenSectionStartAtPreviousEnd": "이전 끝에서 시작하는 숨겨진 섹션", + "WriteHiddenSectionConf": "숨겨진 섹션 구성 쓰기", + "AutoRefresh": "자동 새로 고침", + "AutoRefreshTimerInterval": "자동 새로 고침 타이머 간격", + "HexInfoDash": "16진수 정보 대시", + "AutoFindClosestChangedPosition": "가장 가까운 변경된 위치 자동 찾기", + "InputIsHexFormat": "입력이 16진수 형식입니다.", + "UsingLittleEndian": "리틀 엔디안 사용", + "ColorTheme": "색상 테마", + "UiForeColor": "UI 전경색", + "UiBackColor": "UI 배경색", + "MainForeColor": "기본 전경색", + "MainBackColor": "기본 배경색", + "MainToolStrip1BackColor": "기본 도구 모음 1 배경색", + "MainCheatGridViewRowIndexForeColor": "기본 치트 그리드 뷰 행 인덱스 전경색", + "MainCheatGridViewBackgroundColor": "기본 치트 그리드 뷰 배경색", + "MainCheatGridViewBaseRowColor": "기본 치트 그리드 뷰 기본 행 색상", + "MainCheatGridViewGridColor": "기본 치트 그리드 뷰 그리드 색상", + "MainCheatGridCellForeColor": "기본 치트 그리드 셀 전경색", + "MainCheatGridCellBackColor": "기본 치트 그리드 셀 배경색", + "QueryStatusStrip1BackColor": "쿼리 상태 표시줄 1 배경색", + "QueryAlignmentBoxForeColor": "쿼리 정렬 상자 전경색", + "QueryScanBtnBackColor": "쿼리 스캔 버튼 배경색", + "QuerySectionViewFilterForeColor": "쿼리 섹션 뷰 필터 전경색", + "QuerySectionViewFilterBackColor": "쿼리 섹션 뷰 필터 배경색", + "QuerySectionViewFilterSizeForeColor": "쿼리 섹션 뷰 필터 크기 전경색", + "QuerySectionViewFilterSizeBackColor": "쿼리 섹션 뷰 필터 크기 배경색", + "QuerySectionViewExecutableForeColor": "쿼리 섹션 뷰 실행 가능 전경색", + "QuerySectionViewNoNameForeColor": "쿼리 섹션 뷰 이름 없음 전경색", + "QuerySectionViewNoName2ForeColor": "쿼리 섹션 뷰 이름 없음 2 전경색", + "QuerySectionViewHiddenForeColor": "쿼리 섹션 뷰 숨겨진 전경색", + "QuerySectionViewItemCheck1BackColor": "쿼리 섹션 뷰 항목 확인 1 배경색", + "QuerySectionViewItemCheck2BackColor": "쿼리 섹션 뷰 항목 확인 2 배경색", + "HexEditorChangedFinishForeColor": "16진수 편집기 변경 완료 전경색", + "HexEditorShadowSelectionColor": "16진수 편집기 그림자 선택 색상", + "HexEditorZeroBytesForeColor": "16진수 편집기 제로 바이트 전경색", + "PointerFinderStatusStrip1BackColor": "포인터 찾기 상태 표시줄 1 배경색", + "PointerFinderScanBtnBackColor": "포인터 찾기 스캔 버튼 배경색", + "SendPayloadStatusStrip1BackColor": "페이로드 보내기 상태 표시줄 1 배경색", + + "description_PS4IP": "PS4의 IP 주소를 입력하세요.", + "description_PS4Port": "PS4의 포트를 입력하세요.", + "description_PS4FWVersion": "PS4의 펌웨어 버전을 입력하세요. (SendPayload를 실행할 때만 사용됨)", + "description_CollapsibleContainer": "Query, HexEditor, PointerFinder 창에서 접기 가능한 분할 패널 (SplitContainer) UI를 활성화할지 여부를 결정합니다. \n기본적으로 활성화됩니다.", + "description_UILanguage": "표시되는 언어를 결정합니다. \n기본값은 영어입니다.", + "description_UIFont": "UI의 글꼴 패밀리를 결정합니다. \n기본값은 SystemFonts.DefaultFont입니다.", + "description_UIOpacity": "창의 불투명도를 결정합니다. 최대값은 1 (불투명)입니다. \n기본값은 0.95입니다.", + "description_CheatGridViewGroupByEnabled": "CheatGridView에서 그룹화 기능을 활성화할지 여부를 결정합니다. \n활성화하면 Cheat이 그룹화됩니다. \n로드된 Cheat 항목이 매우 많은 경우 성능 저하를 고려하여이 기능을 비활성화하는 것이 좋습니다. \n값을 수정한 후에는 프로그램을 다시 시작해야 적용됩니다. \n기본적으로 활성화됩니다.", + "description_CheatGridGroupRefreshThreshold": "그룹화된 그리드의 새로 고침 대기 시간이 너무 길어지는 것을 방지하기 위해 실행됩니다. \n이 값보다 로드된 Cheat 수가 작을 때만 그룹 새로 고침이 수행됩니다. \n기본값은 10000입니다.", + "description_PS4DBGMutexFactor": "이 값을 조정하는 것은 권장되지 않으며, 변경한 후에는 프로그램을 다시 시작해야 합니다. \nMutex 계수는 PS4DBG의 초기화 수량과 점유 연결 수를 결정합니다. \n메모리 읽기의 연결 수는 0에서 Mutex 계수 (제외) 사이입니다. \n메모리 쓰기의 연결 수는 Mutex 계수에서 2 * Mutex 계수 (제외)까지입니다. \n기본값은 3입니다.", + "description_DisplayChangesListWhenSaving": "Option 창에서 저장을 실행할 때 변경된 옵션 목록을 표시할지 여부를 결정합니다. \n기본적으로 활성화됩니다.", + "description_CheatCellDirtyValueCommit": "Cheat 값을 UpDown으로 편집할 때 값을 자동으로 PS4에 쓸지 여부를 결정합니다. \n기본적으로 활성화됩니다.", + "description_CheatLock": "Main 창에서 Cheat 잠금을 활성화할지 여부를 결정합니다. \n기본적으로 활성화됩니다.", + "description_VerifySectionWhenLock": "Cheat 항목을 잠금 상태로 설정할 때 섹션 값을 확인할지 여부를 결정합니다. \n기본적으로 활성화됩니다.", + "description_CheatAutoRefresh": "Main 창에서 자동 새로 고침을 활성화할지 여부를 결정합니다. \n기본적으로 비활성화됩니다.", + "description_CheatAutoRefreshShowStatus": "Cheat이 자동으로 새로 고침되면 Main 창에 오류 상태를 표시할지 여부를 결정합니다. \n기본적으로 비활성화됩니다.", + "description_CheatAutoRefreshTimerInterval": "Cheat이 자동으로 새로 고침되면 자동 새로 고침 간격을 밀리초 단위로 결정합니다. \n기본값은 2500입니다.", + "description_VerifySectionWhenRefresh": "Cheat 목록을 새로 고칠 때 섹션 값을 확인할지 여부를 결정합니다. \n기본적으로 활성화됩니다.", + "description_AutoPerformGetProcesses": "Query 창을 열 때 모든 프로세스 목록을 자동으로 가져올지 여부를 결정합니다. \n기본적으로 활성화됩니다.", + "description_DefaultProcess": "모든 프로세스 목록을 가져올 때 기본 선택된 프로세스 이름을 설정합니다. \n기본값은 eboot.bin입니다.", + "description_MaxQueryThreads": "스캔 쿼리에 사용할 최대 스레드 수를 입력합니다. \n기본값은 3 스레드입니다.", + "description_QueryBufferSize": "스캔 쿼리 및 포인터 검색에 사용할 최소 버퍼 크기를 설정합니다 (단위: MB).\n0을 입력하면 버퍼 설정을 사용하지 않습니다. 게임의 섹션 수가 매우 적은 경우 0을 입력하는 것이 좋습니다.\n게임의 섹션 수가 1000을 초과하는 경우 버퍼 크기를 설정하는 것이 좋습니다.\n기본값은 50입니다.", + "description_MinResultAccessFactor": "동일 섹션의 스캔 쿼리 결과가 이 계수보다 작을 때 값을 읽을 때 직접 주소를 사용할지 여부를 결정합니다.\n이 계수는 전체 섹션 값을 읽을지 아니면 주소의 값을 직접 읽을지를 판단합니다.\n기본값은 50입니다.", + "description_MinResultAccessFactorThreshold": "MinResultAccessFactor 옵션에 대한 섹션 크기의 최소 임계값을 설정합니다 (단위: 바이트).\nMinResultAccessFactor 옵션은 섹션 크기가 임계값을 초과 할 때만 작동합니다.\n기본값은 1048576 (1MB)입니다.", + "description_UndoScan": "스캔을 실행할 때 이전 스캔 결과를 복원할지 여부를 결정합니다.\n활성화하면 스캔 쿼리시 메모리 사용량이 더 많아집니다.\n기본적으로 활성화됩니다.", + "description_ScanAutoPause": "스캔 쿼리를 시작할 때 게임을 자동으로 일시 정지할지 여부를 결정합니다.\n기본적으로 비활성화됩니다.", + "description_ScanAutoResume": "스캔 쿼리가 완료되면 게임을 자동으로 다시 시작할지 여부를 결정합니다.\n기본적으로 비활성화됩니다.", + "description_ShowSearchSizeFirstScan": "첫 번째 스캔 쿼리시 스캔 크기 확인 메시지를 표시할지 여부를 결정합니다.\n기본적으로 활성화됩니다.", + "description_UnknownInitialScanDoNotSkip0": "쿼리 창의 비교 유형이 UnknownInitial 인 경우 '0이 아닌 바이트 값 제외' 옵션을 활성화할지 여부를 결정합니다.\n참고: 이 옵션을 활성화하면 스캔 결과 수가 상당히 증가합니다.\n옵션을 수정한 후에는 새로운 쿼리 창을 열어야 적용됩니다.\n기본적으로 비활성화됩니다.", + "description_FloatingResultExact": "쿼리 창에서 부동 소수점(float, double)의 계산 결과를 완전히 정확하게하는지 여부를 결정합니다.\n비활성화되면 부동 소수점 비교 결과가 0.0001보다 작으면 동일한 것으로 간주됩니다.\n기본적으로 활성화됩니다.", + "description_FloatingSimpleValueExponents": "단순 부동 소수점 값(SimpleValues)의 지수 값을 설정합니다.\nCheat Engine의 기본값은 11입니다 (2의 11승 = 2^11 = 양수 또는 음수 2048).\n기본값은 11입니다.", + "description_FilterQuery": "쿼리 창을 열 때 섹션 필터링을 사용할지 여부를 결정합니다.\n기본적으로 활성화됩니다.", + "description_SectionFilterKeys": "필터 값을 입력하면 섹션의 필터 조건이 이 옵션에 따라 설정됩니다.", + "description_FilterSizeQuery": "Query 창을 열 때 섹션 크기 필터링을 사용할지 여부를 결정합니다.\n기본적으로 비활성화됩니다.", + "description_SectionFilterSize": "섹션 크기가 이 값보다 작을 때 필터링합니다 (단위: 바이트).", + "description_MaxResultShow": "표시할 스캔 쿼리 결과의 최대 수를 입력합니다.\nResultView에서 표시되는 결과 수에만 영향을 줍니다.\n기본값은 8192입니다.", + "description_SectionViewFullRowSelect": "Query 창에서 'SectionView의 FullRowSelect' 기능을 사용할지 여부를 결정합니다.\n기본적으로 비활성화됩니다.", + "description_SectionViewDetectHiddenSection": "자동으로 숨겨진 섹션을 감지할지 여부를 결정합니다.\n현재 실험적인 기능입니다.\n기본적으로 비활성화됩니다.", + "description_LastHiddenSectionLengthHex": "마지막 숨겨진 섹션의 Hex 길이를 지정합니다.\n이 옵션은 'SectionViewDetectHiddenSection'을 활성화한 후에만 작동합니다.\n기본값은 0x40000000입니다.", + "description_HiddenSectionStartAtPreviousEnd": "숨겨진 섹션의 시작 주소를 이전 섹션의 끝 주소로 설정할지 여부를 결정합니다.\n비활성화되면 시작 주소가 이전 섹션의 끝 주소보다 1 큰 값이 됩니다.\n기본적으로 활성화됩니다.", + "description_WriteHiddenSectionConf": "감지된 숨겨진 섹션 설정을 'PS4CheaterNeo\\sections\\[GAME_ID].conf' 경로에 쓸지 여부를 결정합니다.\n'Hidden Sections 검색' 스캔 유형을 Query 창에서 실행할 때 이 옵션을 활성화해야 합니다.\n참고: 이 옵션을 활성화하면 Query 창을 열 때 대기 시간이 더 길어집니다. 왜냐하면 [GAME_ID] 정보를 조회해야 하기 때문입니다.\n기본적으로 비활성화됩니다.", + "description_AutoRefresh": "Hex 에디터에서 자동 새로 고침을 사용할지 여부를 결정합니다.\n기본적으로 비활성화됩니다.", + "description_AutoRefreshTimerInterval": "자동 새로 고침이 활성화된 경우, Hex 에디터의 자동 새로 고침 간격을 밀리초 단위로 설정합니다.\n이 값을 설정한 후에는 Hex 에디터를 다시 시작해야 합니다.\n기본값은 2500입니다.", + "description_HexInfoDash": "Hex 에디터에서 현재 Hex 값의 분리 대시를 표시할지 여부를 결정합니다.\n기본값은 '-'입니다.", + "description_AutoFindClosestChangedPosition": "검색 값이 입력되지 않은 경우 현재 주소와 가장 가까운 변경된 주소를 자동으로 선택할지 여부를 결정합니다.\n기본적으로 활성화됩니다.", + "description_InputIsHexFormat": "Hex 에디터의 쿼리 입력 값이 Hex 형식인지 여부를 결정합니다.\n기본적으로 활성화됩니다.", + "description_UsingLittleEndian": "Hex 에디터의 쿼리 입력 값이 Hex인 경우 입력 값 유형이 Little-Endians인지 여부를 결정합니다. 이 옵션이 비활성화된 경우 Big-Endians로 설정됩니다.\n기본적으로 비활성화됩니다.", + "description_ColorTheme": "창 색상 테마를 결정합니다.", + "description_UiForeColor": "UI의 전경색을 결정합니다.", + "description_UiBackColor": "UI의 배경색을 결정합니다.", + "description_MainForeColor": "Main의 전경색을 결정합니다.", + "description_MainBackColor": "Main의 배경색을 결정합니다.", + "description_MainToolStrip1BackColor": "Main ToolStrip1의 배경색을 결정합니다.", + "description_MainCheatGridViewRowIndexForeColor": "Main CheatGridView의 RowIndex의 전경색을 결정합니다.", + "description_MainCheatGridViewBackgroundColor": "Main CheatGridView의 배경색을 결정합니다.", + "description_MainCheatGridViewBaseRowColor": "Main CheatGridView base row의 색상을 결정합니다.", + "description_MainCheatGridViewGridColor": "Main CheatGridView 그리드의 색상을 결정합니다.", + "description_MainCheatGridCellForeColor": "Main dataGridViewCellStyle의 전경색을 결정합니다.", + "description_MainCheatGridCellBackColor": "Main dataGridViewCellStyle의 배경색을 결정합니다.", + "description_QueryStatusStrip1BackColor": "Query StatusStrip1의 배경색을 결정합니다.", + "description_QueryAlignmentBoxForeColor": "AlignmentBox의 전경색을 결정합니다.", + "description_QueryScanBtnBackColor": "Query ScanBtn의 배경색을 결정합니다.", + "description_QuerySectionViewFilterForeColor": "Query SectionView Filter의 전경색을 결정합니다.", + "description_QuerySectionViewFilterBackColor": "Query SectionView Filter의 배경색을 결정합니다.", + "description_QuerySectionViewFilterSizeForeColor": "Query SectionView FilterSize의 전경색을 결정합니다.", + "description_QuerySectionViewFilterSizeBackColor": "Query SectionView FilterSize의 배경색을 결정합니다.", + "description_QuerySectionViewExecutableForeColor": "Query SectionView executable의 전경색을 결정합니다.", + "description_QuerySectionViewNoNameForeColor": "Query SectionView NoName의 전경색을 결정합니다.", + "description_QuerySectionViewNoName2ForeColor": "Query SectionView NoName2의 전경색을 결정합니다.", + "description_QuerySectionViewHiddenForeColor": "Query SectionView Hidden의 전경색을 결정합니다.", + "description_QuerySectionViewItemCheck1BackColor": "Query SectionView ItemCheck1의 배경색을 결정합니다.", + "description_QuerySectionViewItemCheck2BackColor": "Query SectionView ItemCheck2의 배경색을 결정합니다.", + "description_HexEditorChangedFinishForeColor": "Hex 편집기 ChangedFinish의 전경색을 결정합니다.", + "description_HexEditorShadowSelectionColor": "Hex 편집기 ShadowSelection의 색상을 결정합니다.", + "description_HexEditorZeroBytesForeColor": "Hex 편집기 ZeroBytes의 전경색을 결정합니다.", + "description_PointerFinderStatusStrip1BackColor": "PointerFinder statusStrip1의 배경색을 결정합니다.", + "description_PointerFinderScanBtnBackColor": "PointerFinder ScanBtn의 배경색을 결정합니다.", + "description_SendPayloadStatusStrip1BackColor": "SendPayload statusStrip1의 배경색을 결정합니다." + } +} \ No newline at end of file diff --git a/README.md b/README.md index 21a11e2..8303c79 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ PS4CheaterNeo is a program to find game cheat codes, and it is based on [`ps4debug`](https://github.com/jogolden/ps4debug) and [`.Net Framework 4.8`](https://support.microsoft.com/en-us/topic/microsoft-net-framework-4-8-offline-installer-for-windows-9d23f658-3b97-68ab-d013-aa3c3e7495e0). -Currently in `version 1.0.2.1` +Currently in `version 1.0.2.2` ## Table of Contents @@ -136,8 +136,14 @@ PS4CheaterNeo special format, but also supports loading(only) the following form - Cheat Relative (*.chtr) PS4CheaterNeo special format, use relative addresses when multiple cheat addresses are close together (0.9.5.7) -- Cheat Json (*.json) +- Cheat Trainer/GoldHEN (\*.json, \*.shn, \*.mc4) Cheat format used by PS4 Trainer and GoldHEN Cheat (0.9.6.0) +Now supports loading all Cheat Trainer/GoldHEN formats (\*.json, \*.shn, \*.mc4), with MC4 formats supporting reading only.(1.0.2.2) +In the "Add/Edit Cheat" interface within the main window, you can choose whether to input ON and OFF values (must be in hexadecimal).(1.0.2.1) +You can write the values of ON or OFF to the PS4 by right-clicking in the CheatGridView and selecting "Active"(1.0.2.1) + +- eboot.bin +The loaded "eboot.bin" here will be compared with the section memory content of the game executable, and the differing memory data between the two will be obtained. you must select to load an "eboot.bin" with the same game ID but differing from the content of the currently running game for the comparison to be valid.(1.0.2.1) ### Add Address @@ -432,9 +438,9 @@ Range: -0x8000000000000000 to 0x7FFFFFFFFFFFFFFF (-9,223,372,036,854,775,808 to - Added support for "Jump to Address" in the HexEditor's context menu. Enter an address, and it will automatically navigate to that location. (0.9.9.9) - Added support for "Jump to Offset" in the HexEditor's context menu. Enter an offset value from the current address, and it will navigate to the address relative to the current position. Negative offsets are also accepted. (0.9.9.9) -![hexeditor_contextMenu](assets/hexeditor_contextMenu.webp) -![hexeditor_jumpAddress](assets/hexeditor_jumpAddress.webp) -![hexeditor_jumpOffset](assets/hexeditor_jumpOffset.webp) +![hexeditor_contextMenu](assets/hexeditor_contextMenu.webp) +![hexeditor_jumpAddress](assets/hexeditor_jumpAddress.webp) +![hexeditor_jumpOffset](assets/hexeditor_jumpOffset.webp) ## Pointer finder [🔼](#table-of-contents) @@ -700,7 +706,7 @@ Restore default. ## Reference [🔼](#table-of-contents) -[TOC generated by markdown-toc](https://ecotrust-canada.github.io/markdown-toc/) +[TOC generated by markdown-toc](https://ecotrust-canada.github.io/markdown-toc/) [ps4debug](https://github.com/jogolden/ps4debug) [PS4_Cheater](https://github.com/hurrican6/PS4_Cheater) [PS4_Cheater_ctn123](https://github.com/ctn123/PS4_Cheater) @@ -709,4 +715,8 @@ Restore default. [AsmJit](https://github.com/hypeartist/AsmJit) [GroupGridView](https://github.com/avan06/GroupGridView) [OptionTreeView](https://github.com/avan06/OptionTreeView) -[CollapsibleSplitcontainer](https://github.com/avan06/CollapsibleSplitcontainer) \ No newline at end of file +[CollapsibleSplitcontainer](https://github.com/avan06/CollapsibleSplitcontainer) +[GoldHEN](https://github.com/GoldHEN/GoldHEN) +[GoldHEN_Cheat_Repository](https://github.com/GoldHEN/GoldHEN_Cheat_Repository) +[Reaper-Software-Suite](https://github.com/ScriptSK/Reaper-Software-Suite) +[save-decrypters](https://github.com/bucanero/save-decrypters) \ No newline at end of file diff --git a/assets/add.webp b/assets/add.webp index 45a449a..69b5c39 100644 Binary files a/assets/add.webp and b/assets/add.webp differ diff --git a/assets/cheat_1.webp b/assets/cheat_1.webp index fe3d475..112bebe 100644 Binary files a/assets/cheat_1.webp and b/assets/cheat_1.webp differ diff --git a/assets/cheat_2.webp b/assets/cheat_2.webp index 91812de..6dd4638 100644 Binary files a/assets/cheat_2.webp and b/assets/cheat_2.webp differ diff --git a/assets/experimental1.webp b/assets/experimental1.webp index 8763c0d..25209ff 100644 Binary files a/assets/experimental1.webp and b/assets/experimental1.webp differ