Exemplo n.º 1
0
        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", ""));
                }
            }
        }
Exemplo n.º 3
0
        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();
        }