示例#1
0
        public static Dictionary <int, List <int> > FindDualPendulumManipulation(int numIterations)
        {
            TtcSaveState currentSaveState  = new TtcSaveState();
            int          currentStartFrame = MupenUtilities.GetFrameCount();


            Dictionary <int, List <int> > dustFrameLists = new Dictionary <int, List <int> >();

            for (int i = 0; i < numIterations; i++)
            {
                (bool success, TtcSaveState saveState, int relativeEndFrame, List <int> relativeDustFrames) =
                    FindDualPendulumManipulation(currentSaveState);
                if (!success)
                {
                    break;
                }

                List <int> absoluteDustFrames = relativeDustFrames.ConvertAll(rel => rel + currentStartFrame - 2);
                dustFrameLists[currentStartFrame] = absoluteDustFrames;
                Config.Print(currentStartFrame + ":\t[" + string.Join(",", absoluteDustFrames) + "]");

                currentSaveState   = saveState;
                currentStartFrame += relativeEndFrame;
            }
            return(dustFrameLists);
        }
示例#2
0
        public static void FindMidairWalkingSetup()
        {
            TtcSaveState initialSaveState  = new TtcSaveState();
            int          initialStartFrame = MupenUtilities.GetFrameCount();

            int successCounter = 0;

            for (int i = 0; true; i++)
            {
                if (i % 10_000 == 0)
                {
                    Config.Print("Tested " + i);
                }

                List <int>    dustFrames = GetDustFrames(initialStartFrame + 2, 150, 10);
                TtcSimulation simulation = new TtcSimulation(initialSaveState, initialStartFrame, dustFrames);
                (bool success, int startFrame) = simulation.FindMidairWalkingSetup1();
                if (success)
                {
                    successCounter++;

                    Config.Print();
                    Config.Print("SUCCESS#{0}: {1}", successCounter, startFrame);
                    List <int> inputFrames = dustFrames.ConvertAll(frame => frame - 2);
                    foreach (int frame in inputFrames)
                    {
                        Config.Print(frame);
                    }
                    Config.Print();
                }
            }
        }
示例#3
0
 public TtcSimulation(TtcSaveState saveState, int startingFrame, List <int> dustFrames)
 {
     (_rng, _rngObjects) = TtcUtilities.CreateRngObjectsFromSaveState(saveState);
     _startingFrame      = startingFrame;
     _currentFrame       = _startingFrame;
     AddDustFrames(dustFrames);
 }
示例#4
0
 public HandManipulationProgress(
     TtcSaveState saveState,
     int frame,
     List <int> dustFrames)
 {
     SaveState  = saveState;
     Frame      = frame;
     DustFrames = dustFrames;
 }
示例#5
0
        public static void TestReentryPhase1()
        {
            string savestateString = "000069000000130000007D00000090000000550000000E0000007D00000095000000550000006D00000055000000590000007D000000900000002D00000054000000FFFFFFFFAF12000016FFFFFF0D000000000000000100000067E4FFFFD6FFFFFF2A00000000000000FFFFFFFFFCA60000000000000D0000000000000001000000BBDBFFFF000000000D000000090000000000000032000000320000005A0000002B00000001000000000000000000000000000000B184000001000000000000000000000000000000B184000001000000000000000000000000000000B184000001000000000000000000000000000000B184000064000000000000000000000019000000010000004600000001000000270000006400000000000000030000000B0000000C0000000000000002000000210000006400000000000000000000003A000000370000000000000000000000130000006400000000000000030000003600000037000000000000000300000029000000010000001D00000001000000600000000C000000000000000300000001000000370000003C000000010000000000000064000000000000000300000007000000786D0000E0FCFFFF18FCFFFFC4DC0000A8FDFFFF50FBFFFFECBB000076FDFFFF00000000761C0000F401000018FCFFFF78820000CEFFFFFFB00400004E990000CEFFFFFF70FEFFFF60070000C201000070FEFFFF03010000F7FFFFFF010000001E0000001D00000090AB00000A00000090AB0000BCFBFFFF820000000A000000B84D000032000000B84D0000BCFBFFFF8F00000008000000D09B000001000000780000000900000028EB0000FFFFFFFF3C0000000C000000B8F8000001000000780000002C000000F8DE0000010000005A00000002000000C03A0000FFFFFFFF5A00000031000000C0210000FFFFFFFF5A0000001900000008510000FFFFFFFF780000007400000040CA0000010000005A0000003500000030740000010000003C0000002D00000078C7000001000000780000001A0000004095000001000000780000004B000000C87E000001000000780000003200000098C40000FFFFFFFF780000000E000000608F0000010000003C0000000F00000058DC00000A0000000CDC000034F3FFFFFE000000110000002C0F0000320000002C0F000034F3FFFF490000001F000000D439000032000000A035000034F3FFFF1A0000000C0000008067000032000000445C000034F3FFFF390000000300000030CC00003200000084C2000034F3FFFF7100000005000000F474000032000000F068000034F3FFFF5100000002000000CB02000006000000010000005A00000010000000EEFAFFFF0600000001000000B4000000840000000CBE0000580200000000000002000000000000000000000000000000B184000003000000000000000000000000000000B1840000B61900000000000019000000000000002700000002000000178A000002000000FF39000000000000000000000000000000000000";
            int    startFrame      = 41887;

            TtcSaveState  savestate  = new TtcSaveState(savestateString);
            TtcSimulation simulation = new TtcSimulation(savestate, startFrame, new List <int>());

            simulation.FindIdealReentryManipulationGivenFrame1(new List <int>(), startFrame);
        }
