//The freeze engine is very similar to the Hellgenie and shares common functions with it. See RTC_HellgenieEngine.cs for cheat-related methods. public static BlastCheat GenerateUnit(string _domain, long _address) { try { MemoryDomainProxy mdp = RTC_MemoryDomains.getProxy(_domain, _address); BizHawk.Client.Common.DisplayType _displaytype = BizHawk.Client.Common.DisplayType.Unsigned; byte[] _value; if (RTC_Core.CustomPrecision == -1) { _value = new byte[mdp.WordSize]; } else { _value = new byte[RTC_Core.CustomPrecision]; } long safeAddress = _address - (_address % _value.Length); for (int i = 0; i < _value.Length; i++) { _value[i] = 0; } //_value[i] = mdp.PeekByte(safeAddress + i); return(new BlastCheat(_domain, safeAddress, _displaytype, mdp.BigEndian, _value, true, true)); } catch (Exception ex) { MessageBox.Show("Something went wrong in the RTC Freeze Engine. \n" + "This is not a BizHawk error so you should probably send a screenshot of this to the devs\n\n" + ex.ToString()); return(null); } }
public static void CLOSE_GAME(bool loadDefault = false) { if (DisableRTC) { return; } if (CLOSE_GAME_loop_flag == true) { return; } CLOSE_GAME_loop_flag = true; //RTC_Core.AutoCorrupt = false; RTC_PipeEngine.ClearPipes(); RTC_MemoryDomains.Clear(); RTC_Core.lastOpenRom = null; if (loadDefault) { RTC_Core.LoadDefaultRom(); } //RTC_RPC.SendToKillSwitch("UNFREEZE"); CLOSE_GAME_loop_flag = false; }
public static BlastUnit GenerateUnit(string _domain, long _address) { // Randomly selects a memory operation according to the selected algorithm try { MemoryDomainProxy mdp = RTC_MemoryDomains.getProxy(_domain, _address); int pipeSize; if (RTC_Core.CustomPrecision == -1) { pipeSize = mdp.WordSize; } else { pipeSize = RTC_Core.CustomPrecision; } long safeAddress = _address - (_address % pipeSize); if (ChainedPipes) { if (lastDomain == null) // The first unit will always be null { lastDomain = _domain; lastAddress = safeAddress; return(null); } else { BlastPipe bp = new BlastPipe(_domain, safeAddress, lastDomain, lastAddress, tiltValue, pipeSize, true); lastDomain = _domain; lastAddress = safeAddress; return(bp); } } else { var pipeEnd = RTC_Core.GetBlastTarget(); long safepipeEndAddress = pipeEnd.address - (pipeEnd.address % pipeSize); BlastPipe bp = new BlastPipe(_domain, safeAddress, pipeEnd.domain, safepipeEndAddress, tiltValue, pipeSize, true); lastDomain = _domain; lastAddress = safeAddress; return(bp); } } catch (Exception ex) { MessageBox.Show("Something went wrong in the RTC Pipe Engine. \n" + "This is not a BizHawk error so you should probably send a screenshot of this to the devs\n\n" + ex.ToString()); return(null); } }
public void RefreshDomains() { RTC_MemoryDomains.RefreshDomains(); lbMemoryDomains.Items.Clear(); lbMemoryDomains.Items.AddRange(RTC_MemoryDomains.MemoryInterfaces.Keys.ToArray()); if (RTC_MemoryDomains.VmdPool.Count > 0) { lbMemoryDomains.Items.AddRange(RTC_MemoryDomains.VmdPool.Values.Select(it => it.ToString()).ToArray()); } }
public VmdPrototype(BlastLayer bl) { VmdName = RTC_Core.GetRandomKey(); GenDomain = "Hybrid"; BlastUnit bu = bl.Layer[0]; var mi = RTC_MemoryDomains.getInterface(bu.Domain); BigEndian = mi.BigEndian; WordSize = mi.WordSize; SuppliedBlastLayer = bl; }
private void btnRenameVMD_Click(object sender, EventArgs e) { if (lbLoadedVmdList.SelectedIndex == -1) { return; } string VmdName = lbLoadedVmdList.SelectedItem.ToString(); RTC_MemoryDomains.RenameVMD(VmdName); RefreshVMDs(); }
private void lbMemoryDomains_SelectedIndexChanged(object sender, EventArgs e) { if (lbMemoryDomains_DontExecute_SelectedIndexChanged) { return; } string[] selectedDomains = lbMemoryDomains.SelectedItems.Cast <string>().ToArray(); RTC_MemoryDomains.UpdateSelectedDomains(selectedDomains, true); //RTC_Restore.SaveRestore(); }
public override void PokeByte(long address, byte value) { string targetDomain = getRealDomain(address); long targetAddress = getRealAddress(address); var mdp = RTC_MemoryDomains.getProxy(targetDomain, targetAddress); if (mdp == null) { return; } mdp.PokeByte(targetAddress, value); }
public static void LOAD_GAME_DONE() { if (DisableRTC) { return; } //RTC_HellgenieEngine.ClearCheats(); //RTC_PipeEngine.ClearPipes(); //Glitch Harvester warning for archives string uppercaseFilename = GlobalWin.MainForm.CurrentlyOpenRom.ToUpper(); if (RTC_Core.ghForm.Visible && (uppercaseFilename.Contains(".ZIP") || uppercaseFilename.Contains(".7Z"))) { MessageBox.Show($"The rom {RTC_Extensions.getShortFilenameFromPath(uppercaseFilename)} is in an archive and can't be added to a Stockpile"); } //Load Game vars into RTC_Core PathEntry pathEntry = Global.Config.PathEntries[Global.Game.System, "Savestates"] ?? Global.Config.PathEntries[Global.Game.System, "Base"]; RTC_StockpileManager.currentGameSystem = RTC_Core.EmuFolderCheck(pathEntry.SystemDisplayName); RTC_StockpileManager.currentGameName = PathManager.FilesystemSafeName(Global.Game); RTC_Core.lastOpenRom = GlobalWin.MainForm.CurrentlyOpenRom; RTC_RPC.RefreshPlugin(); //prepare memory domains in advance on bizhawk side RTC_MemoryDomains.RefreshDomains(false); if (RTC_StockpileManager.currentGameName != lastGameName) { RTC_Core.SendCommandToRTC(new RTC_Command(CommandType.REMOTE_EVENT_LOADGAMEDONE_NEWGAME)); } else { RTC_Core.SendCommandToRTC(new RTC_Command(CommandType.REMOTE_EVENT_LOADGAMEDONE_SAMEGAME)); } lastGameName = RTC_StockpileManager.currentGameName; //RTC_Restore.SaveRestore(); RTC_NetCore.HugeOperationEnd(); }
public override byte PeekByte(long address) { string targetDomain = getRealDomain(address); long targetAddress = getRealAddress(address); var mdp = RTC_MemoryDomains.getProxy(targetDomain, targetAddress); if (mdp == null) { return(0); } return(mdp.PeekByte(targetAddress)); }
public void RefreshDomainsAndKeepSelected(string[] overrideDomains = null) { string[] copy = RTC_MemoryDomains.lastSelectedDomains; if (overrideDomains != null) { copy = overrideDomains; } RefreshDomains(); //refresh and reload domains RTC_MemoryDomains.UpdateSelectedDomains(copy); setMemoryDomainsSelectedDomains(copy); }
public static BlastLayer GetBlastLayer(byte[] Original, byte[] Corrupt) { BlastLayer bl = new BlastLayer(); string thisSystem = Global.Game.System; string romFilename = GlobalWin.MainForm.CurrentlyOpenRom; var rp = RTC_MemoryDomains.GetRomParts(thisSystem, romFilename); if (rp.error != null) { MessageBox.Show(rp.error); return(null); } if (Original.Length != Corrupt.Length) { MessageBox.Show("ERROR, ROM SIZE MISMATCH"); return(null); } long maxaddress = RTC_MemoryDomains.getInterface(rp.primarydomain).Size; for (int i = 0; i < Original.Length; i++) { if (Original[i] != Corrupt[i] && i >= rp.skipbytes) { if (i - rp.skipbytes >= maxaddress) { bl.Layer.Add(new BlastByte(rp.seconddomain, (i - rp.skipbytes) - maxaddress, BlastByteType.SET, new byte[] { Corrupt[i] }, true)); } else { bl.Layer.Add(new BlastByte(rp.primarydomain, i - rp.skipbytes, BlastByteType.SET, new byte[] { Corrupt[i] }, true)); } } } if (bl.Layer.Count == 0) { return(null); } else { return(bl); } }
private void btnUnloadVMD_Click(object sender, EventArgs e) { if (lbLoadedVmdList.SelectedIndex == -1) { return; } string VmdName = lbLoadedVmdList.SelectedItem.ToString(); foreach (BlastPipe bp in RTC_PipeEngine.AllBlastPipes) { bp.Rasterize(); } RTC_MemoryDomains.RemoveVMD(VmdName); RefreshVMDs(); }
public static BlastUnit GenerateUnit(string _domain, long _address) { // Randomly selects a memory operation according to the selected algorithm //long safeAddress = _address - (_address % 8); //64-bit trunk long safeAddress = _address - (_address % 4); //32-bit trunk MemoryDomainProxy mdp = RTC_MemoryDomains.getProxy(_domain, safeAddress); if (mdp == null) { return(null); } try { BlastVector bv = null; lastValues = read32bits(mdp, safeAddress); lastDomain = _domain; if (isConstant(lastValues, limiterList)) { bv = new BlastVector(_domain, _address, getRandomConstant(valueList), true); } return(bv); } catch (Exception ex) { MessageBox.Show("Something went wrong in the RTC Vector Engine. \n" + "This is not a BizHawk error so you should probably send a screenshot of this to the devs\n\n" + ex.ToString()); return(null); } }
private void btnLoadVmd_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.DefaultExt = "xml"; ofd.Multiselect = true; ofd.Title = "Open VMD File"; ofd.Filter = "VMD xml files|*.xml"; ofd.RestoreDirectory = true; if (ofd.ShowDialog() == DialogResult.OK) { //string Filename = ofd.FileName.ToString(); foreach (string Filename in ofd.FileNames) { try { FileStream FS; XmlSerializer xs = new XmlSerializer(typeof(VmdPrototype)); FS = File.Open(Filename, FileMode.OpenOrCreate); var proto = (VmdPrototype)xs.Deserialize(FS); FS.Close(); RTC_MemoryDomains.AddVMD(proto); } catch { MessageBox.Show($"The VMD xml file {Filename} could not be loaded."); } } RefreshVMDs(); } else { return; } }
public static BlastUnit GenerateUnit(string _domain, long _address) { // Randomly selects a memory operation according to the selected algorithm try { MemoryDomainProxy mdp = RTC_MemoryDomains.getProxy(_domain, _address); BlastByteType Type = BlastByteType.SET; byte[] _value;; if (RTC_Core.CustomPrecision == -1) { _value = new byte[mdp.WordSize]; } else { _value = new byte[RTC_Core.CustomPrecision]; } for (int i = 0; i < _value.Length; i++) { _value[i] = 1; } long safeAddress = _address - (_address % _value.Length); BlastByte bb = new BlastByte(_domain, safeAddress, Type, _value, true); return(bb.GetBackup()); } catch (Exception ex) { MessageBox.Show("Something went wrong in the RTC Distortion Engine. \n" + "This is not a BizHawk error so you should probably send a screenshot of this to the devs\n\n" + ex.ToString()); return(null); } }
public static BlastTarget GetBlastTarget() { //Standalone version of BlastRadius SPREAD string Domain = null; long MaxAddress = -1; long RandomAddress = -1; string[] _selectedDomains = RTC_MemoryDomains.SelectedDomains; if (RTC_Core.SelectedEngine != CorruptionEngine.FREEZE) { Domain = _selectedDomains[RND.Next(_selectedDomains.Length)]; } else { Domain = RTC_MemoryDomains.MainDomain.ToString(); } MaxAddress = RTC_MemoryDomains.getInterface(Domain).Size; RandomAddress = RTC_Core.RND.RandomLong(MaxAddress - 1); return(new BlastTarget(Domain, RandomAddress)); }
public RTC_Command Process_RTCExtensions(RTC_Command cmd) { RTC_Command cmdBack = null; switch (cmd.Type) { case CommandType.ASYNCBLAST: { BlastLayer bl = RTC_Core.Blast(null, RTC_MemoryDomains.SelectedDomains); if (bl != null) { bl.Apply(); } } break; case CommandType.BLAST: { BlastLayer bl = null; string[] _domains = (string[])cmd.objectValue; if (_domains == null) { _domains = RTC_MemoryDomains.SelectedDomains; } if (cmd.blastlayer != null) { cmd.blastlayer.Apply(cmd.isReplay); } else { bl = RTC_Core.Blast(null, _domains); } if (cmd.requestGuid != null) { cmdBack = new RTC_Command(CommandType.RETURNVALUE); cmdBack.objectValue = bl; } } break; case CommandType.STASHKEY: if (!File.Exists(RTC_Core.rtcDir + "\\TEMP\\" + cmd.romFilename)) { File.WriteAllBytes(RTC_Core.rtcDir + "\\TEMP\\" + cmd.romFilename, cmd.romData); } cmd.stashkey.RomFilename = RTC_Core.rtcDir + "\\TEMP\\" + RTC_Extensions.getShortFilenameFromPath(cmd.romFilename); cmd.stashkey.DeployState(); cmd.stashkey.Run(); break; case CommandType.PULLROM: cmdBack = new RTC_Command(CommandType.PUSHROM); cmdBack.romFilename = RTC_Extensions.getShortFilenameFromPath(GlobalWin.MainForm.CurrentlyOpenRom); if (!PeerHasRom(cmdBack.romFilename)) { cmdBack.romData = File.ReadAllBytes(GlobalWin.MainForm.CurrentlyOpenRom); } break; case CommandType.PUSHROM: if (cmd.romData != null) { cmd.romFilename = RTC_Extensions.getShortFilenameFromPath(cmd.romFilename); if (!File.Exists(RTC_Core.rtcDir + "\\TEMP\\" + cmd.romFilename)) { File.WriteAllBytes(RTC_Core.rtcDir + "\\TEMP\\" + cmd.romFilename, cmd.romData); } } RTC_Core.LoadRom(RTC_Core.rtcDir + "\\TEMP\\" + cmd.romFilename); break; case CommandType.PULLSTATE: cmdBack = new RTC_Command(CommandType.PUSHSTATE); StashKey sk_PULLSTATE = RTC_StockpileManager.SaveState(false); cmdBack.stashkey = sk_PULLSTATE; sk_PULLSTATE.EmbedState(); break; case CommandType.PUSHSTATE: cmd.stashkey.DeployState(); RTC_StockpileManager.LoadState(cmd.stashkey, false); if (RTC_Core.multiForm.cbPullStateToGlitchHarvester.Checked) { StashKey sk_PUSHSTATE = RTC_StockpileManager.SaveState(true, cmd.stashkey); sk_PUSHSTATE.RomFilename = GlobalWin.MainForm.CurrentlyOpenRom; } break; case CommandType.PULLSWAPSTATE: cmdBack = new RTC_Command(CommandType.PUSHSWAPSTATE); cmdBack.romFilename = RTC_Extensions.getShortFilenameFromPath(GlobalWin.MainForm.CurrentlyOpenRom); if (!PeerHasRom(cmdBack.romFilename)) { cmdBack.romData = File.ReadAllBytes(GlobalWin.MainForm.CurrentlyOpenRom); } StashKey sk_PULLSWAPSTATE = RTC_StockpileManager.SaveState(false); cmdBack.stashkey = sk_PULLSWAPSTATE; sk_PULLSWAPSTATE.EmbedState(); cmd.romFilename = RTC_Extensions.getShortFilenameFromPath(cmd.romFilename); if (!File.Exists(RTC_Core.rtcDir + "\\TEMP\\" + cmd.romFilename)) { File.WriteAllBytes(RTC_Core.rtcDir + "\\TEMP\\" + cmd.romFilename, cmd.romData); } RTC_Core.LoadRom(RTC_Core.rtcDir + "\\TEMP\\" + cmd.romFilename); cmd.stashkey.DeployState(); RTC_StockpileManager.LoadState(cmd.stashkey, false); if (RTC_Core.multiForm.GameOfSwapTimer != null) { RTC_Core.multiForm.GameOfSwapCounter = 64; } break; case CommandType.PUSHSWAPSTATE: cmd.romFilename = RTC_Extensions.getShortFilenameFromPath(cmd.romFilename); if (cmd.romData != null) { if (!File.Exists(RTC_Core.rtcDir + "\\TEMP\\" + cmd.romFilename)) { File.WriteAllBytes(RTC_Core.rtcDir + "\\TEMP\\" + cmd.romFilename, cmd.romData); } } RTC_Core.LoadRom(RTC_Core.rtcDir + "\\TEMP\\" + cmd.romFilename); cmd.stashkey.DeployState(); RTC_StockpileManager.LoadState(cmd.stashkey, false); if (RTC_Core.multiForm.GameOfSwapTimer != null) { RTC_Core.multiForm.GameOfSwapCounter = 64; } break; case CommandType.PULLSCREEN: cmdBack = new RTC_Command(CommandType.PUSHSCREEN); cmdBack.screen = GlobalWin.MainForm.MakeScreenshotImage().ToSysdrawingBitmap(); break; case CommandType.REQUESTSTREAM: RTC_Core.multiForm.cbStreamScreenToPeer.Checked = true; break; case CommandType.PUSHSCREEN: UpdatePeerScreen(cmd.screen); break; case CommandType.GAMEOFSWAPSTART: RTC_Core.multiForm.StartGameOfSwap(false); break; case CommandType.GAMEOFSWAPSTOP: RTC_Core.multiForm.StopGameOfSwap(true); break; case CommandType.REMOTE_PUSHPARAMS: (cmd.objectValue as RTC_Params).Deploy(); break; case CommandType.REMOTE_PUSHVMDS: RTC_MemoryDomains.VmdPool.Clear(); foreach (var proto in (cmd.objectValue as VmdPrototype[])) { RTC_MemoryDomains.AddVMD(proto); } break; case CommandType.REMOTE_LOADROM: RTC_Core.LoadRom_NET(cmd.romFilename); break; case CommandType.REMOTE_LOADSTATE: { StashKey sk = (StashKey)(cmd.objectValue as object[])[0]; bool reloadRom = (bool)(cmd.objectValue as object[])[1]; bool runBlastLayer = (bool)(cmd.objectValue as object[])[2]; bool returnValue = RTC_StockpileManager.LoadState_NET(sk, reloadRom); RTC_MemoryDomains.RefreshDomains(false); if (runBlastLayer) { RTC_Core.SendCommandToBizhawk(new RTC_Command(CommandType.BLAST) { blastlayer = sk.BlastLayer, isReplay = true }); } cmdBack = new RTC_Command(CommandType.RETURNVALUE); cmdBack.objectValue = returnValue; } break; case CommandType.REMOTE_MERGECONFIG: Stockpile.MergeBizhawkConfig_NET(); break; case CommandType.REMOTE_IMPORTKEYBINDS: Stockpile.ImportBizhawkKeybinds_NET(); break; case CommandType.REMOTE_SAVESTATE: { StashKey sk = RTC_StockpileManager.SaveState_NET((bool)(cmd.objectValue as object[])[0], (StashKey)(cmd.objectValue as object[])[1]); if (cmd.requestGuid != null) { cmdBack = new RTC_Command(CommandType.RETURNVALUE); cmdBack.objectValue = sk; } } break; case CommandType.REMOTE_BACKUPKEY_REQUEST: { if (!RTC_Hooks.isNormalAdvance) { break; } cmdBack = new RTC_Command(CommandType.REMOTE_BACKUPKEY_STASH); bool multiThread = false; // apparently multithread savestates doesn't work well right now. // We can try again in a future version of bizhawk /* * if (new string[] { * "SNES", "GB", "GBC", "GBA", * }.Contains(Global.Game.System.ToString().ToUpper())) * multiThread = false; */ cmdBack.objectValue = RTC_StockpileManager.SaveState_NET(false, null, multiThread); break; } case CommandType.REMOTE_BACKUPKEY_STASH: RTC_StockpileManager.backupedState = (StashKey)cmd.objectValue; RTC_StockpileManager.allBackupStates.Push((StashKey)cmd.objectValue); RTC_Core.coreForm.btnGpJumpBack.Visible = true; RTC_Core.coreForm.btnGpJumpNow.Visible = true; break; case CommandType.REMOTE_DOMAIN_PEEKBYTE: cmdBack = new RTC_Command(CommandType.RETURNVALUE); cmdBack.objectValue = RTC_MemoryDomains.getInterface((string)(cmd.objectValue as object[])[0]).PeekByte((long)(cmd.objectValue as object[])[1]); break; case CommandType.REMOTE_DOMAIN_POKEBYTE: RTC_MemoryDomains.getInterface((string)(cmd.objectValue as object[])[0]).PokeByte((long)(cmd.objectValue as object[])[1], (byte)(cmd.objectValue as object[])[2]); break; case CommandType.REMOTE_DOMAIN_GETDOMAINS: cmdBack = new RTC_Command(CommandType.RETURNVALUE); cmdBack.objectValue = RTC_MemoryDomains.getInterfaces(); break; case CommandType.REMOTE_DOMAIN_VMD_ADD: RTC_MemoryDomains.AddVMD((cmd.objectValue as VmdPrototype)); break; case CommandType.REMOTE_DOMAIN_VMD_REMOVE: RTC_MemoryDomains.RemoveVMD((cmd.objectValue as string)); break; case CommandType.REMOTE_DOMAIN_SETSELECTEDDOMAINS: RTC_MemoryDomains.UpdateSelectedDomains((string[])cmd.objectValue); break; case CommandType.REMOTE_DOMAIN_SYSTEM: cmdBack = new RTC_Command(CommandType.RETURNVALUE); cmdBack.objectValue = Global.Game.System.ToString().ToUpper(); break; case CommandType.REMOTE_DOMAIN_SYSTEMPREFIX: cmdBack = new RTC_Command(CommandType.RETURNVALUE); cmdBack.objectValue = PathManager.SaveStatePrefix(Global.Game); break; case CommandType.REMOTE_KEY_PUSHSAVESTATEDICO: { var key = (string)(cmd.objectValue as object[])[1]; var sk = (StashKey)((cmd.objectValue as object[])[0]); RTC_StockpileManager.SavestateStashkeyDico[key] = sk; RTC_Core.ghForm.refreshSavestateTextboxes(); } break; case CommandType.REMOTE_KEY_GETSYSTEMNAME: cmdBack = new RTC_Command(CommandType.RETURNVALUE); cmdBack.objectValue = (Global.Config.PathEntries[Global.Game.System, "Savestates"] ?? Global.Config.PathEntries[Global.Game.System, "Base"]).SystemDisplayName; break; case CommandType.REMOTE_KEY_GETSYSTEMCORE: cmdBack = new RTC_Command(CommandType.RETURNVALUE); cmdBack.objectValue = StashKey.getCoreName_NET((string)cmd.objectValue); break; case CommandType.REMOTE_KEY_GETGAMENAME: cmdBack = new RTC_Command(CommandType.RETURNVALUE); cmdBack.objectValue = PathManager.FilesystemSafeName(Global.Game); break; case CommandType.REMOTE_KEY_GETSYNCSETTINGS: cmdBack = new RTC_Command(CommandType.RETURNVALUE); cmdBack.objectValue = StashKey.getSyncSettings_NET((string)cmd.objectValue); break; case CommandType.REMOTE_KEY_PUTSYNCSETTINGS: cmdBack = new RTC_Command(CommandType.RETURNVALUE); break; case CommandType.REMOTE_KEY_GETOPENROMFILENAME: cmdBack = new RTC_Command(CommandType.RETURNVALUE); cmdBack.objectValue = GlobalWin.MainForm.CurrentlyOpenRom; break; case CommandType.REMOTE_KEY_GETRAWBLASTLAYER: cmdBack = new RTC_Command(CommandType.RETURNVALUE); cmdBack.objectValue = RTC_StockpileManager.getRawBlastlayer(); break; case CommandType.BIZHAWK_SET_OSDDISABLED: RTC_Core.BizhawkOsdDisabled = (bool)cmd.objectValue; break; case CommandType.REMOTE_SET_SAVESTATEBOX: RTC_StockpileManager.currentSavestateKey = (string)cmd.objectValue; break; case CommandType.REMOTE_SET_AUTOCORRUPT: RTC_Core.AutoCorrupt = (bool)cmd.objectValue; break; case CommandType.REMOTE_SET_CUSTOMPRECISION: RTC_Core.CustomPrecision = (int)cmd.objectValue; break; case CommandType.REMOTE_SET_INTENSITY: RTC_Core.Intensity = (int)cmd.objectValue; break; case CommandType.REMOTE_SET_ERRORDELAY: RTC_Core.ErrorDelay = (int)cmd.objectValue; break; case CommandType.REMOTE_SET_BLASTRADIUS: RTC_Core.Radius = (BlastRadius)cmd.objectValue; break; case CommandType.REMOTE_SET_RESTOREBLASTLAYERBACKUP: if (RTC_StockpileManager.lastBlastLayerBackup != null) { RTC_StockpileManager.lastBlastLayerBackup.Apply(true); } break; case CommandType.REMOTE_SET_NIGHTMARE_TYPE: RTC_NightmareEngine.Algo = (BlastByteAlgo)cmd.objectValue; break; case CommandType.REMOTE_SET_HELLGENIE_MAXCHEATS: RTC_HellgenieEngine.MaxCheats = (int)cmd.objectValue; break; case CommandType.REMOTE_SET_HELLGENIE_CHEARCHEATSREWIND: RTC_Core.ClearCheatsOnRewind = (bool)cmd.objectValue; break; case CommandType.REMOTE_SET_HELLGENIE_CLEARALLCHEATS: if (Global.CheatList != null) { Global.CheatList.Clear(); } break; case CommandType.REMOTE_SET_HELLGENIE_REMOVEEXCESSCHEATS: while (Global.CheatList.Count > RTC_HellgenieEngine.MaxCheats) { Global.CheatList.Remove(Global.CheatList[0]); } break; case CommandType.REMOTE_SET_PIPE_MAXPIPES: RTC_PipeEngine.MaxPipes = (int)cmd.objectValue; break; case CommandType.REMOTE_SET_PIPE_TILTVALUE: RTC_PipeEngine.tiltValue = (int)cmd.objectValue; break; case CommandType.REMOTE_SET_PIPE_CLEARPIPES: RTC_PipeEngine.AllBlastPipes.Clear(); RTC_PipeEngine.lastDomain = null; break; case CommandType.REMOTE_SET_PIPE_LOCKPIPES: RTC_PipeEngine.LockPipes = (bool)cmd.objectValue; break; case CommandType.REMOTE_SET_PIPE_CHAINEDPIPES: RTC_PipeEngine.ChainedPipes = (bool)cmd.objectValue; break; case CommandType.REMOTE_SET_PIPE_PROCESSONSTEP: RTC_PipeEngine.ProcessOnStep = (bool)cmd.objectValue; break; case CommandType.REMOTE_SET_PIPE_CLEARPIPESREWIND: RTC_Core.ClearPipesOnRewind = (bool)cmd.objectValue; break; case CommandType.REMOTE_SET_ENGINE: RTC_Core.SelectedEngine = (CorruptionEngine)cmd.objectValue; break; case CommandType.REMOTE_SET_DISTORTION_DELAY: RTC_DistortionEngine.MaxAge = (int)cmd.objectValue; RTC_DistortionEngine.CurrentAge = 0; RTC_DistortionEngine.AllDistortionBytes.Clear(); break; case CommandType.REMOTE_SET_DISTORTION_RESYNC: RTC_DistortionEngine.CurrentAge = 0; RTC_DistortionEngine.AllDistortionBytes.Clear(); break; case CommandType.REMOTE_SET_VECTOR_LIMITER: RTC_VectorEngine.limiterList = (string[])cmd.objectValue; break; case CommandType.REMOTE_SET_VECTOR_VALUES: RTC_VectorEngine.valueList = (string[])cmd.objectValue; break; case CommandType.REMOTE_EVENT_LOADGAMEDONE_NEWGAME: if (RTC_Core.isStandalone && RTC_GameProtection.isRunning) { RTC_GameProtection.Reset(); } RTC_Core.AutoCorrupt = false; //RTC_StockpileManager.isCorruptionApplied = false; RTC_Core.ecForm.RefreshDomains(); RTC_Core.ecForm.setMemoryDomainsAllButSelectedDomains(RTC_MemoryDomains.GetBlacklistedDomains()); RTC_Core.ecForm.lbCoreDefault.Text = $"Core default: { RTC_MemoryDomains.MemoryInterfaces[RTC_MemoryDomains.MainDomain].WordSize * 8}-bit"; break; case CommandType.REMOTE_EVENT_LOADGAMEDONE_SAMEGAME: //RTC_StockpileManager.isCorruptionApplied = false; RTC_Core.ecForm.RefreshDomainsAndKeepSelected(); RTC_Core.ecForm.lbCoreDefault.Text = $"Core default: { RTC_MemoryDomains.MemoryInterfaces[RTC_MemoryDomains.MainDomain].WordSize * 8}-bit"; break; case CommandType.REMOTE_EVENT_CLOSEBIZHAWK: GlobalWin.MainForm.Close(); break; case CommandType.REMOTE_EVENT_SAVEBIZHAWKCONFIG: GlobalWin.MainForm.SaveConfig(); break; case CommandType.REMOTE_EVENT_BIZHAWKSTARTED: if (RTC_StockpileManager.backupedState == null) { RTC_Core.coreForm.AutoCorrupt = false; } RTC_Core.SendCommandToBizhawk(new RTC_Command(CommandType.REMOTE_PUSHPARAMS) { objectValue = new RTC_Params() }, true, true); RTC_Core.SendCommandToBizhawk(new RTC_Command(CommandType.REMOTE_PUSHVMDS) { objectValue = RTC_MemoryDomains.VmdPool.Values.Select(it => (it as VirtualMemoryDomain).proto).ToArray() }, true, true); Thread.Sleep(100); if (RTC_StockpileManager.backupedState != null) { RTC_Core.ecForm.RefreshDomainsAndKeepSelected(RTC_StockpileManager.backupedState.SelectedDomains.ToArray()); } if (RTC_Core.coreForm.cbUseGameProtection.Checked) { RTC_GameProtection.Start(); } break; case CommandType.REMOTE_HOTKEY_MANUALBLAST: RTC_Core.coreForm.btnManualBlast_Click(null, null); break; case CommandType.REMOTE_HOTKEY_AUTOCORRUPTTOGGLE: RTC_Core.coreForm.btnAutoCorrupt_Click(null, null); break; case CommandType.REMOTE_HOTKEY_ERRORDELAYDECREASE: if (RTC_Core.ecForm.nmErrorDelay.Value > 1) { RTC_Core.ecForm.nmErrorDelay.Value--; } break; case CommandType.REMOTE_HOTKEY_ERRORDELAYINCREASE: if (RTC_Core.ecForm.nmErrorDelay.Value < RTC_Core.ecForm.track_ErrorDelay.Maximum) { RTC_Core.ecForm.nmErrorDelay.Value++; } break; case CommandType.REMOTE_HOTKEY_INTENSITYDECREASE: if (RTC_Core.ecForm.nmIntensity.Value > 1) { RTC_Core.ecForm.nmIntensity.Value--; } break; case CommandType.REMOTE_HOTKEY_INTENSITYINCREASE: if (RTC_Core.ecForm.nmIntensity.Value < RTC_Core.ecForm.track_Intensity.Maximum) { RTC_Core.ecForm.nmIntensity.Value++; } break; case CommandType.REMOTE_HOTKEY_GHLOADCORRUPT: if (!RTC_NetCore.NetCoreCommandSynclock) { RTC_NetCore.NetCoreCommandSynclock = true; RTC_Core.ghForm.cbAutoLoadState.Checked = true; RTC_Core.ghForm.btnCorrupt_Click(null, null); RTC_NetCore.NetCoreCommandSynclock = false; } break; case CommandType.REMOTE_HOTKEY_GHCORRUPT: if (!RTC_NetCore.NetCoreCommandSynclock) { RTC_NetCore.NetCoreCommandSynclock = true; bool isload = RTC_Core.ghForm.cbAutoLoadState.Checked; RTC_Core.ghForm.cbAutoLoadState.Checked = false; RTC_Core.ghForm.btnCorrupt_Click(null, null); RTC_Core.ghForm.cbAutoLoadState.Checked = isload; RTC_NetCore.NetCoreCommandSynclock = false; } break; case CommandType.REMOTE_HOTKEY_GHLOAD: RTC_Core.ghForm.btnSaveLoad.Text = "LOAD"; RTC_Core.ghForm.btnSaveLoad_Click(null, null); break; case CommandType.REMOTE_HOTKEY_GHSAVE: RTC_Core.ghForm.btnSaveLoad.Text = "SAVE"; RTC_Core.ghForm.btnSaveLoad_Click(null, null); break; case CommandType.REMOTE_HOTKEY_GHSTASHTOSTOCKPILE: RTC_Core.ghForm.AddStashToStockpile(false); break; case CommandType.REMOTE_HOTKEY_SENDRAWSTASH: RTC_Core.ghForm.btnSendRaw_Click(null, null); break; case CommandType.REMOTE_HOTKEY_BLASTRAWSTASH: RTC_Core.SendCommandToBizhawk(new RTC_Command(CommandType.ASYNCBLAST)); RTC_Core.ghForm.btnSendRaw_Click(null, null); break; case CommandType.REMOTE_HOTKEY_BLASTLAYERTOGGLE: RTC_Core.ghForm.btnBlastToggle_Click(null, null); break; case CommandType.REMOTE_HOTKEY_BLASTLAYERREBLAST: if (RTC_StockpileManager.currentStashkey == null || RTC_StockpileManager.currentStashkey.BlastLayer.Layer.Count == 0) { RTC_Core.ghForm.IsCorruptionApplied = false; break; } RTC_Core.ghForm.IsCorruptionApplied = true; RTC_Core.SendCommandToRTC(new RTC_Command(CommandType.BLAST) { blastlayer = RTC_StockpileManager.currentStashkey.BlastLayer }); break; case CommandType.REMOTE_RENDER_START: RTC_Render.StartRender_NET(); break; case CommandType.REMOTE_RENDER_STOP: RTC_Render.StopRender_NET(); break; case CommandType.REMOTE_RENDER_SETTYPE: RTC_Render.lastType = (RENDERTYPE)cmd.objectValue; break; case CommandType.REMOTE_RENDER_STARTED: RTC_Core.ghForm.btnRender.Text = "Stop Render"; RTC_Core.ghForm.btnRender.ForeColor = Color.GreenYellow; break; case CommandType.REMOTE_RENDER_RENDERATLOAD: RTC_StockpileManager.renderAtLoad = (bool)cmd.objectValue; break; } return(cmdBack); }
private bool GenerateVMD() { if (string.IsNullOrWhiteSpace(cbSelectedMemoryDomain.SelectedItem?.ToString()) || !RTC_MemoryDomains.MemoryInterfaces.ContainsKey(cbSelectedMemoryDomain.SelectedItem.ToString())) { cbSelectedMemoryDomain.Items.Clear(); return(false); } if (!string.IsNullOrWhiteSpace(tbVmdName.Text) && RTC_MemoryDomains.VmdPool.ContainsKey($"[V]{tbVmdName.Text}")) { MessageBox.Show("There is already a VMD with this name in the VMD Pool"); return(false); } MemoryInterface mi = RTC_MemoryDomains.MemoryInterfaces[cbSelectedMemoryDomain.SelectedItem.ToString()]; VirtualMemoryDomain VMD = new VirtualMemoryDomain(); VmdPrototype proto = new VmdPrototype(); proto.GenDomain = cbSelectedMemoryDomain.SelectedItem.ToString(); if (string.IsNullOrWhiteSpace(tbVmdName.Text)) { proto.VmdName = RTC_Core.GetRandomKey(); } else { proto.VmdName = tbVmdName.Text; } proto.BigEndian = mi.BigEndian; proto.WordSize = mi.WordSize; if (cbUsePointerSpacer.Checked && nmPointerSpacer.Value > 1) { proto.PointerSpacer = Convert.ToInt32(nmPointerSpacer.Value); } else { proto.PointerSpacer = 1; } foreach (string line in tbCustomAddresses.Lines) { if (string.IsNullOrWhiteSpace(line)) { continue; } string trimmedLine = line.Trim(); bool remove = false; if (trimmedLine[0] == '-') { remove = true; trimmedLine = trimmedLine.Substring(1); } string[] lineParts = trimmedLine.Split('-'); if (lineParts.Length > 1) { int start = SafeStringToInt(lineParts[0]); int end = SafeStringToInt(lineParts[1]); if (end >= currentDomainSize) { end = Convert.ToInt32(currentDomainSize - 1); } if (remove) { proto.removeRanges.Add(new int[] { start, end }); } else { proto.addRanges.Add(new int[] { start, end }); } } else { int address = SafeStringToInt(lineParts[0]); if (address < currentDomainSize) { if (remove) { proto.removeSingles.Add(address); } else { proto.addSingles.Add(address); } } } } if (proto.addRanges.Count == 0 && proto.addSingles.Count == 0) { //No add range was specified, use entire domain proto.addRanges.Add(new int[] { 0, (currentDomainSize > int.MaxValue ? int.MaxValue : Convert.ToInt32(currentDomainSize)) }); } VMD = proto.Generate(); if (VMD.PointerAddresses.Count == 0) { MessageBox.Show("The resulting VMD had no pointers so the operation got cancelled."); return(false); } RTC_MemoryDomains.AddVMD(VMD); tbVmdName.Text = ""; cbSelectedMemoryDomain.SelectedIndex = -1; cbSelectedMemoryDomain.Items.Clear(); currentDomainSize = 0; nmPointerSpacer.Value = 2; cbUsePointerSpacer.Checked = false; tbCustomAddresses.Text = ""; lbDomainSizeValue.Text = "######"; lbEndianTypeValue.Text = "######"; lbWordSizeValue.Text = "######"; //send to vmd pool menu RTC_Core.vmdPoolForm.RefreshVMDs(); RTC_Core.ecForm.cbMemoryDomainTool.SelectedIndex = 1; GC.Collect(); GC.WaitForPendingFinalizers(); return(true); }
public static bool Corrupt(bool _loadBeforeOperation = true) { PreApplyStashkey(); var token = RTC_NetCore.HugeOperationStart("LAZY"); StashKey psk = RTC_StockpileManager.getCurrentSavestateStashkey(); if (psk == null) { RTC_Core.StopSound(); MessageBox.Show("The Glitch Harvester could not perform the CORRUPT action\n\nEither no Savestate Box was selected in the Savestate Manager\nor the Savetate Box itself is empty."); RTC_Core.StartSound(); RTC_NetCore.HugeOperationEnd(token); return(false); } string currentGame = (string)RTC_Core.SendCommandToBizhawk(new RTC_Command(CommandType.REMOTE_KEY_GETGAMENAME), true); if (psk.GameName != currentGame) { RTC_Core.LoadRom(psk.RomFilename, true); RTC_Core.ecForm.RefreshDomains(); RTC_Core.ecForm.setMemoryDomainsAllButSelectedDomains(RTC_MemoryDomains.GetBlacklistedDomains()); } BlastLayer bl = (BlastLayer)RTC_Core.SendCommandToBizhawk(new RTC_Command(CommandType.BLAST) { objectValue = RTC_MemoryDomains.SelectedDomains }, true); currentStashkey = new StashKey(RTC_Core.GetRandomKey(), psk.ParentKey, bl); currentStashkey.RomFilename = psk.RomFilename; currentStashkey.SystemName = psk.SystemName; currentStashkey.SystemCore = psk.SystemCore; currentStashkey.GameName = psk.GameName; if (loadBeforeOperation && _loadBeforeOperation) { if (!LoadStateAndBlastLayer(currentStashkey)) { RTC_NetCore.HugeOperationEnd(token); return(isCorruptionApplied); } } else { RTC_Core.SendCommandToBizhawk(new RTC_Command(CommandType.BLAST) { blastlayer = bl }); } isCorruptionApplied = (bl != null); if (stashAfterOperation && bl != null) { StashHistory.Add(currentStashkey); RTC_Core.ghForm.RefreshStashHistory(); RTC_Core.ghForm.dgvStockpile.ClearSelection(); RTC_Core.ghForm.DontLoadSelectedStash = true; RTC_Core.ghForm.lbStashHistory.SelectedIndex = RTC_Core.ghForm.lbStashHistory.Items.Count - 1; } RTC_NetCore.HugeOperationEnd(token); PostApplyStashkey(); return(isCorruptionApplied); }
//Generates or applies a blast layer using one of the multiple BlastRadius algorithms public static BlastLayer Blast(BlastLayer _layer, string[] _selectedDomains) { string Domain = null; long MaxAddress = -1; long RandomAddress = -1; BlastUnit bu; BlastLayer bl; try { if (_layer != null) { _layer.Apply(); //If the BlastLayer was provided, there's no need to generate a new one. return(_layer); } else if (RTC_Core.SelectedEngine == CorruptionEngine.EXTERNALROM) { //External ROM Plugin: Bypasses domains and uses an alternative algorithm to fetch corruption. //It will query a BlastLayer generated from a differential between an original and corrupted rom. bl = RTC_ExternalRomPlugin.GetBlastLayer(); if (bl == null) { return(null); } else { return(bl); } } else { bl = new BlastLayer(); if (_selectedDomains == null || _selectedDomains.Count() == 0) { return(null); } // Age distortion BlastBytes if (RTC_Core.SelectedEngine == CorruptionEngine.DISTORTION && RTC_DistortionEngine.CurrentAge < RTC_DistortionEngine.MaxAge) { RTC_DistortionEngine.CurrentAge++; } //Run Pipes on Corrupt Step if required if (RTC_Core.SelectedEngine == CorruptionEngine.PIPE && !RTC_PipeEngine.ProcessOnStep) { RTC_PipeEngine.ExecutePipes(); } // Capping intensity at engine-specific maximums int _Intensity = Intensity; //general RTC intensity if ((RTC_Core.SelectedEngine == CorruptionEngine.HELLGENIE || RTC_Core.SelectedEngine == CorruptionEngine.FREEZE) && _Intensity > RTC_HellgenieEngine.MaxCheats) { _Intensity = RTC_HellgenieEngine.MaxCheats; //Capping for cheat max } if (RTC_Core.SelectedEngine == CorruptionEngine.PIPE && _Intensity > RTC_PipeEngine.MaxPipes) { _Intensity = RTC_PipeEngine.MaxPipes; //Capping for pipe max } switch (Radius) //Algorithm branching { case BlastRadius.SPREAD: //Randomly spreads all corruption bytes to all selected domains for (int i = 0; i < _Intensity; i++) { Domain = _selectedDomains[RND.Next(_selectedDomains.Length)]; MaxAddress = RTC_MemoryDomains.getInterface(Domain).Size; RandomAddress = RTC_Core.RND.RandomLong(MaxAddress - 1); bu = getBlastUnit(Domain, RandomAddress); if (bu != null) { bl.Layer.Add(bu); } } break; case BlastRadius.CHUNK: //Randomly spreads the corruption bytes in one randomly selected domain Domain = _selectedDomains[RND.Next(_selectedDomains.Length)]; MaxAddress = RTC_MemoryDomains.getInterface(Domain).Size; for (int i = 0; i < _Intensity; i++) { RandomAddress = RTC_Core.RND.RandomLong(MaxAddress - 1); bu = getBlastUnit(Domain, RandomAddress); if (bu != null) { bl.Layer.Add(bu); } } break; case BlastRadius.BURST: // 10 shots of 10% chunk for (int j = 0; j < 10; j++) { Domain = _selectedDomains[RND.Next(_selectedDomains.Length)]; MaxAddress = RTC_MemoryDomains.getInterface(Domain).Size; for (int i = 0; i < (int)((double)_Intensity / 10); i++) { RandomAddress = RTC_Core.RND.RandomLong(MaxAddress - 1); bu = getBlastUnit(Domain, RandomAddress); if (bu != null) { bl.Layer.Add(bu); } } } break; case BlastRadius.NORMALIZED: // Blasts based on the size of the largest selected domain. Intensity = Intensity / (domainSize[largestdomain]/domainSize[currentdomain]) //Find the smallest domain and base our normalization around it //Domains aren't IComparable so I used keys long[] domainSize = new long [_selectedDomains.Length]; for (int i = 0; i < _selectedDomains.Length; i++) { Domain = _selectedDomains[i]; domainSize[i] = RTC_MemoryDomains.getInterface(Domain).Size; } //Sort the arrays Array.Sort(domainSize, _selectedDomains); for (int i = 0; i < _selectedDomains.Length; i++) { Domain = _selectedDomains[i]; //Get the intensity divider. The size of the largest domain divided by the size of the current domain long normalized = ((domainSize[_selectedDomains.Length - 1] / (domainSize[i]))); for (int j = 0; j < (_Intensity / normalized); j++) { MaxAddress = RTC_MemoryDomains.getInterface(Domain).Size; RandomAddress = RTC_Core.RND.RandomLong(MaxAddress - 1); bu = getBlastUnit(Domain, RandomAddress); if (bu != null) { bl.Layer.Add(bu); } } } break; case BlastRadius.PROPORTIONAL: //Blasts proportionally based on the total size of all selected domains long totalSize = _selectedDomains.Select(it => RTC_MemoryDomains.getInterface(it).Size).Sum(); //Gets the total size of all selected domains long[] normalizedIntensity = new long[_selectedDomains.Length]; //matches the index of selectedDomains for (int i = 0; i < _selectedDomains.Length; i++) { //calculates the proportionnal normalized Intensity based on total selected domains size double proportion = (double)RTC_MemoryDomains.getInterface(_selectedDomains[i]).Size / (double)totalSize; normalizedIntensity[i] = Convert.ToInt64((double)_Intensity * proportion); } for (int i = 0; i < _selectedDomains.Length; i++) { Domain = _selectedDomains[i]; for (int j = 0; j < normalizedIntensity[i]; j++) { MaxAddress = RTC_MemoryDomains.getInterface(Domain).Size; RandomAddress = RTC_Core.RND.RandomLong(MaxAddress - 1); bu = getBlastUnit(Domain, RandomAddress); if (bu != null) { bl.Layer.Add(bu); } } } break; case BlastRadius.EVEN: //Evenly distributes the blasts through all selected domains for (int i = 0; i < _selectedDomains.Length; i++) { Domain = _selectedDomains[i]; for (int j = 0; j < (_Intensity / _selectedDomains.Length); j++) { MaxAddress = RTC_MemoryDomains.getInterface(Domain).Size; RandomAddress = RTC_Core.RND.RandomLong(MaxAddress - 1); bu = getBlastUnit(Domain, RandomAddress); if (bu != null) { bl.Layer.Add(bu); } } } break; case BlastRadius.NONE: //Shouldn't ever happen but handled anyway return(null); } if (bl.Layer.Count == 0) { return(null); } else { return(bl); } } } catch (Exception ex) { DialogResult dr = MessageBox.Show("Something went wrong in the RTC Core. \n" + "This is not a BizHawk error so you should probably send a screenshot of this to the devs\n\n" + "If you know the steps to reproduce this error it would be greatly appreaciated.\n\n" + (RTC_Core.coreForm.AutoCorrupt ? ">> STOP AUTOCORRUPT ?.\n\n" : "") + $"domain:{Domain.ToString()} maxaddress:{MaxAddress.ToString()} randomaddress:{RandomAddress.ToString()} \n\n" + ex.ToString(), "Error", (RTC_Core.coreForm.AutoCorrupt ? MessageBoxButtons.YesNo : MessageBoxButtons.OK)); if (dr == DialogResult.Yes || dr == DialogResult.OK) { RTC_Core.coreForm.AutoCorrupt = false; } return(null); } }
public static StashKey getRawBlastlayer() { RTC_Core.StopSound(); StashKey sk = RTC_StockpileManager.SaveState_NET(false); BlastLayer bl = new BlastLayer(); foreach (var item in Global.CheatList) { string[] disassembleCheat = item.Name.Split('|'); if (disassembleCheat[0] == "RTC Cheat") { string _domain = disassembleCheat[1]; long _address = Convert.ToInt64(disassembleCheat[2]); BizHawk.Client.Common.DisplayType _displayType = BizHawk.Client.Common.DisplayType.Unsigned; bool _bigEndian = Convert.ToBoolean(disassembleCheat[4]); byte[] _value = disassembleCheat[5].Split(',').Select(it => Convert.ToByte(it)).ToArray(); bool _isEnabled = Convert.ToBoolean(disassembleCheat[6]); bool _isFreeze = Convert.ToBoolean(disassembleCheat[7]); bl.Layer.Add(new BlastCheat(_domain, _address, _displayType, _bigEndian, _value, _isEnabled, _isFreeze)); } } bl.Layer.AddRange(RTC_PipeEngine.AllBlastPipes); string thisSystem = Global.Game.System; string romFilename = GlobalWin.MainForm.CurrentlyOpenRom; var rp = RTC_MemoryDomains.GetRomParts(thisSystem, romFilename); if (rp.error == null) { if (rp.primarydomain != null) { List <byte> addData = new List <byte>(); if (rp.skipbytes != 0) { byte[] padding = new byte[rp.skipbytes]; for (int i = 0; i < rp.skipbytes; i++) { padding[i] = 0; } addData.AddRange(padding); } addData.AddRange(RTC_MemoryDomains.getDomainData(rp.primarydomain)); if (rp.seconddomain != null) { addData.AddRange(RTC_MemoryDomains.getDomainData(rp.seconddomain)); } byte[] corrupted = addData.ToArray(); byte[] original = File.ReadAllBytes(GlobalWin.MainForm.CurrentlyOpenRom); if (RTC_MemoryDomains.MemoryInterfaces.ContainsKey("32X FB")) //Flip 16-bit words on 32X rom { original = original.FlipWords(2); } else if (thisSystem.ToUpper() == "N64") { original = BizHawk.Client.Common.RomGame.MutateSwapN64(original); } else if (GlobalWin.MainForm.CurrentlyOpenRom.ToUpper().Contains(".SMD")) { original = BizHawk.Client.Common.RomGame.DeInterleaveSMD(original); } for (int i = 0; i < rp.skipbytes; i++) { original[i] = 0; } BlastLayer romBlast = RTC_ExternalRomPlugin.GetBlastLayer(original, corrupted); if (romBlast != null && romBlast.Layer.Count > 0) { bl.Layer.AddRange(romBlast.Layer); } } } sk.BlastLayer = bl; RTC_Core.StartSound(); return(sk); }
public static BlastUnit GenerateUnit(string _domain, long _address) { // Randomly selects a memory operation according to the selected algorithm try { MemoryDomainProxy mdp = RTC_MemoryDomains.getProxy(_domain, _address); BlastByteType Type = BlastByteType.NONE; switch (Algo) { case BlastByteAlgo.RANDOM: //RANDOM always sets a random value Type = BlastByteType.SET; break; case BlastByteAlgo.RANDOMTILT: //RANDOMTILT may add 1,substract 1 or set a random value int result = RTC_Core.RND.Next(1, 4); switch (result) { case 1: Type = BlastByteType.ADD; break; case 2: Type = BlastByteType.SUBSTRACT; break; case 3: Type = BlastByteType.SET; break; default: MessageBox.Show("Random returned an unexpected value (RTC_NightmareEngine switch(Algo) RANDOMTILT)"); return(null); } break; case BlastByteAlgo.TILT: //TILT can either add 1 or substract 1 result = RTC_Core.RND.Next(1, 3); switch (result) { case 1: Type = BlastByteType.ADD; break; case 2: Type = BlastByteType.SUBSTRACT; break; default: MessageBox.Show("Random returned an unexpected value (RTC_NightmareEngine switch(Algo) TILT)"); return(null); } break; } byte[] _value; if (RTC_Core.CustomPrecision == -1) { _value = new byte[mdp.WordSize]; } else { _value = new byte[RTC_Core.CustomPrecision]; } long safeAddress = _address - (_address % _value.Length); if (Type == BlastByteType.SET) { for (int i = 0; i < _value.Length; i++) { _value[i] = (byte)RTC_Core.RND.Next(0, 255); } } else //ADD, SUBSTRACT { for (int i = 0; i < _value.Length; i++) //1 by default because Add(1) or Substract(1) but more is still possible { _value[i] = 1; } } return(new BlastByte(_domain, safeAddress, Type, _value, true)); } catch (Exception ex) { MessageBox.Show("Something went wrong in the RTC Nightmare Engine. \n" + "This is not a BizHawk error so you should probably send a screenshot of this to the devs\n\n" + ex.ToString()); return(null); } }
private void btnAutoSelectDomains_Click(object sender, EventArgs e) { RefreshDomains(); setMemoryDomainsAllButSelectedDomains(RTC_MemoryDomains.GetBlacklistedDomains()); }