public static void AddSlateVars(ref GrammarRequest req) { tmpAddedSlateVars.Clear(); List <Rule> rules = req.Rules; for (int i = 0; i < rules.Count; i++) { Rule_String rule_String = rules[i] as Rule_String; if (rule_String == null) { continue; } string text = rule_String.Generate(); if (text != null) { bool flag = false; tmpSymbol.Clear(); for (int j = 0; j < text.Length; j++) { if (text[j] == '[') { flag = true; } else if (text[j] == ']') { AddSlateVar(ref req, tmpSymbol.ToString(), tmpAddedSlateVars); tmpSymbol.Clear(); flag = false; } else if (flag) { tmpSymbol.Append(text[j]); } } } if (rule_String.constantConstraints != null) { for (int k = 0; k < rule_String.constantConstraints.Count; k++) { string key = rule_String.constantConstraints[k].key; AddSlateVar(ref req, key, tmpAddedSlateVars); } } } }
private void AddCustomRules(List <Rule> grammarRequestRules) { if (!grammarRequestRules.Any(r => r.keyword == MODIFIER_RULE_KEYWORD)) { var rule = new Rule_String(MODIFIER_RULE_KEYWORD, ""); //TODO check for modifier using morphDef (grab morphDef from when mutation was added) grammarRequestRules.Add(rule); //add a blank modifier if none is set } if (!grammarRequestRules.Any(r => r.keyword == "a_an")) { var split = _mutationDef.label.Split(' '); if (split.Length > 1) //label is two words, like 'wolf tail' or 'fox muzzle' { grammarRequestRules.Add(new Rule_String("a_an", GetAAn(split[0]))); } else //if the label is one word it's probably a modifier like 'wolfish' { grammarRequestRules.Add(new Rule_String("a_an", "")); } } }
public static Site GenerateSite(IEnumerable <SitePartDefWithParams> sitePartsParams, int tile, Faction faction, bool hiddenSitePartsPossible = false, RulePack singleSitePartRules = null) { _ = QuestGen.slate; bool flag = false; foreach (SitePartDefWithParams sitePartsParam in sitePartsParams) { if (sitePartsParam.def.defaultHidden) { flag = true; break; } } if (flag || hiddenSitePartsPossible) { SitePartParams parms = SitePartDefOf.PossibleUnknownThreatMarker.Worker.GenerateDefaultParams(0f, tile, faction); SitePartDefWithParams val = new SitePartDefWithParams(SitePartDefOf.PossibleUnknownThreatMarker, parms); sitePartsParams = sitePartsParams.Concat(Gen.YieldSingle(val)); } Site site = SiteMaker.MakeSite(sitePartsParams, tile, faction); List <Rule> list = new List <Rule>(); Dictionary <string, string> dictionary = new Dictionary <string, string>(); List <string> list2 = new List <string>(); int num = 0; for (int i = 0; i < site.parts.Count; i++) { List <Rule> list3 = new List <Rule>(); Dictionary <string, string> dictionary2 = new Dictionary <string, string>(); site.parts[i].def.Worker.Notify_GeneratedByQuestGen(site.parts[i], QuestGen.slate, list3, dictionary2); if (site.parts[i].hidden) { continue; } if (singleSitePartRules != null) { List <Rule> list4 = new List <Rule>(); list4.AddRange(list3); list4.AddRange(singleSitePartRules.Rules); string text = QuestGenUtility.ResolveLocalText(list4, dictionary2, "root", capitalizeFirstSentence: false); list.Add(new Rule_String("sitePart" + num + "_description", text)); if (!text.NullOrEmpty()) { list2.Add(text); } } for (int j = 0; j < list3.Count; j++) { Rule rule = list3[j].DeepCopy(); Rule_String rule_String = rule as Rule_String; if (rule_String != null && num != 0) { rule_String.keyword = "sitePart" + num + "_" + rule_String.keyword; } list.Add(rule); } foreach (KeyValuePair <string, string> item in dictionary2) { string text2 = item.Key; if (num != 0) { text2 = "sitePart" + num + "_" + text2; } if (!dictionary.ContainsKey(text2)) { dictionary.Add(text2, item.Value); } } num++; } if (!list2.Any()) { list.Add(new Rule_String("allSitePartsDescriptions", "HiddenOrNoSitePartDescription".Translate())); list.Add(new Rule_String("allSitePartsDescriptionsExceptFirst", "HiddenOrNoSitePartDescription".Translate())); } else { list.Add(new Rule_String("allSitePartsDescriptions", list2.ToClauseSequence().Resolve())); if (list2.Count >= 2) { list.Add(new Rule_String("allSitePartsDescriptionsExceptFirst", list2.Skip(1).ToList().ToClauseSequence())); } else { list.Add(new Rule_String("allSitePartsDescriptionsExceptFirst", "HiddenOrNoSitePartDescription".Translate())); } } QuestGen.AddQuestDescriptionRules(list); QuestGen.AddQuestNameRules(list); QuestGen.AddQuestDescriptionConstants(dictionary); QuestGen.AddQuestNameConstants(dictionary); QuestGen.AddQuestNameRules(new List <Rule> { new Rule_String("site_label", site.Label) }); return(site); }
private void MakeAffixCaches() { // Affix caches affixStringsCached = affixRules.Select(r => r.Generate()).ToList(); affixDefDictCached = new Dictionary <string, LootAffixDef> { }; affixStringsDictCached = new Dictionary <LootAffixDef, string> { }; modifiersCached = new HashSet <LootAffixModifier> { }; ttlAffixPoints = 0; for (int i = 0; i < AffixCount; i++) { // Null is some bizarre error from Prepare Carefully // The "null_output" was an old save bug which clobbered the rule data if (affixStringsCached[i] == null || affixStringsCached[i] == "null_output") { affixStringsCached[i] = affixes[i].LabelCap; affixRules[i] = new Rule_String("unknown->" + affixStringsCached[i]); } affixDefDictCached [affixStringsCached[i]] = affixes[i]; affixStringsDictCached[affixes[i]] = affixStringsCached[i]; modifiersCached.AddRange(affixes[i].modifiers); ttlAffixPoints += affixes[i].GetRealAffixCost(parent); } // Add new modified VerbProperties, if necessary var verbModifierDefs = affixes.Where( lad => lad.modifiers.Any(lam => lam.AppliesTo == ModifierTarget.VerbProperties) ).ToList(); if (verbModifierDefs.Count > 0) { verbProperties = VerbPropertiesFromDef.Select(vp => vp.MemberwiseClone()).ToList(); foreach (LootAffixDef lad in verbModifierDefs) { foreach (var vp in verbProperties) { lad.ModifyVerbProperties(parent, vp); } } } else { verbProperties = VerbPropertiesFromDef; } // Add new modified Tools, if necessary var toolModifierDefs = affixes.Where( lad => lad.modifiers.Any(lam => lam.AppliesTo == ModifierTarget.Tools) ).ToList(); if (toolModifierDefs.Count > 0) { // [Reflection prep] tool.MemberwiseClone() MethodInfo ToolMemberwiseClone = AccessTools.Method(typeof(Tool), "MemberwiseClone"); tools = ToolsFromDef.Select(t => (Tool)ToolMemberwiseClone.Invoke(t, new object[] {})).ToList(); foreach (LootAffixDef lad in toolModifierDefs) { foreach (var tool in tools) { lad.ModifyTool(parent, tool); } } } else { tools = ToolsFromDef; } // Refresh the VerbTracker cache var equippable = parent.TryGetComp <CompEquippable>(); if (equippable != null && (verbModifierDefs.Count > 0 || toolModifierDefs.Count > 0)) { // [Reflection] verbTracker.verbs FieldInfo verbsField = AccessTools.Field(typeof(VerbTracker), "verbs"); List <Verb> verbs = (List <Verb>)verbsField.GetValue(equippable.VerbTracker); // Don't call this if it's already empty. It may already be in the middle of filling it in. if (!verbs.NullOrEmpty()) { // [Reflection] equippable.VerbTracker.InitVerbsFromZero() MethodInfo InitVerbsFromZero = AccessTools.Method(typeof(VerbTracker), "InitVerbsFromZero"); InitVerbsFromZero.Invoke(equippable.VerbTracker, new object[] {}); } } MakeIcons(); }