Ludeon / RimWorld-ru

Russian Localization for RimWorld
http://ludeon.com/forums/index.php?topic=2933.0
185 stars 117 forks source link

Ideoligion narrative changes Pt. 3 #1586

Closed Reiquard closed 9 months ago

Reiquard commented 10 months ago

Третья часть исправлений, направленных на облагораживание генерируемых описаний идеолигий. Основной упор на структуры Ideological (Светская идеология) и Buddhist origin.

Изменил названия локальных переменных в файле IdeoStoryPatternDef/RulePacks_Ideo_Description.xml во избежание неправильной интерпретации их значений, которые могут быть взяты из одноимённых переменных соответствующих черт идеолигий (and vice versa) при генерации описания.

Убрал в пяти строках того же файла вхождения "(p=2)" и подобные, ибо они указывают не вес (вероятность), а приоритет, что приводит к тому, что все остальные строки просто не участвуют в генерации.

Для целостности восприятия текста, составленного из предложений разных черт идеолигий, в категориях lesson* все обращения представлены местоимением ты и его производными.

Elevator89 commented 10 months ago

Убрал в пяти строках того же файла вхождения "(p=2)" и подобные, ибо они указывают не вес (вероятность), а приоритет, что приводит к тому, что все остальные строки просто не участвуют в генерации.

Это не совсем так. При парсинге строки выполнятся код, который воспринимает p всё-таки как вес. А для приоритета - в строке должно быть priority

    public Rule_String(string rawString)
    {
        Match match = pattern.Match(rawString);
        if (!match.Success)
        {
            Log.Error($"Bad string pass when reading rule {rawString}");
            return;
        }
        keyword = match.Groups["keyword"].Value;
        output = match.Groups["output"].Value;
        for (int i = 0; i < match.Groups["paramname"].Captures.Count; i++)
        {
            string value = match.Groups["paramname"].Captures[i].Value;
            string value2 = match.Groups["paramoperator"].Captures[i].Value;
            string value3 = match.Groups["paramvalue"].Captures[i].Value;
            switch (value)
            {
            case "p":
                if (value2 != "=")
                {
                    Log.Error($"Attempt to compare p instead of assigning in rule {rawString}");
                }
                weight = float.Parse(value3);
                continue;
            case "priority":
                if (value2 != "=")
                {
                    Log.Error($"Attempt to compare priority instead of assigning in rule {rawString}");
                }
                priority = float.Parse(value3);
                continue;
    ...
Reiquard commented 10 months ago

https://github.com/Ludeon/RimWorld-ru/pull/1586#issuecomment-1784136211

Это не совсем так. При парсинге строки выполнятся код, который воспринимает p всё-таки как вес. А для приоритета - в строке должно быть priority

Тем не менее мне не удалось по результатам многочисленных генераций увидеть ни одной иной строки, даже если поставить p=1.1, что и привело меня к такому выводу. Ошибочен этот вывод или нет, но если оставить эти параметры как в оригинале, то в генерации будет участвовать лишь эта строка: https://github.com/Ludeon/RimWorld-ru/blob/e7b5bf981efa537925122b70e1e6c0b4778a8355/Ideology/DefInjected/IdeoStoryPatternDef/RulePacks_Ideo_Description.xml#L182

Elevator89 commented 10 months ago

#1586 (comment)

Это не совсем так. При парсинге строки выполнятся код, который воспринимает p всё-таки как вес. А для приоритета - в строке должно быть priority

Тем не менее мне не удалось по результатам многочисленных генераций увидеть ни одной иной строки, даже если поставить p=1.1, что и привело меня к такому выводу. Ошибочен этот вывод или нет, но если оставить эти параметры как в оригинале, то в генерации будет участвовать лишь эта строка:

https://github.com/Ludeon/RimWorld-ru/blob/e7b5bf981efa537925122b70e1e6c0b4778a8355/Ideology/DefInjected/IdeoStoryPatternDef/RulePacks_Ideo_Description.xml#L182

Надо разобраться в этом поведении. Насколько я смог увидеть, для грамматик описания идеолигий выполняется код, отличный от остальных грамматик:

IComparer<RuleEntry> comparer = Comparer<RuleEntry>.Create((RuleEntry a, RuleEntry b) => customComparer.Compare(a.rule, b.rule)).ThenBy(Comparer<RuleEntry>.Create((RuleEntry a, RuleEntry b) => a.SelectionWeight.CompareTo(b.SelectionWeight)).Descending());
tmpSortedRuleList.Clear();
foreach (RuleEntry item in list)
{
    if (ValidateRule(constants, extraTags, resolvedTags, item, customizer) && item.Priority == maxPriority)
    {
        tmpSortedRuleList.Add(item);
    }
}
tmpSortedRuleList.Shuffle();
tmpSortedRuleList.TryMinBy((RuleEntry x) => x, comparer, out var value);
return value;

В нём, если упростить, список правил сортируется (в том числе) по весу и берётся правило, первое по списку. А другие при прочих равных - игнорируются. Это похоже на баг. Сообщу разрабам

Elevator89 commented 10 months ago

Вынеси, пожалуйста, удаление констрейнтов вида (p=2) в отдельный реквест. Ибо оно не имеет отношения к облагораживанию описаний, а является временным средством для исправления последствий бага, допущенного разрабами