public List <LetterData> GetAllLetterAlterations(List <LetterData> baseLetters, LetterAlterationFilters letterAlterationFilters) { List <LetterData> letterPool = new List <LetterData>(); // Filter: only 1 base or multiple bases? if (!letterAlterationFilters.differentBaseLetters) { var chosenLetter = baseLetters.RandomSelectOne(); baseLetters.Clear(); baseLetters.Add(chosenLetter); } // Get all alterations for the given bases foreach (var baseLetter in baseLetters) { // Check all alterations of this base letter var letterAlterations = GetLettersWithBase(baseLetter.GetId()); List <LetterData> availableVariations = new List <LetterData>(); foreach (var letterData in letterAlterations) { if (!FilterByDiacritics(letterAlterationFilters.ExcludeDiacritics, letterData)) { continue; } if (!FilterByLetterVariations(letterAlterationFilters.ExcludeLetterVariations, letterData)) { continue; } if (!FilterByDipthongs(letterAlterationFilters.excludeDipthongs, letterData)) { continue; } availableVariations.Add(letterData); } //Debug.Log("N availableVariations " + availableVariations.Count + " for " + baseLetter.GetId()); List <LetterData> basesForForms = new List <LetterData>(availableVariations); basesForForms.Add(baseLetter); //Debug.Log("N bases for forms: " + basesForForms.Count); if (letterAlterationFilters.includeForms) { // Place forms only inside the pool, if needed foreach (var baseForForm in basesForForms) { var availableForms = ExtractLettersWithForms(baseForForm); if (letterAlterationFilters.oneFormPerLetter) { // If we are using forms and only one form per letter must appear, add just one at random letterPool.Add(availableForms.RandomSelectOne()); } else { // Add all the (different) forms var visualFormComparer = new StrictLetterDataComparer(LetterEqualityStrictness.WithVisualForm); foreach (var availableForm in availableForms) { if (letterAlterationFilters.visuallyDifferentForms && letterPool.Contains(availableForm, visualFormComparer)) { continue; } letterPool.Add(availableForm); } } } } else { // Place just the isolated versions letterPool.AddRange(basesForForms); } } return(letterPool); }
private void SimulateQuestionBuilder(QuestionBuilderType builderType) { LetterAlterationFilters letterAlterationFilters = null; switch (lettersVariationChoice) { case 0: letterAlterationFilters = LetterAlterationFilters.FormsOfSingleLetter; break; case 1: letterAlterationFilters = LetterAlterationFilters.FormsOfMultipleLetters; break; case 2: letterAlterationFilters = LetterAlterationFilters.MultipleLetters; break; case 3: letterAlterationFilters = LetterAlterationFilters.PhonemesOfSingleLetter; break; case 4: letterAlterationFilters = LetterAlterationFilters.PhonemesOfMultipleLetters; break; case 5: letterAlterationFilters = LetterAlterationFilters.FormsAndPhonemesOfMultipleLetters; break; } var builderParams = SetupBuilderParameters(); IQuestionBuilder builder = null; switch (builderType) { case QuestionBuilderType.RandomLetters: builder = new RandomLettersQuestionBuilder(nPacks: nPacks, nCorrect: nCorrectAnswers, nWrong: nWrongAnswers, firstCorrectIsQuestion: true, parameters: builderParams); break; case QuestionBuilderType.RandomLetterForms: builder = new RandomLetterAlterationsQuestionBuilder(nPacks: nPacks, nCorrect: nCorrectAnswers, nWrong: nWrongAnswers, letterAlterationFilters: letterAlterationFilters, parameters: builderParams); break; case QuestionBuilderType.Alphabet: builder = new AlphabetQuestionBuilder(parameters: builderParams); break; case QuestionBuilderType.LettersBySunMoon: builder = new LettersBySunMoonQuestionBuilder(nPacks: nPacks, parameters: builderParams); break; case QuestionBuilderType.LettersByType: builder = new LettersByTypeQuestionBuilder(nPacks: nPacks, parameters: builderParams); break; case QuestionBuilderType.LettersInWord: builder = new LettersInWordQuestionBuilder(nRounds: nPacks, nPacksPerRound: nPacksPerRound, nCorrect: nCorrectAnswers, nWrong: nWrongAnswers, useAllCorrectLetters: true, parameters: builderParams); break; case QuestionBuilderType.LetterFormsInWords: builder = new LetterFormsInWordsQuestionBuilder(nPacks, nPacksPerRound, parameters: builderParams); break; case QuestionBuilderType.LetterAlterationsInWords: builder = new LetterAlterationsInWordsQuestionBuilder(nPacks, nPacksPerRound, parameters: builderParams, letterAlterationFilters: letterAlterationFilters); break; case QuestionBuilderType.CommonLettersInWords: builder = new CommonLetterInWordQuestionBuilder(nPacks: nPacks, nWrong: nWrongAnswers, parameters: builderParams); break; case QuestionBuilderType.RandomWords: builder = new RandomWordsQuestionBuilder(nPacks: nPacks, nCorrect: nCorrectAnswers, nWrong: nWrongAnswers, firstCorrectIsQuestion: true, parameters: builderParams); break; case QuestionBuilderType.OrderedWords: builderParams.wordFilters.allowedCategories = new[] { WordDataCategory.Numbers }; builder = new OrderedWordsQuestionBuilder(parameters: builderParams); break; case QuestionBuilderType.WordsWithLetter: builder = new WordsWithLetterQuestionBuilder(nRounds: nPacks, nPacksPerRound: nPacksPerRound, nCorrect: nCorrectAnswers, nWrong: nWrongAnswers, parameters: builderParams); break; case QuestionBuilderType.WordsByForm: builder = new WordsByFormQuestionBuilder(nPacks: nPacks, parameters: builderParams); break; case QuestionBuilderType.WordsByArticle: builder = new WordsByArticleQuestionBuilder(nPacks: nPacks, parameters: builderParams); break; case QuestionBuilderType.WordsBySunMoon: builder = new WordsBySunMoonQuestionBuilder(nPacks: nPacks, parameters: builderParams); break; case QuestionBuilderType.WordsInPhrase: builder = new WordsInPhraseQuestionBuilder(nPacks: nPacks, nCorrect: nCorrectAnswers, nWrong: nWrongAnswers, useAllCorrectWords: false, usePhraseAnswersIfFound: true, parameters: builderParams); break; case QuestionBuilderType.PhraseQuestions: builder = new PhraseQuestionsQuestionBuilder(nPacks: nPacks, nWrong: nWrongAnswers, parameters: builderParams); break; } var questionPacksGenerator = new QuestionPacksGenerator(); questionPacksGenerator.GenerateQuestionPacks(builder); }