public CharacterData BuildRandomCharacter(Quirk quirkOverride = null, Spell spellOverride = null) { CharacterData randomCharacter = ScriptableObject.CreateInstance <CharacterData>(); int genderNum = Random.Range(0, 2); string gender = genderNum == 0 ? "MALE" : "FEMALE"; // todo bdsowers - add large window for taglines + bios, names // also pull from the NEUTRAL list for taglines + bios randomCharacter.age = GenerateCharacterAge(); List <string> taglines = new List <string>(); LocalizedText.GetKeysInListCopy("[NEUTRAL_TAGLINE]", taglines); LocalizedText.GetKeysInListCopy("[MALE_TAGLINE]", taglines); LocalizedText.GetKeysInListCopy("[FEMALE_TAGLINE]", taglines); List <string> bios = new List <string>(); LocalizedText.GetKeysInListCopy("[NEUTRAL_BIO]", bios); LocalizedText.GetKeysInListCopy("[MALE_BIO]", bios); LocalizedText.GetKeysInListCopy("[FEMALE_BIO]", bios); // To get our repetition guards to work properly, things need to maintain positions. // But we still want to support gendered text, so create a temporary ignore list // that contains the previously used positions plus any gender-invalid positions List <int> ignoreList = new List <int>(previouslyUsedBios); string invalid = "[MALE"; if (genderNum == 0) { invalid = "[FEMALE"; } for (int i = 0; i < bios.Count; ++i) { if (bios[i].StartsWith(invalid)) { ignoreList.Add(i); } } int bioAndTaglinePosition = bios.SamplePosition(ignoreList); randomCharacter.bio = bios[bioAndTaglinePosition]; randomCharacter.characterName = LocalizedText.GetKeysInList("[" + gender + "_NAME]").Sample((genderNum == 0 ? previouslyUsedMaleNames : previouslyUsedFemaleNames)); randomCharacter.levelRequirement = 1; List <CharacterModelData> unusableModels = new List <CharacterModelData>(previouslyUsedModels); unusableModels.Add(PlayerModel()); CharacterModelData modelData = Game.instance.characterDataList.CharacterModelsWithGender(genderNum).Sample(unusableModels); randomCharacter.model = modelData.model.name; randomCharacter.tagline = taglines[bioAndTaglinePosition]; randomCharacter.characterUniqueId = randomCharacter.characterName + ":::" + randomCharacter.bio + ":::" + randomCharacter.tagline + ":::" + randomCharacter.model; randomCharacter.quirk = QuirksInLevel(Game.instance.playerData.attractiveness, -1, Game.instance.playerData.scoutLevel, -1).Sample(previouslyUsedQuirks).GetComponent <Quirk>(); randomCharacter.spell = SpellsInLevel(Game.instance.playerData.attractiveness, -1, Game.instance.playerData.scoutLevel, -1).Sample(previouslyUsedSpells).GetComponent <Spell>(); randomCharacter.statBoost = (CharacterStatType)Random.Range(1, 6); randomCharacter.statBoostAmount = 1 + Random.Range(0, MaximumPassiveStatBoost(randomCharacter.statBoost) + 1); randomCharacter.material = materials.Sample(); if (quirkOverride != null) { randomCharacter.quirk = quirkOverride; } if (spellOverride != null) { randomCharacter.spell = spellOverride; } previouslyUsedQuirks.AddWindowed(randomCharacter.quirk, GAMEPLAY_REUSE_WINDOW_SIZE); previouslyUsedSpells.AddWindowed(randomCharacter.spell, GAMEPLAY_REUSE_WINDOW_SIZE); previouslyUsedModels.AddWindowed(modelData, GAMEPLAY_REUSE_WINDOW_SIZE); previouslyUsedBios.AddWindowed(bioAndTaglinePosition, TEXT_REUSE_WINDOW_SIZE); if (genderNum == 0) { previouslyUsedMaleNames.AddWindowed(randomCharacter.characterName, TEXT_REUSE_WINDOW_SIZE); } else { previouslyUsedFemaleNames.AddWindowed(randomCharacter.characterName, TEXT_REUSE_WINDOW_SIZE); } return(randomCharacter); }