public MiscManager(List <WatchVariableControlPrecursor> variables, WatchVariablePanel variableTable, Control miscControl) : base(variables, variableTable) { SplitContainer splitContainerMisc = miscControl.Controls["splitContainerMisc"] as SplitContainer; _checkBoxTurnOffMusic = splitContainerMisc.Panel1.Controls["checkBoxTurnOffMusic"] as CheckBox; GroupBox groupBoxRNGIndexTester = splitContainerMisc.Panel1.Controls["groupBoxRNGIndexTester"] as GroupBox; TextBox textBoxRNGIndexTester = groupBoxRNGIndexTester.Controls["textBoxRNGIndexTester"] as TextBox; Button buttonRNGIndexTester = groupBoxRNGIndexTester.Controls["buttonRNGIndexTester"] as Button; buttonRNGIndexTester.Click += (sender, e) => { int?rngIndexNullable = ParsingUtilities.ParseIntNullable(textBoxRNGIndexTester.Text); if (!rngIndexNullable.HasValue) { return; } int rngIndex = rngIndexNullable.Value; ushort rngValue = RngIndexer.GetRngValue(rngIndex); Config.Stream.SetValue(rngValue, MiscConfig.RngAddress); int nextRngIndex = rngIndex + 1; textBoxRNGIndexTester.Text = nextRngIndex.ToString(); }; }
private int GetRngCallsPerFrame() { var currentRng = BitConverter.ToUInt16(_stream.ReadRam(Config.RngRecordingAreaAddress + 0x0E, 2), 0); var preRng = BitConverter.ToUInt16(_stream.ReadRam(Config.RngRecordingAreaAddress + 0x0C, 2), 0); return(RngIndexer.GetRngIndexDiff(preRng, currentRng)); }
private int GetRngCallsPerFrame() { var currentRng = Config.Stream.GetUInt16(Config.HackedAreaAddress + 0x0E); var preRng = Config.Stream.GetUInt16(Config.HackedAreaAddress + 0x0C); return(RngIndexer.GetRngIndexDiff(preRng, currentRng)); }
public MiscManager(List <WatchVariable> watchVariables, NoTearFlowLayoutPanel variableTable, Control miscControl) : base(watchVariables, variableTable) { SplitContainer splitContainerMisc = miscControl.Controls["splitContainerMisc"] as SplitContainer; GroupBox groupBoxRNGIndex = splitContainerMisc.Panel1.Controls["groupBoxRNGIndex"] as GroupBox; _betterTextboxRNGIndex = groupBoxRNGIndex.Controls["betterTextboxRNGIndex"] as BetterTextbox; _betterTextboxRNGIndex.AddEnterAction(() => { int?index = ParsingUtilities.ParseIntNullable(_betterTextboxRNGIndex.Text); if (index.HasValue) { ushort rngValue = RngIndexer.GetRngValue(index.Value); Config.Stream.SetValue(rngValue, Config.RngAddress); } }); _checkBoxTurnOffMusic = splitContainerMisc.Panel1.Controls["checkBoxTurnOffMusic"] as CheckBox; }
private void ProcessSpecialVars() { foreach (var specialVar in _specialWatchVars) { switch (specialVar.SpecialName) { case "RngIndex": ushort rngValue = Config.Stream.GetUInt16(Config.RngAddress); (specialVar as DataContainer).Text = RngIndexer.GetRngIndexString(rngValue); break; case "RngCallsPerFrame": (specialVar as DataContainer).Text = GetRngCallsPerFrame().ToString(); break; case "NumberOfLoadedObjects": (specialVar as DataContainer).Text = ActiveObjectCount.ToString(); break; } } }
public MiscManager(string varFilePath, WatchVariableFlowLayoutPanel variableTable, Control miscControl) : base(varFilePath, variableTable, ALL_VAR_GROUPS, VISIBLE_VAR_GROUPS) { SplitContainer splitContainerMisc = miscControl.Controls["splitContainerMisc"] as SplitContainer; _checkBoxTurnOffMusic = splitContainerMisc.Panel1.Controls["checkBoxTurnOffMusic"] as CheckBox; GroupBox groupBoxRNGIndexTester = splitContainerMisc.Panel1.Controls["groupBoxRNGIndexTester"] as GroupBox; TextBox textBoxRNGIndexTester = groupBoxRNGIndexTester.Controls["textBoxRNGIndexTester"] as TextBox; Button buttonRNGIndexTester = groupBoxRNGIndexTester.Controls["buttonRNGIndexTester"] as Button; buttonRNGIndexTester.Click += (sender, e) => { int?rngIndexNullable = ParsingUtilities.ParseIntNullable(textBoxRNGIndexTester.Text); if (!rngIndexNullable.HasValue) { return; } int rngIndex = rngIndexNullable.Value; ushort rngValue = RngIndexer.GetRngValue(rngIndex); Config.Stream.SetValue(rngValue, MiscConfig.RngAddress); int nextRngIndex = rngIndex + 1; textBoxRNGIndexTester.Text = nextRngIndex.ToString(); }; Button buttonMiscGoToCourse = splitContainerMisc.Panel1.Controls["buttonMiscGoToCourse"] as Button; buttonMiscGoToCourse.ContextMenuStrip = new ContextMenuStrip(); foreach (CourseToGoTo courseToGoTo in _coursesToGoTo) { ToolStripMenuItem item = new ToolStripMenuItem(courseToGoTo.Name); item.Click += (sender, e) => InGameFunctionCall.WriteInGameFunctionCall( RomVersionConfig.SwitchMap(0x8024978C, 0x8024975C), (uint)courseToGoTo.Index); buttonMiscGoToCourse.ContextMenuStrip.Items.Add(item); } buttonMiscGoToCourse.Click += (sender, e) => buttonMiscGoToCourse.ContextMenuStrip.Show(Cursor.Position); }
private int GetNumRngCalls() { var numberOfRngObjs = BitConverter.ToUInt32(_stream.ReadRam(Config.RngRecordingAreaAddress, 4), 0); int numOfCalls = 0; for (int i = 0; i < numberOfRngObjs; i++) { uint rngStructAdd = (uint)(Config.RngRecordingAreaAddress + 0x10 + 0x08 * i); var address = BitConverter.ToUInt32(_stream.ReadRam(rngStructAdd + 0x04, 4), 0); if (address != _currentAddress) { continue; } var preRng = BitConverter.ToUInt16(_stream.ReadRam(rngStructAdd + 0x00, 2), 0); var postRng = BitConverter.ToUInt16(_stream.ReadRam(rngStructAdd + 0x02, 2), 0); numOfCalls = RngIndexer.GetRngIndexDiff(preRng, postRng); break; } return(numOfCalls); }
public override void InitializeTab() { base.InitializeTab(); // Misc Image pictureBoxMisc.Image = Config.ObjectAssociations.MiscImage.Value; panelMiscBorder.BackColor = Config.ObjectAssociations.MiscColor; pictureBoxMisc.BackColor = Config.ObjectAssociations.MiscColor.Lighten(0.5); watchVariablePanelMisc.SetGroups(ALL_VAR_GROUPS, VISIBLE_VAR_GROUPS); buttonRNGIndexTester.Click += (sender, e) => { int?rngIncrementullable = ParsingUtilities.ParseIntNullable(txtRNGIncrement.Text); int?rngIndexNullable = ParsingUtilities.ParseIntNullable(textBoxRNGIndexTester.Text); if (!rngIndexNullable.HasValue || !rngIncrementullable.HasValue) { return; } int rngIndex = rngIndexNullable.Value; ushort rngValue = RngIndexer.GetRngValue(rngIndex); Config.Stream.SetValue(rngValue, MiscConfig.RngAddress); int nextRngIndex = rngIndex + rngIncrementullable.Value; textBoxRNGIndexTester.Text = nextRngIndex.ToString(); }; buttonMiscGoToCourse.ContextMenuStrip = new ContextMenuStrip(); foreach (CourseToGoTo courseToGoTo in _coursesToGoTo) { ToolStripMenuItem item = new ToolStripMenuItem(courseToGoTo.Name); item.Click += (sender, e) => InGameFunctionCall.WriteInGameFunctionCall( RomVersionConfig.SwitchMap(0x8024978C, 0x8024975C), (uint)courseToGoTo.Index); buttonMiscGoToCourse.ContextMenuStrip.Items.Add(item); } buttonMiscGoToCourse.Click += (sender, e) => buttonMiscGoToCourse.ContextMenuStrip.Show(Cursor.Position); }
public void Update(bool updateView) { // Update watch variables foreach (var watchVar in _watchVarControls) { watchVar.Update(); } if (!updateView) { return; } // Update the rng index int rngIndex = RngIndexer.GetRngIndex(BitConverter.ToUInt16(_stream.ReadRam(Config.RngAddress, 2), 0)); _rngIndex.Text = (rngIndex < 0) ? "N/A [" + (-rngIndex).ToString() + "]" : rngIndex.ToString(); _rngPerFrame.Text = GetRngCallsPerFrame().ToString(); _activeObjCnt.Text = ActiveObjectCount.ToString(); _puController.Controls["labelPuConPuValue"].Text = PuUtilities.GetPuPosString(_stream); _puController.Controls["labelPuConQpuValue"].Text = PuUtilities.GetQpuPosString(_stream); }
private void CalculateCoinTrajectories() { ClearCoinTrajectories(); double?hSpeedScale = ParsingUtilities.ParseIntNullable(textBoxCoinHSpeedScale.Text); double?vSpeedScale = ParsingUtilities.ParseIntNullable(textBoxCoinVSpeedScale.Text); double?vSpeedOffset = ParsingUtilities.ParseIntNullable(textBoxCoinVSpeedOffset.Text); bool coinParamOrderParsed = Enum.TryParse(textBoxCoinParamOrder.Text, out CoinParamOrder coinParamOrder); int? numCoins = ParsingUtilities.ParseIntNullable(textBoxCoinNumCoins.Text); if (!hSpeedScale.HasValue || !vSpeedScale.HasValue || !vSpeedOffset.HasValue || !coinParamOrderParsed || !numCoins.HasValue) { DialogUtilities.DisplayMessage( "Could not parse coin param fields.", "Parsing Error"); return; } CoinObject coinObject = new CoinObject( hSpeedScale: hSpeedScale.Value, vSpeedScale: vSpeedScale.Value, vSpeedOffset: vSpeedOffset.Value, coinParamOrder: coinParamOrder, numCoins: numCoins.Value, name: "Dummy"); int?startingRngIndexNullable = ParsingUtilities.ParseIntNullable( textBoxCoinCustomizatonStartingRngIndex.Text); int startingRngIndex = startingRngIndexNullable ?? RngIndexer.GetRngIndex(); int?numDecimalDigitsNullable = ParsingUtilities.ParseIntNullable( textBoxCoinCustomizatonNumDecimalDigits.Text); int numDecimalDigits = numDecimalDigitsNullable ?? 3; List <int> rngIndexes = Enumerable.Range(0, 65114).ToList(); foreach (int rngIndex in rngIndexes) { // rng based values ushort rngValue = RngIndexer.GetRngValue(rngIndex); int rngToGo = MoreMath.NonNegativeModulus(rngIndex - startingRngIndex, 65114); // coin trajectory List <CoinTrajectory> coinTrajectories = coinObject.CalculateCoinTrajectories(rngIndex); // filter the values CoinTrajectoryFilter filter = new CoinTrajectoryFilter( ParsingUtilities.ParseDoubleNullable(textBoxCoinFilterHSpeedMin.Text), ParsingUtilities.ParseDoubleNullable(textBoxCoinFilterHSpeedMax.Text), ParsingUtilities.ParseDoubleNullable(textBoxCoinFilterVSpeedMin.Text), ParsingUtilities.ParseDoubleNullable(textBoxCoinFilterVSpeedMax.Text), ParsingUtilities.ParseDoubleNullable(textBoxCoinFilterAngleMin.Text), ParsingUtilities.ParseDoubleNullable(textBoxCoinFilterAngleMax.Text), ParsingUtilities.ParseIntNullable(textBoxCoinFilterRequiredNumOfQualifiedCoins.Text)); if (!filter.Qualifies(coinTrajectories)) { continue; } if (!checkBoxCoinCustomizatonDisplayNonQualifiedCoinsOfAQualifiedCoinGroup.Checked) { coinTrajectories = coinTrajectories.FindAll( coinTrajectory => filter.Qualifies(coinTrajectory)); } List <double> hSpeedList = coinTrajectories.ConvertAll( coinTrajectory => Math.Round(coinTrajectory.HSpeed, numDecimalDigits)); List <double> vSpeedList = coinTrajectories.ConvertAll( coinTrajectory => Math.Round(coinTrajectory.VSpeed, numDecimalDigits)); List <ushort> angleList = coinTrajectories.ConvertAll( coinTrajectory => coinTrajectory.Angle); object hSpeedJoined = hSpeedList.Count == 1 ? hSpeedList[0] : (object)String.Join(", ", hSpeedList); object vSpeedJoined = vSpeedList.Count == 1 ? vSpeedList[0] : (object)String.Join(", ", vSpeedList); object angleJoined = angleList.Count == 1 ? angleList[0] : (object)String.Join(", ", angleList); // add a new row to the table dataGridViewCoin.Rows.Add( rngIndex, rngValue, rngToGo, hSpeedJoined, vSpeedJoined, angleJoined); } }
/** Sets the RNG/index using an inputted RNG value. */ public void SetRng(ushort rngValue) { _index = RngIndexer.GetRngIndex(rngValue); }
/** Get the current RNG (will not update RNG). */ public ushort GetRng() { return(RngIndexer.GetRngValue(_index)); }
public VarHackManager(Control varHackControlControl, VarHackPanel varHackPanel) { _varHackPanel = varHackPanel; // Top buttons SplitContainer splitContainerVarHack = varHackControlControl.Controls["splitContainerVarHack"] as SplitContainer; Button buttonVarHackAddNewVariable = splitContainerVarHack.Panel1.Controls["buttonVarHackAddNewVariable"] as Button; buttonVarHackAddNewVariable.Click += (sender, e) => _varHackPanel.AddNewControl(); ControlUtilities.AddContextMenuStripFunctions( buttonVarHackAddNewVariable, new List <string>() { "RNG Index", "Floor YNorm", "Defacto Speed", "Mario Action", "Mario Animation", }, new List <Action>() { () => AddVariable(() => "Index " + RngIndexer.GetRngIndex()), () => AddVariable(() => { uint triFloorAddress = Config.Stream.GetUInt32(MarioConfig.StructAddress + MarioConfig.FloorTriangleOffset); float yNorm = Config.Stream.GetSingle(triFloorAddress + TriangleOffsetsConfig.NormY); return("YNorm " + FormatDouble(yNorm, 4, true)); }), () => AddVariable(() => "Defacto " + FormatInteger(WatchVariableSpecialUtilities.GetMarioDeFactoSpeed())), () => AddVariable(() => "Action " + TableConfig.MarioActions.GetActionName()), () => AddVariable(() => "Animation " + TableConfig.MarioAnimations.GetAnimationName()), }); Button buttonVarHackClearVariables = splitContainerVarHack.Panel1.Controls["buttonVarHackClearVariables"] as Button; buttonVarHackClearVariables.Click += (sender, e) => _varHackPanel.ClearControls(); Button buttonVarHackShowVariableBytesInLittleEndian = splitContainerVarHack.Panel1.Controls["buttonVarHackShowVariableBytesInLittleEndian"] as Button; buttonVarHackShowVariableBytesInLittleEndian.Click += (sender, e) => _varHackPanel.ShowVariableBytesInLittleEndian(); Button buttonVarHackShowVariableBytesInBigEndian = splitContainerVarHack.Panel1.Controls["buttonVarHackShowVariableBytesInBigEndian"] as Button; buttonVarHackShowVariableBytesInBigEndian.Click += (sender, e) => _varHackPanel.ShowVariableBytesInBigEndian(); // Bottom buttons Button buttonVarHackApplyVariablesToMemory = splitContainerVarHack.Panel1.Controls["buttonVarHackApplyVariablesToMemory"] as Button; buttonVarHackApplyVariablesToMemory.Click += (sender, e) => _varHackPanel.ApplyVariablesToMemory(); Button buttonVarHackClearVariablesInMemory = splitContainerVarHack.Panel1.Controls["buttonVarHackClearVariablesInMemory"] as Button; buttonVarHackClearVariablesInMemory.Click += (sender, e) => _varHackPanel.ClearVariablesInMemory(); _buttonEnableDisableRomHack = splitContainerVarHack.Panel1.Controls["buttonEnableDisableRomHack"] as BinaryButton; _buttonEnableDisableRomHack.Initialize( "Enable ROM Hack", "Disable ROM Hack", () => VarHackConfig.ShowVarRomHack.LoadPayload(), () => VarHackConfig.ShowVarRomHack.ClearPayload(), () => VarHackConfig.ShowVarRomHack.Enabled); // Middle buttons _textBoxXPosValue = splitContainerVarHack.Panel1.Controls["textBoxXPosValue"] as BetterTextbox; _textBoxXPosValue.AddEnterAction(() => SetPositionsAndApplyVariablesToMemory()); _textBoxXPosValue.Text = VarHackConfig.DefaultXPos.ToString(); InitializePositionControls( _textBoxXPosValue, splitContainerVarHack.Panel1.Controls["textBoxXPosChange"] as TextBox, splitContainerVarHack.Panel1.Controls["buttonXPosSubtract"] as Button, splitContainerVarHack.Panel1.Controls["buttonXPosAdd"] as Button); _textBoxYPosValue = splitContainerVarHack.Panel1.Controls["textBoxYPosValue"] as BetterTextbox; _textBoxYPosValue.AddEnterAction(() => SetPositionsAndApplyVariablesToMemory()); _textBoxYPosValue.Text = VarHackConfig.DefaultYPos.ToString(); InitializePositionControls( _textBoxYPosValue, splitContainerVarHack.Panel1.Controls["textBoxYPosChange"] as TextBox, splitContainerVarHack.Panel1.Controls["buttonYPosSubtract"] as Button, splitContainerVarHack.Panel1.Controls["buttonYPosAdd"] as Button); _textBoxYDeltaValue = splitContainerVarHack.Panel1.Controls["textBoxYDeltaValue"] as BetterTextbox; _textBoxYDeltaValue.AddEnterAction(() => SetPositionsAndApplyVariablesToMemory()); _textBoxYDeltaValue.Text = VarHackConfig.DefaultYDelta.ToString(); InitializePositionControls( _textBoxYDeltaValue, splitContainerVarHack.Panel1.Controls["textBoxYDeltaChange"] as TextBox, splitContainerVarHack.Panel1.Controls["buttonYDeltaSubtract"] as Button, splitContainerVarHack.Panel1.Controls["buttonYDeltaAdd"] as Button); Button buttonSetPositionsAndApplyVariablesToMemory = splitContainerVarHack.Panel1.Controls["buttonSetPositionsAndApplyVariablesToMemory"] as Button; buttonSetPositionsAndApplyVariablesToMemory.Click += (sender, e) => SetPositionsAndApplyVariablesToMemory(); }
public static (string, Func <string>) CreateGetterFunction(string specialType) { string name = DEFAULT_NAME; Func <string> getterFunction = DEFAULT_GETTER; switch (specialType) { case "RngIndex": name = "Index " + VarHackConfig.EscapeChar; getterFunction = () => { return(RngIndexer.GetRngIndex().ToString()); }; break; case "FloorYNorm": name = "YNorm " + VarHackConfig.EscapeChar; getterFunction = () => { uint triFloorAddress = Config.Stream.GetUInt(MarioConfig.StructAddress + MarioConfig.FloorTriangleOffset); float yNorm = Config.Stream.GetFloat(triFloorAddress + TriangleOffsetsConfig.NormY); return(FormatDouble(yNorm, 4, true)); }; break; case "DefactoSpeed": name = "Defacto " + VarHackConfig.EscapeChar; getterFunction = () => { return(FormatInteger(WatchVariableSpecialUtilities.GetMarioDeFactoSpeed())); }; break; case "SlidingSpeed": name = "Spd " + VarHackConfig.EscapeChar; getterFunction = () => { return(FormatInteger(WatchVariableSpecialUtilities.GetMarioSlidingSpeed())); }; break; case "MarioAction": name = "Action " + VarHackConfig.EscapeChar; getterFunction = () => { return(TableConfig.MarioActions.GetActionName()); }; break; case "MarioAnimation": name = "Animation " + VarHackConfig.EscapeChar; getterFunction = () => { return(TableConfig.MarioAnimations.GetAnimationName()); }; break; case "DYawIntendFacing": name = "DYaw " + VarHackConfig.EscapeChar; getterFunction = () => { return(FormatInteger(WatchVariableSpecialUtilities.GetDeltaYawIntendedFacing())); }; break; case "DYawIntendFacingHau": name = "DYaw " + VarHackConfig.EscapeChar; getterFunction = () => { return(FormatInteger(WatchVariableSpecialUtilities.GetDeltaYawIntendedFacing() / 16)); }; break; default: break; } return(name, getterFunction); }