Guest User

Untitled

a guest
Mar 15th, 2021
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 38.06 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using TMPro;
  5. using UnityEngine;
  6. using Random = System.Random;
  7.  
  8. namespace WordGen {
  9.     // TODO:
  10.     // У героя есть 3 второстепенных персонажа, к которым он либо хорошо относится либо плохо. Для отношения нужна причина. В конце хорошие персонажи получают хорошее, а плохие плохое.
  11.     // Часто герой в процессе приключений получает суперсилу. Так что суперсила это должно быть игровое понятие.
  12.     // Как правило героя есть цель и антогонист, и его три приспешника. Герой по очареди побеждает преспешников (ну или тяжелые ситуации) а затем самого антогониста и выполняет цель.
  13.     // Тут намешаны сразу две программы в одну Генератор относительно случайных (хотя возможно тематических) текстов. И генератор историй. Для второго всякие падежи и склонения не нужны вообще.
  14.     // Делать генератор сюжетов вероятно легче всего поверх игровой модели-симуляции. Тоесть по сути эти зеро-бейсед игра-рогалик к которой подключен текстовый описатель, который умеет описывать игровые объекты словами. По сути в игре вывод на экран заменили выводом текста. Првда литературным вариантом.
  15.     // Персонажи обладают знаниями
  16.     // В сеттинге часто есть ПРАВИЛА МИРА:. Суперсила позволяет их нарушать.
  17.     // Некотрые персонажей ГГ знает до начала истории, а с другими он как правило встречается по мере странствий, взаимодействует и в итоге формиурует отношение. Как правило они либо помогают игроку в беде, либо вредят в достижении дела.
  18.     // местоимения
  19.     // кроме местоимений также есть указание принадлежности: мой, его, её итд. Это крайне часто употребляется в повестовании. Конечно это надо делатъ не рандомно, а например каждому существу сделать инвентарь.
  20.     // для разных сеттингов разные словари + базовый общий со словами вроде (идти, смотреть, дом, стул, стол итп.)
  21.     // Если мы вводим в повестование какую-то новую сущность, то нужно её тогда немного описать, особенно в первый раз. И затем держать в голове. Тоесть все повестоватние нужно запоминать. Также старые сущности могут реагировать на новые.
  22.     // Вставить словарь готовых слов либо как-то автоматизировать склонение и спряжение чтоб не вбивать вручную
  23.     // как-то связать слова в группы по темам с которыми они связаны например если повестование идёт про море, то шансы появление слов связанных с морем повышаются.
  24.     // Связать слова между собой, так как они чаще всего употребляются. Например шмыгать + носом или закатить глаза/истерику. Часто вариантов совсем не много.
  25.     // Как-то ввести отношение героя/расказчика к предметам и другим персонажам. А так же довать оценку хорошо/плохо. Так же все действия тоже имеют градацию вредят они или опмогают кому-то: Тоесть ГГ будет вредить врагам и помагать друзьям.
  26.     // простовой вид знаний это состовные части объектов. Например у розы есть шипы. У человека есть части тела, как и уживотных. У животных есть хвост. У бокала ножка. Бокал сделан из стекла. Итд итп. Хоть ПРОЛОГ подрубай.
  27.     // Давать игроку выбор. Развилки сюжета.
  28.     // С помощью ГУИ можно легко и быстро связть по группам слова и связать друг с дружкой глаголы, сущ. и прил. Это было бы крайне полезно в качестве хинтов для увеличения вероятности использования вместе.
  29.     // special Verbs like say, talk, see, love, hate, live, deside etc should be available with no search by static ref
  30.     // ensure names are uniq (use replacement names by collision or just generate the on fly from lattters) (or use nicknames from adj + noun)
  31.     // Verb, Noun, Adj and Adverb must inheiret common abstract class Word
  32.     // Очень часто удачно выпадает лишь часть истории. Нужна возможность перебросить кости на некотрых моментах или наоборот частично сохранять или устанавливать в ручную некотрые конкретные поля
  33.     public class StoryTeller : MonoBehaviour {
  34.         public TextMeshPro txt;
  35.         public bool consoleOutput = false;
  36.  
  37.         const int adverb_chance = 5;
  38.  
  39.         public static Random rand = new Random();
  40.  
  41.         Story story;
  42.  
  43.         public void TellStory() {
  44.             story = GetComponent<StoryMaker>().story;
  45.             MakeDetails();
  46.             txt.text = "";
  47.  
  48.             Chapter1();
  49.  
  50.             if (consoleOutput) {
  51.                 Debug.Log(txt.text);
  52.             }
  53.         }
  54.  
  55.         void Chapter1() {
  56.             var vvv = WordsDB.verbs.Where(vv => vv.semantic_src == Semantic.CREATURE && string.IsNullOrEmpty(vv.casus)).ToList();
  57.             vvv.Shuffle();
  58.             Verb live = vvv.First();
  59.             Verb damsel_verb = WordsDB.RandomVerb(Effect.GOOD);
  60.             Adjective hero_adj = WordsDB.RandomAdjective();
  61.             Adjective damsel_adj = WordsDB.RandomAdjective();
  62.             Verb damsel_reacts = WordsDB.RandomVerb(Effect.GOOD);
  63.  
  64.             Log(Title(), true, false);
  65.             Log("", true, false);
  66.             Log("    ", false, false);
  67.             Log(Intro(live));
  68.             Log(DescByAdj(story.hero.name, hero_adj));
  69.             Log(Related(story.damsel.name, story.hero.home));
  70.             Log(FirstWordConfirmation() + IntroduceDamsel(damsel_adj));
  71.             Log(AdoreDamsel(hero_adj, damsel_verb, damsel_adj));
  72.             Log(Coin() ? TalkToDamsel1(damsel_adj) : TalkToDamsel2(damsel_adj));
  73.             Log(DamselReacts(damsel_adj, damsel_reacts, hero_adj));
  74.  
  75.             Log("\n", true, false);
  76.  
  77.             Adjective antogonist_adj = WordsDB.RandomAdjective();
  78.             Verb evil_to_damsel = WordsDB.RandomVerb(Effect.BAD);
  79.  
  80.             Log("    ", false, false);
  81.             Log(AntogonistComes(live, antogonist_adj));
  82.             string union = Coin() ? ", поэтому " : ", то ";
  83.             Log(RandomReason(story.antogonist.name, antogonist_adj) + union + RandomAction(story.antogonist.name.uniqueName, evil_to_damsel, story.damsel.name));
  84.             Log(PoorDamsel(damsel_adj, evil_to_damsel), false, false);
  85.             Log(HeroReactsEvilDeed(damsel_adj, evil_to_damsel));
  86.             Log(NeverHappenedInCity(antogonist_adj));
  87.  
  88.             Log("\n", true, false);
  89.  
  90.             Log(HeroFightsAntogonist());
  91.             Log(AntogonistPunishment(antogonist_adj));
  92.             Log(DamselRewardsHero(antogonist_adj));
  93.             Log("\n\nКОНЕЦ", true, false);
  94.  
  95.             // Или еще короче:
  96.             // тогда вответ на то плохое что сделал Злодей Любаве, ГГ сделал плохое Злодею.
  97.             // И любава за это сделала хорошее Герою.
  98.             // А злодей получил Наказание.
  99.             // А любава и ГГ получили награду.
  100.  
  101.             //                ГГ думал что же делать.
  102.             //                Но Злодей уже успел удрать из Родины на Чужбину.
  103.             //                Кроме того злодей похитил Любаву.
  104.             //                Любава нужна Злодею для альтернативного фактора.
  105.             //                Это была угроза не только Любаве, но и Родине.
  106.             //                ГГ осознал что любава теперь несчатна.
  107.             //                Только сделав Подвиг с помощью Артефакт ГГ сможет снова сделать Любаву счастливой и спасти Родину.
  108.             //                ГГ отправился на чужбину для этого и покинул Родину.
  109.             //                Путь пролегал через Опасное_Место.
  110.             //                В опасном Месте с ГГ случилось испытание.
  111.             //                ГГ одолел испытание и смог отправится дальше.
  112.             //                На подходе к Чужбине с ГГ случилось еще одно испытание.
  113.             //                Еле одолев его ГГ получил Артефакт.
  114.             //                Прибыв на чужбину наконец ГГ сразился с Злодей.
  115.             //                ГГ почти проиграл так как злодей был очень силён.
  116.             //                Но затем ГГ применил Артефакт и победил злодея.
  117.             //                ГГ получил награду.
  118.             //                Любава поблагорадила ГГ.
  119.             //                Со злодеем в накзание случилось плохое.
  120.             //                После наказания Злодея с Чужбиной случилось плохое.
  121.             //                Вместе с Любавой они вернулись на Родину.
  122.             //                Раньше на родине ГГ и Любава были обычные и не могли делать хорошее.
  123.             //                А теперь на Родине ГГ и Любава стали важными и на родине им стало очень хорошо.
  124.             //                КОНЕЦ.
  125.  
  126.         }
  127.  
  128.  
  129.         void Log(object o, bool nl = false, bool point = true) {
  130.             txt.text += CapitalizeFirst(o + (point ? "." : ""));
  131.             txt.text += nl ? "\n" : " ";
  132.         }
  133.  
  134.         public static bool Coin() {
  135.             return rand.NextDouble() < 0.5;
  136.         }
  137.  
  138.         static bool Chance(int chance) {
  139.             return rand.NextDouble() * 100 < chance;
  140.         }
  141.  
  142.         static string CapitalizeFirst(string str) {
  143.             if (string.IsNullOrEmpty(str)) {
  144.                 return str;
  145.             }
  146.  
  147.             string capital = str[0] + "";
  148.             capital = capital.ToUpper();
  149.             string end = "";
  150.             if (str.Length > 1) {
  151.                 end = str.Substring(1);
  152.             }
  153.  
  154.             return capital + end;
  155.         }
  156.  
  157.  
  158.         void MakeDetails() {
  159.             story.hero.name = WordsDB.RandomHeroName(Coin() ? Genus.MALE : Genus.FEMALE);
  160.             story.hero.job = WordsDB.nouns.Where(n => n.semantic == Semantic.CREATURE && n.genus == story.hero.name.genus).ToList().Rand();
  161.  
  162.             story.hero.home = WordsDB.RandomNoun(Semantic.LOCATION);
  163.             story.hero.home.uniqueName = WordsDB.RandomNoun(Semantic.TOPONIM);
  164.            
  165.  
  166.             story.damsel.name = WordsDB.RandomNoun(Semantic.CREATURE);
  167.             story.damsel.name.uniqueName = WordsDB.RandomHeroName(story.damsel.name.genus);
  168.  
  169.             story.antogonist.name = WordsDB.RandomNoun(Semantic.CREATURE);
  170.             story.antogonist.name.uniqueName = WordsDB.RandomHeroName(story.antogonist.name.genus);
  171.  
  172.  
  173.         }
  174.  
  175.         string FirstWordConfirmation() {
  176.             List<string> ss = new List<string>() { "всяко", "взаправду", "без сомнений", "определённо", "однозначно", "явно", "абсолютно", "правда",
  177.                 "в самом деле", "вне всякого сомнения", "в самом деле", "да-да", "ух как", "ах как", "ох как", "ах", "ох", "ух" };
  178.             ss.Shuffle();
  179.             return (Chance(33) ? "и " : "") + ss.First() + " ";
  180.         }
  181.  
  182.         public string Title() {
  183.             List<string> ss = new List<string>() { "История", "Сага", "Сказание", "Повесть", "Рассказ", "Очерк", "Баллада", "Былина", "Легенда",
  184.                 "Миф", "Сказ", "Небылица", "Опус", "Эссе", "Быль", "Летопись", "Писание", "Эпос", "Песнь", "Новелла", "Ода", "Трагедия", "Эпопея",
  185.                 "Ужас", "Поэма", "Эпиграмма", "Роман", "Гримдарк фентези", "Фентези", "Славянское фентези", "Шедевр", "Басня", "Былица", "Комедия",
  186.                 "Пьеса", "Откровение", "Пророчество", "Славяно-арийское фентези", "Славянское гримдарк фентези", "Славянское запрещённое фентези" };
  187.             ss.Shuffle();
  188.  
  189.             string job = Coin() ? "" : story.hero.job.accusativ + " ";
  190.             string title = ss.First() + " про " + job + story.hero.name.accusativ + " из " + story.hero.home.genetiv;
  191.             title += " " + Quotes(story.hero.home.uniqueName.nominativ);
  192.  
  193.            
  194.             title += ": " + CapitalizeFirst(story.hero.job.nominativ) + ", " + CapitalizeFirst(story.damsel.name.nominativ) + " и " + CapitalizeFirst(story.antogonist.name.nominativ);
  195.  
  196.  
  197.             return title;
  198.         }
  199.  
  200.         string Quotes(string str) {
  201.             return "«" + str + "»";
  202.         }
  203.  
  204.  
  205.  
  206.         string Intro(Verb live) {
  207.             string sentence = "";
  208.             var adverbs = WordsDB.adverbs.Where(a => a.type == Adverb.Type.TIME).ToList();
  209.             adverbs.Shuffle();
  210.             sentence += adverbs.First().txt;
  211.             sentence += " в ";
  212.  
  213.             var adj = WordsDB.RandomAdjective();
  214.  
  215.             sentence += adj.Conj(story.hero.home.genus, Casus.L) + " ";
  216.  
  217.             sentence += story.hero.home.locativ;
  218.             sentence += " " + Quotes(story.hero.home.uniqueName.nominativ);
  219.  
  220.             if (Chance(adverb_chance)) {
  221.                 sentence += " " + WordsDB.RandomAdverb();
  222.             }
  223.  
  224.  
  225.             sentence += " " + live.Past(story.hero.name.genus) + " ";
  226.             sentence += story.hero.job.nominativ + " ";
  227.             sentence += story.hero.name.nominativ;
  228.  
  229.             return sentence;
  230.         }
  231.  
  232.         string Desc(Noun n) {
  233.             return Coin() ? DescByAdj(n, WordsDB.RandomAdjective()) : DescByVerb(n);
  234.         }
  235.  
  236.         string DescByVerb(Noun n) {
  237.             string sentence = "";
  238.  
  239.             sentence += n.nominativ;
  240.  
  241.             Verb v = WordsDB.RandomVerb(n.semantic);
  242.             sentence += " " + v.Past(n.genus);
  243.  
  244.             sentence += " " + AddNounToVerbIfPossible(v, WordsDB.RandomNoun());
  245.  
  246.             return sentence;
  247.         }
  248.  
  249.         string DescByAdj(Noun n, Adjective adj) {
  250.             string sentence = "";
  251.  
  252.             sentence += n.FullNameNominativ();
  253.  
  254.             Verb to_be = WordsDB.verbs.Find(v => v.infinitiv == "быть");
  255.  
  256.             sentence += " " + to_be.Past(n.genus) + " ";
  257.  
  258.             if (Coin()) {
  259.                 sentence += Coin() ?  "очень" : "чрезвычайно";
  260.                 sentence += " ";
  261.             } else if (Chance(adverb_chance)) {
  262.                 sentence += WordsDB.RandomAdverb() + "-";
  263.             }
  264.  
  265.            
  266.             sentence += adj.Conj(n.genus, Casus.N);
  267.  
  268.             n.props.Add(adj);
  269.  
  270.             return sentence;
  271.         }
  272.  
  273.         static string RandomAction(Noun n, Verb verb, Noun optional_skazuemoe) {
  274.             return n.nominativ + " " + RandomAction(n.semantic, n.genus, verb, optional_skazuemoe);
  275.         }
  276.  
  277.         static string RandomAction(Semantic who, Genus gender, Verb verb, Noun optional_skazuemoe) {
  278.             string sentence = "";
  279.  
  280.             if (Chance(20)) {
  281.                 sentence += WordsDB.RandomAdverb().txt + " ";
  282.             }
  283.  
  284.             sentence += verb.Past(gender);
  285.             sentence += AddNounToVerbIfPossible(verb, optional_skazuemoe);
  286.  
  287.             return sentence;
  288.         }
  289.  
  290.         static string AddNounToVerbIfPossible(Verb verb, Noun optional_skazuemoe) {
  291.             string sentence = "";
  292.             if (!string.IsNullOrEmpty(verb.casus)) {
  293.                 sentence += " ";
  294.                 if (!string.IsNullOrEmpty(verb.prefix)) {
  295.                     sentence += verb.prefix;
  296.                     sentence += " ";
  297.                 }
  298.  
  299.                 sentence += verb.Sklonit(optional_skazuemoe);
  300.  
  301.                 if (optional_skazuemoe.uniqueName != null) {
  302.                     sentence += " " + verb.Sklonit(optional_skazuemoe.uniqueName);
  303.  
  304.                 }
  305.  
  306.  
  307.             }
  308.             return sentence;
  309.         }
  310.  
  311.         string RandomReason(Noun n, Adjective reason) {
  312.             string sentence = "";
  313.  
  314.             List<string> w = new List<string>() { "так как", "по той причине, что", "из-за того, что", "в виду того, что", "в связи с тем, что", "в следствии того, что", "одновременно с тем, что" };
  315.             w.Shuffle();
  316.  
  317.             sentence += w.First() + " " + DescByAdj(n, reason);
  318.  
  319.  
  320.             return sentence;
  321.         }
  322.  
  323.         string Judge(Noun who, Noun what, Verb v) {
  324.             string sentence = "";
  325.  
  326.             string decide = "решил";
  327.  
  328.             if (who.genus == Genus.FEMALE) {
  329.                 decide += "а";
  330.             }
  331.  
  332.             sentence += who.nominativ + " посмотрев как " + what.nominativ + " " + v.Past(what.genus) + " " + decide + " что " + what.nominativ + " " + WordsDB.RandomAdjective().Conj(what.genus, Casus.N);
  333.             return sentence;
  334.         }
  335.  
  336.         string LoveHate(bool pronoun, bool reason, Verb v, Noun optional_skazuemoe) {
  337.             string sentence = "";
  338.             sentence += !pronoun ? story.hero.name.nominativ : "она";
  339.             bool positive = rand.NextDouble() < 0.5f;
  340.             List<string> love = new List<string>() { "обожала", "очень любила", "любила", "предпочитала", "славилась тем что любила", "всё время любила" };
  341.             List<string> hate = new List<string>() { "терпеть не могла", "ненавидела", "больше всего не любила", "очень не любила", "ох как не любила", "кровь из глаз не любила" };
  342.  
  343.             var arr = positive ? love : hate;
  344.             arr.Shuffle();
  345.             sentence += " " + arr.First() + " ";
  346.  
  347.             sentence += RandomAction(Semantic.CREATURE, story.hero.name.genus, v, optional_skazuemoe);
  348.  
  349.             if (reason) {
  350.                 if (!positive) {
  351.                     var counter_reasons = new List<string>() {
  352.                         "но к сожалению ничего не могла с собой поделать",
  353.                         "но к своему глубочайшему сожалению не знала как этого избежать",
  354.                         "но из-дня в день это повторялось",
  355.                         "но к сожалению это прочно вошло в её жизнь",
  356.                         "но по другому не получалось",
  357.                         "но видимо такова уж была её судьба",
  358.                     };
  359.                     counter_reasons.Shuffle();
  360.                     sentence += ", " + counter_reasons.First() + " ";
  361.                 } else {
  362.                     var reasons = new List<string>() {
  363.                         "она это просто обожала",
  364.                         "это было её любимое занятие",
  365.                         "это она любила больше всего",
  366.                         "её нельзя было остановить когда она начинала"
  367.                     };
  368.                     reasons.Shuffle();
  369.                     sentence += ", " + reasons.First();
  370.                 }
  371.             }
  372.  
  373.             return sentence;
  374.         }
  375.  
  376.  
  377.  
  378.         string IntroduceDamsel(Adjective adj) {
  379.             string sentence = "";
  380.  
  381.             sentence += story.damsel.name.nominativ;
  382.  
  383.             if (Coin()) {
  384.                 sentence += " по имени";
  385.             }
  386.  
  387.             sentence += " " + story.damsel.name.uniqueName.nominativ;
  388.  
  389.             Verb to_be = WordsDB.verbs.Find(v => v.infinitiv == "быть");
  390.             sentence += " " + to_be.Past(story.damsel.name.genus) + " ";
  391.             sentence += adj.Conj(story.damsel.name.genus, Casus.I) + " ";
  392.  
  393.             sentence += story.damsel.name.genus == Genus.MALE ? "обитателем" : "обитательницей";
  394.             sentence += " " + story.hero.home.genetiv;
  395.  
  396.             return sentence;
  397.         }
  398.  
  399.         string AdoreDamsel(Adjective hero_adj, Verb v, Adjective damsel_adj) {
  400.             string sentence = "";
  401.  
  402.  
  403.             List<string> ss = new List<string>() {
  404.                 "любил", "обожал", "превозносил", "боготворил", "любил"
  405.             };
  406.  
  407.             string love = ss.Rand();
  408.             if (story.hero.name.genus == Genus.FEMALE) {
  409.                 love += "а";
  410.             }
  411.  
  412.             sentence += hero_adj.Conj(story.hero.name.genus, Casus.N) + " ";
  413.             sentence += story.hero.name.nominativ + " так сильно " + love + " " + story.damsel.name.accusativ + " " + story.damsel.name.uniqueName.accusativ;
  414.             sentence += ", что ";
  415.  
  416.             if (Chance(adverb_chance)) {
  417.                 sentence += WordsDB.RandomAdverb() + " ";
  418.                 if (Chance(adverb_chance)) {
  419.                     sentence += "и " + WordsDB.RandomAdverb() + " ";
  420.                 }
  421.  
  422.             }
  423.  
  424.             string deed_to_show_love = v.Past(story.hero.name.genus);
  425.             sentence += deed_to_show_love;
  426.             sentence += AddNounToVerbIfPossible(v, story.damsel.name);
  427.  
  428.             sentence += ", ведь " + story.damsel.name.PronounNominativSingular3() + " настолько " + damsel_adj.Conj(story.damsel.name.genus, Casus.N);
  429.  
  430.             return sentence;
  431.  
  432.         }
  433.  
  434.         string My(Genus g) {
  435.             switch (g) {
  436.                 case Genus.MALE:
  437.                     return "мой";
  438.                 case Genus.FEMALE:
  439.                     return "моя";
  440.                 case Genus.NEUTRAL:
  441.                     return "моё";
  442.                 case Genus.PLURAL:
  443.                     return "мои";
  444.                 default:
  445.                     return "мой";
  446.             }
  447.  
  448.         }
  449.  
  450.         string TalkToDamsel1(Adjective damsel_adj) {
  451.             Noun damsel = story.damsel.name.uniqueName;
  452.  
  453.             string see = "видел";
  454.             string talk = "говорил";
  455.  
  456.             if (story.hero.name.genus == Genus.FEMALE) {
  457.                 see += "а";
  458.                 talk += "а";
  459.             }
  460.  
  461.  
  462.             string sentence = "Когда " + story.hero.name.nominativ + " " + see + " " + damsel.accusativ + " то "
  463.                               + story.hero.name.PronounNominativSingular3() + " всё время восхищённо " + talk + ": «";
  464.  
  465.             Genus gender = damsel.genus;
  466.             sentence += CapitalizeFirst(My(gender)) + " " + WordsDB.RandomAdjective().Conj(gender, Casus.N) + " " + damsel.nominativ + ", ты просто ";
  467.  
  468.             if (Coin()) {
  469.                 sentence += "как ";
  470.             }
  471.  
  472.             Noun compare = WordsDB.nouns.Where(x => x.semantic != Semantic.HERO).ToList().Rand();
  473.             sentence += WordsDB.RandomAdjective().Conj(compare.genus, Casus.N) + " " + compare.nominativ + "! ";
  474.  
  475.             sentence += "Ах ты " + My(compare.genus) + " " + damsel_adj.Conj(compare.genus, Casus.N) + ", ";
  476.             sentence += WordsDB.RandomAdjective().Conj(compare.genus, Casus.N) + " и ";
  477.             sentence += WordsDB.RandomAdjective().Conj(compare.genus, Casus.N) + " ";
  478.             sentence += compare.nominativ + "! ";
  479.             sentence += "Ах! Я " + WordsDB.RandomVerb(Effect.GOOD).singular_1 + " и " + WordsDB.RandomVerb(Effect.GOOD).singular_1 + " когда я рядом с тобой!";
  480.  
  481.  
  482.             sentence += "»";
  483.  
  484.  
  485.             return sentence;
  486.         }
  487.  
  488.         string TalkToDamsel2(Adjective damsel_adj) {
  489.             Noun damsel = story.damsel.name.uniqueName;
  490.  
  491.             string see = "видел";
  492.             string talk = "говорил";
  493.  
  494.             if (story.hero.name.genus == Genus.FEMALE) {
  495.                 see += "а";
  496.                 talk += "а";
  497.             }
  498.  
  499.  
  500.             string sentence = "Когда " + story.hero.name.nominativ + " " + see + " " + damsel.accusativ + " то "
  501.                               + story.hero.name.PronounNominativSingular3() + " всё время восхищённо " + talk + ": «";
  502.  
  503.             Genus gender = damsel.genus;
  504.             sentence += CapitalizeFirst(My(gender)) + " " + WordsDB.RandomAdjective().Conj(gender, Casus.N) + " " + damsel.nominativ + ", ты просто ";
  505.  
  506.             if (Coin()) {
  507.                 sentence += "как ";
  508.             }
  509.  
  510.             Noun compare = WordsDB.nouns.Where(x => x.semantic != Semantic.HERO).ToList().Rand();
  511.             sentence += WordsDB.RandomAdjective().Conj(compare.genus, Casus.N) + " " + compare.nominativ + "! ";
  512.  
  513.             sentence += "Ах ты " + My(compare.genus) + " " + damsel_adj.Conj(compare.genus, Casus.N) + " ";
  514.             sentence += compare.nominativ + ", когда тебя нет рядом я ";
  515.             sentence += WordsDB.RandomVerb(Effect.BAD).singular_1 + ", " + WordsDB.RandomVerb(Effect.BAD).singular_1 ;
  516.             sentence += " и " + WordsDB.RandomVerb(Effect.BAD).singular_1 + "! Без " + compare.genetiv + " я просто " + WordsDB.RandomVerb(Effect.BAD).singular_1 + "!";
  517.  
  518.             sentence += "»";
  519.  
  520.  
  521.             return sentence;
  522.         }
  523.  
  524.  
  525.         string DamselReacts(Adjective damsel_adj, Verb damsel_reaction, Adjective hero_adj) {
  526.             string sentence = "Слыша это " + damsel_adj.Conj(story.damsel.name.genus, Casus.N) + " " + story.damsel.name.FullNameNominativ() + " ";
  527.             sentence += Coin() ? "всегда" : "каждый раз";
  528.  
  529.             sentence += " " + WordsDB.adverbs.Where(x => x.type != Adverb.Type.TIME).ToList().Rand() + "-";
  530.             sentence += WordsDB.adverbs.Where(x => x.type != Adverb.Type.TIME).ToList().Rand();
  531.  
  532.             sentence += " " + damsel_reaction.Past(story.damsel.name.genus);
  533.             sentence += AddNounToVerbIfPossible(damsel_reaction, story.hero.name);
  534.             sentence += ", ведь ";
  535.             sentence += story.hero.name.genus == Genus.MALE ? "тот" : "та";
  536.             sentence += " ";
  537.             sentence += story.hero.name.genus == Genus.MALE ? "был" : "была";
  538.             sentence += " ";
  539.             sentence += hero_adj.Conj(story.hero.job.genus, Casus.I);
  540.             sentence += " ";
  541.             sentence += story.hero.job.instrumentalis;
  542.             return sentence;
  543.         }
  544.  
  545.         string PoorDamsel(Adjective damsel_adj, Verb evil_deed) {
  546.             string sentence = "" + damsel_adj.Conj(story.damsel.name.genus, Casus.N) + " " + story.damsel.name.FullNameNominativ() + " ";
  547.  
  548.             sentence += story.damsel.name.genus == Genus.MALE ? "не мог" : "не могла";
  549.             sentence += " поверить что " + story.antogonist.name.FullNameNominativ() + " ";
  550.             sentence += Coin() ? "взаправду" : " на самом деле";
  551.             sentence += " " + evil_deed.Past(story.antogonist.name.genus);
  552.             if (!string.IsNullOrEmpty(evil_deed.prefix)) {
  553.                 sentence += " " + evil_deed.prefix + " " + story.damsel.name.Conj(evil_deed.casus);
  554.             } else {
  555.                 // TODO: conj pronouns
  556.                 sentence += " " + (story.damsel.name.genus == Genus.MALE ? "его" : "её");
  557.             }
  558.  
  559.  
  560.             List<string> ss = new List<string>() {
  561.                 ". Но это было так!",
  562.                 ". Но это уже случилось!",
  563.                 ". Но это теперь свершившийся факт!",
  564.                 ". Но уже ничего не поменять!",
  565.                 ". Но что сделано то сделано!",
  566.                 ". Но это уже произошло!",
  567.                 ". Но ничего уже не изменить!",
  568.                 ". Но это произошло!",
  569.                 ". Но это факт!",
  570.                 ". Но вот так вот теперь!",
  571.                 ". Но что ж теперь делать!?",
  572.                 ". Но сделанного не обратить вспять!",
  573.                 ". Но деяние свершилось!",
  574.                 ". Но это уже случилося!",
  575.                 ". Но ох и ах, ух и э-хе-хе, теперь то поздно что-то выправлять!"
  576.             };
  577.             sentence += ss.Rand();
  578.  
  579.             return sentence;
  580.         }
  581.  
  582.         string HeroReactsEvilDeed(Adjective damsel_adj, Verb evil_deed) {
  583.             string sentence = "";
  584.  
  585.             List<string> ss = new List<string>() {
  586.                 "узнав что", "прослышав про то как", "прознав о том что", "получив информацию что", "увидев как", "услышав как", "пронюхав что"
  587.             };
  588.  
  589.             sentence += ss.Rand() + " " + story.antogonist.name.FullNameNominativ() + " " + evil_deed.Past(story.antogonist.name.genus);
  590.  
  591.             sentence += AddNounToVerbIfPossible(evil_deed, story.damsel.name);
  592.             sentence += ", " + story.hero.name.FullNameNominativ() + " ";
  593.             sentence += story.hero.name.genus == Genus.MALE ? "был готов" : "была готова";
  594.             Verb revenge_idea = WordsDB.verbs.Where(v => v.effect == Effect.BAD && !string.IsNullOrEmpty(v.casus)).ToList().Rand();
  595.             sentence += " " + revenge_idea.infinitiv;
  596.             sentence += AddNounToVerbIfPossible(revenge_idea, story.antogonist.name.uniqueName);
  597.             sentence += " и " + WordsDB.RandomVerb(Effect.BAD).infinitiv;
  598.             sentence += Coin() ? " от ярости" : " от гнева";
  599.  
  600.             return sentence;
  601.         }
  602.  
  603.         string Related(Noun a, Noun b) {
  604.             string sentence = "";
  605.             List<string> ss = new List<string>() { "наверняка", "доподленно известно", "известно", "каждый знает", "как обычно", "постоянно", "взаимосвязанно", "два сапога пара", ""};
  606.             ss.Shuffle();
  607.             sentence += ss.First();
  608.             if (!string.IsNullOrEmpty(sentence)) {
  609.                 sentence += " ";
  610.             }
  611.  
  612.             ss = new List<string>() { "есть", "найдётся", "имеется", "в наличии", "находится", "будет", "в распоряжении"};
  613.             ss.Shuffle();
  614.             string frist = Coin() ? ss.First() + " " : "";
  615.  
  616.             ss = new List<string>() { "есть", "найдётся", "имеется", "в наличии", "находится", "обитает", "живёт", "будет", "в распоряжении" };
  617.             ss.Shuffle();
  618.             string second = ss.First();
  619.  
  620.             sentence += "где " + frist + b.nominativ + ", всегда " + second + " и " + a.nominativ;
  621.  
  622.             return sentence;
  623.         }
  624.  
  625.         string AntogonistComes(Verb live, Adjective antogonist_adj) {
  626.             string sentence = WordsDB.adverbs.Where(x => x.type == Adverb.Type.TIME).ToList().Rand().txt;
  627.             sentence +=  " в " + story.hero.home.accusativ + " " + Quotes(story.hero.home.uniqueName.accusativ);
  628.  
  629.             sentence += ", где " + live.Past(story.hero.name.genus) + " " + story.hero.name.nominativ + ", ";
  630.  
  631.             Noun antogonist = story.antogonist.name;
  632.  
  633.             sentence += antogonist.genus == Genus.MALE ? "прибыл" : "прибыла";
  634.  
  635.             sentence += " " + antogonist_adj.Conj(antogonist.genus, Casus.N) + " " + antogonist.FullNameNominativ();
  636.  
  637.  
  638.  
  639.  
  640.  
  641.             return sentence;
  642.         }
  643.  
  644.  
  645.         string NeverHappenedInCity(Adjective antogonist_adj) {
  646.             string sentence = "такое еще никогда не происходило в " + story.hero.home.locativ + " " + Quotes(story.hero.home.uniqueName.locativ) + ".";
  647.  
  648.             var gender = story.antogonist.name.genus;
  649.             sentence += " Да, " + story.antogonist.name.FullNameNominativ() + " ";
  650.             sentence += gender == Genus.MALE ? "был" : "была";
  651.             sentence += Coin() ? " действительно" : " поистине";
  652.             sentence += " " + antogonist_adj.Conj(gender, Casus.I);
  653.             sentence += " и " + WordsDB.adjectives.Where(x => x.effect == Effect.BAD).ToList().Rand().Conj(gender, Casus.I);
  654.  
  655.             return sentence;
  656.         }
  657.  
  658.         string HeroFightsAntogonist() {
  659.             string sentence = story.hero.name.nominativ + " более не медля ";
  660.  
  661.             var gender = story.hero.name.genus;
  662.             Verb revenge_of_hero = WordsDB.verbs.Where(v => !string.IsNullOrEmpty(v.casus) && v.effect == Effect.BAD).ToList().Rand();
  663.             sentence += revenge_of_hero.Past(gender);
  664.             sentence += " " + WordsDB.RandomNoun(Semantic.OBJECT).instrumentalis;
  665.             sentence += AddNounToVerbIfPossible(revenge_of_hero, story.antogonist.name.uniqueName);
  666.             sentence += " а затем и вовсе ";
  667.  
  668.             Verb fatality = WordsDB.verbs.Where(v => !string.IsNullOrEmpty(v.casus) && v.effect == Effect.BAD).ToList().Rand();
  669.             sentence += fatality.Past(gender);
  670.             sentence += " " + WordsDB.RandomNoun(Semantic.OBJECT).instrumentalis;
  671.             sentence += AddNounToVerbIfPossible(fatality, story.antogonist.name);
  672.  
  673.             return sentence;
  674.         }
  675.  
  676.         string AntogonistPunishment(Adjective adj) {
  677.             string sentence = "так ";
  678.  
  679.             sentence += WordsDB.adverbs.Where(x => x.type != Adverb.Type.TIME).ToList().Rand() + "-";
  680.             sentence += WordsDB.adverbs.Where(x => x.type != Adverb.Type.TIME).ToList().Rand() + " ";
  681.  
  682.             sentence += story.antogonist.name.FullNameNominativ() + " ";
  683.             var gender = story.antogonist.name.genus;
  684.  
  685.             if (Coin()) {
  686.                 sentence += "и ";
  687.                 sentence += gender == Genus.MALE ? "умер" : "умерла";
  688.             } else {
  689.                 sentence += "навсегда ";
  690.                 sentence += gender == Genus.MALE ? "покинул" : "покинула";
  691.                 sentence += " " + story.hero.home.accusativ + " " + Quotes(story.hero.home.uniqueName.accusativ);
  692.             }
  693.  
  694.  
  695.  
  696.             return sentence;
  697.         }
  698.  
  699.         string DamselRewardsHero(Adjective adj) {
  700.             string sentence = "Ах ";
  701.             var gender = story.damsel.name.genus;
  702.             sentence += gender == Genus.MALE ? "каким " : "какой ";
  703.             sentence += WordsDB.adjectives.Where(x => x.effect == Effect.GOOD).ToList().Rand().Conj(gender, Casus.I) + " и ";
  704.             sentence += WordsDB.adjectives.Where(x => x.effect == Effect.GOOD).ToList().Rand().Conj(gender, Casus.I) + " ";
  705.             sentence += gender == Genus.MALE ? "стал " : "стала ";
  706.             sentence += adj.Conj(gender, Casus.N) + " ";
  707.             sentence += story.damsel.name.FullNameNominativ() + " после этого. Тот час же ";
  708.             sentence += gender == Genus.MALE ? "принялся " : "принялась ";
  709.             sentence += story.damsel.name.PronounNominativSingular3() + " ";
  710.             Verb reward_of_hero = WordsDB.verbs.Where(v => !string.IsNullOrEmpty(v.casus) && v.effect == Effect.GOOD).ToList().Rand();
  711.             sentence += reward_of_hero.infinitiv;
  712.             sentence += " и ";
  713.             reward_of_hero = WordsDB.verbs.Where(v => !string.IsNullOrEmpty(v.casus) && v.effect == Effect.GOOD).ToList().Rand();
  714.             sentence += reward_of_hero.infinitiv;
  715.             sentence += AddNounToVerbIfPossible(reward_of_hero, story.hero.name);
  716.             sentence += ", на что " + WordsDB.adverbs.Where(x => x.type != Adverb.Type.TIME).ToList().Rand() + " смотрели все в";
  717.             sentence += " " + story.hero.home.locativ;
  718.  
  719.  
  720.  
  721.  
  722.  
  723.             return sentence;
  724.         }
  725.  
  726.  
  727.        
  728.  
  729.  
  730.  
  731.  
  732.     }
  733. }
  734.  
Add Comment
Please, Sign In to add comment