示例#6
0
        public static void FindMovingBarManipulation()
        {
            TtcSaveState       saveState       = new TtcSaveState();
            int                startingFrame   = MupenUtilities.GetFrameCount();
            List <List <int> > dustFramesLists = GetDustFrameLists(startingFrame + 2, 25, 25);

            Config.Print("START FindMovingBarManipulation");
            foreach (List <int> dustFrames in dustFramesLists)
            {
                TtcSimulation simulation = new TtcSimulation(saveState, startingFrame, dustFrames);
                simulation.FindMovingBarManipulationGivenDustFrames(dustFrames);
            }
            Config.Print("END FindMovingBarManipulation");
        }
示例#7
0
        public static void ApplySaveState(TtcSaveState saveState)
        {
            (TtcRng rng, List <TtcObject> objects) = CreateRngObjectsFromSaveState(saveState);
            List <uint> addresses = GetObjectAddresses();

            if (objects.Count != addresses.Count + 1)
            {
                throw new ArgumentOutOfRangeException();
            }

            Config.Stream.SetValue(rng.GetRng(), MiscConfig.RngAddress);
            for (int i = 0; i < addresses.Count; i++)
            {
                objects[i].ApplyToAddress(addresses[i]);
            }
        }
示例#8
0
        FindIdealPendulumManipulation(uint pendulumAddress, TtcSaveState saveState)
        {
            List <List <int> > dustFrameLists = GetDustFrameLists(2, 25, 25);

            foreach (List <int> dustFrames in dustFrameLists)
            {
                TtcSimulation simulation = new TtcSimulation(saveState);
                simulation.AddDustFrames(dustFrames);
                (bool success, TtcSaveState savestate, int endFrame) = simulation.FindIdealPendulumManipulation(pendulumAddress);
                if (success)
                {
                    return(success, savestate, endFrame, dustFrames);
                }
            }
            return(false, null, 0, null);
        }
示例#9
0
        FindPunchRecoilPendulumManipulation(TtcSaveState saveState)
        {
            List <List <int> > dustFrameLists = GetDustFrameLists(2, 25, 25).Skip(1).ToList();

            foreach (List <int> dustFrames in dustFrameLists)
            {
                TtcSimulation simulation = new TtcSimulation(saveState);
                simulation.AddDustFrames(dustFrames);
                (bool success, TtcSaveState savestate, int endFrame) = simulation.FindPunchRecoilPendulumManipulation();
                if (success)
                {
                    return(success, savestate, endFrame, dustFrames);
                }
            }
            return(false, null, 0, null);
        }
示例#10
0
        public static void FindIdealCogManipulation()
        {
            TtcSaveState saveState         = new TtcSaveState();
            int          startFrame        = MupenUtilities.GetFrameCount();
            int          earliestDustFrame = startFrame + 2;

            int dustFrameRange = 40;
            int maxDustFrames  = 6;
            int minDustFrames  = 0;

            int numFramesMin = 120;
            int numFramesMax = 7000;

            //int numFramesMin = 0;
            //int numFramesMax = 3000;

            List <List <int> > dustFrameLists = GetDustFrameLists(earliestDustFrame, dustFrameRange, maxDustFrames, minDustFrames);
            int           counter             = 0;
            List <string> outputStrings       = new List <string>();

            Config.Print("Starting brute force...");
            foreach (List <int> dustFrames in dustFrameLists)
            {
                counter++;
                if (counter % 1000 == 0)
                {
                    double percent       = Math.Round(100d * counter / dustFrameLists.Count, 1);
                    string percentString = percent.ToString("N1");
                    Config.Print(
                        "counter = {0} / {1} ({2}%)",
                        counter, dustFrameLists.Count, percentString);
                }

                TtcSimulation simulation = new TtcSimulation(saveState, startFrame, dustFrames);
                int?          idealCogConfigurationFrame = simulation.FindIdealCogConfiguration(numFramesMin, numFramesMax);
                if (idealCogConfigurationFrame.HasValue)
                {
                    List <int> dustInputFrames       = dustFrames.ConvertAll(dustFrame => dustFrame - 2);
                    string     dustInputFramesString = "[" + String.Join(", ", dustInputFrames) + "]";
                    string     outputString          = dustInputFramesString + " => " + idealCogConfigurationFrame.Value;
                    outputStrings.Add(outputString);
                    Config.Print(outputString);
                }
            }
            Config.Print("In total, there were {0} successes:", outputStrings.Count);
            outputStrings.ForEach(output => Config.Print(output));
        }
