Difference between revisions of "Bethesda Tutorial Dialogue/ru"
Jump to navigation
Jump to search
no edit summary
imported>Vitamant m |
imported>Vitamant |
||
Line 2: | Line 2: | ||
{{RussianPage|e}} | {{RussianPage|e}} | ||
{{Tutorial Index/ru | {{Tutorial Index/ru | ||
Line 12: | Line 11: | ||
}} | }} | ||
= | =Краткий обзор= | ||
В этой главе мы будем создавать диалоги к тренировочному квесту "Единственная надежда Бенду Оло". | В этой главе мы будем создавать диалоги к тренировочному квесту "Единственная надежда Бенду Оло". | ||
<br><br>Ты узнаешь: | <br><br>Ты узнаешь: | ||
* Как писать диалоги для Skyrim в Creation Kit. | * Как писать диалоги для Skyrim в Creation Kit. | ||
* Как привязать события к выбранным игроком | * Как привязать события к выбранным игроком темам диалога. | ||
=Представления диалогов= | =Представления диалогов= | ||
Line 22: | Line 21: | ||
Creation Kit визуализирует весь процесс создания диалога, предоставляя удобный интерфейс взаимодействия. | Creation Kit визуализирует весь процесс создания диалога, предоставляя удобный интерфейс взаимодействия. | ||
{{ | {{NewFeature|Если ты писал диалоги для предыдущих игр серии TES или Fallout 3, то можешь воспользоваться родной вкладкой {{ulink|Player_Dialogue_Tab|Player Dialogue}} (на самом деле, система диалогов осталась прежней, просто прячется за новым интерфейсом).}} | ||
{{WarningBox|Если ты намерен писать диалоги на языках не использующих латинский алфавит, то рекомендую сконцентрироваться на изучении именно этого способа, так как на данный момент (13 апреля 2012г.) Creation Kit отказывается адекватно отображать русскоязычный текст в представлении (да и не сам интерфейс скорее кривой, нежели удобный), что делает невозможным поддержку сложных диалогов. Если данную ошибку исправили - убери данную заметку со страницы - прим.переводчика}} | |||
Для начала, дважды щелкни по своему заданию (в нашем случае GSQ01), чтобы открыть окно квеста. Перейди на вкладку {{ulink|Dialogue_Views_Tab|Dialogue Views}}. Выглядеть это должно | Для начала, дважды щелкни по своему заданию (в нашем случае GSQ01), чтобы открыть окно квеста. Перейди на вкладку {{ulink|Dialogue_Views_Tab|Dialogue Views}}. Выглядеть это должно вот так: | ||
[[Image:EmptyDialogueTab.png|600px]] | [[Image:EmptyDialogueTab.png|600px]] | ||
Line 37: | Line 37: | ||
* '''{{ulink|Dialogue_Branch|Ветвь}}:''' Набор связанных по смыслу тем. | * '''{{ulink|Dialogue_Branch|Ветвь}}:''' Набор связанных по смыслу тем. | ||
* '''{{ulink|Topic|Тема}}:''' Выбираемая игроком тема диалога, на которую последует монолог персонажа. | * '''{{ulink|Topic|Тема}}:''' Выбираемая игроком тема диалога, на которую последует монолог персонажа. | ||
* '''{{ulink|Topic_Info|Монолог}}:''' Набор произносимых подряд | * '''{{ulink|Topic_Info|Монолог}}:''' Набор произносимых подряд рерлик. | ||
* '''[[Topic_Info/ru#The_Response_Form| | * '''[[Topic_Info/ru#The_Response_Form|Реплика]]:''' Одна строка монолога, произносимая NPC. Длина строки ограничена 150 символами. С ответом могут быть связаны эмоции и анимации, проигрываемые говорящим. | ||
Line 46: | Line 46: | ||
=Темы= | =Темы= | ||
Двойной ЛКМ по теме (рыжей полоске над серым пространством) откроет {{ulink|Topic Window|окно темы}}. | Двойной ЛКМ по теме (рыжей полоске над серым пространством) откроет {{ulink|Topic Window|окно темы}}. | ||
Line 53: | Line 52: | ||
Пока тебя интересует только поле "Topic Text". Его содержимое будет выведено игроку в качестве варианта диалога во время разговора с персонажем. Делаем из игрока стандартного героя-дурачка, готового помогать всем и каждому. Пишем: "Тебе чем-нибудь помочь?" | Пока тебя интересует только поле "Topic Text". Его содержимое будет выведено игроку в качестве варианта диалога во время разговора с персонажем. Делаем из игрока стандартного героя-дурачка, готового помогать всем и каждому. Пишем: "Тебе чем-нибудь помочь?" | ||
{{WarningBox|Как только поле ввода потеряет фокус, может выскочить окошко Check Spelling. Не пугайся. Это всего лишь окно проверки орфографии, которое не знает русских слов и будет постоянно тебя донимать. К сожалению, это донельзя кривой и неудобный инструмент даже в оригинале. Возможно, с ним можно было бы свыкнуться, однако он (на данный момент) на отрез отказывается корректно работать | {{WarningBox|Как только поле ввода потеряет фокус, может выскочить окошко Check Spelling. Не пугайся. Это всего лишь окно проверки орфографии, которое не знает русских слов и будет постоянно тебя донимать. К сожалению, это донельзя кривой и неудобный инструмент даже в оригинале. Возможно, с ним можно было бы свыкнуться, однако он (на данный момент) на отрез отказывается корректно работать кирилицей (например воспринимает букву "ч" в качестве разделителя). Так что самым правильным (возможно, временным) решением будет отключить проверку правописания и возложить всю ответственность на себя и редактора, если такой имеется. Для этого: | ||
# Закрой Creation Set | # Закрой Creation Set. | ||
# Перейди в каталог игры | # Перейди в каталог игры. | ||
# Открой файл SkyrimEditorPrefs.ini любым текстовым редактором (н.п. блокнотом). | # Открой файл SkyrimEditorPrefs.ini любым текстовым редактором (н.п. блокнотом). | ||
# Найди категорию [SpellCheck] | # Найди категорию [SpellCheck]. | ||
# Измени значение единственного параметра bSpellCheckEnabled с "1" на "0". Сохрани.}} | # Измени значение единственного параметра bSpellCheckEnabled с "1" на "0". | ||
# Сохрани изменения.}} | |||
Ниже расположена таблица монолога. Дважды щелкни по ней, чтобы создать новую фразу. | Ниже расположена таблица монолога. Дважды щелкни по ней, чтобы создать новую фразу. | ||
Line 66: | Line 66: | ||
В поле "Response Text" введи: "Странно, что вы спросили... Как раз недавно один грязный ворюга утащил мой амулет! Не могли бы вы... ммм... вернуть его?" | В поле "Response Text" введи: "Странно, что вы спросили... Как раз недавно один грязный ворюга утащил мой амулет! Не могли бы вы... ммм... вернуть его?" | ||
Теперь | Теперь щелкни по кнопке ОК внизу окна. Оно исчезнет, и ты увидишь новое - окно монолога. | ||
=Монологи= | =Монологи= | ||
Line 78: | Line 78: | ||
[[Image:ConditionItem.png]] | [[Image:ConditionItem.png]] | ||
Каждое из условий может быть либо ложным (False) либо истинным (True). Если все условия в списке истинны, монолог проходит проверку и появляется у персонажа. Твое условие будет простым и не замысловатым - нужно задать одного единственного | Каждое из условий может быть либо ложным (False) либо истинным (True). Если все условия в списке истинны, монолог проходит проверку и появляется у персонажа. Твое условие будет простым и не замысловатым - нужно задать одного единственного персонажа, которому была предназначена тема. Нужная проверка "GetIsID" выбрана по-умолчанию, так-как является наиболее часто используемой ввиду большого количества личных диалогов, привязанных к конкретным персонажам. Щелкни по здоровенной кнопке с надписью "INVALID" и выбери ID Бенду Оло: "GSQBenduOlo" (поле поддерживает быстрый поиск при вводе с клавиатуры). Затем нажми "ОК". | ||
{{InDepth|Особо обрати внимание и запомни, что условия задаются '''не''' для темы, выбираемой персонажем, а для '''ответного монолога'''. Если хоть один монолог проходит проверку - тема появляется в окне диалога. Но сама тема не содержит условий. Это кажется странным, но написав несколько собственных диалогов, ты поймешь, почему сделано именно так.}} | |||
[[Image:ConditionItemFilled.png]] | [[Image:ConditionItemFilled.png]] | ||
Вновь | Вновь нажми "OK" чтобы сохранить изменения и закрыть окно условий. Свежесозданное появится в списке. Теперь только Бенду сможет общаться на эту тему. Однако, ты ведь не хочешь, чтобы он делал это постоянно? Правильно, тема должна быть доступна только до момента взятия квеста. Добавляем еще одно условие. Уверен, ты запомнил, как это делается. | ||
Ограничим тему диалога еще и стадией квеста. В списке проверочных функций (Condition Function) выбери "GetStage". Затем кликни по любимой кнопке "INVALID" и выбери квест с нужным ID ("GSQ01"). Функция знает, что в качестве первого параметра ей должны передать ID квеста, а не чего-либо еще, поэтому других объектов в списке параметров не будет, только квесты. | Ограничим тему диалога еще и стадией квеста. В списке проверочных функций (Condition Function) выбери "GetStage". Затем кликни по любимой кнопке "INVALID" и выбери квест с нужным ID ("GSQ01"). Функция знает, что в качестве первого параметра ей должны передать ID квеста, а не чего-либо еще, поэтому других объектов в списке параметров не будет, только квесты. | ||
Теперь нужно задать метод сравнения результата функции с некоторым значением. | Теперь нужно задать метод сравнения результата функции с некоторым значением. У большинства людей первым желанием будет задать проверку на равенство ("==") с числом "0" (наша начальная стадия квеста). Но жесткое сравнение в программировании (а мы сейчас пишем своего рода программу) никогда не считалось хорошим тоном. Например, в последствии вы решите добавить еще одну стадию между "0" и "10", когда игрок еще не встретился с Бенду Оло, но, например, слышал слухи о том, что у бедняги украли амулет, и условие придется переписывать. Дабы этого избежать, и зная, что разговор Бенду Оло станет стадией квеста под номером "10", запишем условие так: "если стадия меньше 10". То есть меняем метод сравнения на "<" и значение на "10". | ||
[[Image:ConditionItemGetStage.png]] | [[Image:ConditionItemGetStage.png]] | ||
{{ | {{InDepth|Обрати внимание, что порядок следования условий можно изменять стрелками на клавиатуре "вправо" и "влево" (да, не логично) и аналогичными кнопками под нижним левым углом таблицы условий. В нашем случае порядок значения не имеет, но когда ты будешь составлять сложные условия связанные не только AND (и), но и OR (или), это будет играть важную роль.}} | ||
Вот что должно получиться у тебя в итоге: | Вот что должно получиться у тебя в итоге: | ||
Line 96: | Line 98: | ||
[[Image:TopicInfoWindowFilled.png|600px]] | [[Image:TopicInfoWindowFilled.png|600px]] | ||
Кнопкой ОК подтверждаешь изменения и | Кнопкой ОК подтверждаешь изменения и закрываешь окно монолога. Еще раз по ОК, закрывая окно темы. | ||
=Связи= | =Связи= | ||
И вот пред тобою вновь представление диалогов! Теперь уже не пустое. Если тебе захочется увидеть весь текст, отметь флажок "Show All Text" в нижней части окна. | И вот пред тобою вновь представление диалогов! Теперь уже не пустое. Если тебе захочется увидеть весь текст, отметь флажок "Show All Text" в нижней части окна. | ||
{{WarningBox|Ты ведь помнишь предупреждение относительно кириллицы? Вот и сравни то, что видишь ты, со скриншотом ниже.}} | |||
[[Image:DialogueViewWithStuff.png]] | [[Image:DialogueViewWithStuff.png]] | ||
Line 105: | Line 108: | ||
Теперь неплохо бы добавить игроку возможность ответить на просьбу Бенду о помощи. ПКМ в области ветви. Выбираешь "Add Topic." (Если "Add Topic" отсутствует, значит ты промахнулся и щелкнул не туда [см.картинку выше]) | Теперь неплохо бы добавить игроку возможность ответить на просьбу Бенду о помощи. ПКМ в области ветви. Выбираешь "Add Topic." (Если "Add Topic" отсутствует, значит ты промахнулся и щелкнул не туда [см.картинку выше]) | ||
Откроется новое окно редактирования темы. И вновь тебе придется ввести ID. Вводишь: "GSQ01MeetingBenduYes", в переводе, если игрок | Откроется новое окно редактирования темы. И вновь тебе придется ввести ID. Вводишь: "GSQ01MeetingBenduYes", в переводе, если игрок ответит "Да" на просьбу Бенду. В качестве текста укажи: "Конечно, я тебе помогу". Дважды щелкни по таблице монологов, чтобы добавить ответ, и собственно укажи сам ответ: "О, спасибо, спасибо вам огромное! Он убежал в сторону Reachwind Eyrie. Пожалуйста, скорее! Я... я выкуплю его у тебя, за двойную цену!" Нажми "ОК". | ||
Чтобы вернуться к редактированию дважды щелкни по ответу в списке Responses. Обрати внимание на список аудио-файлов в нижней части. | Чтобы вернуться к редактированию дважды щелкни по ответу в списке Responses. Обрати внимание на список аудио-файлов в нижней части. | ||
Line 111: | Line 114: | ||
[[Image:BadSoundExport.png|300px]] | [[Image:BadSoundExport.png|300px]] | ||
Поскольку, ты еще не задал ни одного условия, редактор отображает все доступные голоса, которыми может быть озвучена | Поскольку, ты еще не задал ни одного условия, редактор отображает все доступные голоса, которыми может быть озвучена реплика. Это существенно увеличивает затраты дискового пространства (и времени, если собираешься записывать голос [и если не собираешься, тоже...]). Закрываем окно редактирования фразы и добавляем новое условие. Функция GetIsID, проверяющая, что ID говорящего GSQBenduOlo (как и в предыдущем случае). Если ты теперь вновь откроешь редактирование фразы, то увидишь, что в списке звуковых наборов остался только MaleDarkElf. | ||
[[Image:GoodSoundExport.png|300px]] | [[Image:GoodSoundExport.png|300px]] | ||
Line 125: | Line 128: | ||
[[Image:UnconnectedDialogue.png|450px]] | [[Image:UnconnectedDialogue.png|450px]] | ||
Все имеющиеся темы расположены в одной ветви, но игра не имеет ни малейшего представления о том, как они | Все имеющиеся темы расположены в одной ветви, но игра не имеет ни малейшего представления о том, как они взаимодействуют. Так что теперь ты будешь учиться их связывать. Кликни по GSQ01MeetingBenduBranchTopic, чтобы сделать тему активной. Щелкни еще раз, теперь уже в области текста (курсор изменится на маленькую руку). Зажми ЛКМ и тащи линию к GSQ01MeetingBenduYes. Отпусти ЛКМ. Аналогичным образом свяжи начальную тему с GSQ01MeetingBenduNo. | ||
[[Image:ConnectedDialogue.png|450px]] | [[Image:ConnectedDialogue.png|450px]] | ||
Line 138: | Line 141: | ||
Дважды щелкни по тексту "О, спасибо..." под темой GSQ01MeetingBenduYes. (Заметь, что тебе сразу же открылось окно редактирования монолога, без промежуточного окна темы) | Дважды щелкни по тексту "О, спасибо..." под темой GSQ01MeetingBenduYes. (Заметь, что тебе сразу же открылось окно редактирования монолога, без промежуточного окна темы) | ||
В нижней части этого окна есть два поля: "Begin" и "End." Скрипт в первом выполняется, когда персонаж начинает произносить первую фразу, скрипт во втором - когда, заканчивает последнюю. (В терминологии скриптописания эти маленькие кусочки зовутся фрагментами скрипта | В нижней части этого окна есть два поля: "Begin" и "End." Скрипт в первом выполняется, когда персонаж начинает произносить первую фразу, скрипт во втором - когда, заканчивает последнюю. (В терминологии скриптописания эти маленькие кусочки зовутся фрагментами скрипта (см. {{ulink|Topic_Info_Fragments|Topic Info Fragments}} для дополнительной информации.) | ||
В поле End записывай следующие скриптовые команды (смотри не ошибись!): <br /> | В поле End записывай следующие скриптовые команды (смотри не ошибись!): <br /> | ||
Line 148: | Line 151: | ||
Функция <code>SetStage(10)</code>, как не трудно догадаться, устанавливает "10" текущей стадией квеста. Код <code>GetOwningQuest()</code> вернет экземпляр квеста, которому принадлежит диалог. Зачем это нужно? Затем, что игра не уверена, что ты хочешь изменить стадию именно этого квеста. Возможно, ты хочешь изменить стадию другого квеста, к которому текущий диалог не имеет никакого отношения. Приходится вдаваться в конкретику. | Функция <code>SetStage(10)</code>, как не трудно догадаться, устанавливает "10" текущей стадией квеста. Код <code>GetOwningQuest()</code> вернет экземпляр квеста, которому принадлежит диалог. Зачем это нужно? Затем, что игра не уверена, что ты хочешь изменить стадию именно этого квеста. Возможно, ты хочешь изменить стадию другого квеста, к которому текущий диалог не имеет никакого отношения. Приходится вдаваться в конкретику. | ||
Нажми кнопку "Compile" и в списке скриптов справа увидишь нечто | Нажми кнопку "Compile" и в списке скриптов справа увидишь нечто невнятное и трудно читаемое. Не обращай внимания. (Если ты все-таки ошибся в написании, вместо скрипта со странным названием, ты увидишь сообщение об ошибке). | ||
Перед закрытием окно должно выглядеть примерно так: | Перед закрытием окно должно выглядеть примерно так: | ||
Line 161: | Line 164: | ||
Тема с желто-рыжей плашкой наверху помечена как начальная тема ветви. Когда персонаж определяет, какие варианты вопросов и ответов предложить игроку, он проверяет все начальные темы на выполнение условий и выводит их, если таковые есть. Как ты помнишь, для начальной темы было задано условие: стадия квеста должна быть меньше 10. Когда игрок соглашается начать задание, ты изменяешь стадию квеста на 10, следовательно условие не выполняется и в списке возможных тем персонажа она не появится. | Тема с желто-рыжей плашкой наверху помечена как начальная тема ветви. Когда персонаж определяет, какие варианты вопросов и ответов предложить игроку, он проверяет все начальные темы на выполнение условий и выводит их, если таковые есть. Как ты помнишь, для начальной темы было задано условие: стадия квеста должна быть меньше 10. Когда игрок соглашается начать задание, ты изменяешь стадию квеста на 10, следовательно условие не выполняется и в списке возможных тем персонажа она не появится. | ||
Не- | Не-начальные темы, обычно, имеют куда более скудные списки условий, потому что выполняются только в том случае, если верны все условия стартовой темы. Поэтому мы указали в качестве условий только ID говорящего. и то лишь для того, чтобы не плодить дополнительных голосовых файлов. На самой игре его отсутствие никак бы не сказалось. | ||
Когда игрок выбирает тему без связанных с ней тем, игра снова ищет удовлетворяющие условиям верхние темы. Если ни одной темы не найдено, | Когда игрок выбирает тему без связанных с ней тем, игра снова ищет удовлетворяющие условиям верхние темы. Если ни одной темы не найдено, персонаж выходит из диалога. | ||
=Проверка результата= | =Проверка результата= | ||
Line 176: | Line 179: | ||
К счастью, все это очень просто исправить. | К счастью, все это очень просто исправить. | ||
=Запись | =Запись звуковой дорожки= | ||
Любым уже известным тебе способом открой окно редактирования первой фразы Бенду в теме GSQ01MeetingBenduBranchTopic. В нижней части окна притаилась неприметная кнопка записи: "Record". | Любым уже известным тебе способом открой окно редактирования первой фразы Бенду в теме GSQ01MeetingBenduBranchTopic. В нижней части окна притаилась неприметная кнопка записи: "Record". | ||
[[File:RecordButton.jpg|200px]] | [[File:RecordButton.jpg|200px]] | ||
Нажми на нее. Если микрофон подключен к компьютеру, можешь самостоятельно озвучить фразу. Если | Нажми на нее. Если микрофон подключен к компьютеру, можешь самостоятельно озвучить фразу. Если микрофона нет (или ты слишком застенчив, или тебе не нравится, как звучит в записи твой голос), ты можешь просто записать несколько секунд тишины, в течении которых игрок успеет прочитать текст (Учти: чтобы что-нибудь записать, ты должен подключить микрофон до того, как запустишь Creation Kit, в противном случае ты ничего не запишешь!). Кликни по кнопке Save, чтобы сохранить записанный файл на диск. | ||
Аналогичным образом запиши | Аналогичным образом запиши дорожки или заглушки для фраз в двух других темах. (Пока ты не закрыл это окно, можешь поиграться с различными эмоциями, которые изобразит Бенду в зависимости от твоего выбора; выбери Disgust (отвращение) или Happiness (счастье).) | ||
В теме, где игрок отказывается от выполнения квеста, поставь флажок "Goodbye". Это нужно для того, чтобы диалог | В теме, где игрок отказывается от выполнения квеста, поставь флажок "Goodbye". Это нужно для того, чтобы диалог окончился после завершения монолога Бенду. (Также неплохо бы пометить флажком и монолог во второй теме. Да, на данный момент это не нужно, изменившееся условие не позволит персонажу продолжить диалог, но кто знает - возможно, в будущем у него появятся и другие диалоги, не зависящие от стадии твоего квеста. В этом случае может возникнуть путаница, так что не ленись и поставь галку.) | ||
{{ProTip|В настоящий момент существует редкая ошибка: если у тебя уже есть аудио-файлы (с корректными путями [см. таблицу в окне "Edit Response"]), но в игре они проигрываются (не смотри в Creation Kit, тут все будет работать, проверять нужно именно в игре), то тебе нужно конвертировать записанные файлы из WAV в XWM, а затем из XWM в FUZ. Более подробную информацию и ссылку на конвертер найдешь [http://forums.bethsoft.com/topic/1347417-dialogue-troubles/page__p__20346206#entry20346206 форуме].<br> | {{ProTip|В настоящий момент существует редкая ошибка: если у тебя уже есть аудио-файлы (с корректными путями [см. таблицу в окне "Edit Response"]), но в игре они не проигрываются (не смотри в Creation Kit, тут все будет работать, проверять нужно именно в игре), то тебе нужно конвертировать записанные файлы из WAV в XWM, а затем из XWM в FUZ. Более подробную информацию и ссылку на конвертер найдешь на [http://forums.bethsoft.com/topic/1347417-dialogue-troubles/page__p__20346206#entry20346206 форуме].<br> | ||
Для некоторых людей это единственный способ заставить работать записи в игре}} | Для некоторых людей это единственный способ заставить работать записи в игре}} | ||
= | =Новая ветвь= | ||
Пока ты не закрыл окно, давай ка создадим еще | Пока ты не закрыл окно, давай ка создадим еще одну ветвь, которой встретит нас радостный Бенду после возвращения амулета. | ||
В представлении диалога ПКМ по пустому пространству и "Create Branch". Называешь ветвь "GSQ01BenduFinishBranch". Соглашайся на имя по-умолчанию для начальной темы, задавай теме текст: "Я добыл амулет". Дай ей какой-нибудь подходящий случаю ответ (например "Надеюсь, этому ворюге не сабо досталось!). Теперь нужно задать два условия. Одно, которое привяжет тему к Бенду, и другое, которое проверит, что игрок на 30ой стадии квеста. Наконец, отметь завершающие монологи флажком "Goodbye", и установи стадию квеста на 40. | В представлении диалога ПКМ по пустому пространству и "Create Branch". Называешь ветвь "GSQ01BenduFinishBranch". Соглашайся на имя по-умолчанию для начальной темы, задавай теме текст: "Я добыл амулет". Дай ей какой-нибудь подходящий случаю ответ (например "Надеюсь, этому ворюге не сабо досталось!). Теперь нужно задать два условия. Одно, которое привяжет тему к Бенду, и другое, которое проверит, что игрок на 30ой стадии квеста. Наконец, отметь завершающие монологи флажком "Goodbye", и установи стадию квеста на 40. | ||
Line 202: | Line 205: | ||
Правда, амулет ты еще не сделал, а значит и переход от 10ой стадии к 30ой невозможен. Займемся этим в следующей главе. | Правда, амулет ты еще не сделал, а значит и переход от 10ой стадии к 30ой невозможен. Займемся этим в следующей главе. | ||
{{ | {{InDepth|На первый взгляд, все это очень сложно и муторно. А в итоге получаем персонажа, который произносит пару слов. Да, система бесспорно не совершенна, и многие элементы тащит за собой еще со времен диалогов в игре Morrowind. Однако, она же предоставляет очень гибкую систему диалогов, позволяющую привязывать несколько тем различным персонажам, проигрывать анимацию, изображать эмоции, и еще много-много всего. А гибкость всегда подразумевает некоторую сложность. | ||
Главное - практика. В скором времени, эта система станет твоей второй натурой, и большую часть действий ты будешь выполнять механически, также быстро, как набираешь строчки текста (если опустить тормоза редактора).}} | Главное - практика. В скором времени, эта система станет твоей второй натурой, и большую часть действий ты будешь выполнять механически, также быстро, как набираешь строчки текста (если опустить тормоза редактора).}} |