Пример #1
0
    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);
    }