Beispiel #1
0
        public async Task TrySolve(string number, string input, SocketGuildUser solver)
        {
            if (IsFinished != true)
            {
                if (CurrentLockNumber.HasValue)
                {
                    var curLock = Locks.FirstOrDefault(x => x.LockNumber == CurrentLockNumber.Value);
                    if (curLock.TrySolve(number, input, solver))
                    {
                        CurrentOrderIndex++;
                        if (CurrentOrderIndex >= 10)
                        {
                            IsFinished = true;
                            StringBuilder builder = new StringBuilder();
                            builder.AppendLine("```LOCK::LIFTED");
                            builder.AppendLine("SOLVERS::PRINT()");
                            var users = Locks.Select(x => x.Solver).Distinct();
                            foreach (var user in users)
                            {
                                int amountSolved = Locks.Count(x => x.Solver.Id == user.Id);
                                builder.AppendLine($"SOLVER::{user.Nickname}|ID::{user.Id}|SOLVED::{amountSolved}");
                            }
                            builder.AppendLine($"|{new string('-', 10)}PUZZLE_OVER{new string('-', 10)}|```");
                            await PresentationMessage.ModifyAsync(x => x.Content = builder.ToString());

                            PuzzleSolved?.Invoke(this.Guid);
                        }
                        else
                        {
                            if (CurrentOrderIndex > 0)
                            {
                                PreviousLockNumber = NumbersOrder[CurrentOrderIndex - 1];
                            }
                            else
                            {
                                PreviousLockNumber = null;
                            }
                            if (NumbersOrder.ElementAtOrDefault(CurrentOrderIndex) != 10)
                            {
                                CurrentLockNumber = NumbersOrder[CurrentOrderIndex];
                            }
                            else
                            {
                                CurrentLockNumber = null;
                            }
                            if (NumbersOrder.ElementAtOrDefault(CurrentOrderIndex + 1) != 0)
                            {
                                NextLockNumber = NumbersOrder[CurrentOrderIndex + 1];
                            }
                            else
                            {
                                NextLockNumber = null;
                            }
                            await LockSolved?.Invoke();
                        }
                    }
                }
            }
        }
Beispiel #2
0
        public void RegenerateNewLocks(PuzzleDifficulty difficulty)
        {
            NumbersOrder = NumbersOrder.OrderBy(x => RandomValuesGenerator.GetRandomInt()).ToList();
            Locks.Clear();
            for (int i = 0; i < 10; i++)
            {
                switch (difficulty)
                {
                case PuzzleDifficulty.Easy:
                    Locks.Add(
                        new EasyPuzzleLockPreset(
                            number: NumbersOrder[i],
                            color: (PuzzleColors)Enum.GetValues(typeof(PuzzleColors)).GetValue(RandomValuesGenerator.GetInt(0, 4)),
                            lowerRange: 0,
                            upperRange: 9)
                    {
                        NumberCypherType = PuzzleNumberCypherType.ReverseInRange,
                        ColorCypherType  = PuzzleColorCypherType.TextShuffle
                    });
                    break;

                case PuzzleDifficulty.Normal:
                    Locks.Add(
                        new NormalPuzzleLockPreset(
                            lockNumber: NumbersOrder[i],
                            color: (PuzzleColors)Enum.GetValues(typeof(PuzzleColors)).GetValue(RandomValuesGenerator.GetInt(0, 4)),
                            caesarShift: RandomValuesGenerator.GetInt(1, 100))
                    {
                        NumberCypherType = PuzzleNumberCypherType.Caesar,
                        ColorCypherType  = PuzzleColorCypherType.RGB
                    });
                    break;

                case PuzzleDifficulty.Hard:
                    Locks.Add(
                        new HardPuzzleLockPreset(
                            lockNumber: NumbersOrder[i],
                            color: (PuzzleColors)Enum.GetValues(typeof(PuzzleColors)).GetValue(RandomValuesGenerator.GetInt(0, 4)))
                    {
                        NumberCypherType = PuzzleNumberCypherType.Binary,
                        ColorCypherType  = PuzzleColorCypherType.Hex
                    });
                    break;
                }
            }

            PreviousLockNumber = null;
            CurrentLockNumber  = null;
            NextLockNumber     = null;
            CurrentOrderIndex  = 0;
            CurrentLockNumber  = NumbersOrder[CurrentOrderIndex];
            NextLockNumber     = NumbersOrder[CurrentOrderIndex + 1];
        }