/// <summary> /// Construct a new language excerpt /// </summary> /// <param name="word"></param> /// <param name="sourceLanguage">The source language to draw from</param> /// <param name="displayedSyllables">The number of displayed syllables</param> /// <param name="random">The random number generator to use</param> public LanguageExcerpt(TransmissionWord word, ACryptoLanguage sourceLanguage, int displayedSyllables, System.Random random) { SourceLanguage = sourceLanguage; usedSyllableIndices = new byte[displayedSyllables]; for (int i = 0; i < displayedSyllables; i++) { usedSyllableIndices[i] = 255; } List <byte> indexList = new List <byte>(SourceLanguage.syllableCount - word.syllableIndices.Length); for (byte i = 0; i < SourceLanguage.syllableCount; i++) { if (!word.syllableIndices.Contains(i)) { indexList.Add(i); } } var syllableIndex = 0; for (int i = 0; i < word.syllableIndices.Length; i++) { if (!usedSyllableIndices.Contains(word.syllableIndices[i])) { usedSyllableIndices[syllableIndex] = word.syllableIndices[i]; syllableIndex++; } } for (int i = syllableIndex; i < displayedSyllables; i++) { var index = random.Next(indexList.Count); usedSyllableIndices[i] = indexList[index]; indexList.RemoveAt(index); } for (int i = 0; i < word.syllableIndices.Length; i++) { for (byte j = 0; j < usedSyllableIndices.Length; j++) { if (word.syllableIndices[i] == usedSyllableIndices[j]) { word.syllableIndices[i] = j; break; } } } }
/// <summary> /// Construct a new language excerpt /// </summary> /// <param name="sourceLanguage">The source language to draw from</param> /// <param name="displayedSyllables">The number of displayed syllables</param> /// <param name="random">The random number generator to use</param> public LanguageExcerpt(ACryptoLanguage sourceLanguage, int displayedSyllables, System.Random random) { SourceLanguage = sourceLanguage; usedSyllableIndices = new byte[displayedSyllables]; List <byte> indexList = new List <byte>(SourceLanguage.syllableCount); for (byte i = 0; i < SourceLanguage.syllableCount; i++) { indexList.Add(i); } for (int i = 0; i < displayedSyllables; i++) { var index = random.Next(indexList.Count); usedSyllableIndices[i] = indexList[index]; indexList.RemoveAt(index); } }
/// <summary> /// Initialises the transmission chain /// </summary> /// <param name="seed">The random seed</param> /// <param name="transmissionCount">The number of transmissions</param> /// <param name="wordLength">The number of syllables the current word has</param> /// <param name="displayedSyllables">The number of syllables to display as possibilities</param> /// <returns>The transmission setup</returns> public static TransmissionSetup BuildTransmissionSetup(int seed, byte transmissionCount, int wordLength, int displayedSyllables) { var random = new System.Random(seed); var endpoint = WordManager.Instance.CreateEndpoint(wordLength, displayedSyllables, random); var transmissions = new Transmission[transmissionCount]; List <ACryptoLanguage> buffer = new List <ACryptoLanguage>(LanguageSet); var usedLanguages = new ACryptoLanguage[transmissionCount]; var excerpts = new LanguageExcerpt[transmissionCount]; for (int i = 0; i < transmissionCount; i++) { var index = random.Next(buffer.Count); usedLanguages[i] = buffer[index]; excerpts[i] = new LanguageExcerpt(usedLanguages[i], displayedSyllables, random); buffer.RemoveAt(index); if (i > 0) { transmissions[i - 1] = new Transmission( excerpts[i - 1], excerpts[i], random, displayedSyllables); } } transmissions[transmissionCount - 1] = new Transmission( excerpts[transmissionCount - 1], endpoint.HumanLanguage, random, displayedSyllables); var startWord = endpoint.RealWord; for (int i = transmissionCount - 1; i > -1; i--) { startWord = transmissions[i].Encrypt(startWord); } Setup = new TransmissionSetup(startWord, endpoint, transmissions); return(Setup); }