示例#11
0
        public static void FindPendulumSyncingManipulation()
        {
            TtcSaveState       saveState       = new TtcSaveState();
            int                startingFrame   = MupenUtilities.GetFrameCount();
            List <List <int> > dustFramesLists = GetDustFrameLists(startingFrame + 2, 25, 25);

            Config.Print("START FindPendulumSyncingManipulation");
            foreach (List <int> dustFrames in dustFramesLists)
            {
                TtcSimulation simulation   = new TtcSimulation(saveState, startingFrame, dustFrames);
                int?          syncingFrame = simulation.FindPendulumSyncingManipulation();
                if (syncingFrame.HasValue)
                {
                    Config.Print(syncingFrame.Value + "\t" + FormatDustFrames(dustFrames));
                }
            }
            Config.Print("END FindPendulumSyncingManipulation");
        }
示例#12
0
        public static void FindPunchRecoilPendulumManipulation()
        {
            TtcSaveState currentSaveState  = new TtcSaveState();
            int          currentStartFrame = MupenUtilities.GetFrameCount();

            Dictionary <int, List <int> > dustFrameLists = new Dictionary <int, List <int> >();

            for (int i = 0; i < 100; i++)
            {
                (bool success, TtcSaveState saveState, int relativeEndFrame, List <int> relativeDustFrames) =
                    FindPunchRecoilPendulumManipulation(currentSaveState);
                if (!success)
                {
                    break;
                }

                List <int> absoluteDustFrames = relativeDustFrames.ConvertAll(rel => rel + currentStartFrame - 2);
                dustFrameLists[currentStartFrame] = absoluteDustFrames;
                Config.Print(i + ":\t[" + string.Join(",", absoluteDustFrames) + "]");

                currentSaveState   = saveState;
                currentStartFrame += relativeEndFrame;
            }

            List <int> dustFrames     = dustFrameLists.Values.SelectMany(list => list).ToList();
            int        firstDustFrame = dustFrames[0];
            int        lastDustFrame  = dustFrames[dustFrames.Count - 1];
            int        dustFrameRange = lastDustFrame - firstDustFrame;

            int[] joystickInputs = new int[dustFrameRange + 1000];
            foreach (int dustFrame in dustFrames)
            {
                joystickInputs[dustFrame - firstDustFrame] = 127;
            }

            Config.Print();
            foreach (int joystickInput in joystickInputs)
            {
                Config.Print(joystickInput);
            }
        }
示例#13
0
        public static List <List <int> > FindIdealPendulumManipulation(uint pendulumAddress, int numIterations)
        {
            TtcSaveState currentSaveState  = new TtcSaveState();
            int          currentStartFrame = MupenUtilities.GetFrameCount();

            List <List <int> > dustFrameLists = new List <List <int> >();

            for (int i = 0; i < numIterations; i++)
            {
                (bool success, TtcSaveState saveState, int relativeEndFrame, List <int> relativeDustFrames) =
                    FindIdealPendulumManipulation(pendulumAddress, currentSaveState);
                if (!success)
                {
                    break;
                }

                List <int> absoluteDustFrames = relativeDustFrames.ConvertAll(rel => rel + currentStartFrame - 2);
                dustFrameLists.Add(absoluteDustFrames);

                currentSaveState   = saveState;
                currentStartFrame += relativeEndFrame;
            }
            return(dustFrameLists);
        }
