Beispiel #1
0
    public static void StartSearch(int numThreads, int minDelay, int maxDelay)
    {
        Console.WriteLine("Buffered=" + Buffered + ", Overflow=" + Overflow);
        List <byte[][]> stateList = new List <byte[][]>();

        MakeSave();
        Gold           gb       = new Gold(true);
        List <GscTile> endTiles = new List <GscTile>()
        {
            r29[38, 16]
        };

        gb.SetTimeSec(120);

        for (int i = 0; i <= (maxDelay - minDelay); i++)
        {
            stateList.Add(new byte[60][]);
        }

        new GscIntroSequence(GscStrat.GfSkip, GscStrat.TitleSkip, GscStrat.Continue).ExecuteUntilIGT(gb);
        gb.AdvanceFrames(minDelay, Joypad.Left);
        byte[] state = gb.SaveState();
        for (int i = 0; i < stateList.Count(); i++)
        {
            for (int igt = 0; igt < 60; igt++)
            {
                gb.LoadState(state);
                gb.CpuWrite("wGameTimeFrames", (byte)igt);
                gb.AdvanceFrames(i, Joypad.Left);
                gb.Hold(Joypad.A, "OWPlayerInput");
                stateList[i][igt] = gb.SaveState();
            }
        }

        RandomPathSearch.StartSearch <Gold, GscTile>(numThreads,
                                                     new RandomSearchParameters <GscTile>()
        {
            StateList         = stateList,
            ClusterSize       = 1,
            SS                = 60,
            NumPathsToFind    = int.MaxValue,
            StartEdgeSet      = 0,
            StartTile         = gb.Tile,
            EndTiles          = endTiles.ToArray(),
            ExecutionCallback = (gb, actions) => gb.Execute(actions) == gb.OverworldLoopAddress,
            FoundCallback     = (stateIndex, actions, successes) => {
                lock (startWriter) {
                    startWriter.WriteLine(successes + " " + stateIndex + " " + ActionFunctions.ActionsToPath(actions));
                    startWriter.Flush();
                }
            },
        });
    }