static QueenAction GetQueenAction(int frame, QueenAction previousAction, RngManipulation rngManipulation = RngManipulation.None) { var index = frame + frame - 0x2C + (int)rngManipulation; if (previousAction == QueenAction.Stomp) { index += 8; } else if (previousAction == QueenAction.None || previousAction == QueenAction.StepBack) { return((Numbers[index & 0xFF] & 0x01) == 0x01 ? QueenAction.Scream : QueenAction.Stomp); } var number = Numbers[index & 0xFF] & 0x07; if (number < 5) { return(QueenAction.StepBack); } else if (number < 7) { return(QueenAction.Scream); } else { return(QueenAction.Stomp); } }
static void Main(string[] args) { var translation = new string[] { null, "A", "B", ">" }; var durations = new List <int>(); var sequenceStartRngManipulation = new RngManipulation[] { RngManipulation.None, RngManipulation.None, RngManipulation.None, RngManipulation.None, RngManipulation.None, RngManipulation.None, RngManipulation.None, RngManipulation.None }; for (int startFrame = 0; startFrame < 256; startFrame++) { var queenActions = new List <QueenAction>(); var currentFrame = startFrame; var queenAction = QueenAction.None; var stepBackCount = 0; for (int i = 0; stepBackCount < 9; i++) { var rngManipulation = RngManipulation.None; if ((i == 0 || queenActions[i - 1] == QueenAction.StepBack) && stepBackCount < sequenceStartRngManipulation.Length) { rngManipulation = sequenceStartRngManipulation[stepBackCount]; } queenAction = GetQueenAction(currentFrame, queenAction, rngManipulation); currentFrame += GetFrameCount(queenAction); queenActions.Add(queenAction); if (queenAction == QueenAction.StepBack) { stepBackCount++; } } var duration = currentFrame - startFrame; Console.WriteLine("{0:X2} ({1}): {2}", startFrame, duration, string.Join("", queenActions.Select(x => translation[(int)x]))); durations.Add(duration); } Console.WriteLine("RNG manip: {0}", string.Join(", ", sequenceStartRngManipulation)); Console.WriteLine("Average: {0}", durations.Average()); Console.WriteLine("Best: {0}", durations.Min()); Console.WriteLine("Worst: {0}", durations.Max()); Console.WriteLine("Median: {0}", durations.OrderBy(x => x).Skip(durations.Count / 2).First()); Console.ReadKey(); }