示例#14
0
        public static (TtcRng, List <TtcObject>) CreateRngObjectsFromSaveState(TtcSaveState saveState)
        {
            TtcSaveStateByteIterator iter = saveState.GetIterator();
            TtcRng rng = new TtcRng(iter.GetUShort());

            List <TtcObject> rngObjects = new List <TtcObject>();

            for (int i = 0; i < 6; i++)
            {
                rngObjects.Add(new TtcRotatingBlock(rng, iter.GetInt(), iter.GetInt()).SetIndex(i + 1));
            }
            for (int i = 0; i < 2; i++)
            {
                rngObjects.Add(new TtcRotatingTriangularPrism(rng, iter.GetInt(), iter.GetInt()).SetIndex(i + 1));
            }
            for (int i = 0; i < 4; i++)
            {
                rngObjects.Add(new TtcPendulum(rng, iter.GetInt(), iter.GetInt(), iter.GetInt(), iter.GetInt(), iter.GetInt()).SetIndex(i + 1));
            }
            for (int i = 0; i < 5; i++)
            {
                rngObjects.Add(new TtcTreadmill(rng, iter.GetInt(), iter.GetInt(), iter.GetInt(), iter.GetInt(), iter.GetInt()).SetIndex(i + 1));
            }
            for (int i = 0; i < 12; i++)
            {
                rngObjects.Add(new TtcPusher(rng, iter.GetInt(), iter.GetInt(), iter.GetInt(), iter.GetInt()).SetIndex(i + 1));
            }
            for (int i = 0; i < 5; i++)
            {
                rngObjects.Add(new TtcCog(rng, iter.GetInt(), iter.GetInt(), iter.GetInt()).SetIndex(i + 1));
            }
            for (int i = 0; i < 2; i++)
            {
                rngObjects.Add(new TtcSpinningTriangle(rng, iter.GetInt(), iter.GetInt(), iter.GetInt()).SetIndex(i + 1));
            }
            for (int i = 0; i < 1; i++)
            {
                rngObjects.Add(new TtcPitBlock(rng, iter.GetInt(), iter.GetInt(), iter.GetInt(), iter.GetInt(), iter.GetInt()).SetIndex(i + 1));
            }
            for (int i = 0; i < 2; i++)
            {
                rngObjects.Add(new TtcHand(rng, iter.GetInt(), iter.GetInt(), iter.GetInt(), iter.GetInt(), iter.GetInt(), iter.GetInt()).SetIndex(i + 1));
            }
            for (int i = 0; i < 14; i++)
            {
                rngObjects.Add(new TtcSpinner(rng, iter.GetInt(), iter.GetInt(), iter.GetInt(), iter.GetInt()).SetIndex(i + 1));
            }
            for (int i = 0; i < 6; i++)
            {
                rngObjects.Add(new TtcWheel(rng, iter.GetInt(), iter.GetInt(), iter.GetInt(), iter.GetInt(), iter.GetInt(), iter.GetInt()).SetIndex(i + 1));
            }
            for (int i = 0; i < 2; i++)
            {
                if (i == 0)
                {
                    rngObjects.Add(new TtcElevator(rng, 445, 1045, iter.GetInt(), iter.GetInt(), iter.GetInt(), iter.GetInt(), iter.GetInt()).SetIndex(i + 1));
                }
                if (i == 1)
                {
                    rngObjects.Add(new TtcElevator(rng, -1454, -1254, iter.GetInt(), iter.GetInt(), iter.GetInt(), iter.GetInt(), iter.GetInt()).SetIndex(i + 1));
                }
            }
            for (int i = 0; i < 1; i++)
            {
                rngObjects.Add(new TtcCog(rng, iter.GetInt(), iter.GetInt(), iter.GetInt()).SetIndex(i + 6));
            }
            for (int i = 0; i < 2; i++)
            {
                rngObjects.Add(new TtcTreadmill(rng, iter.GetInt(), iter.GetInt(), iter.GetInt(), iter.GetInt(), iter.GetInt()).SetIndex(i + 6));
            }
            for (int i = 0; i < 1; i++)
            {
                rngObjects.Add(new TtcThwomp(rng, iter.GetInt(), iter.GetInt(), iter.GetInt(), iter.GetInt(), iter.GetInt()).SetIndex(i + 1));
            }
            for (int i = 0; i < 2; i++)
            {
                rngObjects.Add(new TtcAmp(rng, iter.GetInt(), iter.GetInt()).SetIndex(i + 1));
            }
            for (int i = 0; i < 2; i++)
            {
                rngObjects.Add(new TtcBobomb(rng, iter.GetInt(), iter.GetInt()).SetIndex(i + 1));
            }
            for (int i = 0; i < 1; i++)
            {
                TtcDust dust = new TtcDust(rng).SetIndex(i + 1) as TtcDust;
                // if (dustFrames != null) dust.AddDustFrames(dustFrames);
                rngObjects.Add(dust);
            }

            if (!iter.IsDone())
            {
                throw new ArgumentOutOfRangeException();
            }

            return(rng, rngObjects);
        }
示例#15
0
 public TtcSimulation(TtcSaveState saveState)
 {
     (_rng, _rngObjects) = TtcUtilities.CreateRngObjectsFromSaveState(saveState);
     _startingFrame      = 0;
 }
示例#16
0
        public static int FindHandMovement(TtcSaveState saveState, int startingFrame)
        {
            TtcSimulation simulation = new TtcSimulation(saveState, startingFrame, new List <int>());

            return(simulation.FindHandMovement());
        }