コード例 #1
0
ファイル: MiscManager.cs プロジェクト: mkdasher/STROOP
        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();
            };
        }
コード例 #2
0
ファイル: MiscManager.cs プロジェクト: blha303/STROOP
        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));
        }
コード例 #3
0
ファイル: MiscManager.cs プロジェクト: Fuyukai/STROOP
        private int GetRngCallsPerFrame()
        {
            var currentRng = Config.Stream.GetUInt16(Config.HackedAreaAddress + 0x0E);
            var preRng     = Config.Stream.GetUInt16(Config.HackedAreaAddress + 0x0C);

            return(RngIndexer.GetRngIndexDiff(preRng, currentRng));
        }
コード例 #4
0
ファイル: MiscManager.cs プロジェクト: Fuyukai/STROOP
        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;
        }
コード例 #5
0
ファイル: MiscManager.cs プロジェクト: Fuyukai/STROOP
        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;
                }
            }
        }
コード例 #6
0
ファイル: MiscManager.cs プロジェクト: SM64-TAS-ABC/STROOP
        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);
        }
コード例 #7
0
        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);
        }
コード例 #8
0
        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);
        }
コード例 #9
0
ファイル: MiscManager.cs プロジェクト: blha303/STROOP
        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);
        }
コード例 #10
0
ファイル: CoinTab.cs プロジェクト: chaosBrick/STROOP
        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);
            }
        }
コード例 #11
0
 /** Sets the RNG/index using an inputted RNG value.
  */
 public void SetRng(ushort rngValue)
 {
     _index = RngIndexer.GetRngIndex(rngValue);
 }
コード例 #12
0
 /** Get the current RNG (will not update RNG).
  */
 public ushort GetRng()
 {
     return(RngIndexer.GetRngValue(_index));
 }
コード例 #13
0
ファイル: VarHackManager.cs プロジェクト: mkdasher/STROOP
        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();
        }
コード例 #14
0
        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);
        }