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); }
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(); } } }
public TtcSimulation(TtcSaveState saveState, int startingFrame, List <int> dustFrames) { (_rng, _rngObjects) = TtcUtilities.CreateRngObjectsFromSaveState(saveState); _startingFrame = startingFrame; _currentFrame = _startingFrame; AddDustFrames(dustFrames); }
public HandManipulationProgress( TtcSaveState saveState, int frame, List <int> dustFrames) { SaveState = saveState; Frame = frame; DustFrames = dustFrames; }
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); }
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"); }
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]); } }
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); }
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); }
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)); }
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"); }
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); } }
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); }
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); }
public TtcSimulation(TtcSaveState saveState) { (_rng, _rngObjects) = TtcUtilities.CreateRngObjectsFromSaveState(saveState); _startingFrame = 0; }
public static int FindHandMovement(TtcSaveState saveState, int startingFrame) { TtcSimulation simulation = new TtcSimulation(saveState, startingFrame, new List <int>()); return(simulation.FindHandMovement()); }