private void Initialization() { _clues = new List <Clue>(); // Add the size indication var sizeSystem = Rnd.Range(0, 5); var primes = new[] { 3, 5, 7 }; var size = Enumerable.Range(3, 5).SelectMany(width => Enumerable.Range(3, 5).Select(height => new { Width = width, Height = height })) .Where(sz => sizeSystem != 0 || (primes.Contains(sz.Width) && primes.Contains(sz.Height))) .PickRandom(); Clue clue = null; switch (sizeSystem) { case 0: clue = new Clue((size.Width > size.Height ? "{0}" : size.Width < size.Height ? "({0})" : Rnd.Range(0, 2) == 0 ? "{0}" : "({0})").Fmt(size.Width * size.Height), false, false, 128); break; case 1: clue = new Clue("{0}×{1}".Fmt(size.Width, size.Height), false, false, 128, null, "{0}x{1}".Fmt(size.Width, size.Height)); break; case 2: clue = new Clue("{1} by {0}".Fmt(size.Width, size.Height), false, false, 128); break; case 3: clue = new Clue("{0}*{1}".Fmt(size.Width * size.Height, size.Height), false, false, 128); break; case 4: clue = new Clue("{0} : {1}".Fmt(size.Width * size.Height, size.Width), false, false, 128); break; } _clues.Add(clue); Debug.LogFormat(@"[Coordinates #{3}] Showing grid size {0}×{1} as {2}", size.Width, size.Height, clue.LoggingText, _moduleId); var coordCh = 'a'; var grid = new char[size.Width * size.Height]; for (int i = 0; i < size.Width * size.Height; i++) { grid[i] = '.'; } var coordinates = Enumerable.Range(0, size.Width * size.Height).ToList(); coordinates.Shuffle(); var illegalCoords = new List <int>(); var num = 0; // Generate 6 illegal coordinates for (; num < 6; num++) { illegalCoords.Add(coordinates[num]); clue = addClue(false, coordinates[num], size.Width, size.Height); Debug.LogFormat(@"[Coordinates #{3}] Showing illegal coordinate {0}={1} as {2}", coordCh, loggingCoords(coordinates[num], size.Width), clue.LoggingText, _moduleId); grid[coordinates[num]] = coordCh; coordCh++; } // Generate the correct coordinate twice with different coordinate systems clue = addClue(true, coordinates[num], size.Width, size.Height); Debug.LogFormat(@"[Coordinates #{0}] Showing correct coordinate *={1} as {2}", _moduleId, loggingCoords(coordinates[num], size.Width), clue.LoggingText); clue = addClue(true, coordinates[num], size.Width, size.Height, avoidSystem: clue.System); Debug.LogFormat(@"[Coordinates #{0}] Showing correct coordinate *={1} as {2}", _moduleId, loggingCoords(coordinates[num], size.Width), clue.LoggingText); grid[coordinates[num]] = '*'; // Log the grid Debug.LogFormat("[Coordinates #{0}] Grid:\n{1}", _moduleId, Enumerable.Range(0, size.Height).Select(row => (grid[size.Width * row] == '*' ? "" : " ") + Enumerable.Range(0, size.Width) .Select(col => new { Char = grid[col + size.Width * row], Col = col, Coord = col + size.Width * row }) .Select(inf => inf.Char == '*' ? "[*]" : (inf.Char != '.' ? inf.Char : illegalCoords.Contains(inf.Coord) ? '#' : '.') + (inf.Col == size.Width - 1 || grid[inf.Col + 1 + size.Width * row] == '*' ? "" : " ")) .JoinString()) .JoinString("\n")); _clues.Shuffle(); _selectedIndex = 0; _firstCorrectSubmitted = null; Left.OnInteract = delegate { Left.AddInteractionPunch(.5f); Audio.PlayGameSoundAtTransform(KMSoundOverride.SoundEffect.ButtonPress, Left.transform); StartCoroutine(ButtonAnimation(Left)); if (_clues == null) { return(false); } _selectedIndex = (_selectedIndex + _clues.Count - 1) % _clues.Count; UpdateDisplay(false); return(false); }; Right.OnInteract = delegate { Right.AddInteractionPunch(.5f); Audio.PlayGameSoundAtTransform(KMSoundOverride.SoundEffect.ButtonPress, Right.transform); StartCoroutine(ButtonAnimation(Right)); if (_clues == null) { return(false); } _selectedIndex = (_selectedIndex + 1) % _clues.Count; UpdateDisplay(true); return(false); }; Submit.OnInteract = delegate { Submit.AddInteractionPunch(1f); Audio.PlayGameSoundAtTransform(KMSoundOverride.SoundEffect.ButtonPress, Submit.transform); StartCoroutine(ButtonAnimation(Submit)); if (_clues == null) { return(false); } if (_clues[_selectedIndex].IsCorrect && (_firstCorrectSubmitted == null || _firstCorrectSubmitted == _selectedIndex)) { Debug.LogFormat("[Coordinates #{0}] Pressed submit button on {1}: first correct answer.", _moduleId, _clues[_selectedIndex].LoggingText); _firstCorrectSubmitted = _selectedIndex; } else if (_clues[_selectedIndex].IsCorrect) { Debug.LogFormat("[Coordinates #{0}] Pressed submit button on {1}: second correct answer. Module solved.", _moduleId, _clues[_selectedIndex].LoggingText); Module.HandlePass(); _clues = null; } else { Debug.LogFormat("[Coordinates #{0}] Pressed submit button on wrong answer {1}.", _moduleId, _clues[_selectedIndex].LoggingText); Module.HandleStrike(); } return(false); }; UpdateDisplay(true); }