internal static Rotation[][][] GetRandomRotations(RotationOptions options) { var output = new List <List <Rotation> > [options.RotationCount]; var allAxies = InteractScript.allAxies.Take(options.Dimension); for (int i = 0; i < options.RotationCount; i++) { output[i] = new List <List <Rotation> >(); var possibleAxies = new Stack <Axis>(allAxies.ToArray().Shuffle()); for (int j = 0; j < options.MinRotations || (j < options.MaxRotations && possibleAxies.Count >= options.MinLengthPerRotation && (Rnd.Range(0, 1f) <= options.ChanceToRepeat || j == 0)); j++) { AddRandomRotations(output, possibleAxies, options, ref i, ref j); } } return(output.Select(a => a.Select(b => b.ToArray())).Select(a => a.ToArray()).ToArray()); }
private static void AddRandomRotations(List <List <Rotation> >[] output, Stack <Axis> possibleAxies, RotationOptions options, ref int i, ref int j) { output[i].Add(new List <Rotation>()); int rnd = Rnd.Range(options.MinLengthPerRotation, Math.Min(Math.Min(possibleAxies.Count, options.MaxLengthPerRotation), possibleAxies.Count() - options.MinRotations + 1) + 1); for (int k = 0; k < rnd; k++) { output[i][j].Add(new Rotation(Rnd.Range(0, 1f) > options.ChanceForNegativeRotation, possibleAxies.Pop())); } switch (output[i][j].Count) { case 1: // Positive 1-cycle rotations are the same as 0-cycle rotations. output[i][j][0].IsNegative = true; break; case 2: // Equal 2-cycle rotations are the same as 2 1-cycle rotations. if (output[i][j][0].IsNegative == output[i][j][1].IsNegative) { output[i][j][0].IsNegative = !output[i][j][0].IsNegative; } break; } }