taseditor-ru: updates

[[Split portion of a mixed commit.]]
This commit is contained in:
ansstuff 2012-11-25 17:01:57 +00:00
parent 09faa324e2
commit 4a98f4339e
33 changed files with 1919 additions and 1716 deletions

View File

@ -3,7 +3,7 @@
<head>
<title>6. Продвинутые возможности</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("AdvancedFeatures");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("AdvancedFeatures");
}
});
</script>
</head>
@ -52,164 +55,163 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">Продвинутые возможности</span></p>
<p class="rvps2"><span class="rvts39"><br/></span></p>
<p class="rvps2"><span class="rvts39"><br/></span></p>
<p class="rvps15"><a class="rvts28" href="AdvancedFeatures.html#ProjectsSharing">1. Как делиться проектами</a></p>
<p class="rvps15"><a class="rvts28" href="AdvancedFeatures.html#UsingPatterns">2. Использование шаблонов</a></p>
<p class="rvps15"><a class="rvts28" href="AdvancedFeatures.html#UsingMarkers">3. Эффективное использование Маркеров</a></p>
<p class="rvps15"><a class="rvts28" href="AdvancedFeatures.html#UsingLua">4. Использование Lua</a></p>
<p class="rvps14"><a class="rvts28" href="AdvancedFeatures.html#ProjectsSharing">1. Как делиться проектами.</a></p>
<p class="rvps14"><a class="rvts28" href="AdvancedFeatures.html#UsingPatterns">2. Использование шаблонов.</a></p>
<p class="rvps14"><a class="rvts28" href="AdvancedFeatures.html#UsingMarkers">3. Эффективное использование Маркеров.</a></p>
<p class="rvps14"><a class="rvts28" href="AdvancedFeatures.html#UsingLua">4. Использование Lua.</a></p>
<p class="rvps10"><span class="rvts23"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps2"><a name="ProjectsSharing"></a>
<span class="rvts53"><br/></span></p>
<p class="rvps10"><span class="rvts23">1. Как делиться проектами</span></p>
<span class="rvts54"><br/></span></p>
<p class="rvps10"><span class="rvts23">1. Как делиться проектами.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Проект Тасэдитора сохраняется на диске в виде fm3-файла. В этом файле сохраняются все существенные аспекты состояния работы, чтобы можно было в точности восстановить отложенное состояние рабочего процесса. Размер этого "мгновенного снимка" может занимать немало места (в зависимости от объёма Гринзоны он может составлять сотни мегабайт).</span></p>
<p class="rvps10"><span class="rvts22">Проект Тасэдитора сохраняется на диске в виде fm3-файла. В этом файле сохраняются все существенные аспекты работы, чтобы можно было в точности восстановить отложенное состояние рабочего процесса. Размер этого "мгновенного снимка" может занимать немало места (в зависимости от объёма Гринзоны он может составлять сотни мегабайт).</span></p>
<p class="rvps10"><span class="rvts22">Поэтому в случаях, когда вам нужно выложить проект в Интернете (например, для опубликования), имеет смысл сохранять в проекте не полный снимок рабочего процесса, а только необходимую информацию. Для этого нужно выбрать в меню Тасэдитора пункт </span><span class="rvts26">File -&gt; Save Compact</span><span class="rvts22">. Появится окно, где можно выбрать, какие аспекты рабочего процесса следует сохранить в файл.</span></p>
<p class="rvps10"><img align="left" alt="" style="padding : 6px;" src="lib/save-compact.png"/></p>
<p class="rvps10"><span class="rvts26">Binary format of Input</span><span class="rvts22"> сохранять Ввод мувика в двоичном формате. Эта настройка относится к формату fm2-мувиков, расширением которого является fm3-формат. По умолчанию галочка установлена. Если снять её, Ввод будет записан в fm3-файл в текстовом формате, что увеличит размер &nbsp;файла, но позволит редактировать его в любом текстовом редакторе. Однако Тасэдитор гораздо лучше приспособлен к редактированию мувиков, поэтому рекомендуется оставить эту галочку установленной и воздержаться от изменений содержимого fm3-файлов вне Тасэдитора. В некомпактных fm3-проектах (сохраняемых обычным способом) Ввод сохраняется в двоичном формате.</span></p>
<p class="rvps10"><span class="rvts26">Markers</span><span class="rvts22"> сохранять Маркеры в файл. Ввод будет сохраняться в любом случае, так как без Ввода невозможно будет открыть fm3-файлы в эмуляторе. Без Маркеров проигрывание fm3-мувиков возможно, но такие проекты не многим будут отличаться от fm2-мувиков. Рекомендуется оставить эту галочку установленной, чтобы передать в компактном проекте все текущие Маркеры и их Заметки. Размер файла при этом увеличится незначительно.</span></p>
<p class="rvps10"><span class="rvts26">Binary format of Input</span><span class="rvts22"> сохранять Ввод мувика в двоичном формате. Эта настройка относится к особенностям формата fm2, расширением которого является fm3-формат. По умолчанию галочка установлена. Если снять её, Ввод будет записан в fm3-файл в текстовом формате, что увеличит размер &nbsp;файла, но позволит редактировать его в любом текстовом редакторе. Однако Тасэдитор гораздо лучше приспособлен к редактированию мувиков, поэтому рекомендуется оставить эту галочку установленной и воздержаться от изменений содержимого fm3-файлов вне Тасэдитора. В некомпактных fm3-проектах (сохраняемых обычным способом) Ввод сохраняется в двоичном формате.</span></p>
<p class="rvps10"><span class="rvts26">Markers</span><span class="rvts22"> сохранять Маркеры в файл. Ввод будет сохраняться в любом случае, так как без Ввода невозможно будет открыть fm3-файлы в эмуляторе. Без Маркеров проигрывание fm3-мувиков возможно, поэтому вы можете снять эту галочку, если не хотите выкладывать Маркеры. Но такие проекты не многим будут отличаться от fm2-мувиков, поэтому рекомендуется оставить эту галочку установленной, чтобы передать в компактном проекте все текущие Маркеры и их Заметки. Размер файла при этом увеличится незначительно.</span></p>
<p class="rvps10"><span class="rvts26">Bookmarks</span><span class="rvts22"> сохранять Закладки в файл. Сохраняются данные всех имеющихся в проекте Закладок и их ответвлений. Рекомендуется оставить эту галочку установленной. Размер файла увеличится незначительно.</span></p>
<p class="rvps10"><span class="rvts26">Greenzone</span><span class="rvts22"> сохранять Гринзону в файл. Сохраняются все сэйвы, а также Журнал лага. Размер файла значительно увеличится! Именно из-за Гринзоны проекты занимают так много места на диске. Поэтому рекомендуется оставить эту галочку снятой. Если Курсор Проигрывателя в момент компактного сохранения проекта находится на начальном кадре мувика, Гринзона в компактный fm3 вообще не попадает. Но если Курсор Проигрывателя остался внутри мувика, в fm3 попадает один сэйв Гринзоны, позволяющий при открытии проекта восстановить состояние эмулятора на кадр Курсора Проигрывателя. Один сэйв занимает очень мало места, поэтому файл остаётся компактным.</span></p>
<p class="rvps10"><span class="rvts26">Greenzone</span><span class="rvts22"> сохранять Гринзону в файл, включая все сэйвы и Журнал лага. Размер файла значительно увеличится! Именно из-за Гринзоны проекты занимают так много места на диске. Поэтому рекомендуется оставить эту галочку снятой. Если Курсор Проигрывателя в момент компактного сохранения проекта находится на начальном кадре мувика, в компактном fm3 вообще не будет ни одного сэйва Гринзоны. Но если Курсор Проигрывателя остался внутри мувика, в fm3 попадает один сэйв Гринзоны, позволяющий при открытии проекта восстановить состояние эмулятора на кадр Курсора Проигрывателя. Один сэйв занимает очень мало места, поэтому файл остаётся компактным.</span></p>
<p class="rvps10"><span class="rvts26">History</span><span class="rvts22"> сохранять Журнал Истории в файл. Размер файла увеличится на несколько мегабайт. Обычно нет смысла публиковать данные для отката изменений. Поэтому рекомендуется оставить эту галочку снятой. Когда вы открываете fm3-проект без журнала Истории, Тасэдитор создаёт его автоматически.</span></p>
<p class="rvps10"><span class="rvts26">Piano Roll</span><span class="rvts22"> сохранять текущую позицию вертикального скроллинга Piano Roll, чтобы при открытии проекта сразу увидеть тот же самый участок. Размер файла увеличится незначительно, поэтому можно оставить галочку установленной.</span></p>
<p class="rvps10"><span class="rvts26">Selection</span><span class="rvts22"> сохранять все данные Выделения в файл. Сохраняется как текущее Выделение (если есть), так и История Выделений. Размер файла увеличится незначительно, однако обычно нет смысла оставлять эти рабочие данные в публикуемом проекте. Поэтому рекомендуется оставить эту галочку снятой.</span></p>
<p class="rvps10"><span class="rvts26">Selection</span><span class="rvts22"> сохранять все данные Выделения в файл. Сохраняется как текущее Выделение (если есть), так и История Выделений. Размер файла увеличится незначительно, однако обычно нет смысла оставлять эти данные в публикуемом проекте. Поэтому рекомендуется оставить эту галочку снятой.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">В результате компактного сохранения вы можете получить fm3-проект размером менее полумегабайта, при этом передавая в файле не только текущий мувик, но и все существенные данные, которые могут понадобиться получателю. Например, если вы работаете в соавторстве с другим ТАСером, нужно обмениваться не только Вводом, но и Маркерами, и Закладками. А Гринзону получатель файла сможет воссоздать самостоятельно, просто запустив просмотр в Тасэдиторе.</span></p>
<p class="rvps10"><span class="rvts22">При сохранении компактного проекта к имени файла добавляется суффикс "-compact". Компактное сохранение проекта не заменяет обычное сохранение, поэтому, если в проекте имеются несохранённые изменения, звёздочка из заголовка окна не исчезнет после Save Compact.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><img align="left" alt="" style="padding : 6px;" src="lib/export-to-fm2.png"/></p>
<p class="rvps10"><span class="rvts22">Помимо компактного сохранения проекта вы ещё можете экспортировать данные мувика в формат fm2, принятый на сайте TASVideos задолго до возникновения Тасэдитора. В этом формате вы передаёте только Ввод. Для этого нужно выбрать в меню Тасэдитора пункт </span><span class="rvts26">File -&gt; Export to FM2</span><span class="rvts22">. Появится окно, где можно выбрать формат &nbsp;целевого мувика (1P, 2P или Fourscore).</span></p>
<p class="rvps10"><span class="rvts22">Так как формат FM2 поддерживает хранение текстовых субтитров, можно использовать Заметки Маркеров в качестве материала для субтитров. Для этого нужно установить галочку "Convert Marker Notes to Movie Subtitles". Тогда при просмотре полученного fm2-мувика зрители будут видеть текстовые субтитры, появляющиеся на тех кадрах, где стояли соответствующие Маркеры в вашему проекте. А при необходимости можно далее конвертировать fm2-субтитры в общепринятый формат ".srt" для выкладывания ТАСа на Youtube. Для этого надо при проигрывании fm2 в FCEUX щёлкнуть правой кнопкой по игровому окну и в появившемся контекстном меню выбрать пункт "Dump Subtitles to SRT file".</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">FM2-файлы можно открывать в Тасэдиторе точно так же, как FM3-проекты. Для этого в окне выбора файла (</span><span class="rvts26">File -&gt; Open</span><span class="rvts22">) нужно применить фильтр "All Files (*.*)" и выбрать требуемый fm2-мувик. Тасэдитор выдаст сообщение о том, что данный файл не является проектом и потребует подтверждения загрузки. При положительном ответе Тасэдитор создаст новый проект, используя Ввод и настройки (1P/2P/Fourscore) из данного fm2-файла.</span></p>
<p class="rvps10"><span class="rvts22">Помимо сохранения компактного fm3 вы ещё можете экспортировать данные мувика в формат fm2, принятый на сайте TASVideos задолго до возникновения Тасэдитора. В этом формате вы передаёте только Ввод. Для этого нужно выбрать в меню Тасэдитора пункт </span><span class="rvts26">File -&gt; Export to FM2</span><span class="rvts22">. Появится окно, где можно выбрать формат &nbsp;целевого мувика (1P, 2P или Fourscore).</span></p>
<p class="rvps10"><span class="rvts22">Так как формат FM2 поддерживает хранение текстовых субтитров, можно использовать Заметки Маркеров в качестве материала для субтитров. Для этого нужно установить галочку "Convert Marker Notes to Movie Subtitles". Тогда при просмотре полученного fm2-мувика зрители будут видеть текстовые сообщения, появляющиеся во время проигрывания тех кадров, где стояли соответствующие Маркеры в вашем проекте. А при необходимости можно далее конвертировать fm2-субтитры в общепринятый формат ".srt" для выкладывания ТАСа на Youtube. Для этого надо при проигрывании fm2 в FCEUX щёлкнуть правой кнопкой по игровому окну и в появившемся контекстном меню выбрать пункт "Dump Subtitles to SRT file".</span></p>
<p class="rvps10"><span class="rvts22">FM2-файлы можно открывать в Тасэдиторе точно так же, как FM3-проекты. Для этого в окне выбора файла (</span><span class="rvts26">File -&gt; Open</span><span class="rvts22">) нужно переключиться на фильтр "All Files (*.*)" и выбрать требуемый fm2-мувик. Тасэдитор выдаст сообщение о том, что данный файл не является проектом и потребует подтверждения загрузки. При положительном ответе Тасэдитор создаст новый проект, используя Ввод и настройки из данного fm2-файла.</span></p>
<p class="rvps10"><span class="rvts22">Кроме того, вы можете импортировать Ввод из любого fm2 или fm3-файла с помощью </span><span class="rvts26">File -&gt; Import Input</span><span class="rvts22">. При этом не создаётся новый проект, просто текущий Ввод вашего проекта массово заменяется на Ввод из файла. Эта операция похожа на операцию "Вставка из Буфера Обмена", она заносится в Журнал Истории вашего проекта, и её можно откатить с помощью </span><span class="rvts34">Ctrl + Z</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps10"><a name="UsingPatterns"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">2. Использование шаблонов</span></p>
<p class="rvps10"><span class="rvts23">2. Использование шаблонов.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">При редактировании Ввода для каждой кнопки джойстика ТАСер составляет свою последовательность нажатий и отпусканий. Каждое нажатие можно нарисовать всего одним щелчком мыши (для создания длинного зажатия надо потянуть мышь вверх или вниз, не отпуская левую кнопку). Таким образом можно расставить последовательность какой угодно сложности.</span></p>
<p class="rvps10"><span class="rvts22">Для ускорения работы можно ещё запомнить типичные и часто используемые последовательности &nbsp;в виде шаблонов, чтобы устанавливать их парой щелчков, не рисуя каждое нажатие по отдельности.</span></p>
<p class="rvps10"><span class="rvts22">При редактировании Ввода ТАСер фактически составляет уникальную последовательность нажатий и отпусканий для каждой кнопки джойстика. Но, несмотря на уникальность, в составе этой большой последовательности зачастую можно выявить однотипные участки, представляющие собой короткую последовательность нажатий и отпусканий, &nbsp;которая повторяется несколько раз подряд, либо встречается многократно в разных местах мувика.</span></p>
<p class="rvps10"><span class="rvts22">Для ускорения работы можно запомнить такие типичные или часто используемые последовательности &nbsp;в виде </span><span class="rvts31">шаблонов</span><span class="rvts22">, чтобы устанавливать их парой щелчков, не рисуя каждое нажатие по отдельности.</span></p>
<p class="rvps10"><span class="rvts22">Шаблоны полезны в нескольких случаях:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">когда одинаковая последовательность часто используется в мувике (например, размеренное чередование нажатий и отпускания кнопки </span><span class="rvts32">B</span><span class="rvts22">)</span></li>
<li class="rvps15"><span class="rvts22">когда одну и ту же последовательность требуется рисовать для нескольких кнопок</span></li>
<li class="rvps15"><span class="rvts22">когда одну и ту же последовательность требуется перерисовывать много раз</span></li>
<li class="rvps10"><span class="rvts22">когда одинаковая последовательность часто используется в мувике (например, размеренное чередование нажатий и отпускания кнопки </span><span class="rvts32">B</span><span class="rvts22">)</span></li>
<li class="rvps10"><span class="rvts22">когда одну и ту же последовательность требуется рисовать для нескольких кнопок (например, чередовать </span><span class="rvts32">L</span><span class="rvts22"> и </span><span class="rvts32">R</span><span class="rvts22">)</span></li>
<li class="rvps10"><span class="rvts22">когда одну и ту же последовательность требуется рисовать (или перерисовывать) много раз (например, разбег двойным нажатием </span><span class="rvts32">R</span><span class="rvts22">)</span></li>
</ul>
<p class="rvps10"><span class="rvts22">Чтобы добавить свой шаблон, нужно отредактировать в любом текстовом редакторе (например, в Блокноте) файл </span><span class="rvts21">taseditor_patterns.txt</span><span class="rvts22">, находящийся в подпапке </span><span class="rvts21">/tools</span><span class="rvts22"> папки FCEUX. Каждая нечётная строчка этого файла обозначает название шаблона, каждая чётная строчка содержит закодированную последовательность состояний кнопки. Кодировка очень простая единицей обозначается состояние "кнопка нажата", нулём обозначается состояние "кнопка отпущена".</span></p>
<p class="rvps10"><span class="rvts22">Несколько наиболее очевидных шаблонов уже добавлено в файл автором. Чтобы добавить свой шаблон, нужно отредактировать в любом текстовом редакторе (например, в Блокноте) файл </span><span class="rvts21">taseditor_patterns.txt</span><span class="rvts22">, находящийся в подпапке </span><span class="rvts21">/tools</span><span class="rvts22"> папки FCEUX. Каждая нечётная строчка этого файла обозначает название шаблона, каждая чётная строчка содержит закодированную последовательность состояний кнопки. Кодировка очень простая единицей обозначается состояние "кнопка нажата", нулём обозначается состояние "кнопка отпущена".</span></p>
<p class="rvps10"><span class="rvts22">Каждый шаблон является зацикленным, то есть, когда Ввод по короткому шаблону устанавливается в длинный промежуток кадров, шаблон повторяется нужное количество раз, чтобы заполнить требуемый промежуток.</span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/patterns-menu.png"/></p>
<p class="rvps10"><span class="rvts22">Несколько наиболее очевидных шаблонов уже добавлено в файл автором. При добавлении или изменении шаблона необходимо перезапустить Тасэдитор, чтобы новые данные были прочитаны из файла. Список доступных шаблонов находится в верхнем правом углу окна TAS Editor. Для смены текущего шаблона нужно зайти в это меню и щёлкнуть по названию желаемого шаблона. Для простоты ориентирования в шаблонах рекомендуется отражать в названии каждого шаблона его игровую суть, или даже скопировать закодированную последовательность в название.</span></p>
<p class="rvps10"><span class="rvts22">Для установки шаблона Тасэдитору нужно знать начало и конец промежутка, в котором указанная кнопка будет нажиматься и отпускаться по заданному правилу. Существует 3 способа применения шаблона:</span></p>
<p class="rvps10"><span class="rvts26">1 способ. </span><span class="rvts22">Щёлкнуть по начальному кадру левой кнопкой мыши (в любой колонке Piano Roll), чтобы этот кадр стал выделенным. Затем зажать клавишу </span><span class="rvts34">Alt</span><span class="rvts22"> и щёлкнуть левой кнопкой мыши по конечному кадру в колонке редактируемой кнопки. В промежутке от выделенного до щёлкнутого кадра появится требуемая последовательность нажатий и отпусканий указанной кнопки. Этот способ удобно использовать, когда начальный кадр уже и так выделен из-за предыдущих щелчков по Piano Roll, и остаётся только зажать </span><span class="rvts34">Alt</span><span class="rvts22"> и сделать один щелчок по конечному кадру.</span></p>
<p class="rvps10"><span class="rvts26">2 способ.</span><span class="rvts22"> Щёлкнуть по начальному кадру левой кнопкой мыши (в любой колонке Piano Roll) и зажать левую кнопку мыши, начав рисование. Зажать клавишу </span><span class="rvts34">Alt</span><span class="rvts22"> и переместить курсор мыши вверх или вниз. Таким образом вы будете рисовать шаблонную последовательность нажатий и отпусканий указанной кнопки.</span></p>
<p class="rvps10"><span class="rvts22">При добавлении или изменении шаблона необходимо перезапустить Тасэдитор, чтобы новые данные были прочитаны из файла. Список доступных шаблонов находится в верхнем правом углу окна TAS Editor. Для смены текущего шаблона нужно зайти в это меню и щёлкнуть по названию желаемого шаблона. Для облегчения ориентирования в шаблонах рекомендуется отражать в названии каждого шаблона его игровое значение.</span></p>
<p class="rvps10"><span class="rvts22">Для применения текущего шаблона Тасэдитору нужно знать начало и конец промежутка, в котором указанная кнопка будет нажиматься и отпускаться по заданному правилу. Существует 3 разных способа применить шаблон:</span></p>
<p class="rvps10"><span class="rvts26">1 способ. </span><span class="rvts22">Указать и щёлкнуть по начальному кадру (в любой колонке Piano Roll, кроме колонки иконок), чтобы этот кадр стал выделенным. Затем зажать клавишу </span><span class="rvts34">Alt</span><span class="rvts22"> и щёлкнуть по конечному кадру в колонке редактируемой кнопки. В промежутке между двумя этими кадрами появится требуемая последовательность нажатий и отпусканий указанной кнопки. Этот способ удобно использовать, когда начальный кадр уже и так выделен из-за предыдущих щелчков по Piano Roll, и остаётся только зажать </span><span class="rvts34">Alt</span><span class="rvts22"> и сделать один щелчок по конечному кадру.</span></p>
<p class="rvps10"><span class="rvts26">2 способ.</span><span class="rvts22"> Щёлкнуть левой кнопкой мыши по начальному кадру в колонке редактируемой кнопки и зажать левую кнопку мыши, начав рисование. Зажать клавишу </span><span class="rvts34">Alt</span><span class="rvts22"> и переместить курсор мыши вверх или вниз. Таким образом вы будете </span><span class="rvts31">рисовать</span><span class="rvts22"> шаблонную последовательность нажатий и отпусканий указанной кнопки.</span></p>
<p class="rvps10"><span class="rvts26">3 способ.</span><span class="rvts22"> Выделить регион кадров, а затем зажать клавишу </span><span class="rvts34">Alt</span><span class="rvts22"> и щёлкнуть левой кнопкой мыши по символу редактируемой кнопки в Заголовке Piano Roll. В выделенной области появится требуемая последовательность нажатий и отпусканий указанной кнопки.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">При использовании традиционного метода ТАСинга вы также можете применять шаблоны к записываемым последовательностям. Для этого нужно установить галочку </span><a class="rvts28" href="Toolbox.html#UsePattern">Use pattern</a><span class="rvts22"> в панели Рекордера. При этом вам может сначала потребоваться запись кнопок, которые не нужно чередовать (их следует записать без галочки Use pattern), а затем на том же участке с помощью Superimpose можно записать остальные кнопки по шаблону.</span></p>
<p class="rvps10"><span class="rvts22">Например, вам нужно записать стрельбу очередью во время перепрыгивания ямы. Сначала запишите процесс перепрыгивания без стрельбы, затем вернитесь Курсором Проигрывателя в начало участка (прыжком на Закладку), включите галочки Superimpose и Use pattern, зажмите кнопку </span><span class="rvts32">B</span><span class="rvts22"> и отпустите паузу эмуляции. На текущем участке произойдёт объединение Ввода прыжка с шаблонным Вводом стрельбы.</span></p>
<p class="rvps10"><span class="rvts22">До Тасэдитора вместо шаблонов существовала похожая концепция "Autofire". Однако из-за неудобств метода Записи она почти не использовалась, потому что во время впечатывания Ввода обычно проще нажимать и отпускать нужные кнопки вручную. Поэтому при использовании традиционного метода вы, скорее всего, не будете пользоваться шаблонами. Однако в нелинейном и полуавтоматическом методе шаблоны рисуются так же легко, как простые зажатия кнопок, и здесь они действительно могут повысить скорость работы.</span></p>
<p class="rvps10"><span class="rvts22">При использовании традиционного метода ТАСинга вы также можете применять шаблоны к записываемым последовательностям, но с гораздо меньшим удобством. Для этого нужно установить галочку </span><a class="rvts28" href="Toolbox.html#UsePattern">Use pattern</a><span class="rvts22"> в панели Рекордера. При этом вам может сначала потребоваться запись кнопок, которые не нужно чередовать (их следует записать без галочки Use pattern), а затем на том же участке с помощью Superimpose можно записать остальные кнопки по шаблону.</span></p>
<p class="rvps10"><span class="rvts22">Например, вам нужно записать стрельбу очередью во время перепрыгивания ямы. Сначала запишите процесс перепрыгивания без стрельбы, затем вернитесь Курсором Проигрывателя в начало участка (прыжком на оставленную здесь Закладку), включите галочки Superimpose и Use pattern, зажмите кнопку </span><span class="rvts32">B</span><span class="rvts22"> и отпустите паузу эмуляции. На текущем участке произойдёт объединение Ввода прыжка с шаблонным Вводом стрельбы.</span></p>
<p class="rvps10"><span class="rvts22">До Тасэдитора вместо шаблонов существовала похожая концепция "Autofire". Однако из-за неудобств метода Записи она почти не использовалась, потому что во время впечатывания Ввода обычно проще нажимать и отпускать нужные кнопки вручную. Поэтому, если вы ограничиваетесь традиционным методом, вы, скорее всего, не будете пользоваться шаблонами. Однако в нелинейном и полуавтоматическом методе шаблоны рисуются так же быстро, как простые зажатия кнопок, и здесь они действительно могут повысить скорость работы.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Шаблоны используются при создании последовательностей для любой отдельно взятой кнопки. А когда нужно вставить типовую комбинацию сразу нескольких кнопок, следует воспользоваться функциями Copy/Paste.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps10"><a name="UsingMarkers"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">3. Эффективное использование Маркеров</span></p>
<p class="rvps10"><span class="rvts23">3. Эффективное использование Маркеров.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Не ленитесь ставить Маркеры и писать комментарии.</span></p>
<p class="rvps10"><span class="rvts22">В первую очередь Маркеры предназначены для упрощения сложных ситуаций за счёт структуризации проблемы. Когда в игре требуется проделать несколько комплексных взаимосвязанных действий, следует разбить большой участок на отдельные участки, чтобы чётко понимать, когда заканчивается одно действие и начинается другое. Даже если первоначальное разбиение окажется ошибочным, оно поможет привести ваши мысли в порядок.</span></p>
<p class="rvps10"><span class="rvts22">Естественно, не имеет смысла ставить Маркеры на ничем не примечательных участках, которые даже не требуется шлифовать (где достаточно, например, просто зажать </span><span class="rvts32">R</span><span class="rvts22">). А вот ключевые и памятные моменты мувика следует не только отмечать Маркерами, но и комментировать Заметками. Это позволит вам легко держать в голове мысленный образ всего проекта, а также осуществлять быструю навигацию по тексту Заметок.</span></p>
<p class="rvps10"><span class="rvts22">Причём не требуется писать литературные произведения, можно ограничиться простыми словами-метками, наподобие тегов. Слова придумаете на ходу, тут главное соблюдать системный подход. То есть, если в начале первого уровня (на экране перехода) вы поставили Маркер с Заметкой "level 1 start", то и в начале второго уровня следует написать "level 2 start", а не что-нибудь вроде "act II begin". Во время создания ТАСа у вас в голове формируется уникальный глоссарий, состоящий из понятий, актуальных для данной игры. И чем более системный подход вы применяете к написанию Заметок, тем проще будет охарактеризовать очередной участок, а значит, понять очередную задачу. И тем проще будет перемещаться между однотипными событиями мувика, а также находить старые участки Ввода, помня только их примерный результат в игре.</span></p>
<p class="rvps10"><span class="rvts22">Задачи, предлагаемые игроку в видеоиграх, очень часто повторяются. Детали и антураж могут меняться, но действия игрока остаются теми же. В особенно типовых случаях можно просто скопировать Ввод (решение подобной задачи из предыдущего уровня), и он успешно синхронизируется с новой игровой ситуацией (ну или понадобится небольшая модификация). Только после копипаста рекомендуется всё же разнообразить Ввод, чтобы зрители ТАСа не заскучали.</span></p>
<p class="rvps10"><span class="rvts22">Например, в начале многих уровней Super Mario Bros ТАСеру необходимо использовать одинаковую последовательность нажатий кнопок, чтобы оптимально разогнаться до максимальной скорости. Предположим, что вы добросовестно комментируете Ввод по ходу ТАСинга. Значит, в первом уровне на месте разгона вы оставили Заметку со словами вроде "acceleration" или тому подобными фразами по своему усмотрению. Теперь, когда в новом уровне вы начинаете создавать Ввод для участка с той же самой задачей, вы ставите в начало участка Маркер и пишете к нему Заметку, характеризующую текущую задачу. Очевидно, что в тексте Заметки тоже окажется слово "acceleration", потому что требуется разгон.</span></p>
<p class="rvps10"><span class="rvts22">Маркеры предназначены для упрощения сложных ситуаций за счёт структуризации проблемы. Когда в игре требуется проделать (или обмозговать) несколько комплексных действий, следует разбить большой участок на отдельные интервалы, чтобы чётко понимать, когда заканчивается одно действие и начинается другое. Даже если первоначальное разбиение окажется ошибочным, оно поможет привести ваши мысли в порядок.</span></p>
<p class="rvps10"><span class="rvts22">Естественно, не имеет смысла ставить Маркеры на ничем не примечательных участках, многие из которых даже не требуется шлифовать (достаточно, например, просто зажать </span><span class="rvts32">R</span><span class="rvts22">). А вот ключевые моменты и памятные ситуации мувика следует не только отмечать Маркерами, но и комментировать Заметками. Это позволит вам держать в голове мысленный образ всего проекта, а также осуществлять навигацию по тексту.</span></p>
<p class="rvps10"><span class="rvts22">Не требуется писать в Заметках литературные произведения. Можно ограничиться простыми словами-метками, числами, тегами. Слова придумаете на ходу, тут главное соблюдать системный подход. То есть, если в начале первого уровня (на экране перехода) вы поставили Маркер с Заметкой "level 1 start", то и в начале второго уровня следует написать "level 2 start", а не что-нибудь вроде "act II begin". Во время создания ТАСа у вас в голове непринуждённо формируется уникальный глоссарий, состоящий из понятий, актуальных для данной игры. &nbsp;И чем более системный подход вы применяете к написанию Заметок, тем проще будет охарактеризовать очередной (похожий) участок, а значит, понять очередную задачу. И тем проще будет перемещаться между однотипными событиями мувика, а также находить старые участки Ввода, помня только их смутный образ в игре.</span></p>
<p class="rvps10"><span class="rvts22">Задачи, предлагаемые игроку в видеоиграх, очень часто повторяются. Детали и антураж могут меняться, но действия игрока остаются примерно теми же. В ряде случаев можно просто скопировать Ввод (решение подобной задачи из предыдущего уровня), и он успешно синхронизируется с новой игровой ситуацией (вероятно, понадобится небольшая подгонка). Только после копипаста рекомендуется всё же разнообразить Ввод, чтобы зрители ТАСа не заметили повторения и не заскучали.</span></p>
<p class="rvps10"><span class="rvts22">Например, в начале многих уровней Super Mario Bros ТАСеру необходимо использовать одинаковую последовательность нажатий кнопок, чтобы оптимально разогнаться до максимальной скорости. Предположим, что вы добросовестно комментируете Ввод по ходу ТАСинга. Значит, в первом уровне на месте разгона вы, вероятно, оставили Заметку со словами вроде "acceleration" или тому подобными фразами по своему усмотрению. Теперь, когда в новом уровне вы начинаете создавать Ввод для участка с той же самой задачей, вы ставите в начало участка Маркер и пишете к нему Заметку, характеризующую текущую задачу. Очевидно, что в тексте Заметки тоже окажется слово "acceleration", потому что требуется разгон.</span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/toolbox-selection.png"/></p>
<p class="rvps10"><span class="rvts22">И здесь уже можно воспользоваться функцией автоматического поиска похожих Заметок. Оставляете Курсор Проигрывателя на текущем участке и нажимаете кнопку </span><span class="rvts32">Similar</span><span class="rvts22"> в самом низу панели инструментов. Курсор Выделения сразу же прыгнет к Маркеру, который содержит наиболее похожую Заметку, по мнению Тасэдитора. Скорее всего, это будет Маркер в начале участка, отвечающего за разгон в первом уровне. Поэтому вы можете сразу выделить весь Ввод на этом участке, нажав </span><span class="rvts34">Ctrl + A</span><span class="rvts22">, скопировать его в Буфер Обмена (</span><span class="rvts34">Ctrl + C</span><span class="rvts22">), а затем вернуться к текущему участку (дважды нажать </span><span class="rvts34">Shift</span><span class="rvts22">) и вставить из Буфера Обмена (</span><span class="rvts34">Ctrl + V</span><span class="rvts22">).</span></p>
<p class="rvps10"><span class="rvts22">И вот здесь уже можно воспользоваться функцией автоматического поиска похожих Заметок. Оставьте Курсор Проигрывателя на текущем участке и нажмите кнопку "</span><span class="rvts32">Similar</span><span class="rvts22">" в самом низу панели инструментов. Курсор Выделения сразу же прыгнет к Маркеру, который содержит наиболее похожую Заметку по мнению Тасэдитора. Скорее всего, это будет Маркер в начале участка, отвечающего за разгон в первом уровне. Поэтому вы можете сразу выделить весь Ввод на этом участке, нажав </span><span class="rvts34">Ctrl + A</span><span class="rvts22">, скопировать его в Буфер Обмена (</span><span class="rvts34">Ctrl + C</span><span class="rvts22">), а затем вернуться к текущему участку (дважды нажать </span><span class="rvts34">Shift</span><span class="rvts22">) и вставить из Буфера Обмена (</span><span class="rvts34">Ctrl + V</span><span class="rvts22">).</span></p>
<p class="rvps10"><span class="rvts22">Если первый результат поиска не подходит, можно нажимать кнопку </span><span class="rvts32">More</span><span class="rvts22">, чтобы переходить к следующим вариантам похожих Заметок. Обычно нужный участок обнаруживается в числе первых предложенных вариантов, конечно, при условии, что этот участок был отмечен Маркером с разумной Заметкой.</span></p>
<p class="rvps10"><span class="rvts22">Важно заметить, что при написании Заметки к второму разгону слово "acceleration" появляется в тексте не нарочно, а потому что одинаковые игровые ситуации описываются одинаковыми словами. Поэтому запоминать текст старых Заметок совершенно не требуется в нужное время адекватные слова придут в голову сами.</span></p>
<p class="rvps10"><span class="rvts22">Таким образом, благодаря функции автопоиска вы прямо в процессе ТАСинга формируете библиотеку </span><span class="rvts26">полезных комбинаций Ввода</span><span class="rvts22">, наподобие вышеописанного списка Шаблонов, только без необходимости явно заготавливать последовательности кнопок они появляются естественным путём во время оптимизации участков и хранятся прямо в мувике. А при улучшении какой-либо комбинации (например, если вы найдёте более быстрый способ осуществлять разгон)можно будет быстро найти и исправить все участки, где используется эта комбинация. Также здесь вам не требуется помнить точное описание каждой последовательности, ведь если вы соблюдаете системный подход к формулировке задач, используемые слова будут частично совпадать (а полное совпадение не требуется, алгоритм автопоиска достаточно умный).</span></p>
<p class="rvps10"><span class="rvts22">Автопоиск также удобно использовать для прыжков между двумя (и более) взаимосвязанными участками, разнесёнными в мувике достаточно далеко. Скроллировать Piano Roll колесом мыши или прыгать через десятки Маркеров от одного участка к другому будет не столь оперативно, как сделать щелчок по кнопке </span><span class="rvts32">Similar</span><span class="rvts22"> или </span><span class="rvts32">More</span><span class="rvts22">. Чтобы участки-близнецы (или участок-источник и участок-приёмник) находились сразу же, имеет смысл написать в их заметках уникальное слово, которое не используется в других местах.</span></p>
<p class="rvps10"><span class="rvts22">Интересный факт: при написании Заметки к второму разгону слово "acceleration" появляется в тексте не нарочно, а потому что одинаковые игровые ситуации в целом описываются одинаковыми словами. Поэтому запоминать текст старых Заметок совершенно не требуется. В нужное время адекватные слова придут в голову сами.</span></p>
<p class="rvps10"><span class="rvts22">Таким образом вы прямо в процессе ТАСинга формируете </span><span class="rvts26">библиотеку полезных комбинаций Ввода</span><span class="rvts22">, наподобие вышеописанного списка шаблонов, только без необходимости явно заготавливать последовательности кнопок они появляются естественным путём во время оформления и оптимизации участков, и хранятся они прямо в мувике, а не во внешнем файле. А при улучшении какой-либо комбинации (например, если вы найдёте более быстрый способ осуществлять разгон) можно будет быстро найти и исправить все участки, где используется эта комбинация. Также здесь вам не требуется помнить точное описание или имя нужной последовательности, ведь если вы соблюдаете системный подход к формулировке задач, используемые слова будут частично совпадать (а полное совпадение не требуется, алгоритм автопоиска достаточно умный).</span></p>
<p class="rvps10"><span class="rvts22">Автопоиск также удобно использовать для прыжков между двумя (и более) взаимосвязанными участками, разнесёнными в мувике достаточно далеко. Скроллировать Piano Roll колесом мыши или прыгать через десятки Маркеров от одного участка к другому будет не столь оперативно, как сделать щелчок по кнопке "</span><span class="rvts32">Similar</span><span class="rvts22">" или "</span><span class="rvts32">More</span><span class="rvts22">". Чтобы алгоритм мог мгновенно найти участки-близнецы (или участок-источник и участок-приёмник), имеет смысл написать в их Заметках уникальное слово, которое не используется в других местах.</span></p>
<p class="rvps10"><span class="rvts22">Например, в игре Megaman с каждым робот-мастером необходимо драться дважды (во второй раз в конце игры). Логично предположить, что обе битвы будут озаглавлены Маркерами с Заметками, содержащими имя робота и слова "boss" или "fight", или что-то в этом духе. В результате, когда Курсор Проигрывателя находится на одном из этих двух мест, нажатие кнопки </span><span class="rvts32">Similar</span><span class="rvts22"> перебросит вас к другому.</span></p>
<p class="rvps10"><span class="rvts22">В этом примере нужные слова при написании Заметки нашлись автоматически, и они достаточно уникальны, чтобы не повторяться в других местах мувика (по крайней мере не в том же наборе слов), поэтому автопоиск сработает идеально. В каком-нибудь другом примере, возможно, придётся специально придумывать уникальное слово-метку, но чаще всего будет достаточно первого пришедшего в голову описания происходящей в игре ситуации.</span></p>
<p class="rvps10"><span class="rvts22">В этом примере подходящие слова при написании Заметки нашлись без раздумий, при этом они достаточно уникальны, чтобы не повторяться в других местах мувика (по крайней мере не в том же наборе слов), поэтому автопоиск сработает идеально. В каком-нибудь другом примере, возможно, придётся специально придумывать уникальное слово-метку, но чаще всего будет достаточно первого пришедшего в голову описания происходящей в игре ситуации.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/find-note.png"/></p>
<p class="rvps10"><span class="rvts22">В некоторых случаях может пригодиться ручной поиск текста в Заметках. Например, полезно в ходе ТАСинга оставлять в некоторых местах Заметку со словом "TODO" (или что-нибудь подобное) там, где нет уверенности, что найдено окончательное решение задачи (самый оптимальный Ввод на участке). И когда у вас появится настроение провести работу над ошибками, можно будет пройтись по всем Маркерам с этим тегом, вызвав окно Find Note (</span><span class="rvts34">Ctrl + F</span><span class="rvts22">) и введя слово "TODO" для поиска.</span></p>
<p class="rvps10"><span class="rvts22">Также может пригодиться стандартный поиск текста в Заметках. Например, полезно в ходе ТАСинга оставлять в некоторых местах Заметку со словом "TODO" там, где нет уверенности, что найдено окончательное решение задачи (самый оптимальный Ввод на участке). И когда у вас появится настроение провести работу над ошибками, можно будет пройтись по всем Маркерам с этим тегом, вызвав окно "Find Note" (</span><span class="rvts34">Ctrl + F</span><span class="rvts22">) и введя слово "TODO" для поиска.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Если вам не нравится вся эта затея с Маркерами, вы вполне можете обойтись без них. В конце концов, большинство игр ставят перед ТАСером довольно простые задачи, которые не требуют высокоорганизованного подхода к процессу решения. Если задачу можно решить с наскока, конечно, не нужно тратить время на подготовку и укрепление позиций. Маркеры дают примущества в долгосрочных целях, а не в краткосрочных.</span></p>
<p class="rvps10"><span class="rvts22">Поэтому, как и в программировании, в большинстве случаев вы можете успешно писать так называемый "грязный код" (в нашем случае это мувик без Маркеров и Заметок), который быстро создаётся, но плохо поддерживается и расширяется. Либо вы можете создавать любовно оформленный проект, который приятно просматривать и модифицировать.</span></p>
<p class="rvps10"><span class="rvts22">Только важно понимать, что модифицировать свой мувик в попытках побить вчерашний рекорд ТАСерам приходится очень часто, поэтому затраты сегодняшнего времени на оформление проекта завтра могут окупиться тем, что сам внешний вид проекта мотивирует продолжать над ним работу.</span></p>
<p class="rvps10"><span class="rvts22">Поэтому, как и в программировании, в большинстве случаев вы можете успешно писать так называемый "грязный код" (в нашем случае это проект без Маркеров и Заметок), который быстро создаётся, но плохо поддерживается и расширяется. Либо вы можете создавать любовно оформленный проект, который приятно просматривать и модифицировать. Важно понимать, что модифицировать свой мувик в попытках побить вчерашний рекорд ТАСерам приходится очень часто, поэтому затраты сегодняшнего времени на оформление проекта завтра могут окупиться тем, что сам внешний вид проекта мотивирует продолжать над ним работу.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps10"><a name="UsingLua"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">4. Использование Lua</span></p>
<p class="rvps10"><span class="rvts23">4. Использование Lua.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">На языке Lua можно писать скрипты, исполняемые эмулятором FCEUX одновременно с эмуляцией игры. Для написания скриптов требуются минимальные навыки программирования, при этом спектр доступных возможностей чрезвычайно широк. Можно создавать собственные инструменты для ТАСинга, модифицировать игру во время её исполнения, получать доступ к изображению и звуку на лету, передавать данные по сети или записывать на диск и т.д. А также с помощью Lua-скриптов можно писать расширения для Тасэдитора.</span></p>
<p class="rvps10"><span class="rvts22">Для полного освоения языка Lua потребуется прочесть его документацию, однако для простых скриптов будет достаточно чтения этого Руководства, а также </span><a class="rvts28" href="http://www.fceux.com/web/help/fceux.html?LuaScripting.html" target="_blank">раздела о Lua в Документации FCEUX</a><span class="rvts22">. Для начала попробуйте запустить примеры чужих скриптов, созданные ТАСерами для FCEUX. Они находятся в подпапке </span><span class="rvts21">/luaScripts</span><span class="rvts22">. Каждый скрипт представляет собой текстовый файл с расширением </span><span class="rvts21">.lua</span><span class="rvts22">, который можно создавать и редактировать в любом текстовом редакторе. Перед запуском скриптов нужно открыть ROM любой игры. Чтобы запустить скрипт, нужно открыть Lua-консоль (</span><span class="rvts26">File -&gt; Lua -&gt; New Lua Script Window</span><span class="rvts22">), в появившемся окне нажать кнопку </span><span class="rvts32">Browse</span><span class="rvts22"> и загрузить желаемый скрипт, затем нажать кнопку </span><span class="rvts32">Run</span><span class="rvts22">. Если эмулятор при этом стоит на паузе, требуется либо снять паузу на короткое время, либо сделать Frame Advance, чтобы скрипт начал работать. А саму Lua-консоль можно скрыть, чтобы не загораживала экран.</span></p>
<p class="rvps10"><span class="rvts22">Программный код в Lua-скриптах для FCEUX обычно делится на две части одна часть скрипта выполняется сразу в момент запуска скрипта, другая выполняется при наступлении определённых событий, таких как окончание эмуляции очередного кадра, загрузка или создание сэйва и т.д.</span></p>
<p class="rvps10"><span class="rvts22">Та часть кода, которая исполняется в момент запуска скрипта, обычно выполняется однократно (если, конечно, вы не организовали бесконечный цикл). Код выполняется построчно, сверху вниз. Чаще всего основная задача этой части кода инициализировать глобальные переменные и зарегистрировать функции, которые затем будут автоматически запускаться эмулятором FCEUX при наступлении определённых событий. В этих функциях (чаще всего в одной функции) обычно и задаётся код основных действий скрипта.</span></p>
<p class="rvps10"><span class="rvts22">Например, так может выглядеть код рисования хитбокса Марио для игры SMB:</span></p>
<p class="rvps10"><span class="rvts22">Для полного освоения языка Lua потребуется прочесть его документацию и набраться реального опыта, однако для создания простых скриптов будет достаточно чтения этого Руководства и </span><a class="rvts28" href="http://www.fceux.com/web/help/fceux.html?LuaScripting.html" target="_blank">раздела о Lua в Документации FCEUX</a><span class="rvts22">. Для начала попробуйте запустить чужие скрипты, созданные для FCEUX разными людьми. Они находятся в подпапке </span><span class="rvts21">/luaScripts</span><span class="rvts22">. Каждый скрипт представляет собой текстовый файл с расширением </span><span class="rvts21">.lua</span><span class="rvts22">, который можно создавать и редактировать в любом текстовом редакторе. Перед запуском скриптов нужно открыть ROM любой игры. Чтобы запустить скрипт, нужно открыть Lua-консоль (</span><span class="rvts26">File -&gt; Lua -&gt; New Lua Script Window</span><span class="rvts22">), в появившемся окне нажать кнопку "</span><span class="rvts32">Browse</span><span class="rvts22">" и загрузить файл желаемого скрипта, затем нажать кнопку "</span><span class="rvts32">Run</span><span class="rvts22">". Если эмулятор при этом стоит на паузе, требуется либо снять паузу, либо нажать </span><span class="rvts27">Frame Advance</span><span class="rvts22">, чтобы скрипт начал работать. А саму Lua-консоль можно скрыть, чтобы её окно не загораживало экран.</span></p>
<p class="rvps10"><span class="rvts22">Программный код в Lua-скриптах для FCEUX обычно делится на две части одна часть скрипта выполняется сразу в момент запуска скрипта, другая выполняется при наступлении определённых событий эмуляции, таких как окончание эмуляции очередного кадра, загрузка сэйва и т.д.</span></p>
<p class="rvps10"><span class="rvts22">Та часть кода, которая исполняется в момент запуска скрипта, обычно выполняется однократно (если, конечно, вы не организовали в ней бесконечный цикл). Код выполняется построчно, сверху вниз. Обычно основная задача этой части инициализировать глобальные переменные и зарегистрировать функции, которые затем будут автоматически запускаться эмулятором FCEUX при наступлении определённых событий.</span></p>
<p class="rvps10"><span class="rvts22">В большинстве случаев основной код скрипта находится внутри одной функции, которая автоматически выполняется в конце каждого кадра. Например, так может выглядеть код рисования хитбокса Марио для игры SMB:</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<div class="rvps10"><table width="98%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid;">
<tr valign="top">
<td style="border-color: #000000; border-style: solid;"><p class="rvps2"><span class="rvts55">marioWidth = 16</span></p>
<p class="rvps2"><span class="rvts55">marioHeight = 32</span></p>
<p class="rvps2"><span class="rvts55"><br/></span></p>
<p class="rvps2"><span class="rvts55">function everyframe()</span></p>
<p class="rvps2"><span class="rvts55"></span><span class="rvts55"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts55">marioX = memory.readbyte(0x3AD)</span></p>
<p class="rvps2"><span class="rvts55"></span><span class="rvts55"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts55">marioY = memory.readbyte(0xCE)</span></p>
<p class="rvps2"><span class="rvts55"></span><span class="rvts55"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts55">gui.drawbox(marioX, marioY, marioX + marioWidth, marioY + marioHeight)</span></p>
<p class="rvps2"><span class="rvts55">end</span></p>
<p class="rvps2"><span class="rvts55"><br/></span></p>
<p class="rvps2"><span class="rvts55">emu.registerafter(everyframe)</span></p>
<td style="border-color: #000000; border-style: solid;"><p class="rvps2"><span class="rvts56">marioWidth = 16</span></p>
<p class="rvps2"><span class="rvts56">marioHeight = 32</span></p>
<p class="rvps2"><span class="rvts56"><br/></span></p>
<p class="rvps2"><span class="rvts56">function everyframe()</span></p>
<p class="rvps2"><span class="rvts56"></span><span class="rvts56"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts56">marioX = memory.readbyte(0x3AD)</span></p>
<p class="rvps2"><span class="rvts56"></span><span class="rvts56"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts56">marioY = memory.readbyte(0xCE)</span></p>
<p class="rvps2"><span class="rvts56"></span><span class="rvts56"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts56">gui.drawbox(marioX, marioY, marioX + marioWidth, marioY + marioHeight)</span></p>
<p class="rvps2"><span class="rvts56">end</span></p>
<p class="rvps2"><span class="rvts56"><br/></span></p>
<p class="rvps2"><span class="rvts56">emu.registerafter(everyframe)</span></p>
</td>
</tr>
</table>
</div>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">При запуске этого скрипта FCEUX создаст и инициализирует две переменные marioWidth и marioHeight, а затем зарегистрирует функцию everyframe() на событие окончания каждого кадра (registerafter). После этого текст в скрипте заканчивается, и скрипт перестаёт выполняться, однако зарегистрированная функция остаётся в памяти эмулятора, и если теперь вы отпустите паузу или начнёте нажимать </span><span class="rvts27">Frame Advance</span><span class="rvts22">, после каждого кадра будет запускаться код из функции everyframe(). Этот код состоит из трёх строк первые две создают переменные, отвечающие за координаты хитбокса, и инициализируют их значениями из оперативной памяти (RAM) эмулируемой приставки.</span></p>
<p class="rvps10"><span class="rvts22">Конкретные адреса ячеек оперативной памяти можно взять из публичных источников (например, </span><a class="rvts28" href="http://tasvideos.org/GameResources/NES/SuperMarioBros.html" target="_blank">http://tasvideos.org/GameResources/NES/SuperMarioBros.html</a><span class="rvts22">) или найти самостоятельно методом отсеивания с помощью инструмента Cheat Search, встроенного в FCEUX. В данном случае нам известно, что по адресу </span><span class="rvts55">0x3AD </span><span class="rvts22">в игре хранится координата X Марио, а по адресу </span><span class="rvts55">0xCE</span><span class="rvts22"> координата Y. Поэтому от скрипта требуется только взять эти значения и нарисовать прямоугольник на соответствующем месте экрана.</span></p>
<p class="rvps10"><span class="rvts22">Про функции readbyte() и drawbox(), а также про другие полезные функции написано в </span><a class="rvts28" href="http://www.fceux.com/web/help/fceux.html?LuaFunctionsList.html" target="_blank">документации эмулятора FCEUX</a><span class="rvts22">. Про функции, доступные при запущенном Тасэдиторе, написано в </span><a class="rvts28" href="LuaAPI.html">Справочнике</a><span class="rvts22">. Используя эти знания, можно не только рисовать и выводить надписи поверх экрана приставки, но и контролировать Курсор Проигрывателя и Выделение, а главное манипулировать Вводом и Маркерами мувика.</span></p>
<p class="rvps10"><span class="rvts22">Например, так может выглядеть код, копирующий Ввод первого джойстика на место второго джойстика:</span></p>
<p class="rvps10"><span class="rvts22">При активации этого скрипта FCEUX создаст и инициализирует две переменные ("marioWidth" и "marioHeight"), а затем зарегистрирует функцию с названием everyframe() на событие окончания каждого кадра (registerafter). После этого текст в скрипте заканчивается, и скрипт перестаёт выполняться, однако зарегистрированная функция остаётся в памяти эмулятора, и если теперь вы отпустите паузу или начнёте нажимать </span><span class="rvts27">Frame Advance</span><span class="rvts22">, после каждого кадра будет запускаться код, находящийся внутри функции everyframe(). Этот код состоит из трёх строк. Первые две создают переменные, отвечающие за координаты хитбокса, и инициализируют их текущими значениями из оперативной памяти (RAM) эмулируемой приставки. Третья строчка рисует графику поверх изображения игры.</span></p>
<p class="rvps10"><span class="rvts22">Конкретные адреса ячеек оперативной памяти можно взять из публичных источников (например, </span><a class="rvts28" href="http://tasvideos.org/GameResources/NES/SuperMarioBros.html" target="_blank">http://tasvideos.org/GameResources/NES/SuperMarioBros.html</a><span class="rvts22">) или найти самостоятельно с помощью инструментов Cheat Search или RAM Search, встроенных в FCEUX. В данном случае нам известно, что по адресу </span><span class="rvts56">0x3AD </span><span class="rvts22">в игре хранится координата X Марио, а по адресу </span><span class="rvts56">0xCE</span><span class="rvts22"> координата Y. Поэтому от скрипта требуется только взять их текущие значения и нарисовать прямоугольник на соответствующем месте экрана. Иногда приходится пересчитывать эти значения, чтобы перевести внутриигровые координаты в экранные координаты, но в данном случае они совпадают.</span></p>
<p class="rvps10"><span class="rvts22">Про стандартные функции readbyte() и drawbox(), а также про другие полезные функции написано в </span><a class="rvts28" href="http://www.fceux.com/web/help/fceux.html?LuaFunctionsList.html" target="_blank">документации эмулятора FCEUX</a><span class="rvts22">. Там же написано про использование математических выражений, организацию циклов и условий.</span></p>
<p class="rvps10"><span class="rvts22">Про стандартные функции, доступные только при запущенном Тасэдиторе, написано в </span><a class="rvts28" href="LuaAPI.html">Справочнике</a><span class="rvts22">. Используя все эти знания, можно не только рисовать и выводить надписи поверх экрана приставки, но и контролировать Проигрыватель и Выделение, а главное, изменять Ввод и Маркеры мувика.</span></p>
<p class="rvps10"><span class="rvts22">Например, вот так может выглядеть код, копирующий Ввод первого джойстика на место второго джойстика:</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<div class="rvps10"><table width="98%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid;">
<tr valign="top">
<td style="border-color: #000000; border-style: solid;"><p class="rvps2"><span class="rvts55">function doCopy()</span></p>
<p class="rvps2"><span class="rvts55"></span><span class="rvts55"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts55">selection_table = taseditor.getselection()</span></p>
<p class="rvps2"><span class="rvts55"></span><span class="rvts55"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts55">if (selection_table ~= nil) then</span></p>
<p class="rvps2"><span class="rvts55"></span><span class="rvts55"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts55"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts55">for i = 1, #selection_table do</span></p>
<p class="rvps2"><span class="rvts55"></span><span class="rvts55"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts55"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts55"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts55">selected_frame = selection_table[i]</span></p>
<p class="rvps2"><span class="rvts55"></span><span class="rvts55"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts55"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts55"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts55">joypad1data = taseditor.getinput(selected_frame, 1)</span></p>
<p class="rvps2"><span class="rvts55"></span><span class="rvts55"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts55"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts55"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts55">taseditor.submitinputchange(selected_frame, 2, joypad1data)</span></p>
<p class="rvps2"><span class="rvts55"></span><span class="rvts55"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts55"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts55">end</span></p>
<p class="rvps2"><span class="rvts55"></span><span class="rvts55"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts55"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts55">taseditor.applyinputchanges("Copy 1P-&gt;2P")</span></p>
<p class="rvps2"><span class="rvts55"></span><span class="rvts55"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts55">end</span></p>
<p class="rvps2"><span class="rvts55">end</span></p>
<p class="rvps2"><span class="rvts55"><br/></span></p>
<p class="rvps2"><span class="rvts55">taseditor.registermanual(doCopy, "Copy 1P to 2P")</span></p>
<td style="border-color: #000000; border-style: solid;"><p class="rvps2"><span class="rvts56">function doCopy()</span></p>
<p class="rvps2"><span class="rvts56"></span><span class="rvts56"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts56">selection_table = taseditor.getselection()</span></p>
<p class="rvps2"><span class="rvts56"></span><span class="rvts56"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts56">if (selection_table ~= nil) then</span></p>
<p class="rvps2"><span class="rvts56"></span><span class="rvts56"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts56"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts56">for i = 1, #selection_table do</span></p>
<p class="rvps2"><span class="rvts56"></span><span class="rvts56"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts56"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts56"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts56">selected_frame = selection_table[i]</span></p>
<p class="rvps2"><span class="rvts56"></span><span class="rvts56"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts56"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts56"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts56">joypad1data = taseditor.getinput(selected_frame, 1)</span></p>
<p class="rvps2"><span class="rvts56"></span><span class="rvts56"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts56"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts56"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts56">taseditor.submitinputchange(selected_frame, 2, joypad1data)</span></p>
<p class="rvps2"><span class="rvts56"></span><span class="rvts56"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts56"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts56">end</span></p>
<p class="rvps2"><span class="rvts56"></span><span class="rvts56"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts56"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts56">taseditor.applyinputchanges("Copy 1P-&gt;2P")</span></p>
<p class="rvps2"><span class="rvts56"></span><span class="rvts56"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts56">end</span></p>
<p class="rvps2"><span class="rvts56">end</span></p>
<p class="rvps2"><span class="rvts56"><br/></span></p>
<p class="rvps2"><span class="rvts56">taseditor.registermanual(doCopy, "Copy 1P to 2P")</span></p>
</td>
</tr>
</table>
</div>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">При запуске этого скрипта FCEUX зарегистрирует функцию doCopy() на событие нажатия кнопки </span><span class="rvts32">Run function</span><span class="rvts22">(registermanual). Теперь при каждом нажатии этой кнопки будет запускаться код этой функции, который состоит из девяти строк. Сначала функция получает от Тасэдитора информацию о Выделении, и если оно не пустое (то есть выделен хотя бы один кадр в Piano Roll), то запускается цикл "for", перебирающий все выделенные кадры по порядку, начиная с первого и заканчивая последним. Для каждого выделенного кадра функция запрашивает у Тасэдитора Ввод первого игрока (и сохраняет в переменную </span><span class="rvts55">joypad1data</span><span class="rvts22">), затем делает заявку на изменение Ввода второго игрока в этом же кадре. Все заявки накапливаются в памяти Тасэдитора до завершения цикла for, после чего они все разом исполняются с помощью вызова applyinputchanges(). В итоге Ввод второго джойстика в выделенных кадрах будет совпадать с Вводом первого джойстика.</span></p>
<p class="rvps10"><span class="rvts22">При запуске этого скрипта FCEUX зарегистрирует функцию doCopy() на событие нажатия кнопки "</span><span class="rvts32">Run function</span><span class="rvts22">"</span><span class="rvts32"> </span><span class="rvts22">(registermanual). Теперь при любом нажатии этой кнопки будет запускаться код этой функции, который состоит из девяти строк. Сначала функция получает от Тасэдитора информацию о Выделении, и если оно не пустое (то есть выделен хотя бы один кадр в Piano Roll), то запускается цикл FOR, перебирающий все выделенные кадры по порядку, начиная с первого и заканчивая последним. Для каждого выделенного кадра функция запрашивает у Тасэдитора Ввод первого игрока (и сохраняет в переменную "joypad1data"), затем делает заявку на изменение Ввода второго игрока в этом же кадре. Все заявки накапливаются в памяти Тасэдитора до завершения цикла FOR, после чего они все разом исполняются с помощью вызова applyinputchanges(). В итоге Ввод второго джойстика в выделенных кадрах будет совпадать с Вводом первого джойстика.</span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/lua-run-manual.png"/></p>
<p class="rvps10"><span class="rvts22">Этот весьма простой скрипт уже представляет из себя полезный инструмент, который может пригодиться вам при создании ТАСов &nbsp;с управлением двумя игроками одновременно. После запуска этого скрипта вы во время ТАСинга сможете выделять в Piano Roll ряд кадров и нажимать кнопку </span><span class="rvts32">Run function</span><span class="rvts22"> (или хоткей "</span><span class="rvts26">Run Manual Lua function</span><span class="rvts22">") для синхронизации обоих игроков. Когда в результате действий этого скрипта изменится Ввод, произойдёт естественное усечение Гринзоны и добавление записи в Журнал Истории, чтобы при необходимости вы могли откатить произведённые скриптом изменения. Таким образом вы получаете полностью интегрированную в Тасэдитор фичу, логику которой запрограммировали сами.</span></p>
<p class="rvps10"><span class="rvts22">Хотя вы можете успешно ТАСить и без знания языка Lua, его использование может значительно сэкономить вам время и даже натолкнуть на неочевидные решения при оптимизации Ввода и анализе игрового Вывода.</span></p>
<p class="rvps10"><span class="rvts22">Очень часто игра скрывает от игрока существенные детали происходящего, и ТАСеру приходится просматривать состояние памяти напрямую, чтобы ориентироваться в ситуации и ощущать факторы оптимальности во время шлифовки участков. Например, во многих играх счётчик жизней босса не показывается на экране. Поэтому, чтобы точно знать данные о нанесении урона, ТАСеру необходимо просматривать числовое значение соответствующей ячейки RAM с помощью инструмента Memory Watch.</span></p>
<p class="rvps10"><span class="rvts22">А когда таких скрытых факторов много (например, несколько таймеров неуязвимости и атак босса, а также особые счётчики самого игрового персонажа), ТАСеру приходится просматривать и анализировать множество ячеек памяти, значения которых колеблются по разнообразным законам. В этом случае большим подспорьем будет визуализация некоторых данных на экране эмулятора, а не только в виде чисел в окне Memory Watch. Например, счётчик жизней босса можно изобразить в виде полоски над его головой (используя тот же метод drawbox), причём цвет полоски может быть индикатором нанесения урона или ещё каких-нибудь событий. В результате вы неплохо разгружаете голову, переходя от формата данных, который требуется переваривать, к формату, который сразу доводит основную мысль (например, "удар по боссу сработал").</span></p>
<p class="rvps10"><span class="rvts22">Поэтому рекомендуется освоить Lua хотя бы на уровне осмысленной модификации чужих скриптов. За время существования FCEUX было написано и опубликовано множество скриптов, выполняющих самые разные цели, и возможно, вам потребуется только изменить в чужом скрипте адреса ячеек RAM, подстроив его под свою игру. В некоторых случаях имеет смысл попросить помощи на </span><a class="rvts28" href="http://tasvideos.org/forum/viewforum.php?f=25" target="_blank">форуме TASVideos</a><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Этот весьма простой скрипт уже представляет из себя полезный мини-инструмент, который может пригодиться вам при создании ТАСов &nbsp;с управлением двумя игроками одновременно. После запуска этого скрипта вы во время ТАСинга сможете выделять в Piano Roll ряд кадров и нажимать кнопку "</span><span class="rvts32">Copy 1P to 2P</span><span class="rvts22">" (или хоткей "</span><span class="rvts26">Run Manual Lua function</span><span class="rvts22">") для синхронизации обоих игроков. Каждый раз, когда в результате действий этого скрипта изменяется Ввод, происходит естественное усечение Гринзоны и добавление записи в Журнал Истории, чтобы при необходимости можно было откатить произведённые скриптом изменения. Таким образом вы получаете полностью интегрированную в Тасэдитор фичу, поведение которой запрограммировали сами.</span></p>
<p class="rvps10"><span class="rvts22">Хотя вы можете успешно ТАСить и без знания языка Lua, его использование может значительно сэкономить вам время и даже натолкнуть на неочевидные решения при оптимизации Ввода (а точнее, при анализе игрового Вывода).</span></p>
<p class="rvps10"><span class="rvts22">Очень часто видеоигры скрывают от игрока существенные детали происходящего, и ТАСеру приходится просматривать состояние памяти напрямую, чтобы точно ориентироваться в ситуации и ощущать факторы оптимальности во время шлифовки участков.</span></p>
<p class="rvps10"><span class="rvts22">Например, во многих играх счётчик жизней босса не показывается на экране. Поэтому, чтобы точно знать данные о нанесении урона, ТАСеру необходимо просматривать числовое значение соответствующей ячейки RAM с помощью инструмента Memory Watch. А когда таких скрытых факторов много (например, несколько таймеров неуязвимости и атак босса, а также особые счётчики самого игрового персонажа), ТАСеру приходится просматривать и анализировать множество ячеек памяти, значения которых колеблются по разнообразным законам. В этом случае большим подспорьем будет визуализация некоторых данных на экране эмулятора. Например, счётчик жизней босса можно изобразить в виде полоски или числа над его головой, причём красным цветом можно акцентировать кадры нанесения урона или ещё какие-нибудь события. В результате вы неплохо разгружаете голову, переходя от формата абстрактных данных, которые требуется расшифровывать, к формату, который сразу доводит основную мысль (например, "удар по боссу сработал", "хорошо/плохо").</span></p>
<p class="rvps10"><span class="rvts22">Поэтому рекомендуется освоить Lua хотя бы на уровне осмысленной модификации чужих скриптов. За долгое время существования FCEUX было написано и опубликовано множество скриптов, выполняющих самые разные цели, и возможно, вам потребуется только изменить в чужом скрипте адреса ячеек RAM, подстроив его под свою игру. Порой также имеет смысл попросить помощи на </span><a class="rvts28" href="http://tasvideos.org/forum/viewforum.php?f=25" target="_blank">форуме TASVideos</a><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Курс по изучению Тасэдитора подошёл к концу. Если вы добросовестно подошли к чтению, теперь вы знаете почти всё, что нужно знать ТАСеру. Осталось лишь набраться опыта в реальной работе, довести большинство действий до автоматизма, чтобы не чувствовать рутину, а просто получать удовольствие от процесса вооружённого прохождения и исследования видеоигр.</span></p>
<p class="rvps10"><span class="rvts22">Курс по изучению Тасэдитора подошёл к концу. Если вы внимательно подошли к чтению, теперь вы знаете всё, что требуется для создания ТАСов на уровне TASVideos. Осталось лишь набраться опыта в реальной работе, довести большинство действий до автоматизма, чтобы не чувствовать рутину, а просто получать удовольствие от процесса вооружённого прохождения и исследования видеоигр.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/help-authoring-tool">Single source CHM, PDF, DOC and HTML Help creation</a></p>
</div>

View File

@ -3,7 +3,7 @@
<head>
<title>Курс для новичка</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("BeginnersGuide");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("BeginnersGuide");
}
});
</script>
</head>
@ -48,6 +51,7 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">Курс для новичка</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
@ -78,7 +82,8 @@
<p class="rvps12"><span class="rvts25"><br/></span></p>
<p class="rvps12"><span class="rvts25"><br/></span></p>
<p class="rvps12"><span class="rvts25"><br/></span></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/feature-tour/create-ebooks-for-amazon-kindle">Full featured Kindle eBooks generator</a></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/feature-tour/create-ebooks-for-amazon-kindle">Full-featured Kindle eBooks generator</a></p>
</div>
<div id="topic_footer">

View File

@ -3,7 +3,7 @@
<head>
<title>Управление</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("Controls");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("Controls");
}
});
</script>
</head>
@ -52,6 +55,7 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">Управление</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
@ -63,19 +67,19 @@
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps2"><a name="mouse"></a>
<span class="rvts6"><br/></span></p>
<p><span class="rvts58">Управление мышью</span></p>
<p><span class="rvts59">Управление мышью</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps2" style="text-indent: 30px"><a class="rvts56" href="Controls.html#mouseover">наведение курсором</a></li>
<li class="rvps2" style="text-indent: 30px"><a class="rvts56" href="Controls.html#leftbutton">левая кнопка</a></li>
<li class="rvps2" style="text-indent: 30px"><a class="rvts56" href="Controls.html#rightbutton">правая кнопка</a></li>
<li class="rvps2" style="text-indent: 30px"><a class="rvts56" href="Controls.html#middlebutton">средняя кнопка</a></li>
<li class="rvps2" style="text-indent: 30px"><a class="rvts56" href="Controls.html#wheel">колесо</a></li>
<li class="rvps26" style="text-indent: 30px"><a class="rvts57" href="Controls.html#mouseover">наведение курсором</a></li>
<li class="rvps26" style="text-indent: 30px"><a class="rvts57" href="Controls.html#leftbutton">левая кнопка</a></li>
<li class="rvps26" style="text-indent: 30px"><a class="rvts57" href="Controls.html#rightbutton">правая кнопка</a></li>
<li class="rvps26" style="text-indent: 30px"><a class="rvts57" href="Controls.html#middlebutton">средняя кнопка</a></li>
<li class="rvps26" style="text-indent: 30px"><a class="rvts57" href="Controls.html#wheel">колесо</a></li>
</ul>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><a name="mouseover"></a>
<span class="rvts6"><br/></span></p>
<p class="rvps10"><span class="rvts51">Наведение курсором</span></p>
<p class="rvps10"><span class="rvts52">Наведение курсором</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Курсор мыши служит указателем на элементы оконного интерфейса.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
@ -90,18 +94,18 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="leftbutton"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts51">Левая кнопка</span></p>
<p class="rvps10"><span class="rvts52">Левая кнопка</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Левая кнопка выполняет основную роль.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts26">A. </span><span class="rvts37">Стандартные операции в Windows</span></p>
<p class="rvps10"><span class="rvts22">Большинство элементов окна TAS Editor управляется так же, как в других Windows-программах:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">нажатие кнопок в GUI, в том числе щелчки по прогрессбару, по надписи "Bookmarks/Branches" или по "Marker #" действует в момент нажатия</span></li>
<li class="rvps15"><span class="rvts22">установка/снятие галочек в GUI действует в момент отпускания</span></li>
<li class="rvps15"><span class="rvts22">раскрытие меню программы, выбор команды в меню, установка/снятие галочек в меню</span></li>
<li class="rvps15"><span class="rvts22">скроллинг обозримой области Piano Roll или Журнала Истории с помощью скроллбаров</span></li>
<li class="rvps15"><span class="rvts22">перетаскивание окна TAS Editor и изменение размеров окна</span></li>
<li class="rvps10"><span class="rvts22">нажатие кнопок в GUI, в том числе щелчки по прогрессбару, по надписи "Bookmarks/Branches" или по "Marker #" действует в момент нажатия</span></li>
<li class="rvps10"><span class="rvts22">установка/снятие галочек в GUI действует в момент отпускания</span></li>
<li class="rvps10"><span class="rvts22">раскрытие меню программы, выбор команды в меню, установка/снятие галочек в меню</span></li>
<li class="rvps10"><span class="rvts22">скроллинг обозримой области Piano Roll или Журнала Истории с помощью скроллбаров</span></li>
<li class="rvps10"><span class="rvts22">перетаскивание окна TAS Editor и изменение размеров окна</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts26">B. </span><span class="rvts37">Управление Курсором Проигрывателя</span></p>
@ -148,7 +152,7 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="rightbutton"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts51">Правая кнопка</span></p>
<p class="rvps10"><span class="rvts52">Правая кнопка</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Правая кнопка мыши используется реже, чем левая.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
@ -164,26 +168,26 @@
<p class="rvps10"><span class="rvts22">Эта операция срабатывает в момент отпускания правой кнопки мыши.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts26">D. </span><span class="rvts37">Контекстное меню</span></p>
<p class="rvps10"><span class="rvts22">Когда курсор мыши находится над номером выделенного кадра (в колонке "Frame#" Списка Piano Roll), щелчок правой кнопкой вызывает контекстное меню. Меню появляется в момент отпускания правой кнопки мыши. Если щёлкнуть правой кнопкой по не выделенному кадру, ничего не произойдёт.</span></p>
<p class="rvps10"><span class="rvts22">Контекстное меню содержит следующие пункты:</span></p>
<p class="rvps10"><span class="rvts22">Когда курсор мыши находится над номером выделенного кадра (в колонке "Frame#" Списка Piano Roll), щелчок правой кнопкой вызывает контекстное меню, которое</span><span class="rvts22"> содержит следующие пункты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps22" style="margin-left: 0; text-indent: 30px"><span class="rvts44">Set Markers</span></li>
<li class="rvps22" style="margin-left: 0; text-indent: 30px"><span class="rvts44">Remove Markers</span></li>
<li class="rvps22" style="margin-left: 0; text-indent: 30px"><span class="rvts44">Deselect</span></li>
<li class="rvps22" style="margin-left: 0; text-indent: 30px"><span class="rvts44">Select between Markers</span></li>
<li class="rvps22" style="margin-left: 0; text-indent: 30px"><span class="rvts44">Clear</span></li>
<li class="rvps22" style="margin-left: 0; text-indent: 30px"><span class="rvts44">Delete</span></li>
<li class="rvps22" style="margin-left: 0; text-indent: 30px"><span class="rvts44">Insert</span></li>
<li class="rvps22" style="margin-left: 0; text-indent: 30px"><span class="rvts44">Insert # of Frames</span></li>
<li class="rvps22" style="margin-left: 0; text-indent: 30px"><span class="rvts44">Clone</span></li>
<li class="rvps22" style="margin-left: 0; text-indent: 30px"><span class="rvts44">Truncate movie</span></li>
<li class="rvps25" style="margin-left: 0; text-indent: 30px"><span class="rvts44">Set Markers</span></li>
<li class="rvps25" style="margin-left: 0; text-indent: 30px"><span class="rvts44">Remove Markers</span></li>
<li class="rvps25" style="margin-left: 0; text-indent: 30px"><span class="rvts44">Deselect</span></li>
<li class="rvps25" style="margin-left: 0; text-indent: 30px"><span class="rvts44">Select between Markers</span></li>
<li class="rvps25" style="margin-left: 0; text-indent: 30px"><span class="rvts44">Ungreenzone</span></li>
<li class="rvps25" style="margin-left: 0; text-indent: 30px"><span class="rvts44">Clear</span></li>
<li class="rvps25" style="margin-left: 0; text-indent: 30px"><span class="rvts44">Delete</span></li>
<li class="rvps25" style="margin-left: 0; text-indent: 30px"><span class="rvts44">Insert</span></li>
<li class="rvps25" style="margin-left: 0; text-indent: 30px"><span class="rvts44">Insert # of Frames</span></li>
<li class="rvps25" style="margin-left: 0; text-indent: 30px"><span class="rvts44">Clone</span></li>
<li class="rvps25" style="margin-left: 0; text-indent: 30px"><span class="rvts44">Truncate movie</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Также свои контекстные меню есть у текстовых полей (при редактировании Заметок) и у скроллбаров.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="middlebutton"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts51">Средняя кнопка</span></p>
<p class="rvps10"><span class="rvts52">Средняя кнопка</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">У средней кнопки мыши есть только одна функция ставить и снимать паузу эмуляции. Не имеет значения, где находится курсор мыши в момент щелчка средней кнопкой. Кнопка</span><span class="rvts22"> срабатывает в момент нажатия.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
@ -197,7 +201,7 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="wheel"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts51">Колесо</span></p>
<p class="rvps10"><span class="rvts52">Колесо</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Колесо можно вращать вверх и вниз с различной скоростью. Когда требуется высокая точность, вращайте колесо медленно. Когда требуется быстрое перемещение, вращайте колесо быстро.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
@ -213,33 +217,33 @@
<p class="rvps10"><span class="rvts22">Если зажать клавишу </span><span class="rvts34">Shift</span><span class="rvts22">, при прокручивании колеса Курсор Проигрывателя будет прыгать по Маркерам, позволяя быстро перейти к любому кадру Гринзоны. Piano Roll будет следовать за Курсором Проигрывателя, если установлена галочка "Follow cursor".</span></p>
<p class="rvps10"><span class="rvts22">Если зажать клавишу </span><span class="rvts34">Ctrl</span><span class="rvts22">, при прокручивании колеса Курсор Выделения будет прыгать по Маркерам, позволяя быстро перейти к любому кадру мувика. Piano Roll всегда будет следовать за Курсором Выделения.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts26">D. </span><span class="rvts37">Пересечение промежутков во Вводе или Маркерах</span></p>
<p class="rvps10"><span class="rvts26">D. </span><span class="rvts37">Пересечение промежутков</span></p>
<p class="rvps10"><span class="rvts22">Зажать клавишу </span><span class="rvts34">Alt</span><span class="rvts22">, навести курсор мыши на любое место длинного столбика кнопочных нажатий (или, наоборот, на пустоту) и сделать поворот колеса вверх или вниз. Piano Roll проскроллируется соответственно вверх или вниз на некое количество кадров, рассчитав расстояние так, чтобы курсор мыши указывал на кадр перед началом или после окончания этого длинного ряда кнопочных нажатий (или на начало/окончание пустоты).</span></p>
<p class="rvps10"><span class="rvts22">Такой же подход можно применять для поиска соседних Маркеров.</span></p>
<p class="rvps10"><span class="rvts22">Такой же подход можно применять для поиска соседних Маркеров (когда курсор мыши над колонкой с номерами кадров) или Закладок (над колонкой иконок).</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps2"><a name="keyboard"></a>
<span class="rvts6"><br/></span></p>
<p><span class="rvts58">Управление клавиатурой</span></p>
<p><span class="rvts59">Управление клавиатурой</span></p>
<p class="rvps2"><span class="rvts39"><br/></span></p>
<p class="rvps5"><img alt="" style="padding : 1px;" src="lib/keyboard-all-keys.png"/></p>
<p class="rvps5"><span class="rvts39"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps2" style="text-indent: 30px"><a class="rvts61" href="Controls.html#modifiers">модификаторы (Shift, Ctrl, Alt)</a></li>
<li class="rvps2" style="text-indent: 30px"><a class="rvts61" href="Controls.html#accelerators">клавиатурные акселераторы</a></li>
<li class="rvps2" style="text-indent: 30px"><a class="rvts61" href="Controls.html#hotkeys">хоткеи FCEUX</a></li>
<li class="rvps2" style="text-indent: 30px"><a class="rvts61" href="Controls.html#virtual_joypad">кнопки виртуальных джойстиков</a></li>
<li class="rvps26" style="text-indent: 30px"><a class="rvts62" href="Controls.html#modifiers">модификаторы (Shift, Ctrl, Alt)</a></li>
<li class="rvps26" style="text-indent: 30px"><a class="rvts62" href="Controls.html#accelerators">клавиатурные акселераторы</a></li>
<li class="rvps26" style="text-indent: 30px"><a class="rvts62" href="Controls.html#hotkeys">хоткеи FCEUX</a></li>
<li class="rvps26" style="text-indent: 30px"><a class="rvts62" href="Controls.html#virtual_joypad">кнопки виртуальных джойстиков</a></li>
</ul>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><a name="modifiers"></a>
<span class="rvts6"><br/></span></p>
<p class="rvps10"><span class="rvts51">Модификаторы (Shift, Ctrl, Alt)</span></p>
<p class="rvps10"><span class="rvts52">Модификаторы (Shift, Ctrl, Alt)</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Зажатие этих клавиш изменяет функции щелчка левой кнопкой мыши, а также функции вращения колеса.</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts34">Shift</span><span class="rvts22"> отвечает за навигацию Курсором Проигрывателя, а также за выделение региона кадров.</span></li>
<li class="rvps15"><span class="rvts34">Ctrl</span><span class="rvts22"> отвечает за навигацию Курсором Выделения, а также за выделение добавочных кадров.</span></li>
<li class="rvps15"><span class="rvts34">Alt</span><span class="rvts22"> отвечает за генерацию </span><span class="rvts22">Ввод</span><span class="rvts22">а/Маркеров/выделения по шаблону, а также за пересечение промежутков колесом.</span></li>
<li class="rvps10"><span class="rvts34">Shift</span><span class="rvts22"> отвечает за навигацию Курсором Проигрывателя, а также за выделение региона кадров.</span></li>
<li class="rvps10"><span class="rvts34">Ctrl</span><span class="rvts22"> отвечает за навигацию Курсором Выделения, а также за выделение добавочных кадров.</span></li>
<li class="rvps10"><span class="rvts34">Alt</span><span class="rvts22"> отвечает за генерацию </span><span class="rvts22">Ввод</span><span class="rvts22">а/Маркеров/выделения по шаблону, а также за пересечение промежутков колесом.</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Если быстро нажать </span><span class="rvts34">Shift </span><span class="rvts22">два раза подряд, Piano Roll </span><span class="rvts22">автоматически скроллируется к Курсору Проигрывателя.</span></p>
@ -249,58 +253,58 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="accelerators"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts51">Клавиатурные акселераторы</span></p>
<p class="rvps10"><span class="rvts52">Клавиатурные акселераторы</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Это жёстко определённые комбинации клавиш, типичные для большинства Windows-программ. В данном руководстве эти комбинации отмечаются красным цветом.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps18"><img alt="" style="padding : 1px;" src="lib/keyboard-accelerator-keys.png"/></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts34">Ctrl + S</span><span class="rvts22"> = сохранить проект на диск</span></p>
<p class="rvps10"><span class="rvts57"><br/></span></p>
<p class="rvps10"><span class="rvts58"><br/></span></p>
<p class="rvps10"><span class="rvts34">Ctrl + Z</span><span class="rvts22"> = откат последнего изменения (undo)</span></p>
<p class="rvps10"><span class="rvts34">Ctrl + Y</span><span class="rvts22"> = возврат к отменённым изменениям (redo)</span></p>
<p class="rvps10"><span class="rvts57"><br/></span></p>
<p class="rvps10"><span class="rvts58"><br/></span></p>
<p class="rvps10"><span class="rvts34">Ctrl + Q</span><span class="rvts22"> = восстановление предыдущего Выделения (Selection undo)</span></p>
<p class="rvps10"><span class="rvts34">Ctrl + W</span><span class="rvts22"> = восстановление следующего Выделения (Selection redo)</span></p>
<p class="rvps10"><span class="rvts34">Ctrl + A</span><span class="rvts22"> = выделить все кадры между двумя соседними Маркерами</span></p>
<p class="rvps10"><span class="rvts34">Ctrl + B</span><span class="rvts22"> = выделить участок, ранее скопированный в Буфер Обмена</span></p>
<p class="rvps10"><span class="rvts57"><br/></span></p>
<p class="rvps10"><span class="rvts58"><br/></span></p>
<p class="rvps10"><span class="rvts34">Ctrl + C</span><span class="rvts22"> = копировать выделенный </span><span class="rvts22">Ввод</span><span class="rvts22"> в Буфер Обмена</span></p>
<p class="rvps10"><span class="rvts34">Ctrl + X</span><span class="rvts22"> = вырезать выделенный </span><span class="rvts22">Ввод</span><span class="rvts22"> в Буфер Обмена</span></p>
<p class="rvps10"><span class="rvts34">Ctrl + V</span><span class="rvts22"> = вставить </span><span class="rvts22">Ввод</span><span class="rvts22"> из Буфера Обмена поверх старого </span><span class="rvts22">Ввод</span><span class="rvts22">а</span></p>
<p class="rvps10"><span class="rvts34">Ctrl + </span><span class="rvts34">Shift + V</span><span class="rvts22"> = вставить </span><span class="rvts22">Ввод</span><span class="rvts22"> из Буфера Обмена с раздвиганием старого </span><span class="rvts22">Ввод</span><span class="rvts22">а</span></p>
<p class="rvps10"><span class="rvts57"><br/></span></p>
<p class="rvps10"><span class="rvts58"><br/></span></p>
<p class="rvps10"><span class="rvts34">Delete</span><span class="rvts22"> = очистить выделенный </span><span class="rvts22">Ввод</span></p>
<p class="rvps10"><span class="rvts34">Ctrl + Delete</span><span class="rvts22"> = удалить выделенные кадры из мувика</span></p>
<p class="rvps10"><span class="rvts34">Insert</span><span class="rvts22"> = вставить заданное число кадров в мувик</span></p>
<p class="rvps10"><span class="rvts34">Ctrl + Insert</span><span class="rvts22"> = клонировать выделенные кадры</span></p>
<p class="rvps10"><span class="rvts34">Ctrl + </span><span class="rvts34">Shift + Insert</span><span class="rvts22"> = вставить пустые кадры на место выделения</span></p>
<p class="rvps10"><span class="rvts57"><br/></span></p>
<p class="rvps10"><span class="rvts58"><br/></span></p>
<p class="rvps10"><span class="rvts34">Ctrl + F</span><span class="rvts22"> = вызвать окно Find Note</span></p>
<p class="rvps10"><span class="rvts57"><br/></span></p>
<p class="rvps10"><span class="rvts58"><br/></span></p>
<p class="rvps10"><span class="rvts34">Ctrl + PageUp</span><span class="rvts22"> / </span><span class="rvts34">Ctrl + </span><span class="rvts34">Page</span><span class="rvts34">Down</span><span class="rvts22"> = прыгать Курсором Выделения по Маркерам</span></p>
<p class="rvps10"><span class="rvts34">Ctrl + Home</span><span class="rvts22"> / </span><span class="rvts34">Ctrl + </span><span class="rvts34">End</span><span class="rvts22"> </span><span class="rvts22">=</span><span class="rvts22"> </span><span class="rvts22">переместить Выделение</span><span class="rvts22"> </span><span class="rvts22">в начало / в конец мувика</span></p>
<p class="rvps10"><span class="rvts34">Ctrl + Вверх</span><span class="rvts22"> / </span><span class="rvts34">Ctrl + Вниз</span><span class="rvts22"> = переместить Выделение на 1 кадр выше / ниже</span></p>
<p class="rvps10"><span class="rvts34">Ctrl + Вправо</span><span class="rvts22"> / </span><span class="rvts34">Ctrl + Влево</span><span class="rvts22"> = скроллировать Piano Roll вправо и влево</span></p>
<p class="rvps10"><span class="rvts57"><br/></span></p>
<p class="rvps10"><span class="rvts58"><br/></span></p>
<p class="rvps10"><span class="rvts34">Shift + </span><span class="rvts34">Page</span><span class="rvts34">Up</span><span class="rvts22"> / </span><span class="rvts34">Shift + </span><span class="rvts34">PageD</span><span class="rvts34">own</span><span class="rvts22"> </span><span class="rvts22">=</span><span class="rvts22"> прыгать Курсором Проигрывателя по Маркерам</span></p>
<p class="rvps10"><span class="rvts34">Shift + Home</span><span class="rvts22"> / </span><span class="rvts34">Shift + </span><span class="rvts34">End</span><span class="rvts22"> </span><span class="rvts22">=</span><span class="rvts22"> прыгать Курсором Проигрывателя </span><span class="rvts22">в начало / в конец мувика</span></p>
<p class="rvps10"><span class="rvts34">Shift + Вверх</span><span class="rvts22"> / </span><span class="rvts34">Shift</span><span class="rvts34"> + Вниз</span><span class="rvts22"> = переместить Курсор Проигрывателя на 1 кадр выше / ниже</span></p>
<p class="rvps10"><span class="rvts34">Shift + Вправо</span><span class="rvts22"> / </span><span class="rvts34">Shift</span><span class="rvts34"> + Влево</span><span class="rvts22"> = скроллировать Piano Roll вправо и влево</span></p>
<p class="rvps10"><span class="rvts57"><br/></span></p>
<p class="rvps10"><span class="rvts58"><br/></span></p>
<p class="rvps10"><span class="rvts34">PageUp</span><span class="rvts22"> / </span><span class="rvts34">Page</span><span class="rvts34">Down</span><span class="rvts22"> = скроллировать Piano Roll постранично вверх / вниз</span></p>
<p class="rvps10"><span class="rvts34">Home</span><span class="rvts22"> / </span><span class="rvts34">End</span><span class="rvts22"> = скроллировать Piano Roll в начало / в конец мувика</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="hotkeys"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts51">Хоткеи FCEUX</span></p>
<p class="rvps10"><span class="rvts52">Хоткеи FCEUX</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Настраиваемые клавиши эмулятора. См. главу </span><a class="rvts28" href="ProgramCustomization.html">Настройка программы</a><span class="rvts22">. </span><span class="rvts22">Клавиши, уже настроенные по умолчанию, в данном Руководстве отмечаются голубым цветом.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps18"><img alt="" style="padding : 1px;" src="lib/keyboard-hotkeys.png"/></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts27">Ctrl + F1</span><span class="rvts22"> = открыть последний проект</span></p>
<p class="rvps10"><span class="rvts57"><br/></span></p>
<p class="rvps10"><span class="rvts58"><br/></span></p>
<p class="rvps10"><span class="rvts27">Pause</span><span class="rvts22"> = пауза эмулятора</span></p>
<p class="rvps10"><span class="rvts27">Esc</span><span class="rvts22"> = отменить добегание</span></p>
<p class="rvps10"><span class="rvts27">Пробел</span><span class="rvts22"> = восстановить позицию Курсора Проигрывателя</span></p>
@ -308,126 +312,126 @@
<p class="rvps10"><span class="rvts27">\</span><span class="rvts22"> (обратная косая черта) = </span><span class="rvts27">Frame Advance</span><span class="rvts22"> (продвинуться на 1 кадр вперёд)</span></p>
<p class="rvps10"><span class="rvts27">Backspace </span><span class="rvts22">= перемотать на 1 кадр назад</span></p>
<p class="rvps10"><span class="rvts27">Shift + R</span><span class="rvts22"> = запустить проигрывание мувика с начала</span></p>
<p class="rvps10"><span class="rvts57"><br/></span></p>
<p class="rvps10"><span class="rvts58"><br/></span></p>
<p class="rvps10"><span class="rvts27">-</span><span class="rvts22"> (белая клавиша "минус") = снизить скорость эмуляции</span></p>
<p class="rvps10"><span class="rvts27">=</span><span class="rvts22"> (белая клавиша "равно") = повысить скорость эмуляции</span></p>
<p class="rvps10"><span class="rvts27">Tab</span><span class="rvts22"> = Турбо (действует, пока клавиша зажата)</span></p>
<p class="rvps10"><span class="rvts57"><br/></span></p>
<p class="rvps10"><span class="rvts58"><br/></span></p>
<p class="rvps10"><span class="rvts27">F1</span><span class="rvts27">-</span><span class="rvts27">F10</span><span class="rvts22"> = загрузка ответвления из Закладки</span></p>
<p class="rvps10"><span class="rvts27">1-0</span><span class="rvts22"> = </span><span class="rvts22">прыжок на Закладку</span></p>
<p class="rvps10"><span class="rvts27">Shift + F1-F10</span><span class="rvts22"> = установить Закладку</span></p>
<p class="rvps10"><span class="rvts27">I </span><span class="rvts22">= сохранить мувик в текущую Закладку-ответвление</span></p>
<p class="rvps10"><span class="rvts27">P</span><span class="rvts22"> = загрузить мувик из текущей Закладки-ответвления</span></p>
<p class="rvps10"><span class="rvts57"><br/></span></p>
<p class="rvps10"><span class="rvts58"><br/></span></p>
<p class="rvps10"><span class="rvts27">M</span><span class="rvts22"> = показ счётчика перезаписей</span></p>
<p class="rvps10"><span class="rvts27">, </span><span class="rvts22">(запятая) = показ виртуальных джойстиков</span></p>
<p class="rvps10"><span class="rvts27">. </span><span class="rvts22">(точка) = показ счётчика кадров</span></p>
<p class="rvps10"><span class="rvts27">/ </span><span class="rvts22">(дробь) = показ счётчика лага</span></p>
<p class="rvps10"><span class="rvts57"><br/></span></p>
<p class="rvps10"><span class="rvts58"><br/></span></p>
<p class="rvps10"><span class="rvts27">Shift + L</span><span class="rvts22"> = перезагрузить текущий Lua-скрипт</span></p>
<p class="rvps10"><span class="rvts57"><br/></span></p>
<p class="rvps10"><span class="rvts58"><br/></span></p>
<p class="rvps10"><span class="rvts27">Q</span><span class="rvts22"> = включение/выключение режима Записи</span></p>
<p class="rvps10"><span class="rvts27">W</span><span class="rvts22"> = переключение текущего джойстика для записи методом мультитрекинга</span></p>
<p class="rvps10"><span class="rvts27">Ctrl + R</span><span class="rvts22"> = команда Reset</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Полный список хоткеев FCEUX, работающих при запущенном Тасэдиторе:</span></p>
<p class="rvps10"><span class="rvts57"><br/></span></p>
<p class="rvps10"><span class="rvts58"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts47">Power</span></li>
<li class="rvps15"><span class="rvts27">Reset</span></li>
<li class="rvps15"><span class="rvts27">Pause</span></li>
<li class="rvps15"><span class="rvts27">Frame Advance</span></li>
<li class="rvps15"><span class="rvts47">Screenshot</span></li>
<li class="rvps15"><span class="rvts47">Exit</span></li>
<li class="rvps15"><span class="rvts47">Slowest Speed</span></li>
<li class="rvps15"><span class="rvts27">Speed Down</span></li>
<li class="rvps15"><span class="rvts47">Normal Speed</span></li>
<li class="rvps15"><span class="rvts27">Speed Up</span></li>
<li class="rvps15"><span class="rvts27">Turbo</span></li>
<li class="rvps15"><span class="rvts47">Turbo Toggle</span></li>
<li class="rvps15"><span class="rvts27">Savestate Slot 0</span></li>
<li class="rvps15"><span class="rvts27">Savestate Slot 1</span></li>
<li class="rvps15"><span class="rvts27">Savestate Slot 2</span></li>
<li class="rvps15"><span class="rvts27">Savestate Slot 3</span></li>
<li class="rvps15"><span class="rvts27">Savestate Slot 4</span></li>
<li class="rvps15"><span class="rvts27">Savestate Slot 5</span></li>
<li class="rvps15"><span class="rvts27">Savestate Slot 6</span></li>
<li class="rvps15"><span class="rvts27">Savestate Slot 7</span></li>
<li class="rvps15"><span class="rvts27">Savestate Slot 8</span></li>
<li class="rvps15"><span class="rvts27">Savestate Slot 9</span></li>
<li class="rvps15"><span class="rvts59">Next Savestate Slot</span></li>
<li class="rvps15"><span class="rvts59">Previous Savestate Slot</span></li>
<li class="rvps15"><span class="rvts27">Save State</span></li>
<li class="rvps15"><span class="rvts27">Save State to Slot 0</span></li>
<li class="rvps15"><span class="rvts27">Save State to Slot 1</span></li>
<li class="rvps15"><span class="rvts27">Save State to Slot 2</span></li>
<li class="rvps15"><span class="rvts27">Save State to Slot 3</span></li>
<li class="rvps15"><span class="rvts27">Save State to Slot 4</span></li>
<li class="rvps15"><span class="rvts27">Save State to Slot 5</span></li>
<li class="rvps15"><span class="rvts27">Save State to Slot 6</span></li>
<li class="rvps15"><span class="rvts27">Save State to Slot 7</span></li>
<li class="rvps15"><span class="rvts27">Save State to Slot 8</span></li>
<li class="rvps15"><span class="rvts27">Save State to Slot 9</span></li>
<li class="rvps15"><span class="rvts27">Load State</span></li>
<li class="rvps15"><span class="rvts27">Load State from Slot 0</span></li>
<li class="rvps15"><span class="rvts27">Load State from Slot 1</span></li>
<li class="rvps15"><span class="rvts27">Load State from Slot 2</span></li>
<li class="rvps15"><span class="rvts27">Load State from Slot 3</span></li>
<li class="rvps15"><span class="rvts27">Load State from Slot 4</span></li>
<li class="rvps15"><span class="rvts27">Load State from Slot 5</span></li>
<li class="rvps15"><span class="rvts27">Load State from Slot 6</span></li>
<li class="rvps15"><span class="rvts27">Load State from Slot 7</span></li>
<li class="rvps15"><span class="rvts27">Load State from Slot 8</span></li>
<li class="rvps15"><span class="rvts27">Load State from Slot 9</span></li>
<li class="rvps15"><span class="rvts27">Play Movie From Beginning</span></li>
<li class="rvps15"><span class="rvts27">Toggle Read-Only</span></li>
<li class="rvps15"><span class="rvts27">Toggle Frame Display</span></li>
<li class="rvps15"><span class="rvts27">Toggle Input Display</span></li>
<li class="rvps15"><span class="rvts47">Toggle Status Icon</span></li>
<li class="rvps15"><span class="rvts27">Reload current Lua script</span></li>
<li class="rvps15"><span class="rvts47">Sound Mute Toggle</span></li>
<li class="rvps15"><span class="rvts47">Sound Volume Up</span></li>
<li class="rvps15"><span class="rvts47">Sound Volume Down</span></li>
<li class="rvps15"><span class="rvts47">Sound Volume Normal</span></li>
<li class="rvps15"><span class="rvts47">Record AVI As...</span></li>
<li class="rvps15"><span class="rvts47">Stop AVI</span></li>
<li class="rvps15"><span class="rvts47">Eject or Insert FDS Disk</span></li>
<li class="rvps15"><span class="rvts47">Switch FDS Disk Side</span></li>
<li class="rvps15"><span class="rvts47">Use Input Preset 1</span></li>
<li class="rvps15"><span class="rvts47">Use Input Preset 2</span></li>
<li class="rvps15"><span class="rvts47">Use Input Preset 3</span></li>
<li class="rvps15"><span class="rvts47">Toggle Background Display</span></li>
<li class="rvps15"><span class="rvts47">Toggle Object Display</span></li>
<li class="rvps15"><span class="rvts27">Lag Counter Toggle</span></li>
<li class="rvps15"><span class="rvts47">Open TAS Editor</span></li>
<li class="rvps15"><span class="rvts47">Open Memory Watch</span></li>
<li class="rvps15"><span class="rvts47">Open Cheats</span></li>
<li class="rvps15"><span class="rvts47">Open Debugger</span></li>
<li class="rvps15"><span class="rvts47">Open Hex Editor</span></li>
<li class="rvps15"><span class="rvts47">Open PPU Viewer</span></li>
<li class="rvps15"><span class="rvts47">Open Name Table Viewer</span></li>
<li class="rvps15"><span class="rvts47">Open Trace Logger</span></li>
<li class="rvps15"><span class="rvts47">Open Code/Data Logger</span></li>
<li class="rvps15"><span class="rvts47">Frame Adv.-Skip Lag</span></li>
<li class="rvps15"><span class="rvts27">Reload ROM or TAS Editor Project</span></li>
<li class="rvps15"><span class="rvts47">Toggle Movie Subtitles</span></li>
<li class="rvps15"><span class="rvts47">Open Ram Watch</span></li>
<li class="rvps15"><span class="rvts47">Open Ram Search</span></li>
<li class="rvps15"><span class="rvts27">Toggle Rerecord Display</span></li>
<li class="rvps15"><span class="rvts27">Frame Rewind</span></li>
<li class="rvps15"><span class="rvts27">Restore Playback</span></li>
<li class="rvps15"><span class="rvts27">Cancel Seeking</span></li>
<li class="rvps15"><span class="rvts27">Switch Auto-restore last position</span></li>
<li class="rvps15"><span class="rvts27">Switch current Multitracking mode</span></li>
<li class="rvps15"><span class="rvts47">Run Manual Lua function</span></li>
<li class="rvps15"><span class="rvts47">Toggle FPS Display</span></li>
<li class="rvps10"><span class="rvts48">Power</span></li>
<li class="rvps10"><span class="rvts27">Reset</span></li>
<li class="rvps10"><span class="rvts27">Pause</span></li>
<li class="rvps10"><span class="rvts27">Frame Advance</span></li>
<li class="rvps10"><span class="rvts48">Screenshot</span></li>
<li class="rvps10"><span class="rvts48">Exit</span></li>
<li class="rvps10"><span class="rvts48">Slowest Speed</span></li>
<li class="rvps10"><span class="rvts27">Speed Down</span></li>
<li class="rvps10"><span class="rvts48">Normal Speed</span></li>
<li class="rvps10"><span class="rvts27">Speed Up</span></li>
<li class="rvps10"><span class="rvts27">Turbo</span></li>
<li class="rvps10"><span class="rvts48">Turbo Toggle</span></li>
<li class="rvps10"><span class="rvts27">Savestate Slot 0</span></li>
<li class="rvps10"><span class="rvts27">Savestate Slot 1</span></li>
<li class="rvps10"><span class="rvts27">Savestate Slot 2</span></li>
<li class="rvps10"><span class="rvts27">Savestate Slot 3</span></li>
<li class="rvps10"><span class="rvts27">Savestate Slot 4</span></li>
<li class="rvps10"><span class="rvts27">Savestate Slot 5</span></li>
<li class="rvps10"><span class="rvts27">Savestate Slot 6</span></li>
<li class="rvps10"><span class="rvts27">Savestate Slot 7</span></li>
<li class="rvps10"><span class="rvts27">Savestate Slot 8</span></li>
<li class="rvps10"><span class="rvts27">Savestate Slot 9</span></li>
<li class="rvps10"><span class="rvts60">Next Savestate Slot</span></li>
<li class="rvps10"><span class="rvts60">Previous Savestate Slot</span></li>
<li class="rvps10"><span class="rvts27">Save State</span></li>
<li class="rvps10"><span class="rvts27">Save State to Slot 0</span></li>
<li class="rvps10"><span class="rvts27">Save State to Slot 1</span></li>
<li class="rvps10"><span class="rvts27">Save State to Slot 2</span></li>
<li class="rvps10"><span class="rvts27">Save State to Slot 3</span></li>
<li class="rvps10"><span class="rvts27">Save State to Slot 4</span></li>
<li class="rvps10"><span class="rvts27">Save State to Slot 5</span></li>
<li class="rvps10"><span class="rvts27">Save State to Slot 6</span></li>
<li class="rvps10"><span class="rvts27">Save State to Slot 7</span></li>
<li class="rvps10"><span class="rvts27">Save State to Slot 8</span></li>
<li class="rvps10"><span class="rvts27">Save State to Slot 9</span></li>
<li class="rvps10"><span class="rvts27">Load State</span></li>
<li class="rvps10"><span class="rvts27">Load State from Slot 0</span></li>
<li class="rvps10"><span class="rvts27">Load State from Slot 1</span></li>
<li class="rvps10"><span class="rvts27">Load State from Slot 2</span></li>
<li class="rvps10"><span class="rvts27">Load State from Slot 3</span></li>
<li class="rvps10"><span class="rvts27">Load State from Slot 4</span></li>
<li class="rvps10"><span class="rvts27">Load State from Slot 5</span></li>
<li class="rvps10"><span class="rvts27">Load State from Slot 6</span></li>
<li class="rvps10"><span class="rvts27">Load State from Slot 7</span></li>
<li class="rvps10"><span class="rvts27">Load State from Slot 8</span></li>
<li class="rvps10"><span class="rvts27">Load State from Slot 9</span></li>
<li class="rvps10"><span class="rvts27">Play Movie From Beginning</span></li>
<li class="rvps10"><span class="rvts27">Toggle Read-Only</span></li>
<li class="rvps10"><span class="rvts27">Toggle Frame Display</span></li>
<li class="rvps10"><span class="rvts27">Toggle Input Display</span></li>
<li class="rvps10"><span class="rvts48">Toggle Status Icon</span></li>
<li class="rvps10"><span class="rvts27">Reload current Lua script</span></li>
<li class="rvps10"><span class="rvts48">Sound Mute Toggle</span></li>
<li class="rvps10"><span class="rvts48">Sound Volume Up</span></li>
<li class="rvps10"><span class="rvts48">Sound Volume Down</span></li>
<li class="rvps10"><span class="rvts48">Sound Volume Normal</span></li>
<li class="rvps10"><span class="rvts48">Record AVI As...</span></li>
<li class="rvps10"><span class="rvts48">Stop AVI</span></li>
<li class="rvps10"><span class="rvts48">Eject or Insert FDS Disk</span></li>
<li class="rvps10"><span class="rvts48">Switch FDS Disk Side</span></li>
<li class="rvps10"><span class="rvts48">Use Input Preset 1</span></li>
<li class="rvps10"><span class="rvts48">Use Input Preset 2</span></li>
<li class="rvps10"><span class="rvts48">Use Input Preset 3</span></li>
<li class="rvps10"><span class="rvts48">Toggle Background Display</span></li>
<li class="rvps10"><span class="rvts48">Toggle Object Display</span></li>
<li class="rvps10"><span class="rvts27">Lag Counter Toggle</span></li>
<li class="rvps10"><span class="rvts48">Open TAS Editor</span></li>
<li class="rvps10"><span class="rvts48">Open Memory Watch</span></li>
<li class="rvps10"><span class="rvts48">Open Cheats</span></li>
<li class="rvps10"><span class="rvts48">Open Debugger</span></li>
<li class="rvps10"><span class="rvts48">Open Hex Editor</span></li>
<li class="rvps10"><span class="rvts48">Open PPU Viewer</span></li>
<li class="rvps10"><span class="rvts48">Open Name Table Viewer</span></li>
<li class="rvps10"><span class="rvts48">Open Trace Logger</span></li>
<li class="rvps10"><span class="rvts48">Open Code/Data Logger</span></li>
<li class="rvps10"><span class="rvts48">Frame Adv.-Skip Lag</span></li>
<li class="rvps10"><span class="rvts27">Reload ROM or TAS Editor Project</span></li>
<li class="rvps10"><span class="rvts48">Toggle Movie Subtitles</span></li>
<li class="rvps10"><span class="rvts48">Open Ram Watch</span></li>
<li class="rvps10"><span class="rvts48">Open Ram Search</span></li>
<li class="rvps10"><span class="rvts27">Toggle Rerecord Display</span></li>
<li class="rvps10"><span class="rvts27">Frame Rewind</span></li>
<li class="rvps10"><span class="rvts27">Restore Playback</span></li>
<li class="rvps10"><span class="rvts27">Cancel Seeking</span></li>
<li class="rvps10"><span class="rvts27">Switch Auto-restore last position</span></li>
<li class="rvps10"><span class="rvts27">Switch current Multitracking mode</span></li>
<li class="rvps10"><span class="rvts48">Run Manual Lua function</span></li>
<li class="rvps10"><span class="rvts48">Toggle FPS Display</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Остальные хоткеи FCEUX не будут работать при запущенном Тасэдиторе (см. главу </span><a class="rvts28" href="MistakeProofing.html">Защита от ошибок</a><span class="rvts22">).</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="virtual_joypad"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts51">Кнопки виртуальных джойстиков</span></p>
<p class="rvps10"><span class="rvts52">Кнопки виртуальных джойстиков</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Аналоги кнопок настоящего геймпада приставки, настраиваемые либо на клавиши клавиатуры, либо на кнопки реального джойстика. Их можно использовать для Записи, а также для быстрой установки Ввода в выделенных кадраз. Подробнее см. главу </span><a class="rvts28" href="ProgramCustomization.html#fceux-config">Настройка программы</a><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию следующие клавиши настроены на кнопки первого игрока:</span></p>
@ -442,10 +446,10 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Когда вам нужно помимо кнопок джойстика ещё вводить команды приставки, используйте меню FCEUX или хоткеи:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts37">NES -&gt; Reset</span><span class="rvts22"> или хоткей "</span><span class="rvts27">Reset</span><span class="rvts22">" (по умолчанию </span><span class="rvts27">Ctrl + R</span><span class="rvts22">) для команды "Сброс"</span></li>
<li class="rvps15"><span class="rvts37">NES -&gt; Power</span><span class="rvts22"> или хоткей "</span><span class="rvts60">Power</span><span class="rvts22">" для команды "Включение" (в реальной работе не требуется)</span></li>
<li class="rvps15"><span class="rvts37">NES -&gt; Eject/Insert Disk</span><span class="rvts22"> или хоткей "</span><span class="rvts60">Eject or Insert FDS Disk</span><span class="rvts22">" для команды "Вытащить/Вставить диск" (актуально только для Famicom Disk System)</span></li>
<li class="rvps15"><span class="rvts37">NES -&gt; Switch Disk Side</span><span class="rvts22"> или хоткей "</span><span class="rvts60">Switch FDS Disk Side</span><span class="rvts22">" для команды "Поменять сторону диска" (актуально только для Famicom Disk System)</span></li>
<li class="rvps10"><span class="rvts37">NES -&gt; Reset</span><span class="rvts22"> или хоткей "</span><span class="rvts27">Reset</span><span class="rvts22">" (по умолчанию </span><span class="rvts27">Ctrl + R</span><span class="rvts22">) для команды "Сброс"</span></li>
<li class="rvps10"><span class="rvts37">NES -&gt; Power</span><span class="rvts22"> или хоткей "</span><span class="rvts61">Power</span><span class="rvts22">" для команды "Включение" (в реальной работе не требуется)</span></li>
<li class="rvps10"><span class="rvts37">NES -&gt; Eject/Insert Disk</span><span class="rvts22"> или хоткей "</span><span class="rvts61">Eject or Insert FDS Disk</span><span class="rvts22">" для команды "Вытащить/Вставить диск" (актуально только для Famicom Disk System)</span></li>
<li class="rvps10"><span class="rvts37">NES -&gt; Switch Disk Side</span><span class="rvts22"> или хоткей "</span><span class="rvts61">Switch FDS Disk Side</span><span class="rvts22">" для команды "Поменять сторону диска" (актуально только для Famicom Disk System)</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Эти команды срабатывают только в режиме Записи, причём для отображения результата на экране FCEUX необходимо после запуска команды (например, после нажатия </span><span class="rvts27">Ctrl + R</span><span class="rvts22">) ещё дополнительно нажать </span><span class="rvts27">Frame Advance </span><span class="rvts22">либо отпустить паузу эмулятора, чтобы впечатать команду в мувик.</span></p>
@ -454,7 +458,7 @@
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps2"><a name="notes"></a>
<span class="rvts6"><br/></span></p>
<p><span class="rvts58">Управление при редактировании Заметок</span></p>
<p><span class="rvts59">Управление при редактировании Заметок</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps10"><span class="rvts22">При редактировании Заметок клавиатура используется для печатания текста.</span></p>
@ -479,7 +483,8 @@
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/feature-tour/create-ebooks-for-amazon-kindle">Full featured Kindle eBooks generator</a></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/feature-tour/create-ebooks-for-amazon-kindle">Full-featured Kindle eBooks generator</a></p>
</div>
<div id="topic_footer">

View File

@ -3,7 +3,7 @@
<head>
<title>Ответы на вопросы</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("FAQ");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("FAQ");
}
});
</script>
</head>
@ -52,6 +55,7 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">Ответы на вопросы</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
@ -68,10 +72,10 @@
<p class="rvps10"><span class="rvts23">Как использовать Тасэдитор для традиционного метода ТАСинга?</span></p>
<p class="rvps10"><span class="rvts22">Вы можете использовать этот метод сразу же, без дополнительных настроек. Однако, если вам морально требуются некоторые ограничения старого подхода (без которых вы чувствуете себя неуютно), можно сделать следующее:</span></p>
<ul style="text-indent: 25px; margin-left: 5px; list-style-position: inside;">
<li class="rvps15" style="text-indent: 25px"><span class="rvts22">установить галочку </span><a class="rvts28" href="ProgramCustomization.html#OldcontrolschemeforBranching">Config -&gt; Old control scheme for Branching</a></li>
<li class="rvps15" style="text-indent: 25px"><span class="rvts22">снять галочку </span><a class="rvts28" href="ProgramCustomization.html#BranchesrestoreentireMovie">Config -&gt; Branches restore entire Movie</a></li>
<li class="rvps15" style="text-indent: 25px"><span class="rvts22">установить галочку </span><a class="rvts28" href="ProgramCustomization.html#CombineconsecutiveRecordings">Config -&gt; Combine consecutive Recordings/Draws</a></li>
<li class="rvps15" style="text-indent: 25px"><span class="rvts22">снять галочку </span><a class="rvts28" href="ProgramCustomization.html#UseInputkeysforColumnSet">Config -&gt; Use Input keys for Column Set</a></li>
<li class="rvps10" style="text-indent: 25px"><span class="rvts22">установить галочку </span><a class="rvts28" href="ProgramCustomization.html#OldcontrolschemeforBranching">Config -&gt; Old control scheme for Branching</a></li>
<li class="rvps10" style="text-indent: 25px"><span class="rvts22">снять галочку </span><a class="rvts28" href="ProgramCustomization.html#BranchesrestoreentireMovie">Config -&gt; Branches restore entire Movie</a></li>
<li class="rvps10" style="text-indent: 25px"><span class="rvts22">установить галочку </span><a class="rvts28" href="ProgramCustomization.html#CombineconsecutiveRecordings">Config -&gt; Combine consecutive Recordings/Draws</a></li>
<li class="rvps10" style="text-indent: 25px"><span class="rvts22">снять галочку </span><a class="rvts28" href="ProgramCustomization.html#UseInputkeysforColumnSet">Config -&gt; Use Input keys for Column Set</a></li>
</ul>
<p class="rvps10"><span class="rvts22">Также рекомендуется переключить Список закладок в вид Дерева ответвлений.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
@ -121,7 +125,8 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/feature-tour">Full featured Help generator</a></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/feature-tour">Full-featured Help generator</a></p>
</div>
<div id="topic_footer">

View File

@ -3,7 +3,7 @@
<head>
<title>Формат FM3</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("FM3format");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("FM3format");
}
});
</script>
</head>
@ -50,6 +53,7 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">Формат FM3</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
@ -70,7 +74,7 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Заголовок хранится в текстовом формате, в кодировке ASCII.</span></p>
<p class="rvps10"><span class="rvts22">Он состоит из нескольких строк вида "ключевое слово + значение".</span></p>
<p class="rvps10"><span class="rvts22">Символом перевода строки может быть как </span><span class="rvts71">\r\n</span><span class="rvts22">, так и </span><span class="rvts71">\n</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Символом перевода строки может быть как </span><span class="rvts72">\r\n</span><span class="rvts22">, так и </span><span class="rvts72">\n</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Если в начале очередной строки идёт символ "|" (вертикальная черта), это значит, что Заголовок закончился, и начался Журнал Ввода.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">В начале каждой строки Заголовка находится ключевое слово, после которого стоит пробел, а затем идёт текстовое представление значения.</span></p>
@ -81,44 +85,44 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts37">Список ключевых слов с целочисленным значением:</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">(включая значения для переменных типа Boolean, где 1 = </span><span class="rvts71">true</span><span class="rvts22">, 0 = </span><span class="rvts71">false</span><span class="rvts22">)</span></p>
<p class="rvps10"><span class="rvts22">(числовое значение должно умещаться в переменную типа </span><span class="rvts71">int32</span><span class="rvts22">)</span></p>
<p class="rvps10"><span class="rvts22">(включая значения для переменных типа Boolean, где 1 = </span><span class="rvts72">true</span><span class="rvts22">, 0 = </span><span class="rvts72">false</span><span class="rvts22">)</span></p>
<p class="rvps10"><span class="rvts22">(числовое значение должно умещаться в переменную типа </span><span class="rvts72">int32</span><span class="rvts22">)</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts26">version</span><span class="rvts22"> (наличие обязательно) номер версии формата мувика; на данный момент это </span><span class="rvts26">3</span></li>
<li class="rvps15"><span class="rvts26">emuVersion</span><span class="rvts22"> (обязательно) версия эмулятора, в котором был создан этот файл (например, </span><span class="rvts26">21060</span><span class="rvts22">)</span></li>
<li class="rvps15"><span class="rvts26">rerecordCount</span><span class="rvts22"> (наличие не обязательно) счётчик перезаписей</span></li>
<li class="rvps15"><span class="rvts26">palFlag</span><span class="rvts22"> (</span><span class="rvts71">bool</span><span class="rvts22">) (не обязательно) </span><span class="rvts71">true</span><span class="rvts22">, если мувик использует тайминг PAL, а по умолчанию используется NTSC</span></li>
<li class="rvps15"><span class="rvts26">NewPPU</span><span class="rvts22"> (</span><span class="rvts71">bool</span><span class="rvts22">) (не обязательно) </span><span class="rvts71">true</span><span class="rvts22">, если мувик использует New PPU</span></li>
<li class="rvps15"><span class="rvts26">FDS</span><span class="rvts22"> (</span><span class="rvts71">bool</span><span class="rvts22">) (не обязательно) </span><span class="rvts71">true</span><span class="rvts22">, если мувик создан для игры с Famicom Disk System</span></li>
<li class="rvps15"><span class="rvts26">fourscore</span><span class="rvts22"> (</span><span class="rvts71">bool</span><span class="rvts22">) </span><span class="rvts71">true</span><span class="rvts22">, если мувик создан с использованием устройства fourscore. Если fourscore не использовалось, то в Заголовке обязательно наличие значений для ключевых слов </span><span class="rvts26">port0</span><span class="rvts22"> и </span><span class="rvts26">port1</span><span class="rvts22">.</span></li>
<li class="rvps15"><span class="rvts26">port0</span><span class="rvts22"> тип устройства ввода, настроенного на порт 0 приставки. Возможны следующие значения:</span></li>
<li class="rvps10"><span class="rvts26">version</span><span class="rvts22"> (наличие обязательно) номер версии формата мувика; на данный момент это </span><span class="rvts26">3</span></li>
<li class="rvps10"><span class="rvts26">emuVersion</span><span class="rvts22"> (обязательно) версия эмулятора, в котором был создан этот файл (например, </span><span class="rvts26">21060</span><span class="rvts22">)</span></li>
<li class="rvps10"><span class="rvts26">rerecordCount</span><span class="rvts22"> (наличие не обязательно) счётчик перезаписей</span></li>
<li class="rvps10"><span class="rvts26">palFlag</span><span class="rvts22"> (</span><span class="rvts72">bool</span><span class="rvts22">) (не обязательно) </span><span class="rvts72">true</span><span class="rvts22">, если мувик использует тайминг PAL, а по умолчанию используется NTSC</span></li>
<li class="rvps10"><span class="rvts26">NewPPU</span><span class="rvts22"> (</span><span class="rvts72">bool</span><span class="rvts22">) (не обязательно) </span><span class="rvts72">true</span><span class="rvts22">, если мувик использует New PPU</span></li>
<li class="rvps10"><span class="rvts26">FDS</span><span class="rvts22"> (</span><span class="rvts72">bool</span><span class="rvts22">) (не обязательно) </span><span class="rvts72">true</span><span class="rvts22">, если мувик создан для игры с Famicom Disk System</span></li>
<li class="rvps10"><span class="rvts26">fourscore</span><span class="rvts22"> (</span><span class="rvts72">bool</span><span class="rvts22">) </span><span class="rvts72">true</span><span class="rvts22">, если мувик создан с использованием устройства fourscore. Если fourscore не использовалось, то в Заголовке обязательно наличие значений для ключевых слов </span><span class="rvts26">port0</span><span class="rvts22"> и </span><span class="rvts26">port1</span><span class="rvts22">.</span></li>
<li class="rvps10"><span class="rvts26">port0</span><span class="rvts22"> тип устройства ввода, настроенного на порт 0 приставки. Возможны следующие значения:</span></li>
</ul>
<ul style="text-indent: 60px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15" style="text-indent: 60px"><span class="rvts22">SI_NONE = 0 (ничего не подключено)</span></li>
<li class="rvps15" style="text-indent: 60px"><span class="rvts22">SI_GAMEPAD = 1 (подключен стандартный геймпад NES)</span></li>
<li class="rvps15" style="text-indent: 60px"><span class="rvts22">SI_ZAPPER = 2 (подключен пистолет)</span></li>
<li class="rvps10" style="text-indent: 60px"><span class="rvts22">SI_NONE = 0 (ничего не подключено)</span></li>
<li class="rvps10" style="text-indent: 60px"><span class="rvts22">SI_GAMEPAD = 1 (подключен стандартный геймпад NES)</span></li>
<li class="rvps10" style="text-indent: 60px"><span class="rvts22">SI_ZAPPER = 2 (подключен пистолет)</span></li>
</ul>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts26">port1</span><span class="rvts22"> тип устройства ввода, настроенного на порт 1 приставки. Возможны следующие значения:</span></li>
<li class="rvps10"><span class="rvts26">port1</span><span class="rvts22"> тип устройства ввода, настроенного на порт 1 приставки. Возможны следующие значения:</span></li>
</ul>
<ul style="text-indent: 60px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15" style="text-indent: 60px"><span class="rvts22">SI_NONE = 0 (ничего не подключено)</span></li>
<li class="rvps15" style="text-indent: 60px"><span class="rvts22">SI_GAMEPAD = 1 (подключен стандартный геймпад NES)</span></li>
<li class="rvps15" style="text-indent: 60px"><span class="rvts22">SI_ZAPPER = 2 (подключен пистолет)</span></li>
<li class="rvps10" style="text-indent: 60px"><span class="rvts22">SI_NONE = 0 (ничего не подключено)</span></li>
<li class="rvps10" style="text-indent: 60px"><span class="rvts22">SI_GAMEPAD = 1 (подключен стандартный геймпад NES)</span></li>
<li class="rvps10" style="text-indent: 60px"><span class="rvts22">SI_ZAPPER = 2 (подключен пистолет)</span></li>
</ul>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts26">port2</span><span class="rvts22"> (обязательно) тип устройства ввода, настроенного на порт FCExp приставки. Возможны следующие значения:</span></li>
<li class="rvps10"><span class="rvts26">port2</span><span class="rvts22"> (обязательно) тип устройства ввода, настроенного на порт FCExp приставки. Возможны следующие значения:</span></li>
</ul>
<ul style="text-indent: 60px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15" style="text-indent: 60px"><span class="rvts22">SIFC_NONE = 0 (ничего не подключено)</span></li>
<li class="rvps10" style="text-indent: 60px"><span class="rvts22">SIFC_NONE = 0 (ничего не подключено)</span></li>
</ul>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts26">binary</span><span class="rvts22"> (</span><span class="rvts71">bool</span><span class="rvts22">) (не обязательно) </span><span class="rvts71">true</span><span class="rvts22">, если Журнал Ввода сохранён в двоичном формате. FM2-файлы обычно хранят Ввод в текстовом формате, чтобы его было удобно редактировать в текстовых редакторах. FM3-файлы обычно хранят Ввод в двоичном формате, чтобы сэкономить место на диске</span></li>
<li class="rvps15"><span class="rvts26">length</span><span class="rvts22"> (обязательно для fm3) размер мувика (количество кадров в сохранённом Журнале Ввода). Если в Заголовке есть это ключевое слово, и его значение &gt;= 0, то Журнал Ввода оканчивается после означенного количества записей, а затем следуют данные Тасэдитора. Именно наличие этого ключевого слова в Заголовке отличает FM3-файлы от FM2-файлов.</span></li>
<li class="rvps10"><span class="rvts26">binary</span><span class="rvts22"> (</span><span class="rvts72">bool</span><span class="rvts22">) (не обязательно) </span><span class="rvts72">true</span><span class="rvts22">, если Журнал Ввода сохранён в двоичном формате. FM2-файлы обычно хранят Ввод в текстовом формате, чтобы его было удобно редактировать в текстовых редакторах. FM3-файлы обычно хранят Ввод в двоичном формате, чтобы сэкономить место на диске</span></li>
<li class="rvps10"><span class="rvts26">length</span><span class="rvts22"> (обязательно для fm3) размер мувика (количество кадров в сохранённом Журнале Ввода). Если в Заголовке есть это ключевое слово, и его значение &gt;= 0, то Журнал Ввода оканчивается после означенного количества записей, а затем следуют данные Тасэдитора. Именно наличие этого ключевого слова в Заголовке отличает FM3-файлы от FM2-файлов.</span></li>
</ul>
<p class="rvps15"><span class="rvts22"><br/></span></p>
<p class="rvps15"><span class="rvts22"><br/></span></p>
<p class="rvps14"><span class="rvts22"><br/></span></p>
<p class="rvps14"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts37">Список ключевых слов со строковым значением:</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">(эти строки не могут содержать символ перевода строки, так как он служит индикатором окончания значения)</span></p>
@ -195,7 +199,7 @@
<li class="rvps10" style="text-indent: 60px"><span class="rvts22">второй байт координата Y мыши</span></li>
<li class="rvps10" style="text-indent: 60px"><span class="rvts22">третий байт 1 = кнопка мышки нажата, 0 = не нажата</span></li>
<li class="rvps10" style="text-indent: 60px"><span class="rvts22">четвёртый байт значение, необходимое для эмуляции пистолета</span></li>
<li class="rvps10" style="text-indent: 60px"><span class="rvts22">байты с 5-го по 12-й (</span><span class="rvts71">uint64</span><span class="rvts22">) значение, необходимое для эмуляции пистолета</span></li>
<li class="rvps10" style="text-indent: 60px"><span class="rvts22">байты с 5-го по 12-й (</span><span class="rvts72">uint64</span><span class="rvts22">) значение, необходимое для эмуляции пистолета</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Если используется fourscore, все устройства ввода считаются геймпадами, и к размеру записи добавляется 4 байта. Биты первого байта отражают состояние сооветствующей кнопки первого джойстика (бит 0 = </span><span class="rvts32">A</span><span class="rvts22">, бит 1 = </span><span class="rvts32">B</span><span class="rvts22">, бит 2 = </span><span class="rvts32">Select</span><span class="rvts22">, бит 3 = </span><span class="rvts32">Start</span><span class="rvts22">, бит 4 = </span><span class="rvts32">Вверх</span><span class="rvts22">, бит 5 = </span><span class="rvts32">Вниз</span><span class="rvts22">, бит 6 = </span><span class="rvts32">Влево</span><span class="rvts22">, бит 7 = </span><span class="rvts32">Вправо</span><span class="rvts22">). Биты второго байта отражают состояние сооветствующей кнопки второго джойстика, и т.д.</span></p>
@ -209,17 +213,33 @@
<tr valign="middle">
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 104px;"><p class="rvps5"><span class="rvts6">4 байта</span></p>
</td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 146px;"><p class="rvps5"><span class="rvts79">unsigned int32</span></p>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 146px;"><p class="rvps5"><span class="rvts80">unsigned int32</span></p>
</td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 192px;"><p class="rvps5"><span class="rvts6">FM3 version</span></p>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 192px;"><p class="rvps5"><span class="rvts6">Версия FM3</span></p>
</td>
</tr>
<tr valign="middle">
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 104px;"><p class="rvps5"><span class="rvts6">4 байта</span></p>
</td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 146px;"><p class="rvps5"><span class="rvts79">unsigned int32</span></p>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 146px;"><p class="rvps5"><span class="rvts80">unsigned int32</span></p>
</td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 192px;"><p class="rvps5"><span class="rvts6">saved modules</span></p>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 192px;"><p class="rvps5"><span class="rvts6">Какие модули сохранены</span></p>
</td>
</tr>
<tr valign="top">
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 104px;"><p class="rvps5"><span class="rvts6">4 байта</span></p>
</td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 146px;"><p class="rvps5"><span class="rvts80">unsigned int32</span></p>
</td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 192px;"><p class="rvps5"><span class="rvts6">Количество смещений (N)</span></p>
</td>
</tr>
<tr valign="top">
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 104px;"><p class="rvps5"><span class="rvts6">4 * N байтов</span></p>
</td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 146px;"><p class="rvps5"><span class="rvts6">указатели</span></p>
</td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 192px;"><p class="rvps5"><span class="rvts6">Смещения</span></p>
</td>
</tr>
<tr valign="middle">
@ -273,10 +293,9 @@
</table>
</div>
<p class="rvps21"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Данные Тасэдитора начинаются сразу после окончания последней записи в Журнале Ввода. </span></p>
<p class="rvps10"><span class="rvts22">Если во время загрузки fm3-файла сразу после окончания последней записи в Журнале Ввода обнаруживается конец файла, Тасэдитор воспримет этот файл как fm2-файл.</span></p>
<p class="rvps10"><span class="rvts22">Данные Тасэдитора начинаются сразу после окончания последней записи в Журнале Ввода. Если сразу после окончания последней записи обнаруживается конец файла, Тасэдитор воспримет этот файл как fm2-файл.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Первые 4 байта данных содержат номер версии формата проекта. Релизная версия TAS Editor 1.0 имеет версию формата под номером 1.</span></p>
<p class="rvps10"><span class="rvts22">Первые 4 байта данных содержат номер версии формата проекта. Релизная версия TAS Editor 1.0 имеет версию формата под номером 3.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Следующие 4 байта содержат битовую карту, которая может использоваться для определения, какие модули Тасэдитора сохранили свои данные в этот файл:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
@ -288,18 +307,21 @@
<li class="rvps10"><span class="rvts22">бит 5 в файле сохранена История Выделений</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">При сохранении проекта Тасэдитор поочерёдно вызывает все модули, требующие сохранения данных. В зависимости от настроек компактного сохранения каждый модуль осуществляет выборочную сериализацию своих данных в файловый поток. Порядок сохранения модулей всегда одинаков (Маркеры, Закладки, Гринзона, История, Piano Roll, Выделение). При загрузке проекта Тасэдитор вызывает модули в той же очерёдности, и они загружают свои данные из файлового потока, перемещая вперёд указатель на текущую позицию в файле.</span></p>
<p class="rvps10"><span class="rvts22">Следующие 4 байта содержат общее число сохраняемых модулей, в версии 3 это число всегда должно быть равно 6.</span></p>
<p class="rvps10"><span class="rvts22">Затем располагаются шесть четырёхбайтных смещений на данные каждого модуля. Смещения отсчитываются от начала файла.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">При сохранении проекта Тасэдитор поочерёдно вызывает все модули, требующие сохранения данных. Каждый модуль сначала сохраняет текущую позицию записи в файл (смещение), а затем в зависимости от настроек компактного сохранения осуществляет выборочную сериализацию своих данных в файловый поток. Порядок сохранения модулей всегда одинаков (Маркеры, Закладки, Гринзона, История, Piano Roll, Выделение). При загрузке проекта Тасэдитор вызывает модули в той же очерёдности, и они переходят по нужному смещению и загружают свои данные из файлового потока.</span></p>
<p class="rvps10"><span class="rvts22">Чтобы оценить целостность загружаемых данных, каждый модуль при сохранении записывает в файл строку-идентификатор своих данных. И если перед началом загрузки своих данных модуль не обнаружит эту строку на текущей позиции в файловом потоке, он откажется от загрузки и создаст данные по умолчанию, передав Тасэдитору сообщение об ошибке загрузки. Кроме того, если вместо строки-идентификатора сохранения он обнаружит строку-идентификатор отсутствия данных, он откажется от загрузки и создаст данные по умолчанию, без генерации сообщения об ошибке.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<div class="rvps21"><table width="450" border="1" cellpadding="0" cellspacing="0" style="border-color: #ffffff #000000 #000000 #ffffff; border-style: solid;">
<tr valign="middle">
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; background-color: #0000ff; width: 106px;"><p class="rvps5"><span class="rvts78">Модуль</span></p>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; background-color: #0000ff; width: 106px;"><p class="rvps5"><span class="rvts79">Модуль</span></p>
</td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; background-color: #0000ff; width: 174px;"><p class="rvps5"><span class="rvts78">Идентификатор</span></p>
<p class="rvps5"><span class="rvts78">сохранённых данных</span></p>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; background-color: #0000ff; width: 174px;"><p class="rvps5"><span class="rvts79">Идентификатор</span></p>
<p class="rvps5"><span class="rvts79">сохранённых данных</span></p>
</td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; background-color: #0000ff; width: 162px;"><p class="rvps5"><span class="rvts78">Идентификатор</span></p>
<p class="rvps5"><span class="rvts78">отсутствия данных</span></p>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; background-color: #0000ff; width: 162px;"><p class="rvps5"><span class="rvts79">Идентификатор</span></p>
<p class="rvps5"><span class="rvts79">отсутствия данных</span></p>
</td>
</tr>
<tr valign="middle">
@ -357,6 +379,7 @@
<p class="rvps21"><span class="rvts22"><br/></span></p>
<p class="rvps21"><span class="rvts22"><br/></span></p>
<p class="rvps21"><span class="rvts22"><br/></span></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/help-authoring-tool">Single source CHM, PDF, DOC and HTML Help creation</a></p>
</div>

View File

@ -3,7 +3,7 @@
<head>
<title>Глоссарий</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("Glossary");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("Glossary");
}
});
</script>
</head>
@ -52,6 +55,7 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">Глоссарий</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
@ -94,8 +98,8 @@
<p class="rvps10"><span class="rvts22">Благодаря редактированию Ввода ТАСер освобождается от некоторых человеческих ограничений (например, слабой реакции) и может направить все усилия на создание крайне неординарных прохождений видеоигр. Это может быть не только спидран, но и развлекательный видеоролик (playaround).</span></p>
<p class="rvps10"><span class="rvts22">ТАСы распространяются:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">в виде готовых видеороликов с Выводом (youtube, AVI-файлы &nbsp;и т.д.) удобно смотреть</span></li>
<li class="rvps15"><span class="rvts22">в виде исходных мувиков с Вводом (fm2 и т.д.) удобно редактировать</span></li>
<li class="rvps10"><span class="rvts22">в виде готовых видеороликов с Выводом (youtube, AVI-файлы &nbsp;и т.д.) удобно смотреть</span></li>
<li class="rvps10"><span class="rvts22">в виде исходных мувиков с Вводом (fm2 и т.д.) удобно редактировать</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts26">Movie Мувик</span><span class="rvts22"> (фильм)</span></p>
@ -220,10 +224,10 @@
<p class="rvps10"><span class="rvts22">Маркером можно отметить любой кадр в Piano Roll. С помощью установки и удаления Маркеров можно повысить наглядность и удобство работы.</span></p>
<p class="rvps10"><span class="rvts22">Цели использования Маркеров:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">структуризация Ввода</span></li>
<li class="rvps15"><span class="rvts22">формализация знаний (с помощью Заметок)</span></li>
<li class="rvps15"><span class="rvts22">ускорение навигации</span></li>
<li class="rvps15"><span class="rvts22">быстрое выделение участков (</span><span class="rvts34">Ctrl + A</span><span class="rvts22">)</span></li>
<li class="rvps10"><span class="rvts22">структуризация Ввода</span></li>
<li class="rvps10"><span class="rvts22">формализация знаний (с помощью Заметок)</span></li>
<li class="rvps10"><span class="rvts22">ускорение навигации</span></li>
<li class="rvps10"><span class="rvts22">быстрое выделение участков (</span><span class="rvts34">Ctrl + A</span><span class="rvts22">)</span></li>
</ul>
<p class="rvps10"><span class="rvts22">Подробнее: </span><a class="rvts28" href="PianoRoll.html#markers">Интерфейс Piano Roll</a><span class="rvts22">, </span><a class="rvts28" href="Ideas.html#Markers">Спецификации Маркеров</a></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
@ -242,10 +246,10 @@
<p class="rvps10"><span class="rvts22">При желании текущий мувик может быть заменён на это ответвление, тем самым восстанавливается состояние мувика из копии.</span></p>
<p class="rvps10"><span class="rvts22">С помощью ответвлений можно одновременно хранить в проекте несколько разных мувиков и мгновенно переключаться между ними:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">для сравнения альтернативных стратегий прохождения</span></li>
<li class="rvps15"><span class="rvts22">для хранения текущего лучшего варианта при тестировании других вариантов на участке</span></li>
<li class="rvps15"><span class="rvts22">для запоминания ещё неиспользованных трюков, которые могут пригодиться в будущем</span></li>
<li class="rvps15"><span class="rvts22">для сравнения своего мувика с чужим (при создании обгона)</span></li>
<li class="rvps10"><span class="rvts22">для сравнения альтернативных стратегий прохождения</span></li>
<li class="rvps10"><span class="rvts22">для хранения текущего лучшего варианта при тестировании других вариантов на участке</span></li>
<li class="rvps10"><span class="rvts22">для запоминания ещё неиспользованных трюков, которые могут пригодиться в будущем</span></li>
<li class="rvps10"><span class="rvts22">для сравнения своего мувика с чужим (при создании обгона)</span></li>
</ul>
<p class="rvps10"><span class="rvts22">Подробнее: </span><a class="rvts28" href="Toolbox.html#bookmarks">Панель инструментов</a><span class="rvts22">, </span><a class="rvts28" href="ProgramCustomization.html#BranchesrestoreentireMovie">Настройка программы</a><span class="rvts22">, </span><a class="rvts28" href="Ideas.html#BookmarksBranches">Спецификации ответвлений</a></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
@ -273,6 +277,7 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com">Free EBook and documentation generator</a></p>
</div>

View File

@ -3,7 +3,7 @@
<head>
<title>Идеи</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("Ideas");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("Ideas");
}
});
</script>
</head>
@ -52,6 +55,7 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">Идеи</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
@ -60,40 +64,40 @@
<p class="rvps21"><span class="rvts22"><br/></span></p>
<div class="rvps21"><table width="700" border="1" cellpadding="0" cellspacing="0" style="border-color: #000000; border-style: solid;">
<tr valign="top">
<td style="border-color: #000000; border-style: solid; background-color: #0000ff;"><p class="rvps5"><a class="rvts77" href="Ideas.html#ImplementedIdeas">Реализовано в 1.0</a></p>
<td style="border-color: #000000; border-style: solid; background-color: #0000ff;"><p class="rvps5"><a class="rvts78" href="Ideas.html#ImplementedIdeas">Реализовано в 1.0</a></p>
</td>
<td style="border-color: #000000; border-style: solid; background-color: #0000ff;"><p class="rvps5"><a class="rvts77" href="Ideas.html#PlannedIdeas">Запланировано на 2.0</a></p>
<td style="border-color: #000000; border-style: solid; background-color: #0000ff;"><p class="rvps5"><a class="rvts78" href="Ideas.html#PlannedIdeas">Запланировано на 2.0</a></p>
</td>
</tr>
<tr valign="top">
<td style="border-color: #000000; border-style: solid;"><p class="rvps18"><a class="rvts62" href="Ideas.html#PianoRoll">Piano Roll</a></p>
<p class="rvps18"><a class="rvts62" href="Ideas.html#Selection">Выделение</a></p>
<p class="rvps18"><a class="rvts62" href="Ideas.html#Markers">Маркеры</a></p>
<p class="rvps18"><a class="rvts62" href="Ideas.html#HotChanges">Горячие Правки</a></p>
<p class="rvps18"><a class="rvts62" href="Ideas.html#Greenzone">Гринзона</a></p>
<p class="rvps18"><a class="rvts62" href="Ideas.html#Playback">Проигрыватель</a></p>
<p class="rvps18"><a class="rvts62" href="Ideas.html#GreenArrow">Зелёная стрелка</a></p>
<p class="rvps18"><a class="rvts62" href="Ideas.html#AutoRestoring">Автовосстановление утраченной позиции</a></p>
<p class="rvps18"><a class="rvts62" href="Ideas.html#Recorder">Мультитрекинг-рекордер</a></p>
<p class="rvps18"><a class="rvts62" href="Ideas.html#Lua">Lua-автоматизация</a></p>
<p class="rvps18"><a class="rvts62" href="Ideas.html#BookmarksBranches">Закладки и ответвления</a></p>
<p class="rvps18"><a class="rvts62" href="Ideas.html#PopupWindows">Всплывающие окна</a></p>
<p class="rvps18"><a class="rvts62" href="Ideas.html#HistoryLog">Журнал Истории</a></p>
<p class="rvps18"><a class="rvts62" href="Ideas.html#RerecordsCounter">Счётчик перезаписей</a></p>
<p class="rvps18"><a class="rvts62" href="Ideas.html#Modifiers">Система клавиш-модификаторов</a></p>
<p class="rvps18"><a class="rvts62" href="Ideas.html#Patterns">Шаблоны</a></p>
<p class="rvps18"><a class="rvts62" href="Ideas.html#CrossingGaps">Пересечение промежутков</a></p>
<p class="rvps18"><a class="rvts62" href="Ideas.html#SaveCompact">Компактное сохранение</a></p>
<p class="rvps18"><a class="rvts62" href="Ideas.html#Autosave">Автосохранение</a></p>
<td style="border-color: #000000; border-style: solid;"><p class="rvps18"><a class="rvts63" href="Ideas.html#PianoRoll">Piano Roll</a></p>
<p class="rvps18"><a class="rvts63" href="Ideas.html#Selection">Выделение</a></p>
<p class="rvps18"><a class="rvts63" href="Ideas.html#Markers">Маркеры</a></p>
<p class="rvps18"><a class="rvts63" href="Ideas.html#HotChanges">Горячие Правки</a></p>
<p class="rvps18"><a class="rvts63" href="Ideas.html#Greenzone">Гринзона</a></p>
<p class="rvps18"><a class="rvts63" href="Ideas.html#Playback">Проигрыватель</a></p>
<p class="rvps18"><a class="rvts63" href="Ideas.html#GreenArrow">Зелёная стрелка</a></p>
<p class="rvps18"><a class="rvts63" href="Ideas.html#AutoRestoring">Автовосстановление утраченной позиции</a></p>
<p class="rvps18"><a class="rvts63" href="Ideas.html#Recorder">Мультитрекинг-рекордер</a></p>
<p class="rvps18"><a class="rvts63" href="Ideas.html#Lua">Lua-автоматизация</a></p>
<p class="rvps18"><a class="rvts63" href="Ideas.html#BookmarksBranches">Закладки и ответвления</a></p>
<p class="rvps18"><a class="rvts63" href="Ideas.html#PopupWindows">Всплывающие окна</a></p>
<p class="rvps18"><a class="rvts63" href="Ideas.html#HistoryLog">Журнал Истории</a></p>
<p class="rvps18"><a class="rvts63" href="Ideas.html#RerecordsCounter">Счётчик перезаписей</a></p>
<p class="rvps18"><a class="rvts63" href="Ideas.html#Modifiers">Система клавиш-модификаторов</a></p>
<p class="rvps18"><a class="rvts63" href="Ideas.html#Patterns">Шаблоны</a></p>
<p class="rvps18"><a class="rvts63" href="Ideas.html#CrossingGaps">Пересечение промежутков</a></p>
<p class="rvps18"><a class="rvts63" href="Ideas.html#SaveCompact">Компактное сохранение</a></p>
<p class="rvps18"><a class="rvts63" href="Ideas.html#Autosave">Автосохранение</a></p>
</td>
<td style="border-color: #000000; border-style: solid;"><p class="rvps5"><a class="rvts76" href="Ideas.html#OutputLog">Журнал Вывода</a></p>
<p class="rvps5"><a class="rvts76" href="Ideas.html#Minimap">Миникарта</a></p>
<p class="rvps5"><a class="rvts76" href="Ideas.html#VirtualJoypad">Виртуальный Джойстик</a></p>
<p class="rvps5"><a class="rvts76" href="Ideas.html#BetterSelection">Усовершенствование Выделения</a></p>
<p class="rvps5"><a class="rvts76" href="Ideas.html#BetterColumns">Гибкая настройка колонок</a></p>
<p class="rvps5"><a class="rvts76" href="Ideas.html#RerecordsHeatmap">Теплокарта перезаписей</a></p>
<p class="rvps5"><a class="rvts76" href="Ideas.html#Etc">Прочие мелочи</a></p>
<p class="rvps5"><a class="rvts76" href="Ideas.html#OtherPlatforms">Поддержка платформ, отличных от NES</a></p>
<td style="border-color: #000000; border-style: solid;"><p class="rvps5"><a class="rvts77" href="Ideas.html#OutputLog">Журнал Вывода</a></p>
<p class="rvps5"><a class="rvts77" href="Ideas.html#Minimap">Миникарта</a></p>
<p class="rvps5"><a class="rvts77" href="Ideas.html#VirtualJoypad">Виртуальный Джойстик</a></p>
<p class="rvps5"><a class="rvts77" href="Ideas.html#BetterSelection">Усовершенствование Выделения</a></p>
<p class="rvps5"><a class="rvts77" href="Ideas.html#BetterColumns">Гибкая настройка колонок</a></p>
<p class="rvps5"><a class="rvts77" href="Ideas.html#RerecordsHeatmap">Теплокарта перезаписей</a></p>
<p class="rvps5"><a class="rvts77" href="Ideas.html#Etc">Прочие мелочи</a></p>
<p class="rvps5"><a class="rvts77" href="Ideas.html#OtherPlatforms">Поддержка платформ, отличных от NES</a></p>
</td>
</tr>
</table>
@ -102,7 +106,7 @@
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps2"><a name="ImplementedIdeas"></a>
<span class="rvts37"><br/></span></p>
<p class="rvps10"><span class="rvts75">Реализованные идеи</span></p>
<p class="rvps10"><span class="rvts76">Реализованные идеи</span></p>
<p class="rvps10"><a name="PianoRoll"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">Piano Roll</span></p>
@ -110,14 +114,14 @@
<p class="rvps10"><span class="rvts22">Основа Тасэдитора, вокруг этой идеи и были сформированы все остальные.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Представляет собой значительно переработанный компонент Список (ListView) или Таблица (GridView). Столбцы Списка соответствуют кнопкам Ввода, строки Списка соответствуют кадрам мувика. Количество строк Списка регулярно автоматически обновляется, чтобы соответствовать количеству кадров текущего мувика. Строки нумеруются сверху вниз от нуля. Номер строки равен номеру кадра, с которым ассоциируется эта строка. Количество столбцов зависит от типа мувика (от количества джойстиков и, соответственно, количества кнопок).</span></li>
<li class="rvps15"><span class="rvts22">Слева перед столбцами Ввода располагаются два дополнительных столбца. Самый первый столбец (шириной ~17 пикселей) отвечает за отображение иконок и за управление Курсором Проигрывателя. Текущее положение Курсора Проигрывателя отображается иконкой в виде голубой стрелки. При щелчке левой кнопкой по этому столбцу Курсор Проигрывателя посылается на соответствующий кадр, и начинается перетаскивание Курсора, пока не будет отпущена левая кнопка.</span></li>
<li class="rvps15"><span class="rvts22">Второй столбец (шириной 75 пикселей) отвечает за отображение номеров кадров, отображение Маркеров, управление Выделением и управление Маркерами. При одинарном щелчке левой кнопкой по этому столбцу изменяется Выделение (и можно растягивать Выделение перетаскиванием). При двойном щелчке на этом кадре ставится Маркер, и начинается перетаскивание этого Маркера, пока не будет отпущена левая кнопка.</span></li>
<li class="rvps15"><span class="rvts22">В Заголовке Списка отображаются названия столбцов. Самый первый столбец (столбец иконок) не имеет названия, второй столбец назван "Frame#" (номер кадра), остальные столбцы обозначены символом соответствующей кнопки джойстика. Этот же символ отображается в ячейках данного столбца на тех строках, где данная кнопка является нажатой. По ячейкам Заголовка Списка можно щёлкать, изменяя Ввод соответствующей кнопки в выделенных кадрах. А при щелчке по "Frame#" изменяются Маркеры в выделенных кадрах. Кроме того, Заголовок служит индикатором зажатых кнопок джойстика, а при Записи Ввода в Заголовке вспыхивают символы, кнопки которых были только что записаны в мувик.</span></li>
<li class="rvps15"><span class="rvts22">Столбцы Ввода отображают состояние соответствующей кнопки джойстика для каждого кадра мувика. Чтобы узнать состояние кнопки, нужно визуально найти пересечение строки требуемого кадра и столбца требуемой кнопки. Если в этой ячейке находится символ кнопки, то кнопка в данном кадре нажата. Если в этой ячейке пустота или прочерк, то кнопка отпущена. Щелчком левой кнопкой мыши по любой ячейке Ввода можно инвертировать состояние соответствующей кнопки Ввода. &nbsp;Кроме того, если зажать левую кнопку мыши, можно рисовать или стирать Ввод в соседних кадрах, перемещая курсор мыши выше или ниже. Эти и другие возможности быстрого редактирования Ввода призваны полностью заменить линейную Запись нелинейным редактированием.</span></li>
<li class="rvps15"><span class="rvts22">Строки Piano Roll раскрашиваются разными цветами в пастельных тонах, чтобы на их фоне были чётко видны номера кадров (отображаемые чёрным цветом) и символы кнопочных нажатий (отображаемые тёмными цветами). По цвету строки Piano Roll пользователь может сразу определить, находится ли данный кадр мувика в Гринзоне, проявляется ли лаг в данном кадре, является ли данный кадр текущим (отображаемым в окне эмулятора в данный момент), является ли данный кадр выделенным. Также дополнительными цветами можно акцентировать внимание пользователя на определённых кадрах, например, на кадре окончания добегания (мигающий голубой цвет) или на ключевом кадре отката (фиолетовый цвет). Кроме того, по цвету фона ячеек с номерами кадров пользователь может определить наличие Маркера на этом кадре (жёлтый цвет).</span></li>
<li class="rvps15"><span class="rvts22">Расцветка ячеек Piano Roll зависит не только от строки, но и от столбца (хоть и в меньшей мере). Столбец иконок всегда отображается белым цветом. Стобец номеров кадров отображается бледным оттенком текущего цвета строки. Столбцы кнопок Ввода для первого (а также третьего) джойстика отображаются нормальным оттенком текущего цвета строки (зелёным, красным, голубым и т.д.), а столбцы кнопок Ввода для второго (а также четвёртого) джойстика отображаются немного затемнённым оттенком текущего цвета строки.</span></li>
<li class="rvps15"><span class="rvts22">Видимая область Piano Roll может скроллироваться колесом мыши или с помощью скроллбаров, а также с помощью множества других способов </span><a class="rvts28" href="Navigation.html#scrolling-piano-roll">навигации</a><span class="rvts22">. Многообразие способов призвано ускорить навигацию к любому желаемому участку мувика, так как в видимой области отображается лишь ограниченное количество строк. Это количество зависит от текущей высоты Piano Roll в пикселах, которая зависит от текущей высоты окна TAS Editor.</span></li>
<li class="rvps10"><span class="rvts22">Представляет собой значительно переработанный компонент Список (ListView) или Таблица (GridView). Столбцы Списка соответствуют кнопкам Ввода, строки Списка соответствуют кадрам мувика. Количество строк Списка регулярно автоматически обновляется, чтобы соответствовать количеству кадров текущего мувика. Строки нумеруются сверху вниз от нуля. Номер строки равен номеру кадра, с которым ассоциируется эта строка. Количество столбцов зависит от типа мувика (от количества джойстиков и, соответственно, количества кнопок).</span></li>
<li class="rvps10"><span class="rvts22">Слева перед столбцами Ввода располагаются два дополнительных столбца. Самый первый столбец (шириной ~17 пикселей) отвечает за отображение иконок и за управление Курсором Проигрывателя. Текущее положение Курсора Проигрывателя отображается иконкой в виде голубой стрелки. При щелчке левой кнопкой по этому столбцу Курсор Проигрывателя посылается на соответствующий кадр, и начинается перетаскивание Курсора, пока не будет отпущена левая кнопка.</span></li>
<li class="rvps10"><span class="rvts22">Второй столбец (шириной 75 пикселей) отвечает за отображение номеров кадров, отображение Маркеров, управление Выделением и управление Маркерами. При одинарном щелчке левой кнопкой по этому столбцу изменяется Выделение (и можно растягивать Выделение перетаскиванием). При двойном щелчке на этом кадре ставится Маркер, и начинается перетаскивание этого Маркера, пока не будет отпущена левая кнопка.</span></li>
<li class="rvps10"><span class="rvts22">В Заголовке Списка отображаются названия столбцов. Самый первый столбец (столбец иконок) не имеет названия, второй столбец назван "Frame#" (номер кадра), остальные столбцы обозначены символом соответствующей кнопки джойстика. Этот же символ отображается в ячейках данного столбца на тех строках, где данная кнопка является нажатой. По ячейкам Заголовка Списка можно щёлкать, изменяя Ввод соответствующей кнопки в выделенных кадрах. А при щелчке по "Frame#" изменяются Маркеры в выделенных кадрах. Кроме того, Заголовок служит индикатором зажатых кнопок джойстика, а при Записи Ввода в Заголовке вспыхивают символы, кнопки которых были только что записаны в мувик.</span></li>
<li class="rvps10"><span class="rvts22">Столбцы Ввода отображают состояние соответствующей кнопки джойстика для каждого кадра мувика. Чтобы узнать состояние кнопки, нужно визуально найти пересечение строки требуемого кадра и столбца требуемой кнопки. Если в этой ячейке находится символ кнопки, то кнопка в данном кадре нажата. Если в этой ячейке пустота или прочерк, то кнопка отпущена. Щелчком левой кнопкой мыши по любой ячейке Ввода можно инвертировать состояние соответствующей кнопки Ввода. &nbsp;Кроме того, если зажать левую кнопку мыши, можно рисовать или стирать Ввод в соседних кадрах, перемещая курсор мыши выше или ниже. Эти и другие возможности быстрого редактирования Ввода призваны полностью заменить линейную Запись нелинейным редактированием.</span></li>
<li class="rvps10"><span class="rvts22">Строки Piano Roll раскрашиваются разными цветами в пастельных тонах, чтобы на их фоне были чётко видны номера кадров (отображаемые чёрным цветом) и символы кнопочных нажатий (отображаемые тёмными цветами). По цвету строки Piano Roll пользователь может сразу определить, находится ли данный кадр мувика в Гринзоне, проявляется ли лаг в данном кадре, является ли данный кадр текущим (отображаемым в окне эмулятора в данный момент), является ли данный кадр выделенным. Также дополнительными цветами можно акцентировать внимание пользователя на определённых кадрах, например, на кадре окончания добегания (мигающий голубой цвет) или на ключевом кадре отката (фиолетовый цвет). Кроме того, по цвету фона ячеек с номерами кадров пользователь может определить наличие Маркера на этом кадре (жёлтый цвет).</span></li>
<li class="rvps10"><span class="rvts22">Расцветка ячеек Piano Roll зависит не только от строки, но и от столбца (хоть и в меньшей мере). Столбец иконок всегда отображается белым цветом. Стобец номеров кадров отображается бледным оттенком текущего цвета строки. Столбцы кнопок Ввода для первого (а также третьего) джойстика отображаются нормальным оттенком текущего цвета строки (зелёным, красным, голубым и т.д.), а столбцы кнопок Ввода для второго (а также четвёртого) джойстика отображаются немного затемнённым оттенком текущего цвета строки.</span></li>
<li class="rvps10"><span class="rvts22">Видимая область Piano Roll может скроллироваться колесом мыши или с помощью скроллбаров, а также с помощью множества других способов </span><a class="rvts28" href="Navigation.html#scrolling-piano-roll">навигации</a><span class="rvts22">. Многообразие способов призвано ускорить навигацию к любому желаемому участку мувика, так как в видимой области отображается лишь ограниченное количество строк. Это количество зависит от текущей высоты Piano Roll в пикселах, которая зависит от текущей высоты окна TAS Editor.</span></li>
</ul>
<p class="rvps10"><a name="Selection"></a>
<span class="rvts22"><br/></span></p>
@ -126,56 +130,56 @@
<p class="rvps10"><span class="rvts22">Как и в любом другом редакторе, &nbsp;в Тасэдиторе Выделение служит для применения операций к множеству кадров одновременно. Кроме того, здесь Выделение служит в качестве указателя (курсора) на место последнего щелчка по Вводу.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Выделение хранится в виде списка номеров кадров, считающихся выделенными.</span></li>
<li class="rvps15"><span class="rvts22">В памяти хранится Журнал Выделений в виде массива списков. Размер массива равен размеру Журнала Истории, можно возвращаться к предыдущим выделениям с помощью </span><span class="rvts34">Ctrl + Q</span><span class="rvts22"> и </span><span class="rvts34">Ctrl + W</span><span class="rvts22">. Это полезно для быстрого отслеживания истории недавних щелчков по Piano Roll.</span></li>
<li class="rvps15"><span class="rvts22">Для управления Выделением служит столбец с номерами кадров. Если после щелчка по номеру кадра зажать левую кнопку, можно растягивать Выделение на соседние кадры. Если зажать клавишу </span><span class="rvts34">Ctrl</span><span class="rvts22"> перед щелчком по номеру кадра, ранее выделенные кадры останутся выделенными. А при простом щелчке по номеру кадра или Ввода текущее Выделение уходит в историю Выделений, и вместо него создаётся новое Выделение, состоящее из одного кадра (по которому был сделан щелчок). Если зажать клавишу </span><span class="rvts34">Shift</span><span class="rvts22">, выделятся все кадры от начала старого Выделения до кадра щелчка. Если зажать </span><span class="rvts34">Alt</span><span class="rvts22">, создастся Выделение по шаблону. Также Выделение меняется и при щелчке по ячейкам Ввода, но только когда не зажаты клавиши модификаторы,</span></li>
<li class="rvps15"><span class="rvts22">Самый верхний выделенный кадр называется Курсором Выделения. Если не выделено ни одного кадра, подразумевается, что Курсор Выделения указывает на кадр с номером -1. Это нужно для некоторых ситуаций, например, при отсутствии Выделения в нижнем текстовом поле отображается Заметка нулевого Маркера.</span></li>
<li class="rvps15"><span class="rvts22">Журнал Выделений (в том числе текущее Выделение) сохраняется и загружается из файла проекта. При изменении настройки "undo levels" происходит соответствующее изменение размера Журнала Выделений.</span></li>
<li class="rvps15"><span class="rvts22">При вставке и удалении кадров текущее Выделение смещается на соответственное количество строк вниз или вверх, чтобы оставаться на тех же позициях относительно Ввода, что и перед вставкой/удалением.</span></li>
<li class="rvps15"><span class="rvts22">Текущее Выделение можно сдвигать (</span><span class="rvts34">Ctrl + Вверх</span><span class="rvts22"> / </span><span class="rvts34">Ctrl + Вниз</span><span class="rvts22"> / </span><span class="rvts34">Ctrl + Home</span><span class="rvts22"> / </span><span class="rvts34">Ctrl + End</span><span class="rvts22">). Если часть Выделения выходит за рамки Piano Roll, эта часть исчезает. То есть пользователь не может выделить кадры за пределами текущего мувика.</span></li>
<li class="rvps15"><span class="rvts22">Курсором Выделения можно осуществлять прыжки по Маркерам (</span><span class="rvts34">Ctrl + Page Up</span><span class="rvts22"> / </span><span class="rvts34">Ctrl + Page Down</span><span class="rvts22">), при этом текущее Выделение уходит в Историю, а вместо него появляется один выделенный кадр на месте следующего Маркера.</span></li>
<li class="rvps15"><span class="rvts22">Видимая область Piano Roll всегда следует за Выделением. При этом, если Выделение не помещается целиком на экране, Piano Roll скроллируется таким образом, чтобы Курсор Выделения был в середине, а если Выделение помещается центрирует всё Выделение.</span></li>
<li class="rvps15"><span class="rvts22">В нижнем текстовом поле отображается текст Заметки маркера, на участке которого находится Курсор Выделения. Этот текст обновляется при каждом изменении Выделения, а также при изменении текущих Маркеров.</span></li>
<li class="rvps15"><span class="rvts22">При нажатии </span><span class="rvts34">Ctrl + A</span><span class="rvts22"> текущее Выделение уходит в Историю, вместо него становятся выделенными все кадры, начиная с Маркера, на участке которого был Курсор Выделения, заканчивая следующим Маркером (не включая этот Маркер). Таким образом выделяется весь участок текущего Маркера. При следующем нажатии </span><span class="rvts34">Ctrl + A</span><span class="rvts22"> Выделение изменится на набор кадров между Маркерами, не включая верхний и нижний Маркеры. При третьем </span><span class="rvts34">Ctrl + A</span><span class="rvts22"> Выделение изменится на набор кадров между Маркерами, не включая верхний, но включая нижний Маркер. Наконец, при четвёртом нажатии </span><span class="rvts34">Ctrl + A</span><span class="rvts22"> Выделение изменится на набор кадров между Маркерами, включающий оба Маркера. При дальнейших нажатиях </span><span class="rvts34">Ctrl + A</span><span class="rvts22"> будет повторение предыдущих вариантов выделения. Это позволяет пользователю быстро выделить нужный участок, причём в большинстве случаев ТАСеру будет нужен именно первый вариант выделения между Маркерами.</span></li>
<li class="rvps10"><span class="rvts22">Выделение хранится в виде списка номеров кадров, считающихся выделенными.</span></li>
<li class="rvps10"><span class="rvts22">В памяти хранится Журнал Выделений в виде массива списков. Размер массива равен размеру Журнала Истории, можно возвращаться к предыдущим выделениям с помощью </span><span class="rvts34">Ctrl + Q</span><span class="rvts22"> и </span><span class="rvts34">Ctrl + W</span><span class="rvts22">. Это полезно для быстрого отслеживания истории недавних щелчков по Piano Roll.</span></li>
<li class="rvps10"><span class="rvts22">Для управления Выделением служит столбец с номерами кадров. Если после щелчка по номеру кадра зажать левую кнопку, можно растягивать Выделение на соседние кадры. Если зажать клавишу </span><span class="rvts34">Ctrl</span><span class="rvts22"> перед щелчком по номеру кадра, ранее выделенные кадры останутся выделенными. А при простом щелчке по номеру кадра или Ввода текущее Выделение уходит в историю Выделений, и вместо него создаётся новое Выделение, состоящее из одного кадра (по которому был сделан щелчок). Если зажать клавишу </span><span class="rvts34">Shift</span><span class="rvts22">, выделятся все кадры от начала старого Выделения до кадра щелчка. Если зажать </span><span class="rvts34">Alt</span><span class="rvts22">, создастся Выделение по шаблону. Также Выделение меняется и при щелчке по ячейкам Ввода, но только когда не зажаты клавиши модификаторы,</span></li>
<li class="rvps10"><span class="rvts22">Самый верхний выделенный кадр называется Курсором Выделения. Если не выделено ни одного кадра, подразумевается, что Курсор Выделения указывает на кадр с номером -1. Это нужно для некоторых ситуаций, например, при отсутствии Выделения в нижнем текстовом поле отображается Заметка нулевого Маркера.</span></li>
<li class="rvps10"><span class="rvts22">Журнал Выделений (в том числе текущее Выделение) сохраняется и загружается из файла проекта. При изменении настройки "undo levels" происходит соответствующее изменение размера Журнала Выделений.</span></li>
<li class="rvps10"><span class="rvts22">При вставке и удалении кадров текущее Выделение смещается на соответственное количество строк вниз или вверх, чтобы оставаться на тех же позициях относительно Ввода, что и перед вставкой/удалением.</span></li>
<li class="rvps10"><span class="rvts22">Текущее Выделение можно сдвигать (</span><span class="rvts34">Ctrl + Вверх</span><span class="rvts22"> / </span><span class="rvts34">Ctrl + Вниз</span><span class="rvts22"> / </span><span class="rvts34">Ctrl + Home</span><span class="rvts22"> / </span><span class="rvts34">Ctrl + End</span><span class="rvts22">). Если часть Выделения выходит за рамки Piano Roll, эта часть исчезает. То есть пользователь не может выделить кадры за пределами текущего мувика.</span></li>
<li class="rvps10"><span class="rvts22">Курсором Выделения можно осуществлять прыжки по Маркерам (</span><span class="rvts34">Ctrl + Page Up</span><span class="rvts22"> / </span><span class="rvts34">Ctrl + Page Down</span><span class="rvts22">), при этом текущее Выделение уходит в Историю, а вместо него появляется один выделенный кадр на месте следующего Маркера.</span></li>
<li class="rvps10"><span class="rvts22">Видимая область Piano Roll всегда следует за Выделением. При этом, если Выделение не помещается целиком на экране, Piano Roll скроллируется таким образом, чтобы Курсор Выделения был в середине, а если Выделение помещается центрирует всё Выделение.</span></li>
<li class="rvps10"><span class="rvts22">В нижнем текстовом поле отображается текст Заметки маркера, на участке которого находится Курсор Выделения. Этот текст обновляется при каждом изменении Выделения, а также при изменении текущих Маркеров.</span></li>
<li class="rvps10"><span class="rvts22">При нажатии </span><span class="rvts34">Ctrl + A</span><span class="rvts22"> текущее Выделение уходит в Историю, вместо него становятся выделенными все кадры, начиная с Маркера, на участке которого был Курсор Выделения, заканчивая следующим Маркером (не включая этот Маркер). Таким образом выделяется весь участок текущего Маркера. При следующем нажатии </span><span class="rvts34">Ctrl + A</span><span class="rvts22"> Выделение изменится на набор кадров между Маркерами, не включая верхний и нижний Маркеры. При третьем </span><span class="rvts34">Ctrl + A</span><span class="rvts22"> Выделение изменится на набор кадров между Маркерами, не включая верхний, но включая нижний Маркер. Наконец, при четвёртом нажатии </span><span class="rvts34">Ctrl + A</span><span class="rvts22"> Выделение изменится на набор кадров между Маркерами, включающий оба Маркера. При дальнейших нажатиях </span><span class="rvts34">Ctrl + A</span><span class="rvts22"> будет повторение предыдущих вариантов выделения. Это позволяет пользователю быстро выделить нужный участок, причём в большинстве случаев ТАСеру будет нужен именно первый вариант выделения между Маркерами.</span></li>
</ul>
<p class="rvps15"><a name="Markers"></a>
<p class="rvps10"><a name="Markers"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">Маркеры</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">При редактировании больших мувиков пользователю может понадобиться установка отметок на некоторые строки Piano Roll, чтобы эти строки визуально отличались от соседних. После ряда усовершенствований эта идея вылилась в многогранную фичу.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Любой кадр мувика может быть отмечен. При желании пользователь может отметить Маркерами сразу все кадры мувика. Кроме того, пользователь может оставить отметку, например, на кадре 1200, а затем сделать усечение Ввода после кадра 1000, оставив отвязанный от Ввода Маркер за пределами мувика. Этот Маркер будет оставаться в проекте; чтобы увидеть его наличие, нужно проэмулировать мувик до кадра 1200, чтобы в Piano Roll отражалась строка с этим Маркером.</span></li>
<li class="rvps15"><span class="rvts22">Неотмеченные строки Piano Roll отображаются обычными цветами, а в отмеченных строках ячейка с номером кадра имеет жёлтый цвет фона. Этот цвет выбран, так как Маркеры призваны акцентировать внимание пользователя на отмеченных кадрах. Также номера отмеченных кадров отображаются особым шрифтом, чтобы о наличии Маркера можно было догадаться, даже когда жёлтый фон ячейки загораживается синим цветом Выделения.</span></li>
<li class="rvps15"><span class="rvts22">Маркеры могут быть привязаны к Вводу (тогда они отображаются бледно-жёлтым цветом), а могут быть отвязанными (отображаются более насыщенным жёлтым цветом). Когда Маркеры привязаны, на них действуют операции по смещению Ввода вверх/вниз, а также усечению Ввода.</span></li>
<li class="rvps15"><span class="rvts22">Маркер ставится двойным щелчком левой кнопкой мыши по номеру желаемого кадра. Если сделать двойной щелчок по уже установленному Маркеру, начинается его перетаскивание (до момента отпускания левой кнопки). Так можно перенести Маркер на другой кадр или удалить, перенеся за рамки Piano Roll. При перетаскивании под курсором мыши висит образ Маркера в виде жёлтого прямоугольника с номером кадра, с которого был снят этот Маркер. Чтобы отменить перетаскивание, нужно опустить Маркер либо на ту же самую ячейку с номером кадра, либо на любую ячейку Ввода.</span></li>
<li class="rvps15"><span class="rvts22">Также Маркеры можно устанавливать и удалять с помощью контекстного меню по правой кнопке или с помощью щелчка по Frame#.</span></li>
<li class="rvps15"><span class="rvts22">Обычно Маркеры ставятся относительно далеко друг от друга, и между ними находятся промежутки из неотмеченных кадров. Поэтому Маркеры можно воспринимать не только как цветовое выделение особенных кадров, но и как пограничные отметки для участков мувика. Для стандартизации принята следующая терминология: каждому Маркеру соответствует участок кадров мувика, начинающийся с отмеченного кадра и заканчивающийся последним неотмеченным кадром. Например, если в мувике на кадрах 10 и 20 стоят Маркеры, то участком первого маркера является регион кадров с 10-го по 19-й, а участком второго маркера регион с 20-го по последний кадр мувика.</span></li>
<li class="rvps15"><span class="rvts22">Промежутки между Маркерами можно пересекать прыжками от текущего к следующему (или предыдущему). Это позволяет в ряде случаев ускорить навигацию по мувику.</span></li>
<li class="rvps15"><span class="rvts22">С помощью функции </span><span class="rvts26">Select between Markers</span><span class="rvts22"> (</span><span class="rvts34">Ctrl + A</span><span class="rvts22">) можно быстро выделить все кадры на участке текущего Маркера. Таким образом Маркеры позволяют ускорить не только навигацию, но и редактирование.</span></li>
<li class="rvps15"><span class="rvts22">Каждый Маркер имеет свою текстовую Заметку. При создании она пустая. Пользователь может просматривать и редактировать Заметку с помощью любого из двух имеющихся текстовых полей. В верхнем текстовом поле отображается Заметка Маркера, на участке которого находится Курсор Проигрывателя. В нижнем текстовом поле отображается Заметка Маркера, на участке которого находится Курсор Выделения. Таким образом, чтобы отредактировать желаемую Заметку, нужно сначала поставить один из курсоров на её Маркер или на кадр под Маркером. В теории это звучит неудобно, но рабочий процесс в Тасэдиторе организован таким образом, что под нужными Маркерами обязательно стоит какой-нибудь курсор.</span></li>
<li class="rvps15"><span class="rvts22">Объём Заметки ограничен сотней символов, так как Заметки предназначены не для хранения длинных текстов, а для коротких комментариев, тегов и тому подобных записок на салфетках. В крайнем случае можно разместить несколько Маркеров подряд, разбив длинный текст на несколько соседствующих Заметок.</span></li>
<li class="rvps15"><span class="rvts22">По тексту Заметок можно осуществлять обычный поиск (Find Note) и нечёткий поиск (Similar/More). Подробнее см. </span><a class="rvts28" href="AdvancedFeatures.html#UsingMarkers">Продвинутые возможности</a><span class="rvts22">.</span></li>
<li class="rvps15"><span class="rvts22">Маркеры сохраняются и восстанавливаются из ответвлений Закладок вместе с Вводом. Каждая операция с Маркерами заносится в Журнал Истории аналогично операциям с Вводом. В файле проекта Маркеры сохраняются сразу после Ввода.</span></li>
<li class="rvps10"><span class="rvts22">Любой кадр мувика может быть отмечен. При желании пользователь может отметить Маркерами сразу все кадры мувика. Кроме того, пользователь может оставить отметку, например, на кадре 1200, а затем сделать усечение Ввода после кадра 1000, оставив отвязанный от Ввода Маркер за пределами мувика. Этот Маркер будет оставаться в проекте; чтобы увидеть его наличие, нужно проэмулировать мувик до кадра 1200, чтобы в Piano Roll отражалась строка с этим Маркером.</span></li>
<li class="rvps10"><span class="rvts22">Неотмеченные строки Piano Roll отображаются обычными цветами, а в отмеченных строках ячейка с номером кадра имеет жёлтый цвет фона. Этот цвет выбран, так как Маркеры призваны акцентировать внимание пользователя на отмеченных кадрах. Также номера отмеченных кадров отображаются особым шрифтом, чтобы о наличии Маркера можно было догадаться, даже когда жёлтый фон ячейки загораживается синим цветом Выделения.</span></li>
<li class="rvps10"><span class="rvts22">Маркеры могут быть привязаны к Вводу (тогда они отображаются бледно-жёлтым цветом), а могут быть отвязанными (отображаются более насыщенным жёлтым цветом). Когда Маркеры привязаны, на них действуют операции по смещению Ввода вверх/вниз, а также усечению Ввода.</span></li>
<li class="rvps10"><span class="rvts22">Маркер ставится двойным щелчком левой кнопкой мыши по номеру желаемого кадра. Если сделать двойной щелчок по уже установленному Маркеру, начинается его перетаскивание (до момента отпускания левой кнопки). Так можно перенести Маркер на другой кадр или удалить, перенеся за рамки Piano Roll. При перетаскивании под курсором мыши висит образ Маркера в виде жёлтого прямоугольника с номером кадра, с которого был снят этот Маркер. Чтобы отменить перетаскивание, нужно опустить Маркер либо на ту же самую ячейку с номером кадра, либо на любую ячейку Ввода.</span></li>
<li class="rvps10"><span class="rvts22">Также Маркеры можно устанавливать и удалять с помощью контекстного меню по правой кнопке или с помощью щелчка по Frame#.</span></li>
<li class="rvps10"><span class="rvts22">Обычно Маркеры ставятся относительно далеко друг от друга, и между ними находятся промежутки из неотмеченных кадров. Поэтому Маркеры можно воспринимать не только как цветовое выделение особенных кадров, но и как пограничные отметки для участков мувика. Для стандартизации принята следующая терминология: каждому Маркеру соответствует участок кадров мувика, начинающийся с отмеченного кадра и заканчивающийся последним неотмеченным кадром. Например, если в мувике на кадрах 10 и 20 стоят Маркеры, то участком первого маркера является регион кадров с 10-го по 19-й, а участком второго маркера регион с 20-го по последний кадр мувика.</span></li>
<li class="rvps10"><span class="rvts22">Промежутки между Маркерами можно пересекать прыжками от текущего к следующему (или предыдущему). Это позволяет в ряде случаев ускорить навигацию по мувику.</span></li>
<li class="rvps10"><span class="rvts22">С помощью функции </span><span class="rvts26">Select between Markers</span><span class="rvts22"> (</span><span class="rvts34">Ctrl + A</span><span class="rvts22">) можно быстро выделить все кадры на участке текущего Маркера. Таким образом Маркеры позволяют ускорить не только навигацию, но и редактирование.</span></li>
<li class="rvps10"><span class="rvts22">Каждый Маркер имеет свою текстовую Заметку. При создании она пустая. Пользователь может просматривать и редактировать Заметку с помощью любого из двух имеющихся текстовых полей. В верхнем текстовом поле отображается Заметка Маркера, на участке которого находится Курсор Проигрывателя. В нижнем текстовом поле отображается Заметка Маркера, на участке которого находится Курсор Выделения. Таким образом, чтобы отредактировать желаемую Заметку, нужно сначала поставить один из курсоров на её Маркер или на кадр под Маркером. В теории это звучит неудобно, но рабочий процесс в Тасэдиторе организован таким образом, что под нужными Маркерами обязательно стоит какой-нибудь курсор.</span></li>
<li class="rvps10"><span class="rvts22">Объём Заметки ограничен сотней символов, так как Заметки предназначены не для хранения длинных текстов, а для коротких комментариев, тегов и тому подобных записок на салфетках. В крайнем случае можно разместить несколько Маркеров подряд, разбив длинный текст на несколько соседствующих Заметок.</span></li>
<li class="rvps10"><span class="rvts22">По тексту Заметок можно осуществлять обычный поиск (Find Note) и нечёткий поиск (Similar/More). Подробнее см. </span><a class="rvts28" href="AdvancedFeatures.html#UsingMarkers">Продвинутые возможности</a><span class="rvts22">.</span></li>
<li class="rvps10"><span class="rvts22">Маркеры сохраняются и восстанавливаются из ответвлений Закладок вместе с Вводом. Каждая операция с Маркерами заносится в Журнал Истории аналогично операциям с Вводом. В файле проекта Маркеры сохраняются сразу после Ввода.</span></li>
</ul>
<p class="rvps15"><a name="HotChanges"></a>
<p class="rvps10"><a name="HotChanges"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">Горячие Правки</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Раскраска текстовых символов в ячейках Ввода разными цветами, в зависимости от давности редактирования каждой ячейки. Подробнее см. </span><a class="rvts28" href="PianoRoll.html#HotChanges">Интерфейс программы</a><span class="rvts22"> и </span><a class="rvts28" href="ProgramCustomization.html#EnableHotChanges">Настройка программы</a><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">В памяти хранятся значения сразу всех ячеек Ввода, даже несмотря на то, что большинство из них имеет нулевой уровень горячести. Это необходимо для тех редких случаев, когда массово изменяются почти все ячейки мувика (например, при операциях Import или Paste). Массив Горячих Правок занимает много места в оперативной памяти, но хорошо сжимается и занимает мало места на диске.</span></li>
<li class="rvps15"><span class="rvts22">16 градаций цвета, чтобы в одном байте умещалась информация о горячести двух ячеек. Кроме того, добавлять ещё больше градаций нет смысла, так как человеческий глаз будет хуже различать их, а ценность Горячих Правок именно в возможности быстрой визуальной оценки Ввода, не требующей длительного обдумывания.</span></li>
<li class="rvps15"><span class="rvts22">Состояние текущей карты Горячих Правок меняется только при добавлении нового пункта в Журнал истории и при откатах Истории.</span></li>
<li class="rvps10"><span class="rvts22">В памяти хранятся значения сразу всех ячеек Ввода, даже несмотря на то, что большинство из них имеет нулевой уровень горячести. Это необходимо для тех редких случаев, когда массово изменяются почти все ячейки мувика (например, при операциях Import или Paste). Массив Горячих Правок занимает много места в оперативной памяти, но хорошо сжимается и занимает мало места на диске.</span></li>
<li class="rvps10"><span class="rvts22">16 градаций цвета, чтобы в одном байте умещалась информация о горячести двух ячеек. Кроме того, добавлять ещё больше градаций нет смысла, так как человеческий глаз будет хуже различать их, а ценность Горячих Правок именно в возможности быстрой визуальной оценки Ввода, не требующей длительного обдумывания.</span></li>
<li class="rvps10"><span class="rvts22">Состояние текущей карты Горячих Правок меняется только при добавлении нового пункта в Журнал истории и при откатах Истории.</span></li>
</ul>
<ul style="text-indent: 30px; margin-left: 40px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">при редактировании Ввода старые ячейки теряют один уровень горячести, а изменённые ячейки приобретают максимальный уровень</span></li>
<li class="rvps15"><span class="rvts22">при удалении кадров старые ячейки теряют один уровень горячести</span></li>
<li class="rvps15"><span class="rvts22">при вставке кадров старые ячейки теряют один уровень горячести, а все ячейки вставленных кадров приобретают максимальный уровень</span></li>
<li class="rvps15"><span class="rvts22">при изменении Маркеров или Закладок, а также при усечении мувика Горячие Правки не меняются</span></li>
<li class="rvps15"><span class="rvts22">при прыжке на Закладку во времени текущие Горячие Правки замещаются Горячими Правками из ответвления Закладки</span></li>
<li class="rvps15"><span class="rvts22">при импорте Ввода старые ячейки обнуляют уровень горячести, а изменённые ячейки приобретают максимальный уровень</span></li>
<li class="rvps10"><span class="rvts22">при редактировании Ввода старые ячейки теряют один уровень горячести, а изменённые ячейки приобретают максимальный уровень</span></li>
<li class="rvps10"><span class="rvts22">при удалении кадров старые ячейки теряют один уровень горячести</span></li>
<li class="rvps10"><span class="rvts22">при вставке кадров старые ячейки теряют один уровень горячести, а все ячейки вставленных кадров приобретают максимальный уровень</span></li>
<li class="rvps10"><span class="rvts22">при изменении Маркеров или Закладок, а также при усечении мувика Горячие Правки не меняются</span></li>
<li class="rvps10"><span class="rvts22">при прыжке на Закладку во времени текущие Горячие Правки замещаются Горячими Правками из ответвления Закладки</span></li>
<li class="rvps10"><span class="rvts22">при импорте Ввода старые ячейки обнуляют уровень горячести, а изменённые ячейки приобретают максимальный уровень</span></li>
</ul>
<p class="rvps10"><a name="Greenzone"></a>
<span class="rvts22"><br/></span></p>
@ -184,15 +188,15 @@
<p class="rvps10"><span class="rvts22">Так как интерфейс Piano Roll предоставляет пользователю почти мгновенный доступ к изменению Ввода на любом кадре мувика, желательно также предоставить быстрый доступ к просмотру состояния игры на любом кадре мувика. Это реализуется с помощью кеширования данных о всех полученных состояниях игры.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Гринзона представляет собой массив информации о Выводе игры на начало каждого кадра. То есть в ячейке с номером 0 хранится состояние игры до начала эмуляции, в ячейке 1 состояние игры перед началом эмуляции второго кадра (кадра с номером 000001) и т.д. Помимо сэйвов Гринзона хранит Журнал лага, соответствующий Вводу текущего мувика. Теоретически возможно хранение и другой информации.</span></li>
<li class="rvps15"><span class="rvts22">Гринзона начинается с нулевого кадра и имеет нижнюю границу (голову) &nbsp; номер кадра, начиная с которого в Гринзоне отсутствует информация о дальнейших состояниях игры (однако для них может присутствовать информация в Журнале лага). Для кадров, номер которых меньше головы, в Гринзоне может иметься информация.</span></li>
<li class="rvps15"><span class="rvts22">Данные в Гринзону собираются в начале каждого кадра (перед эмуляцией) по следующему принципу: если в массиве Гринзоны ячейка с номером, равным текущему кадру, пустует, или же позиция головы Гринзоны меньше номера текущего кадра, то ячейка массива заполняется информацией о текущем состоянии игры (из эмулятора), а голова Гринзоны при необходимости перемещается вперёд.</span></li>
<li class="rvps15"><span class="rvts22">Для экономии памяти Гринзона периодически разреживается, удаляя сэйвы (но не трогая Журнал лага) некоторых ранних кадров, от которых Курсор Проигрывателя ушёл достаточно далеко. </span><span class="rvts22">Подробнее см. </span><a class="rvts28" href="ProgramCustomization.html#SetGreenzonecapacity">Настройка программы</a><span class="rvts22">.</span></li>
<li class="rvps15"><span class="rvts22">Вся Гринзона вместе с Журналом лага сохраняется и загружается из файла проекта. После загрузки проекта Тасэдитор восстанавливает состояние Курсора Проигрывателя с помощью Гринзоны.</span></li>
<li class="rvps15"><span class="rvts22">При любом изменении Ввода текущего мувика из Гринзоны удаляется информация о кадрах, идущих после первого изменённого кадра. Это реализуется с помощью уменьшения позиции головы Гринзоны и удаления устаревшей информации из массива сэйвов (без освобождения памяти, так как на место старых сэйвов вскоре будут записаны новые данные примерно того же размера). Обычно одновременно с этим перемещается Курсор Проигрывателя, чтобы он всегда находился внутри Гринзоны (чтобы на экране FCEUX никогда не отображалось неактуальное состояние игры).</span></li>
<li class="rvps15"><span class="rvts22">При создании Закладки в неё копируется Журнал лага и сэйв соответствующего кадра Гринзоны. При загрузке ответвления этой Закладки из неё восстанавливается Журнал лага и сэйв в соответствующую ячейку Гринзоны, и при необходимости передвигается позиция головы.</span></li>
<li class="rvps15"><span class="rvts22">Информация из Гринзоны используется при раскрашивании строк Piano Roll и Списка Закладок. Информация из Журнала лага отображается не только для кадров, содержащихся в Гринзоне, но и для отсутствующих в ней кадров. Если в Журнале нет информации о лаге на определённом кадре, то предполагается, что это кадр без лага.</span></li>
<li class="rvps15"><span class="rvts22">Информация в Журнал лага собирается одновременно со сбором текущего состояния игры в Гринзону, то есть перед началом эмуляции текущего кадра. В этот момент эмулятор обладает информацией о лаге предыдущего кадра, поэтому на кадре с номером 000020 данные о лаге сохраняются в ячейку 19. Также именно в этот момент может сработать операция </span><a class="rvts28" href="Operations.html#AdjustLag">AdjustLag</a><span class="rvts22">, которая сдвигает весь Ввод в последующих кадрах мувика на 1 кадр вверх или вниз. Ввод сдвигается вверх, если в Журнале лага на прошлом кадре был лаг, а теперь его не стало. Ввод сдвигается вниз, если в Журнале лага на прошлом кадре не было лага, а теперь он есть. Вместе с Вводом аналогично сдвигается и все последующие ячейки Журнала лага, чтобы красные строки Piano Roll по-прежнему соответствовали сдвинувшимся пропускам во Вводе. Кроме того, после операции AdjustLag Курсор Проигрывателя насильно возвращается на предыдущий кадр (в котором изменилась информация о лаге), чтобы проэмулировать его заново. Это реализуется не простой перемоткой назад, а усечением Гринзоны после предыдущего кадра, чтобы в следующий раз повторилась проверка на несовпадение флага лага.</span></li>
<li class="rvps10"><span class="rvts22">Гринзона представляет собой массив информации о Выводе игры на начало каждого кадра. То есть в ячейке с номером 0 хранится состояние игры до начала эмуляции, в ячейке 1 состояние игры перед началом эмуляции второго кадра (кадра с номером 000001) и т.д. Помимо сэйвов Гринзона хранит Журнал лага, соответствующий Вводу текущего мувика. Теоретически возможно хранение и другой информации.</span></li>
<li class="rvps10"><span class="rvts22">Гринзона начинается с нулевого кадра и имеет нижнюю границу (голову) &nbsp; номер кадра, начиная с которого в Гринзоне отсутствует информация о дальнейших состояниях игры (однако для них может присутствовать информация в Журнале лага). Для кадров, номер которых меньше головы, в Гринзоне может иметься информация.</span></li>
<li class="rvps10"><span class="rvts22">Данные в Гринзону собираются в начале каждого кадра (перед эмуляцией) по следующему принципу: если в массиве Гринзоны ячейка с номером, равным текущему кадру, пустует, или же позиция головы Гринзоны меньше номера текущего кадра, то ячейка массива заполняется информацией о текущем состоянии игры (из эмулятора), а голова Гринзоны при необходимости перемещается вперёд.</span></li>
<li class="rvps10"><span class="rvts22">Для экономии памяти Гринзона периодически разреживается, удаляя сэйвы (но не трогая Журнал лага) некоторых ранних кадров, от которых Курсор Проигрывателя ушёл достаточно далеко. </span><span class="rvts22">Подробнее см. </span><a class="rvts28" href="ProgramCustomization.html#SetGreenzonecapacity">Настройка программы</a><span class="rvts22">.</span></li>
<li class="rvps10"><span class="rvts22">Вся Гринзона вместе с Журналом лага сохраняется и загружается из файла проекта. После загрузки проекта Тасэдитор восстанавливает состояние Курсора Проигрывателя с помощью Гринзоны.</span></li>
<li class="rvps10"><span class="rvts22">При любом изменении Ввода текущего мувика из Гринзоны удаляется информация о кадрах, идущих после первого изменённого кадра. Это реализуется с помощью уменьшения позиции головы Гринзоны и удаления устаревшей информации из массива сэйвов (без освобождения памяти, так как на место старых сэйвов вскоре будут записаны новые данные примерно того же размера). Обычно одновременно с этим перемещается Курсор Проигрывателя, чтобы он всегда находился внутри Гринзоны (чтобы на экране FCEUX никогда не отображалось неактуальное состояние игры).</span></li>
<li class="rvps10"><span class="rvts22">При создании Закладки в неё копируется Журнал лага и сэйв соответствующего кадра Гринзоны. При загрузке ответвления этой Закладки из неё восстанавливается Журнал лага и сэйв в соответствующую ячейку Гринзоны, и при необходимости передвигается позиция головы.</span></li>
<li class="rvps10"><span class="rvts22">Информация из Гринзоны используется при раскрашивании строк Piano Roll и Списка Закладок. Информация из Журнала лага отображается не только для кадров, содержащихся в Гринзоне, но и для отсутствующих в ней кадров. Если в Журнале нет информации о лаге на определённом кадре, то предполагается, что это кадр без лага.</span></li>
<li class="rvps10"><span class="rvts22">Информация в Журнал лага собирается одновременно со сбором текущего состояния игры в Гринзону, то есть перед началом эмуляции текущего кадра. В этот момент эмулятор обладает информацией о лаге предыдущего кадра, поэтому на кадре с номером 000020 данные о лаге сохраняются в ячейку 19. Также именно в этот момент может сработать операция </span><a class="rvts28" href="Operations.html#AdjustLag">AdjustLag</a><span class="rvts22">, которая сдвигает весь Ввод в последующих кадрах мувика на 1 кадр вверх или вниз. Ввод сдвигается вверх, если в Журнале лага на прошлом кадре был лаг, а теперь его не стало. Ввод сдвигается вниз, если в Журнале лага на прошлом кадре не было лага, а теперь он есть. Вместе с Вводом аналогично сдвигается и все последующие ячейки Журнала лага, чтобы красные строки Piano Roll по-прежнему соответствовали сдвинувшимся пропускам во Вводе. Кроме того, после операции AdjustLag Курсор Проигрывателя насильно возвращается на предыдущий кадр (в котором изменилась информация о лаге), чтобы проэмулировать его заново. Это реализуется не простой перемоткой назад, а усечением Гринзоны после предыдущего кадра, чтобы в следующий раз повторилась проверка на несовпадение флага лага.</span></li>
</ul>
<p class="rvps10"><a name="Playback"></a>
<span class="rvts22"><br/></span></p>
@ -201,15 +205,15 @@
<p class="rvps10"><span class="rvts22">Проигрыватель это собрание всех функций по просмотру Вывода (состояния игры в нужных кадрах).</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Главный атрибут Проигрывателя текущий проигрываемый кадр мувика, скриншот этого кадра отображается в окне эмулятора в данный момент времени. Этому кадру соответствует голубая строка в Piano Roll, которая носит название Курсор Проигрывателя. Так как Курсор Проигрывателя привязан к состоянию эмулируемой игры, можно использовать его не только в качестве индикатора, но и в качестве управляющего элемента. Чтобы увидеть на экране FCEUX события интересующего кадра, нужно передвинуть Курсор Проигрывателя на строку с номером этого кадра. Для этого есть </span><a class="rvts28" href="Navigation.html#playback-cursor">множество способов</a><span class="rvts22">.</span></li>
<li class="rvps15"><span class="rvts22">Когда пользователь посылает Курсор Проигрывателя на кадр, содержащийся в Гринзоне, состояние эмулируемой игры восстанавливается из соответствующего сэйва. Так как при этом не было никакой эмуляции, Тасэдитор имитирует события "frame boundary" и "frame begin"/"frame end", чтобы сработали соответствующие функции Lua.</span></li>
<li class="rvps15"><span class="rvts22">Когда пользователь посылает Курсор Проигрывателя на кадр, не содержащийся в Гринзоне, Тасэдитор восстанавливает состояние игры на ближайший предшествующий кадр, для которого имеется сэйв Гринзоны, а затем запускает добегание к желаемому кадру. Добегание это эмуляция, которая автоматически останавливается при достижении целевого кадра. Во время добегания на целевом кадре мигает копия голубого курсора.</span></li>
<li class="rvps15"><span class="rvts22">Так как эмулятор обеспечивает детерминизм, состояние игры на любом кадре можно гарантированно получить, используя базовое состояние игры (состояние на начало мувика) и Ввод из мувика. Более того, можно получить требуемое состояние, используя состояние на любой предыдущий кадр (сэйв из Гринзоны) и Ввод из мувика. На этом принципе и основано добегание.</span></li>
<li class="rvps15"><span class="rvts22">Процесс добегания отображается на прогрессбаре, чтобы в случае длительного добегания пользователь мог оценить оставшееся время ожидания. Когда добегания нет, прогрессбар полностью заполнен во время паузы и пуст во время эмуляции.</span></li>
<li class="rvps15"><span class="rvts22">Добегание может осуществляться на максимально возможной скорости эмуляции. В этом случае для относительно небольших участков добегание будет завершено практически мгновенно.</span></li>
<li class="rvps15"><span class="rvts22">Во многих случаях полезно автоматически останавливать эмуляцию на последнем кадре, для которого в мувике есть Ввод. Для этого служит настройка </span><a class="rvts28" href="ProgramCustomization.html#AutopauseattheendofMovie">Autopause at the end of Movie</a><span class="rvts22">, благодаря которой Курсор Проигрывателя при отпущенной паузе не будет убегать слишком далеко.</span></li>
<li class="rvps15"><span class="rvts22">В большинстве случаев пользователю не требуется автоматически скроллировать Piano Roll к Курсору Проигрывателя во время передвижения этого курсора. Для тех случаев, когда это всё-таки нужно, служит галочка "Follow cursor".</span></li>
<li class="rvps15"><span class="rvts22">Когда эмулятор стоит на паузе, если Курсор Проигрывателя находится не на последнем кадре мувика, Проигрыватель устанавливает флаг автоматической остановки. И если пользователь отпустит паузу, Проигрыватель автоматически остановится при достижении последнего кадра мувика.</span></li>
<li class="rvps10"><span class="rvts22">Главный атрибут Проигрывателя текущий проигрываемый кадр мувика, скриншот этого кадра отображается в окне эмулятора в данный момент времени. Этому кадру соответствует голубая строка в Piano Roll, которая носит название Курсор Проигрывателя. Так как Курсор Проигрывателя привязан к состоянию эмулируемой игры, можно использовать его не только в качестве индикатора, но и в качестве управляющего элемента. Чтобы увидеть на экране FCEUX события интересующего кадра, нужно передвинуть Курсор Проигрывателя на строку с номером этого кадра. Для этого есть </span><a class="rvts28" href="Navigation.html#playback-cursor">множество способов</a><span class="rvts22">.</span></li>
<li class="rvps10"><span class="rvts22">Когда пользователь посылает Курсор Проигрывателя на кадр, содержащийся в Гринзоне, состояние эмулируемой игры восстанавливается из соответствующего сэйва. Так как при этом не было никакой эмуляции, Тасэдитор имитирует события "frame boundary" и "frame begin"/"frame end", чтобы сработали соответствующие функции Lua.</span></li>
<li class="rvps10"><span class="rvts22">Когда пользователь посылает Курсор Проигрывателя на кадр, не содержащийся в Гринзоне, Тасэдитор восстанавливает состояние игры на ближайший предшествующий кадр, для которого имеется сэйв Гринзоны, а затем запускает добегание к желаемому кадру. Добегание это эмуляция, которая автоматически останавливается при достижении целевого кадра. Во время добегания на целевом кадре мигает копия голубого курсора.</span></li>
<li class="rvps10"><span class="rvts22">Так как эмулятор обеспечивает детерминизм, состояние игры на любом кадре можно гарантированно получить, используя базовое состояние игры (состояние на начало мувика) и Ввод из мувика. Более того, можно получить требуемое состояние, используя состояние на любой предыдущий кадр (сэйв из Гринзоны) и Ввод из мувика. На этом принципе и основано добегание.</span></li>
<li class="rvps10"><span class="rvts22">Процесс добегания отображается на прогрессбаре, чтобы в случае длительного добегания пользователь мог оценить оставшееся время ожидания. Когда добегания нет, прогрессбар полностью заполнен во время паузы и пуст во время эмуляции.</span></li>
<li class="rvps10"><span class="rvts22">Добегание может осуществляться на максимально возможной скорости эмуляции. В этом случае для относительно небольших участков добегание будет завершено практически мгновенно.</span></li>
<li class="rvps10"><span class="rvts22">Во многих случаях полезно автоматически останавливать эмуляцию на последнем кадре, для которого в мувике есть Ввод. Для этого служит настройка </span><a class="rvts28" href="ProgramCustomization.html#AutopauseattheendofMovie">Autopause at the end of Movie</a><span class="rvts22">, благодаря которой Курсор Проигрывателя при отпущенной паузе не будет убегать слишком далеко.</span></li>
<li class="rvps10"><span class="rvts22">В большинстве случаев пользователю не требуется автоматически скроллировать Piano Roll к Курсору Проигрывателя во время передвижения этого курсора. Для тех случаев, когда это всё-таки нужно, служит галочка "Follow cursor".</span></li>
<li class="rvps10"><span class="rvts22">Когда эмулятор стоит на паузе, если Курсор Проигрывателя находится не на последнем кадре мувика, Проигрыватель устанавливает флаг автоматической остановки. И если пользователь отпустит паузу, Проигрыватель автоматически остановится при достижении последнего кадра мувика.</span></li>
</ul>
<p class="rvps10"><a name="GreenArrow"></a>
<span class="rvts22"><br/></span></p>
@ -220,23 +224,23 @@
<p class="rvps10"><span class="rvts22">Чтобы сделать вывод об улучшении, ТАСеру нужно сравнить старый номер кадра (найденный в прошлый раз) и новый номер, найденный только что. Тасэдитор визуализирует эти данные, чтобы пользователю не требовалось запоминать их в уме. На новый номер указывает Курсор Проигрывателя, на старый номер указывает зелёная стрелка.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Полное название зелёной стрелки утерянная позиция Курсора Проигрывателя.</span></li>
<li class="rvps15"><span class="rvts22">Более адекватной заменой зелёной стрелке служат Маркеры и Закладки, устанавливаемые вручную.</span></li>
<li class="rvps15"><span class="rvts22">Иконка зелёной стрелки отображается в столбце иконок Piano Roll.</span></li>
<li class="rvps15"><span class="rvts22">При рисовании иконок в Piano Roll зелёная стрелка имеет более высокий приоритет над голубой стрелкой (иконкой Курсора Проигрывателя), так как положение голубого курсора можно определить и по другим столбцам.</span></li>
<li class="rvps15"><span class="rvts22">Зелёная стрелка появляется на кадре вместо Курсора Проигрывателя в момент усечения Гринзоны. И она остаётся на этом кадре до тех пор, пока не будет произведена следующая последовательность событий:</span></li>
<li class="rvps10"><span class="rvts22">Полное название зелёной стрелки утерянная позиция Курсора Проигрывателя.</span></li>
<li class="rvps10"><span class="rvts22">Более адекватной заменой зелёной стрелке служат Маркеры и Закладки, устанавливаемые вручную.</span></li>
<li class="rvps10"><span class="rvts22">Иконка зелёной стрелки отображается в столбце иконок Piano Roll.</span></li>
<li class="rvps10"><span class="rvts22">При рисовании иконок в Piano Roll зелёная стрелка имеет более высокий приоритет над голубой стрелкой (иконкой Курсора Проигрывателя), так как положение голубого курсора можно определить и по другим столбцам.</span></li>
<li class="rvps10"><span class="rvts22">Зелёная стрелка появляется на кадре вместо Курсора Проигрывателя в момент усечения Гринзоны. И она остаётся на этом кадре до тех пор, пока не будет произведена следующая последовательность событий:</span></li>
</ul>
<ol style="text-indent: 30px; margin-left: 40px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">эмуляция хотя бы одного кадра (подразумевается, что пользователь запустил просмотр участка)</span></li>
<li class="rvps15"><span class="rvts22">следующее отступление Курсора Проигрывателя из-за усечения Гринзоны</span></li>
<li class="rvps10"><span class="rvts22">эмуляция хотя бы одного кадра (подразумевается, что пользователь запустил просмотр участка)</span></li>
<li class="rvps10"><span class="rvts22">следующее отступление Курсора Проигрывателя из-за усечения Гринзоны</span></li>
</ol>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Таким образом, зелёная стрелка не меняет своё положение, когда ещё до запуска эмуляции Гринзона усекается повторно (например, ТАСер изменил Ввод на кадре 90, а затем на кадре 80, но зелёная стрелка так и осталась на кадре 100).</span></li>
<li class="rvps15"><span class="rvts22">Также зелёная стрелка не меняет своё положение, когда Гринзона усекается во время добегания, и эмулятор в этот момент не стоит на паузе.</span></li>
<li class="rvps15"><span class="rvts22">Зелёная стрелка не меняет своё положение при операциях </span><a class="rvts28" href="Operations.html#AdjustLag">AdjustLag</a><span class="rvts22">, </span><a class="rvts28" href="Operations.html#Branch">Branch</a><span class="rvts22">, </span><a class="rvts28" href="Operations.html#Record">Record</a><span class="rvts22">.</span></li>
<li class="rvps15"><span class="rvts22">При нажатии средней кнопки мыши запускается добегание к зелёной стрелке, если она находится за пределами Гринзоны. Если же зелёная стрелка находится внутри Гринзоны, это означает, что текущий участок уже был просмотрен до конца, и при повторных просмотрах автоматическая пауза на зелёной стрелке не нужна.</span></li>
<li class="rvps10"><span class="rvts22">Таким образом, зелёная стрелка не меняет своё положение, когда ещё до запуска эмуляции Гринзона усекается повторно (например, ТАСер изменил Ввод на кадре 90, а затем на кадре 80, но зелёная стрелка так и осталась на кадре 100).</span></li>
<li class="rvps10"><span class="rvts22">Также зелёная стрелка не меняет своё положение, когда Гринзона усекается во время добегания, и эмулятор в этот момент не стоит на паузе.</span></li>
<li class="rvps10"><span class="rvts22">Зелёная стрелка не меняет своё положение при операциях </span><a class="rvts28" href="Operations.html#AdjustLag">AdjustLag</a><span class="rvts22">, </span><a class="rvts28" href="Operations.html#Branch">Branch</a><span class="rvts22">, </span><a class="rvts28" href="Operations.html#Record">Record</a><span class="rvts22">.</span></li>
<li class="rvps10"><span class="rvts22">При нажатии средней кнопки мыши запускается добегание к зелёной стрелке, если она находится за пределами Гринзоны. Если же зелёная стрелка находится внутри Гринзоны, это означает, что текущий участок уже был просмотрен до конца, и при повторных просмотрах автоматическая пауза на зелёной стрелке не нужна.</span></li>
</ul>
<p class="rvps15"><a name="AutoRestoring"></a>
<p class="rvps10"><a name="AutoRestoring"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">Автоматическое восстановление последней позиции</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
@ -244,9 +248,9 @@
<p class="rvps10"><span class="rvts22">Этот процесс можно автоматизировать, автоматически запуская добегание к утерянной позиции Курсора Проигрывателя после каждого усечения Гринзоны. Для этого служит галочка "Auto-restore last position".</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Когда галочка установлена, сразу после усечения Гринзоны запускается добегание к последней позиции Курсора Проигрывателя.</span></li>
<li class="rvps15"><span class="rvts22">Если Гринзона была усечена во время добегания, при усечении будет продолжено добегание к целевому кадру, а не к текущему положению Курсора Проигрывателя. Но если во время усечения Гринзоны добегание стоит на паузе, это добегание отменяется, и будет запущено добегание к утерянной позиции Курсора Проигрывателя. Подразумевается, что если ТАСер не дождался окончания добегания, поставил эмулятор на паузу и начал изменять Ввод на участке, то он сосредоточился на подучастке, поэтому дальнейший автоматический просмотр будет запускаться именно для этого подучастка.</span></li>
<li class="rvps15"><span class="rvts22">Автовосстановление не запускается при операциях </span><a class="rvts28" href="Operations.html#AdjustLag">AdjustLag</a><span class="rvts22">, </span><a class="rvts28" href="Operations.html#Branch">Branch</a><span class="rvts22">, </span><a class="rvts28" href="Operations.html#Record">Record</a><span class="rvts22">. При срабатывании операции </span><a class="rvts28" href="Operations.html#AdjustLag">AdjustLag</a><span class="rvts22"> продолжается проигрывание мувика.</span></li>
<li class="rvps10"><span class="rvts22">Когда галочка установлена, сразу после усечения Гринзоны запускается добегание к последней позиции Курсора Проигрывателя.</span></li>
<li class="rvps10"><span class="rvts22">Если Гринзона была усечена во время добегания, при усечении будет продолжено добегание к целевому кадру, а не к текущему положению Курсора Проигрывателя. Но если во время усечения Гринзоны добегание стоит на паузе, это добегание отменяется, и будет запущено добегание к утерянной позиции Курсора Проигрывателя. Подразумевается, что если ТАСер не дождался окончания добегания, поставил эмулятор на паузу и начал изменять Ввод на участке, то он сосредоточился на подучастке, поэтому дальнейший автоматический просмотр будет запускаться именно для этого подучастка.</span></li>
<li class="rvps10"><span class="rvts22">Автовосстановление не запускается при операциях </span><a class="rvts28" href="Operations.html#AdjustLag">AdjustLag</a><span class="rvts22">, </span><a class="rvts28" href="Operations.html#Branch">Branch</a><span class="rvts22">, </span><a class="rvts28" href="Operations.html#Record">Record</a><span class="rvts22">. При срабатывании операции </span><a class="rvts28" href="Operations.html#AdjustLag">AdjustLag</a><span class="rvts22"> продолжается проигрывание мувика.</span></li>
</ul>
<p class="rvps10"><a name="Recorder"></a>
<span class="rvts22"><br/></span></p>
@ -255,22 +259,22 @@
<p class="rvps10"><span class="rvts22">Рекордер это собрание всех функций по редактированию Ввода на кадре под Курсором Проигрывателя. Рекордер предоставляет ТАСеру второй способ редактирования Ввода Запись.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Мультитрекинг позволяет ТАСеру в режиме Записи изменять данные только одного выбранного джойстика, оставляя данные других джойстиков на этом же кадре нетронутыми. Подробнее см. </span><a class="rvts28" href="Toolbox.html#multitracking">Панель инструментов</a><span class="rvts22">.</span></li>
<li class="rvps15"><span class="rvts22">Когда включен режим Записи, перед началом каждого кадра эмулятор опрашивает виртуальные джойстики и записывает данные в текущий мувик. Затем сразу же передаёт управление Рекордеру.</span></li>
<li class="rvps15"><span class="rvts22">Рекордер:</span></li>
<li class="rvps10"><span class="rvts22">Мультитрекинг позволяет ТАСеру в режиме Записи изменять данные только одного выбранного джойстика, оставляя данные других джойстиков на этом же кадре нетронутыми. Подробнее см. </span><a class="rvts28" href="Toolbox.html#multitracking">Панель инструментов</a><span class="rvts22">.</span></li>
<li class="rvps10"><span class="rvts22">Когда включен режим Записи, перед началом каждого кадра эмулятор опрашивает виртуальные джойстики и записывает данные в текущий мувик. Затем сразу же передаёт управление Рекордеру.</span></li>
<li class="rvps10"><span class="rvts22">Рекордер:</span></li>
</ul>
<ul style="text-indent: 30px; margin-left: 40px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">использует данные из мувика на кадре Курсора Проигрывателя в качестве записываемых данных, либо (если идёт Запись по шаблону, и сейчас надо записывать отсутствие нажатий) использует ноль в качестве записываемых данных</span></li>
<li class="rvps15"><span class="rvts22">сравнивает записываемые данные со старыми данными, хранящимися в Журнале Истории</span></li>
<li class="rvps15"><span class="rvts22">накладывает на изменения фильтр, соответствующий выбранному режиму мультитрекинга</span></li>
<li class="rvps15"><span class="rvts22">избирательно объединяет старые данные с новыми, в соответствии с галочкой "Superimpose"</span></li>
<li class="rvps15"><span class="rvts22">сохраняет реальные изменения в текущий мувик</span></li>
<li class="rvps15"><span class="rvts22">вызывает добавление пункта в Журнал Истории и усечение Гринзоны</span></li>
<li class="rvps15"><span class="rvts22">затем возвращает управление эмулятору</span></li>
<li class="rvps10"><span class="rvts22">использует данные из мувика на кадре Курсора Проигрывателя в качестве записываемых данных, либо (если идёт Запись по шаблону, и сейчас надо записывать отсутствие нажатий) использует ноль в качестве записываемых данных</span></li>
<li class="rvps10"><span class="rvts22">сравнивает записываемые данные со старыми данными, хранящимися в Журнале Истории</span></li>
<li class="rvps10"><span class="rvts22">накладывает на изменения фильтр, соответствующий выбранному режиму мультитрекинга</span></li>
<li class="rvps10"><span class="rvts22">избирательно объединяет старые данные с новыми, в соответствии с галочкой "Superimpose"</span></li>
<li class="rvps10"><span class="rvts22">сохраняет реальные изменения в текущий мувик</span></li>
<li class="rvps10"><span class="rvts22">вызывает добавление пункта в Журнал Истории и усечение Гринзоны</span></li>
<li class="rvps10"><span class="rvts22">затем возвращает управление эмулятору</span></li>
</ul>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Эмулятор возвращает данные из текущего мувика в виртуальные джойстики, чтобы использовать эти данные для наступающего кадра. Также в этот момент эмулятор запускает записанные команды (сброс и т.д.).</span></li>
<li class="rvps15"><span class="rvts22">В каждом кадре Рекордер получает от эмулятора информацию о зажатых в данный момент кнопках виртуальных джойстиков и подготавливает для Piano Roll информацию о том, какие столбцы в Заголовке Piano Roll должны загораться зелёным светом. Например, если выбрана радиокнопка "2P" и установлена галочка </span><a class="rvts28" href="ProgramCustomization.html#Use1PkeysforallsingleRecordings">Use 1P keys for all single Recordings</a><span class="rvts22">, то при нажатии кнопки </span><span class="rvts32">A</span><span class="rvts22"> на первом джойстике в Заголовке Piano Roll будет загораться столбец "A" второго джойстика. А если в предыдущем кадре кнопка </span><span class="rvts32">A</span><span class="rvts22"> не была зажата, то Рекордер воспринимает это как нажатие кнопки, и в соответствии с галочкой </span><a class="rvts28" href="ProgramCustomization.html#UseInputkeysforColumnSet">Use Input keys for Column Set</a><span class="rvts22"> вызывает либо установку/снятие Ввода в Выделении, либо установку Ввода в Выделении по шаблону (если зажат </span><span class="rvts34">Alt</span><span class="rvts22">).</span></li>
<li class="rvps10"><span class="rvts22">Эмулятор возвращает данные из текущего мувика в виртуальные джойстики, чтобы использовать эти данные для наступающего кадра. Также в этот момент эмулятор запускает записанные команды (сброс и т.д.).</span></li>
<li class="rvps10"><span class="rvts22">В каждом кадре Рекордер получает от эмулятора информацию о зажатых в данный момент кнопках виртуальных джойстиков и подготавливает для Piano Roll информацию о том, какие столбцы в Заголовке Piano Roll должны загораться зелёным светом. Например, если выбрана радиокнопка "2P" и установлена галочка </span><a class="rvts28" href="ProgramCustomization.html#Use1PkeysforallsingleRecordings">Use 1P keys for all single Recordings</a><span class="rvts22">, то при нажатии кнопки </span><span class="rvts32">A</span><span class="rvts22"> на первом джойстике в Заголовке Piano Roll будет загораться столбец "A" второго джойстика. А если в предыдущем кадре кнопка </span><span class="rvts32">A</span><span class="rvts22"> не была зажата, то Рекордер воспринимает это как нажатие кнопки, и в соответствии с галочкой </span><a class="rvts28" href="ProgramCustomization.html#UseInputkeysforColumnSet">Use Input keys for Column Set</a><span class="rvts22"> вызывает либо установку/снятие Ввода в Выделении, либо установку Ввода в Выделении по шаблону (если зажат </span><span class="rvts34">Alt</span><span class="rvts22">).</span></li>
</ul>
<p class="rvps10"><a name="Lua"></a>
<span class="rvts22"><br/></span></p>
@ -279,11 +283,11 @@
<p class="rvps10"><span class="rvts22">Lua позволяет пользователю расширить возможности Тасэдитора, в частности, предоставляет ТАСеру третий способ редактирования Ввода автоматическая генерация.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Интерпретатор Lua-функций вызывает соответствующую функцию Тасэдитора не напрямую, а через луа-шлюз Тасэдитора (taseditor_lua).</span></li>
<li class="rvps15"><span class="rvts22">При срабатывании какой-либо функции из библиотеки "taseditor" луа-интерпретатор берёт входные данные из стека, при необходимости конвертирует их в формат, принимаемый луа-шлюзом Тасэдитора, и передаёт их соответствующей функции луа-шлюза Тасэдитора.</span></li>
<li class="rvps15"><span class="rvts22">Луа-шлюз Тасэдитора вызывает соответствующие функции Тасэдитора и передаёт полученный результат обратно в луа-интерпретатор.</span></li>
<li class="rvps15"><span class="rvts22">Луа-интерпретатор помещает полученные данные в стек, при необходимости конвертируя их в формат, принимаемый луа-кодом.</span></li>
<li class="rvps15"><span class="rvts22">Функции </span><span class="rvts69">submitinputchange()</span><span class="rvts22">, &nbsp;</span><span class="rvts69">submitinsertframes()</span><span class="rvts22"> и </span><span class="rvts69">submitdeleteframes()</span><span class="rvts22"> не вызывают соответствующее изменение мувика, а только создают запись в массиве отложенных заданий, хранящемся в луа-шлюзе Тасэдитора. Все отложенные задания реализуются при вызове </span><span class="rvts69">applyinputchanges()</span><span class="rvts22">. Благодаря этому луа-скрипт может вносить в мувик сразу несколько изменений, создавая только один пункт Журнала Истории.</span></li>
<li class="rvps10"><span class="rvts22">Интерпретатор Lua-функций вызывает соответствующую функцию Тасэдитора не напрямую, а через луа-шлюз Тасэдитора (taseditor_lua).</span></li>
<li class="rvps10"><span class="rvts22">При срабатывании какой-либо функции из библиотеки "taseditor" луа-интерпретатор берёт входные данные из стека, при необходимости конвертирует их в формат, принимаемый луа-шлюзом Тасэдитора, и передаёт их соответствующей функции луа-шлюза Тасэдитора.</span></li>
<li class="rvps10"><span class="rvts22">Луа-шлюз Тасэдитора вызывает соответствующие функции Тасэдитора и передаёт полученный результат обратно в луа-интерпретатор.</span></li>
<li class="rvps10"><span class="rvts22">Луа-интерпретатор помещает полученные данные в стек, при необходимости конвертируя их в формат, принимаемый луа-кодом.</span></li>
<li class="rvps10"><span class="rvts22">Функции </span><span class="rvts70">submitinputchange()</span><span class="rvts22">, &nbsp;</span><span class="rvts70">submitinsertframes()</span><span class="rvts22"> и </span><span class="rvts70">submitdeleteframes()</span><span class="rvts22"> не вызывают соответствующее изменение мувика, а только создают запись в массиве отложенных заданий, хранящемся в луа-шлюзе Тасэдитора. Все отложенные задания реализуются при вызове </span><span class="rvts70">applyinputchanges()</span><span class="rvts22">. Благодаря этому луа-скрипт может вносить в мувик сразу несколько изменений, создавая только один пункт Журнала Истории.</span></li>
</ul>
<p class="rvps10"><a name="BookmarksBranches"></a>
<span class="rvts22"><br/></span></p>
@ -292,30 +296,30 @@
<p class="rvps10"><span class="rvts22">Закладки являются специализированной альтернативой Маркерам. А ответвления служат для хранения нескольких мувиков в одном проекте. Для упрощения создания и навигации по ответвлениям они привязаны к Закладкам, по аналогии с традиционными сохранениями.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">В проекте может храниться не более 10 Закладок. Это ограничение связано с количеством цифровых клавиш на клавиатуре. Также такое ограничение позволяет отображать в окне TAS Editor основную информацию сразу обо всех Закладках, без необходимости скроллинга. Кроме того, многолетний опыт традиционного ТАСинга подтверждает, что такого количества слотов для Закладок вполне достаточно для продуктивного ТАСинга. </span></li>
<li class="rvps15"><span class="rvts22">Закладка может быть установлена на любой кадр мувика. Закладки не исчезают, даже когда мувик усекается. Например, если поставить Закладку на кадр 1200, а затем сделать усечение Ввода после кадра 1000, за пределами мувика останется Закладка, при прыжке на которую мувик автоматически расширится до кадра 1200.</span></li>
<li class="rvps15"><span class="rvts22">В Piano Roll Закладки отображаются иконкой с соответствующей цифрой (номером слота). Закладка, хранящая текущее ответвление мувика, отображается голубой цифрой, остальные Закладки отображаются зелёными цифрами.</span></li>
<li class="rvps15"><span class="rvts22">Закладка устанавливается нажатием соответствующего хоткея (для каждого слота есть отдельный хоткей сохранения) либо щелчком правой кнопки мыши по слоту Закладки. При этом Закладка устанавливается на тот кадр, где в данный момент находится Курсор Проигрывателя. Этот номер кадра запоминается в Закладке, и в дальнейшем можно в любой момент отправить Курсор Проигрывателя на этот кадр, щёлкнув левой кнопкой мыши по слоту Закладки или нажав соответствующий хоткей (для каждого слота есть отдельный хоткей прыжка). Прыжок на Закладку не является операцией, так как никаких изменений мувика не происходит.</span></li>
<li class="rvps15"><span class="rvts22">В момент установки Закладки Тасэдитор проверяет, отличаются ли сохраняемые данные от уже содержащихся в этой Закладке данных. Если различий не найдено, операция </span><a class="rvts28" href="Operations.html#Bookmark">Bookmark</a><span class="rvts22"> не производится.</span></li>
<li class="rvps15"><span class="rvts22">Помимо номера кадра в слот устанавливаемой Закладки сохраняются все данные текущего мувика (тип Ввода, Ввод, Горячие Правки, Маркеры). Тем самым в проекте сохраняется текущее ответвление из всех возможных ответвлений мувика. В дальнейшем мувик будет многократно изменён, но пользователь сможет в любой момент вернуться к состоянию мувика, сохранённому в данной Закладке.</span></li>
<li class="rvps15"><span class="rvts22">В слот устанавливаемой Закладки сохраняются дополнительные данные, повышающие удобство использования. В частности, скриншот экрана FCEUX на момент создания Закладки позволяет быстро узнавать содержимое Закладки без загрузки её ответвления. А копия одного сэйва из Гринзоны (на закладочном кадре) позволяет после загрузки ответвления сразу же поставить Курсор Проигрывателя на кадр Закладки.</span></li>
<li class="rvps15"><span class="rvts22">После установки закладки она становится текущей (отображается голубой цифрой), так как её ответвление более остальных похоже на текущий мувик.</span></li>
<li class="rvps15"><span class="rvts22">При смене текущего мувика на ответвление из Закладки происходит изменение Ввода, поэтому Гринзона усекается, начиная с первого отличающегося кадра. Но благодаря хранящемуся в Закладке сэйву в Гринзону возвращается один сэйв на кадре, где и установлена эта Закладка. Поэтому "прыжок на Закладку во времени" всегда мгновенно перемещает Курсор Проигрывателя на кадр Закладки, в то время как прыжок на Закладку в пространстве (без изменения мувика) может потребовать добегания.</span></li>
<li class="rvps15"><span class="rvts22">Все операции с Закладками (установка, прыжок, загрузка) производятся после окончания эмуляции текущего кадра, даже если сигнал от пользователя сработает в середине кадра.</span></li>
<li class="rvps15"><span class="rvts22">Для отображения основных Данных закладок используется Список (Listview) без скроллинга, содержащий 10 строк и 3 столбца. при создании нового проекта все 10 Закладок пустые, поэтому второй и третий столбец Списка Закладок будут пустовать.</span></li>
<li class="rvps15"><span class="rvts22">В первом столбце Списка Закладок отображается номер слота, которому соответствует данная строка. Номер отображается как и в Piano Roll с помощью цифровых иконок зелёного или голубого цвета. Нумерация слотов идёт в таком порядке: 1, 2, 3, 4, 5, 6, 7, 8, 9, 0. Этот порядок нужен, чтобы не нарушать ассоциацию с цифровыми клавишами на клавиатуре, которыми пользователь может контролировать Закладки.</span></li>
<li class="rvps15"><span class="rvts22">Во втором столбце Списка Закладок отображается номер кадра, на который установлена Закладка.</span></li>
<li class="rvps15"><span class="rvts22">В третьем столбце Списка Закладок отображается реальное время установки Закладки.</span></li>
<li class="rvps15"><span class="rvts22">Список Закладок разделяется вертикальной чертой примерно пополам. Левая часть (где располагается первый и второй столбец Списка) ассоциируется с закладочным функционалом Закладок. Правая часть (где располагается третий столбец) ассоциируется с ответвлениями, хранящимися в Закладках. Левая часть отображается более светлым оттенком, правая более тёмным. Щелчок левой кнопкой мыши по левой половине означает прыжок на Закладку, а щелчок по правой половине загрузку ответвления.</span></li>
<li class="rvps15"><span class="rvts22">Строки Списка Закладок окрашиваются цветами, соответствующими цветам строк Piano Roll, на которых установлены эти Закладки. Например, если Закладка установлена на кадре 1000, и на этом кадре в данный момент находится Курсор Проигрывателя, то в Списке Закладок строчка этой Закладки будет нарисована голубым цветом. Эта фича даёт пользователю дополнительную информацию о расположении Закладок в мувике.</span></li>
<li class="rvps15"><span class="rvts22">Вместо постоянного просмотра Списка Закладок можно переключать вид на Дерево ответвлений. Переключение осуществляется щелчком по заголовку, расположенному над Списком Закладок.</span></li>
<li class="rvps15"><span class="rvts22">Дерево ответвлений это графическое представление взаимосвязей между ответвлениями всех Закладок в проекте. Обычно Закладки создаются по мере создания мувика, поэтому более поздние Закладки хранят ответвление, начальная часть которого совпадает с ответвлениями более ранних Закладок. Для каждой Закладки можно найти "родительскую" Закладку, из мувика которой, вероятнее всего, произошёл мувик данной Закладки. В результате все Закладки выстраиваются в иерархическую структуру, в начале которой находится корень (отображается в виде тучки), являющийся родителем Закладок, для которых не нашлось родителя. Поиск родителей для Закладок осуществляется при каждом изменении любой Закладки. При поиске учитывается номер кадра, на котором установлена каждая Закладка. Благодаря этому в начале иерархии находятся Закладки с наименьшим номером кадра.</span></li>
<li class="rvps15"><span class="rvts22">При установке Закладки она становится текущей, и её содержимое ничем не отличается от текущего мувика. Но после внесения изменений в мувик текущая Закладка уже будет отличаться, поэтому в Дереве ответвлений появляется фаербол, сообщающий об этом. Фаербол символизирует текущий мувик, однако его родителем всегда считается текущая Закладка. Реального поиска лучшего родителя не производится, так как пришлось бы после каждой модификации мувика запускать сравнение его Ввода со всеми Закладками, что признано слишком ресурсоёмким.</span></li>
<li class="rvps15"><span class="rvts22">Закладки в Дереве ответвлений отображаются цифровыми иконками (как и в Piano Roll). Текущая Закладка отображается голубой цифрой. Связи между Закладками отображаются тонкими линиями. Для текущей Закладки формируется последовательность красных линий, связывающих все закладки, при загрузке которых не будет изменения Ввода (то есть как минимум от начального кадра до кадра загружаемой Закладки Ввод будет совпадать с Вводом, хранящимся в текущей Закладке). Эти красные линии идут от тучки к текущей Закладке, либо ещё далее к наследникам текущей Закладки, когда ответвление текущей Закладки содержит тот же самый Ввод, который содержится в ответвлениях этих наследников вплоть до кадра Закладки.</span></li>
<li class="rvps15"><span class="rvts22">Благодаря расположению Закладок по возрастанию их номера кадра, последовательность красных линий можно воспринимать как хронологию текущего мувика. Началом этой хронологии служит тучка, при щелчке по ней Курсор проигрывателя посылается на начало мувика. Закладки, нанизанные на красную нить, являются промежуточными этапами этой хронологии, при щелчке по ним Курсор Проигрывателя посылается на кадр указанной Закладки. Фаербол (если он есть) считается концом текущей хронологии, и при щелчке по нему Курсор Проигрывателя посылается в конец мувика. Также любое положения Курсора Проигрывателя можно проецировать на эту хронологическую линию, найдя две Закладки, между кадрами которых располагается Курсор Проигрывателя, и переведя расстояние, измеряемое в кадрах, в пиксели. В результате текущее положение Курсора Проигрывателя постоянно отображается в Дереве ответвлений в виде маленького голубого треугольника (по аналогии с иконкой Курсора Проигрывателя в Piano Roll).</span></li>
<li class="rvps15"><span class="rvts22">Аналогично просмотру текущей хронологии можно быстро увидеть альтернативную хронологию для любой Закладки, наведя на неё курсор мыши (будет отображаться синими линиями).</span></li>
<li class="rvps15"><span class="rvts22">Маркеры, содержащиеся в ответвлениях Закладок, не влияют на процесс поиска родителей и формирования Дерева.</span></li>
<li class="rvps15"><span class="rvts22">Все данные Закладок сохраняются и загружаются из файла проекта. Для Дерева ответвлений сохраняются и загружаются только кэшированные данные о номере первого кадра различий во Вводе для каждой пары Закладок. Исходя из этих данных Тасэдитор легко восстанавливает иерархию родительских отношений между закладками. А если эти данные отсутствуют, Тасэдитору придётся произвести сравнение Ввода всех Закладок относительно друг друга.</span></li>
<li class="rvps10"><span class="rvts22">В проекте может храниться не более 10 Закладок. Это ограничение связано с количеством цифровых клавиш на клавиатуре. Также такое ограничение позволяет отображать в окне TAS Editor основную информацию сразу обо всех Закладках, без необходимости скроллинга. Кроме того, многолетний опыт традиционного ТАСинга подтверждает, что такого количества слотов для Закладок вполне достаточно для продуктивного ТАСинга. </span></li>
<li class="rvps10"><span class="rvts22">Закладка может быть установлена на любой кадр мувика. Закладки не исчезают, даже когда мувик усекается. Например, если поставить Закладку на кадр 1200, а затем сделать усечение Ввода после кадра 1000, за пределами мувика останется Закладка, при прыжке на которую мувик автоматически расширится до кадра 1200.</span></li>
<li class="rvps10"><span class="rvts22">В Piano Roll Закладки отображаются иконкой с соответствующей цифрой (номером слота). Закладка, хранящая текущее ответвление мувика, отображается голубой цифрой, остальные Закладки отображаются зелёными цифрами.</span></li>
<li class="rvps10"><span class="rvts22">Закладка устанавливается нажатием соответствующего хоткея (для каждого слота есть отдельный хоткей сохранения) либо щелчком правой кнопки мыши по слоту Закладки. При этом Закладка устанавливается на тот кадр, где в данный момент находится Курсор Проигрывателя. Этот номер кадра запоминается в Закладке, и в дальнейшем можно в любой момент отправить Курсор Проигрывателя на этот кадр, щёлкнув левой кнопкой мыши по слоту Закладки или нажав соответствующий хоткей (для каждого слота есть отдельный хоткей прыжка). Прыжок на Закладку не является операцией, так как никаких изменений мувика не происходит.</span></li>
<li class="rvps10"><span class="rvts22">В момент установки Закладки Тасэдитор проверяет, отличаются ли сохраняемые данные от уже содержащихся в этой Закладке данных. Если различий не найдено, операция </span><a class="rvts28" href="Operations.html#Bookmark">Bookmark</a><span class="rvts22"> не производится.</span></li>
<li class="rvps10"><span class="rvts22">Помимо номера кадра в слот устанавливаемой Закладки сохраняются все данные текущего мувика (тип Ввода, Ввод, Горячие Правки, Маркеры). Тем самым в проекте сохраняется текущее ответвление из всех возможных ответвлений мувика. В дальнейшем мувик будет многократно изменён, но пользователь сможет в любой момент вернуться к состоянию мувика, сохранённому в данной Закладке.</span></li>
<li class="rvps10"><span class="rvts22">В слот устанавливаемой Закладки сохраняются дополнительные данные, повышающие удобство использования. В частности, скриншот экрана FCEUX на момент создания Закладки позволяет быстро узнавать содержимое Закладки без загрузки её ответвления. А копия одного сэйва из Гринзоны (на закладочном кадре) позволяет после загрузки ответвления сразу же поставить Курсор Проигрывателя на кадр Закладки.</span></li>
<li class="rvps10"><span class="rvts22">После установки закладки она становится текущей (отображается голубой цифрой), так как её ответвление более остальных похоже на текущий мувик.</span></li>
<li class="rvps10"><span class="rvts22">При смене текущего мувика на ответвление из Закладки происходит изменение Ввода, поэтому Гринзона усекается, начиная с первого отличающегося кадра. Но благодаря хранящемуся в Закладке сэйву в Гринзону возвращается один сэйв на кадре, где и установлена эта Закладка. Поэтому "прыжок на Закладку во времени" всегда мгновенно перемещает Курсор Проигрывателя на кадр Закладки, в то время как прыжок на Закладку в пространстве (без изменения мувика) может потребовать добегания.</span></li>
<li class="rvps10"><span class="rvts22">Все операции с Закладками (установка, прыжок, загрузка) производятся после окончания эмуляции текущего кадра, даже если сигнал от пользователя сработает в середине кадра.</span></li>
<li class="rvps10"><span class="rvts22">Для отображения основных Данных закладок используется Список (Listview) без скроллинга, содержащий 10 строк и 3 столбца. при создании нового проекта все 10 Закладок пустые, поэтому второй и третий столбец Списка Закладок будут пустовать.</span></li>
<li class="rvps10"><span class="rvts22">В первом столбце Списка Закладок отображается номер слота, которому соответствует данная строка. Номер отображается как и в Piano Roll с помощью цифровых иконок зелёного или голубого цвета. Нумерация слотов идёт в таком порядке: 1, 2, 3, 4, 5, 6, 7, 8, 9, 0. Этот порядок нужен, чтобы не нарушать ассоциацию с цифровыми клавишами на клавиатуре, которыми пользователь может контролировать Закладки.</span></li>
<li class="rvps10"><span class="rvts22">Во втором столбце Списка Закладок отображается номер кадра, на который установлена Закладка.</span></li>
<li class="rvps10"><span class="rvts22">В третьем столбце Списка Закладок отображается реальное время установки Закладки.</span></li>
<li class="rvps10"><span class="rvts22">Список Закладок разделяется вертикальной чертой примерно пополам. Левая часть (где располагается первый и второй столбец Списка) ассоциируется с закладочным функционалом Закладок. Правая часть (где располагается третий столбец) ассоциируется с ответвлениями, хранящимися в Закладках. Левая часть отображается более светлым оттенком, правая более тёмным. Щелчок левой кнопкой мыши по левой половине означает прыжок на Закладку, а щелчок по правой половине загрузку ответвления.</span></li>
<li class="rvps10"><span class="rvts22">Строки Списка Закладок окрашиваются цветами, соответствующими цветам строк Piano Roll, на которых установлены эти Закладки. Например, если Закладка установлена на кадре 1000, и на этом кадре в данный момент находится Курсор Проигрывателя, то в Списке Закладок строчка этой Закладки будет нарисована голубым цветом. Эта фича даёт пользователю дополнительную информацию о расположении Закладок в мувике.</span></li>
<li class="rvps10"><span class="rvts22">Вместо постоянного просмотра Списка Закладок можно переключать вид на Дерево ответвлений. Переключение осуществляется щелчком по заголовку, расположенному над Списком Закладок.</span></li>
<li class="rvps10"><span class="rvts22">Дерево ответвлений это графическое представление взаимосвязей между ответвлениями всех Закладок в проекте. Обычно Закладки создаются по мере создания мувика, поэтому более поздние Закладки хранят ответвление, начальная часть которого совпадает с ответвлениями более ранних Закладок. Для каждой Закладки можно найти "родительскую" Закладку, из мувика которой, вероятнее всего, произошёл мувик данной Закладки. В результате все Закладки выстраиваются в иерархическую структуру, в начале которой находится корень (отображается в виде тучки), являющийся родителем Закладок, для которых не нашлось родителя. Поиск родителей для Закладок осуществляется при каждом изменении любой Закладки. При поиске учитывается номер кадра, на котором установлена каждая Закладка. Благодаря этому в начале иерархии находятся Закладки с наименьшим номером кадра.</span></li>
<li class="rvps10"><span class="rvts22">При установке Закладки она становится текущей, и её содержимое ничем не отличается от текущего мувика. Но после внесения изменений в мувик текущая Закладка уже будет отличаться, поэтому в Дереве ответвлений появляется фаербол, сообщающий об этом. Фаербол символизирует текущий мувик, однако его родителем всегда считается текущая Закладка. Реального поиска лучшего родителя не производится, так как пришлось бы после каждой модификации мувика запускать сравнение его Ввода со всеми Закладками, что признано слишком ресурсоёмким.</span></li>
<li class="rvps10"><span class="rvts22">Закладки в Дереве ответвлений отображаются цифровыми иконками (как и в Piano Roll). Текущая Закладка отображается голубой цифрой. Связи между Закладками отображаются тонкими линиями. Для текущей Закладки формируется последовательность красных линий, связывающих все закладки, при загрузке которых не будет изменения Ввода (то есть как минимум от начального кадра до кадра загружаемой Закладки Ввод будет совпадать с Вводом, хранящимся в текущей Закладке). Эти красные линии идут от тучки к текущей Закладке, либо ещё далее к наследникам текущей Закладки, когда ответвление текущей Закладки содержит тот же самый Ввод, который содержится в ответвлениях этих наследников вплоть до кадра Закладки.</span></li>
<li class="rvps10"><span class="rvts22">Благодаря расположению Закладок по возрастанию их номера кадра, последовательность красных линий можно воспринимать как хронологию текущего мувика. Началом этой хронологии служит тучка, при щелчке по ней Курсор проигрывателя посылается на начало мувика. Закладки, нанизанные на красную нить, являются промежуточными этапами этой хронологии, при щелчке по ним Курсор Проигрывателя посылается на кадр указанной Закладки. Фаербол (если он есть) считается концом текущей хронологии, и при щелчке по нему Курсор Проигрывателя посылается в конец мувика. Также любое положения Курсора Проигрывателя можно проецировать на эту хронологическую линию, найдя две Закладки, между кадрами которых располагается Курсор Проигрывателя, и переведя расстояние, измеряемое в кадрах, в пиксели. В результате текущее положение Курсора Проигрывателя постоянно отображается в Дереве ответвлений в виде маленького голубого треугольника (по аналогии с иконкой Курсора Проигрывателя в Piano Roll).</span></li>
<li class="rvps10"><span class="rvts22">Аналогично просмотру текущей хронологии можно быстро увидеть альтернативную хронологию для любой Закладки, наведя на неё курсор мыши (будет отображаться синими линиями).</span></li>
<li class="rvps10"><span class="rvts22">Маркеры, содержащиеся в ответвлениях Закладок, не влияют на процесс поиска родителей и формирования Дерева.</span></li>
<li class="rvps10"><span class="rvts22">Все данные Закладок сохраняются и загружаются из файла проекта. Для Дерева ответвлений сохраняются и загружаются только кэшированные данные о номере первого кадра различий во Вводе для каждой пары Закладок. Исходя из этих данных Тасэдитор легко восстанавливает иерархию родительских отношений между закладками. А если эти данные отсутствуют, Тасэдитору придётся произвести сравнение Ввода всех Закладок относительно друг друга.</span></li>
</ul>
<p class="rvps10"><a name="PopupWindows"></a>
<span class="rvts22"><br/></span></p>
@ -340,26 +344,26 @@
<p class="rvps10"><span class="rvts22">История всех существенных изменений проекта служит, главным образом, для удобного отката этих изменений, а также для визуального отслеживания этой истории.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">В каждом пункте Журнала Истории хранится полная копия Ввода и Маркеров на момент создания пункта. Также в любом пункте может храниться резервная копия Закладки, если пункт создан из-за операции </span><a class="rvts28" href="Operations.html#Bookmark">Bookmark</a><span class="rvts22">.</span></li>
<li class="rvps15"><span class="rvts22">Данные каждого пункта хранятся в оперативной памяти одновременно в двух видах &nbsp; сжатом и несжатом. Несжатый используется при работе, сжатый сохраняется в fm3-файл. При создании нового пункта Истории он хранится только в несжатом виде, однако каждые полсекунды Тасэдитор проходится по Журналу Истории и создаёт сжатую версию для первого попавшегося пункта без сжатой версии. Таким образом, к моменту сохранения проекта на диск почти все пункты Истории уже имеют сжатую версию, а те, которые не имеют, сжимаются во время сохранения (что немного замедляет процесс сохранения). При загрузке fm3-файла пункты Журнала Истории загружаются в запакованном виде и распаковываются.</span></li>
<li class="rvps15"><span class="rvts22">Благодаря Журналу Истории реализуется поиск первого изменившегося кадра, после которого затем усекается Гринзона. Большинство операций работают таким образом:</span></li>
<li class="rvps10"><span class="rvts22">В каждом пункте Журнала Истории хранится полная копия Ввода и Маркеров на момент создания пункта. Также в любом пункте может храниться резервная копия Закладки, если пункт создан из-за операции </span><a class="rvts28" href="Operations.html#Bookmark">Bookmark</a><span class="rvts22">.</span></li>
<li class="rvps10"><span class="rvts22">Данные каждого пункта хранятся в оперативной памяти одновременно в двух видах &nbsp; сжатом и несжатом. Несжатый используется при работе, сжатый сохраняется в fm3-файл. При создании нового пункта Истории он хранится только в несжатом виде, однако каждые полсекунды Тасэдитор проходится по Журналу Истории и создаёт сжатую версию для первого попавшегося пункта без сжатой версии. Таким образом, к моменту сохранения проекта на диск почти все пункты Истории уже имеют сжатую версию, а те, которые не имеют, сжимаются во время сохранения (что немного замедляет процесс сохранения). При загрузке fm3-файла пункты Журнала Истории загружаются в запакованном виде и распаковываются.</span></li>
<li class="rvps10"><span class="rvts22">Благодаря Журналу Истории реализуется поиск первого изменившегося кадра, после которого затем усекается Гринзона. Большинство операций работают таким образом:</span></li>
</ul>
<ul style="text-indent: 30px; margin-left: 40px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Вносятся изменения в мувик.</span></li>
<li class="rvps15"><span class="rvts22">Для большинства операций запоминаются минимальный и максимальный номер кадра, в который были внесены изменения.</span></li>
<li class="rvps15"><span class="rvts22">Вызывается регистрация изменений с помощью Истории, минимальный и максимальный кадр передаются в качестве параметров вместе с кодом операции и другими параметрами.</span></li>
<li class="rvps15"><span class="rvts22">История сверяет содержимое текущего мувика с содержимым последнего пункта Журнала Истории. Если задан минимальный кадр, то сверка начинается с этого кадра, игнорируя содержимое мувика до него. Иначе проверяется всё от начала мувика. Если задан максимальный кадр, то сверка заканчивается после этого кадра (но большинство операций не передают максимальный кадр, так как, например, вставка пустого кадра передвигает весь последующий Ввод, и нужно вести проверку до самого конца мувика).</span></li>
<li class="rvps15"><span class="rvts22">Как только обнаруживается первое различие между Вводом/Маркерами мувика и Вводом/Маркерами последнего снимка мувика, создаётся новый пункт в Журнале Истории и заполняются все его атрибуты.</span></li>
<li class="rvps15"><span class="rvts22">Если различия не были обнаружены, то считается, что операция не повлияла на мувик, и никаких изменений в проекте не производится. Например, если записать те же самые нажатия поверх уже имеющихся, операция </span><a class="rvts28" href="Operations.html#Record">Record</a><span class="rvts22"> не будет зарегистрирована.</span></li>
<li class="rvps15"><span class="rvts22">Для операции </span><a class="rvts28" href="Operations.html#Record">Record</a><span class="rvts22"> регистрируется не только номер кадра с изменившимся Вводом, но и номер джойстика, кнопки которого были изменены.</span></li>
<li class="rvps15"><span class="rvts22">Последовательно добавляемые пункты для операций </span><a class="rvts28" href="Operations.html#AdjustLag">AdjustLag</a><span class="rvts22">, </span><a class="rvts28" href="Operations.html#Record">Record</a><span class="rvts22">, </span><a class="rvts28" href="Operations.html#Set">Set</a><span class="rvts22"> и </span><a class="rvts28" href="Operations.html#Unset">Unset</a><span class="rvts22"> могут объединяться в один пункт Журнала Истории, чтобы их было удобнее откатывать в случае необходимости. Объединение производится во время заполнения атрибутов нового пункта Журнала Истории. Вместо добавления этого пункта в конец Журнала происходит замена последнего пункта на новый.</span></li>
<li class="rvps15"><span class="rvts22">После регистрации нового пункта История подаёт сигнал Дереву ответвлений (чтобы на нём появился фаербол) и менеджеру проекта (чтобы в заголовке окна появилась звёздочка), а затем возвращает номер кадра, на котором были обнаружено первое различие.</span></li>
<li class="rvps15"><span class="rvts22">Вызывается усечение Гринзоны после кадра с первым обнаруженным различием. Этот номер может быть больше, чем минимальный номер кадра, в который были внесены изменения самой операцией. Например, если установить нажатия кнопки на всех кадрах в Выделении, минимальным номером кадра будет первый выделенный кадр, но Гринзона будет усечена только после того выделенного кадра, на котором раньше не было нажатия этой кнопки.</span></li>
<li class="rvps10"><span class="rvts22">Вносятся изменения в мувик.</span></li>
<li class="rvps10"><span class="rvts22">Для большинства операций запоминаются минимальный и максимальный номер кадра, в который были внесены изменения.</span></li>
<li class="rvps10"><span class="rvts22">Вызывается регистрация изменений с помощью Истории, минимальный и максимальный кадр передаются в качестве параметров вместе с кодом операции и другими параметрами.</span></li>
<li class="rvps10"><span class="rvts22">История сверяет содержимое текущего мувика с содержимым последнего пункта Журнала Истории. Если задан минимальный кадр, то сверка начинается с этого кадра, игнорируя содержимое мувика до него. Иначе проверяется всё от начала мувика. Если задан максимальный кадр, то сверка заканчивается после этого кадра (но большинство операций не передают максимальный кадр, так как, например, вставка пустого кадра передвигает весь последующий Ввод, и нужно вести проверку до самого конца мувика).</span></li>
<li class="rvps10"><span class="rvts22">Как только обнаруживается первое различие между Вводом/Маркерами мувика и Вводом/Маркерами последнего снимка мувика, создаётся новый пункт в Журнале Истории и заполняются все его атрибуты.</span></li>
<li class="rvps10"><span class="rvts22">Если различия не были обнаружены, то считается, что операция не повлияла на мувик, и никаких изменений в проекте не производится. Например, если записать те же самые нажатия поверх уже имеющихся, операция </span><a class="rvts28" href="Operations.html#Record">Record</a><span class="rvts22"> не будет зарегистрирована.</span></li>
<li class="rvps10"><span class="rvts22">Для операции </span><a class="rvts28" href="Operations.html#Record">Record</a><span class="rvts22"> регистрируется не только номер кадра с изменившимся Вводом, но и номер джойстика, кнопки которого были изменены.</span></li>
<li class="rvps10"><span class="rvts22">Последовательно добавляемые пункты для операций </span><a class="rvts28" href="Operations.html#AdjustLag">AdjustLag</a><span class="rvts22">, </span><a class="rvts28" href="Operations.html#Record">Record</a><span class="rvts22">, </span><a class="rvts28" href="Operations.html#Set">Set</a><span class="rvts22"> и </span><a class="rvts28" href="Operations.html#Unset">Unset</a><span class="rvts22"> могут объединяться в один пункт Журнала Истории, чтобы их было удобнее откатывать в случае необходимости. Объединение производится во время заполнения атрибутов нового пункта Журнала Истории. Вместо добавления этого пункта в конец Журнала происходит замена последнего пункта на новый.</span></li>
<li class="rvps10"><span class="rvts22">После регистрации нового пункта История подаёт сигнал Дереву ответвлений (чтобы на нём появился фаербол) и менеджеру проекта (чтобы в заголовке окна появилась звёздочка), а затем возвращает номер кадра, на котором были обнаружено первое различие.</span></li>
<li class="rvps10"><span class="rvts22">Вызывается усечение Гринзоны после кадра с первым обнаруженным различием. Этот номер может быть больше, чем минимальный номер кадра, в который были внесены изменения самой операцией. Например, если установить нажатия кнопки на всех кадрах в Выделении, минимальным номером кадра будет первый выделенный кадр, но Гринзона будет усечена только после того выделенного кадра, на котором раньше не было нажатия этой кнопки.</span></li>
</ul>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Откат Истории осуществляется как переход с текущего пункта Журнала Истории на предыдущий. Можно сразу прыгать на любой пункт Журнала Истории. Текущий мувик и текущие Маркеры восстанавливаются из данных, содержащихся в этом пункте, а сам пункт становится текущим.</span></li>
<li class="rvps15"><span class="rvts22">Одним из атрибутов каждого пункта Истории является "номер ключевого кадра". Для большинства операций это номер кадра, где обнаружилось первое различие. Для операций, сдвигающих Ввод, это номер минимального кадра.</span></li>
<li class="rvps15"><span class="rvts22">При прыжках по Истории в Piano Roll на полсекунды появляется курсор-указка фиолетового цвета, акцентирующий внимание на ключевом кадре. При откате (undo) этот курсор указывает на ключевой кадр следующего пункта Истории (относительно текущего), при повторе (redo) этот курсор указывает на ключевой кадр текущего пункта истории.</span></li>
<li class="rvps10"><span class="rvts22">Откат Истории осуществляется как переход с текущего пункта Журнала Истории на предыдущий. Можно сразу прыгать на любой пункт Журнала Истории. Текущий мувик и текущие Маркеры восстанавливаются из данных, содержащихся в этом пункте, а сам пункт становится текущим.</span></li>
<li class="rvps10"><span class="rvts22">Одним из атрибутов каждого пункта Истории является "номер ключевого кадра". Для большинства операций это номер кадра, где обнаружилось первое различие. Для операций, сдвигающих Ввод, это номер минимального кадра.</span></li>
<li class="rvps10"><span class="rvts22">При прыжках по Истории в Piano Roll на полсекунды появляется курсор-указка фиолетового цвета, акцентирующий внимание на ключевом кадре. При откате (undo) этот курсор указывает на ключевой кадр следующего пункта Истории (относительно текущего), при повторе (redo) этот курсор указывает на ключевой кадр текущего пункта истории.</span></li>
</ul>
<p class="rvps10"><a name="RerecordsCounter"></a>
<span class="rvts22"><br/></span></p>
@ -368,11 +372,11 @@
<p class="rvps10"><span class="rvts22">По традиции во всех ТАСерских эмуляторах ведётся учёт количества перезаписей, использованных во время создания ТАСа. Это число может использоваться для примерной оценки трудозатрат.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Счётчик перезаписей хранится в мувике (а значит и в fm3-файле проекта). При создании нового мувика (либо нового проекта в Тасэдиторе) счётчик обнуляется.</span></li>
<li class="rvps15"><span class="rvts22">При ТАСинге вне Тасэдитора: счётчик увеличивается на единицу каждый раз, когда ТАСер загружает сэйв в режиме Записи, чтобы изменить Ввод на уже просмотренном участке мувика. Счётчик не увеличивается, когда ТАСер записывает Ввод для кадров, события которых ему не известны.</span></li>
<li class="rvps15"><span class="rvts22">При ТАСинге в Тасэдиторе: счётчик увеличивается на единицу каждый раз, когда ТАСер изменяет Ввод на отгринзоненном участке мувика. Счётчик не увеличивается, когда ТАСер изменяет Ввод для кадров, находящихся дальше головы Гринзоны.</span></li>
<li class="rvps15"><span class="rvts22">Таким образом, в обоих случаях ведётся учёт, </span><span class="rvts37">сколько раз ТАСер изменил известное ему будущее</span><span class="rvts22">. Счётчик не увеличивается, когда ТАСер меняет будущее вслепую, то есть до просмотра игровых событий на изменяемых кадрах.</span></li>
<li class="rvps15"><span class="rvts22">В старых эмуляторах счётчик увеличивается прямо в момент загрузки сэйва в режиме Записи, ещё до того, как ТАСер изменяет Ввод. Из-за этого возможна ситуация, когда пользователь несколько раз подряд нажимает хоткей загрузки сэйва (например, </span><span class="rvts27">F1</span><span class="rvts22">), и при каждом нажатии счётчик перезаписей будет увеличиваться. В Тасэдиторе счётчик увеличивается только в момент усечения Гринзоны, независимо от выбранного способа навигации. Поэтому при первом нажатии хоткея загрузки Закладки (например, </span><span class="rvts27">F1</span><span class="rvts22">) счётчик увеличится только в случае, если ответвление этой Закладки отличается от текущего мувика, причём расхождение должно начинаться с уже просмотренного кадра (кадра внутри Гринзоны). А при повторных нажатиях этого хоткея счётчик не будет увеличиваться, так как ответвление Закладки уже не отличается от текущего мувика, и изменения Ввода не происходит.</span></li>
<li class="rvps10"><span class="rvts22">Счётчик перезаписей хранится в мувике (а значит и в fm3-файле проекта). При создании нового мувика (либо нового проекта в Тасэдиторе) счётчик обнуляется.</span></li>
<li class="rvps10"><span class="rvts22">При ТАСинге вне Тасэдитора: счётчик увеличивается на единицу каждый раз, когда ТАСер загружает сэйв в режиме Записи, чтобы изменить Ввод на уже просмотренном участке мувика. Счётчик не увеличивается, когда ТАСер записывает Ввод для кадров, события которых ему не известны.</span></li>
<li class="rvps10"><span class="rvts22">При ТАСинге в Тасэдиторе: счётчик увеличивается на единицу каждый раз, когда ТАСер изменяет Ввод на отгринзоненном участке мувика. Счётчик не увеличивается, когда ТАСер изменяет Ввод для кадров, находящихся дальше головы Гринзоны.</span></li>
<li class="rvps10"><span class="rvts22">Таким образом, в обоих случаях ведётся учёт, </span><span class="rvts37">сколько раз ТАСер изменил известное ему будущее</span><span class="rvts22">. Счётчик не увеличивается, когда ТАСер меняет будущее вслепую, то есть до просмотра игровых событий на изменяемых кадрах.</span></li>
<li class="rvps10"><span class="rvts22">В старых эмуляторах счётчик увеличивается прямо в момент загрузки сэйва в режиме Записи, ещё до того, как ТАСер изменяет Ввод. Из-за этого возможна ситуация, когда пользователь несколько раз подряд нажимает хоткей загрузки сэйва (например, </span><span class="rvts27">F1</span><span class="rvts22">), и при каждом нажатии счётчик перезаписей будет увеличиваться. В Тасэдиторе счётчик увеличивается только в момент усечения Гринзоны, независимо от выбранного способа навигации. Поэтому при первом нажатии хоткея загрузки Закладки (например, </span><span class="rvts27">F1</span><span class="rvts22">) счётчик увеличится только в случае, если ответвление этой Закладки отличается от текущего мувика, причём расхождение должно начинаться с уже просмотренного кадра (кадра внутри Гринзоны). А при повторных нажатиях этого хоткея счётчик не будет увеличиваться, так как ответвление Закладки уже не отличается от текущего мувика, и изменения Ввода не происходит.</span></li>
</ul>
<p class="rvps10"><a name="Modifiers"></a>
<span class="rvts22"><br/></span></p>
@ -381,9 +385,9 @@
<p class="rvps10"><span class="rvts22">Для повышения интуитивности клавиатурного управления в Тасэдиторе используется строгое разделение функций клавиш модификаторов:</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts34">Shift</span><span class="rvts22"> ассоциируется с </span><a class="rvts28" href="Glossary.html#Output">Выводом</a><span class="rvts22"> мувика, а конкретно с Курсором Проигрывателя. Многие клавиатурные комбинации, содержащие эту клавишу, относятся к управлению этим курсором. Если быстро нажать </span><span class="rvts34">Shift </span><span class="rvts22">два раза подряд, Piano Roll автоматически скроллируется к Курсору Проигрывателя.</span></li>
<li class="rvps15"><span class="rvts34">Ctrl</span><span class="rvts22"> ассоциируется с </span><a class="rvts28" href="Glossary.html#Input">Вводом</a><span class="rvts22"> мувика, а конкретно &nbsp;с Курсором Выделения. Многие клавиатурные комбинации, содержащие эту клавишу, относятся к управлению этим курсором. Если быстро нажать </span><span class="rvts34">Ctrl </span><span class="rvts22">два раза подряд, Piano Roll автоматически скроллируется к Курсору Выделения.</span></li>
<li class="rvps15"><span class="rvts34">Alt</span><span class="rvts22"> ассоциируется с шаблонами и чередующимися последовательностями.</span></li>
<li class="rvps10"><span class="rvts34">Shift</span><span class="rvts22"> ассоциируется с </span><a class="rvts28" href="Glossary.html#Output">Выводом</a><span class="rvts22"> мувика, а конкретно с Курсором Проигрывателя. Многие клавиатурные комбинации, содержащие эту клавишу, относятся к управлению этим курсором. Если быстро нажать </span><span class="rvts34">Shift </span><span class="rvts22">два раза подряд, Piano Roll автоматически скроллируется к Курсору Проигрывателя.</span></li>
<li class="rvps10"><span class="rvts34">Ctrl</span><span class="rvts22"> ассоциируется с </span><a class="rvts28" href="Glossary.html#Input">Вводом</a><span class="rvts22"> мувика, а конкретно &nbsp;с Курсором Выделения. Многие клавиатурные комбинации, содержащие эту клавишу, относятся к управлению этим курсором. Если быстро нажать </span><span class="rvts34">Ctrl </span><span class="rvts22">два раза подряд, Piano Roll автоматически скроллируется к Курсору Выделения.</span></li>
<li class="rvps10"><span class="rvts34">Alt</span><span class="rvts22"> ассоциируется с шаблонами и чередующимися последовательностями.</span></li>
</ul>
<p class="rvps10"><a name="Patterns"></a>
<span class="rvts22"><br/></span></p>
@ -392,12 +396,12 @@
<p class="rvps10"><span class="rvts22">Заготовленные последовательности &nbsp;нажатий для одной кнопки. Подробнее см. </span><a class="rvts28" href="AdvancedFeatures.html#UsingPatterns">Продвинутые возможности</a><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Хранятся во внешнем текстовом файле в формате, доступном для редактирования в Блокноте.</span></li>
<li class="rvps15"><span class="rvts22">Формат файла должен быть описан в самом файле. Для каждого шаблона указывается его имя, которое будет отображаться в списке шаблонов.</span></li>
<li class="rvps15"><span class="rvts22">Загружаются из файла в оперативную память в момент открытия окна TAS Editor.</span></li>
<li class="rvps15"><span class="rvts22">В TAS Editor 1.0 нет встроенных средств редактирования шаблонов, так как формат очень прост, а фича не слишком востребована.</span></li>
<li class="rvps15"><span class="rvts22">По шаблону можно устанавливать Ввод, Маркеры и даже Выделение.</span></li>
<li class="rvps15"><span class="rvts22">При установке шаблона может учитываться или не учитываться лаг. Подробнее: </span><a class="rvts28" href="ProgramCustomization.html#AutofirePatternskipsLag">Настройка программы</a></li>
<li class="rvps10"><span class="rvts22">Хранятся во внешнем текстовом файле в формате, доступном для редактирования в Блокноте.</span></li>
<li class="rvps10"><span class="rvts22">Формат файла должен быть описан в самом файле. Для каждого шаблона указывается его имя, которое будет отображаться в списке шаблонов.</span></li>
<li class="rvps10"><span class="rvts22">Загружаются из файла в оперативную память в момент открытия окна TAS Editor.</span></li>
<li class="rvps10"><span class="rvts22">В TAS Editor 1.0 нет встроенных средств редактирования шаблонов, так как формат очень прост, а фича не слишком востребована.</span></li>
<li class="rvps10"><span class="rvts22">По шаблону можно устанавливать Ввод, Маркеры и даже Выделение.</span></li>
<li class="rvps10"><span class="rvts22">При установке шаблона может учитываться или не учитываться лаг. Подробнее: </span><a class="rvts28" href="ProgramCustomization.html#AutofirePatternskipsLag">Настройка программы</a></li>
</ul>
<p class="rvps10"><a name="CrossingGaps"></a>
<span class="rvts22"><br/></span></p>
@ -406,11 +410,11 @@
<p class="rvps10"><span class="rvts22">Дополнительный способ быстрой навигации по содержимому Piano Roll, облегчающий визуальное прослеживание длинных последовательностей для отдельно взятой кнопки или Маркеров.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Пересечение промежутков это вертикальный скроллинг Piano Roll, срабатывающий при вращении колеса мыши с зажатой клавишей </span><span class="rvts34">Alt</span><span class="rvts22">. Конкретная величина скроллинга не зависит от скорости вращения колеса, а рассчитывается каждый раз индивидуально, исходя из ячейки Piano Roll под курсором мыши в данный момент.</span></li>
<li class="rvps15"><span class="rvts22">При зажатом </span><span class="rvts34">Alt</span><span class="rvts22"> имеет значение только направление вращения колеса (вверх или вниз), а не скорость вращения.</span></li>
<li class="rvps15"><span class="rvts22">Пересечение &nbsp;промежутков подразумевает, что пользователь хочет найти ячейку, находящуюся на расстоянии более одного кадра от ячейки под курсором мыши (иначе нет смысла использовать эту функцию, достаточно просто провести курсор мыши чуть выше).</span></li>
<li class="rvps15"><span class="rvts22">Таким образом, при вращении колеса мыши вверх эта функция запоминает значение ячейки, предшествующей ячейке под курсором мыши. Затем функция начинает поиск ячейки, значение которой не совпадает с данным значением. Поиск идёт снизу вверх от ячейки, предшествующей ячейке под курсором мыши. При успешном обнаружении такой ячейки Piano Roll скроллируется таким образом, чтобы курсор мыши теперь указывал на найденную ячейку. Если же поиск дошёл до начала мувика, а ячейка не найдена, то Piano Roll не скроллируется.</span></li>
<li class="rvps15"><span class="rvts22">Аналогично при вращении колеса мыши вниз эта функция запоминает значение ячейки, следующей за ячейкой под курсором мыши. Затем функция начинает поиск ячейки, значение которой не совпадает с данным значением. Поиск идёт сверху вниз от ячейки, следующей за ячейкой под курсором мыши.</span></li>
<li class="rvps10"><span class="rvts22">Пересечение промежутков это вертикальный скроллинг Piano Roll, срабатывающий при вращении колеса мыши с зажатой клавишей </span><span class="rvts34">Alt</span><span class="rvts22">. Конкретная величина скроллинга не зависит от скорости вращения колеса, а рассчитывается каждый раз индивидуально, исходя из ячейки Piano Roll под курсором мыши в данный момент.</span></li>
<li class="rvps10"><span class="rvts22">При зажатом </span><span class="rvts34">Alt</span><span class="rvts22"> имеет значение только направление вращения колеса (вверх или вниз), а не скорость вращения.</span></li>
<li class="rvps10"><span class="rvts22">Пересечение &nbsp;промежутков подразумевает, что пользователь хочет найти ячейку, находящуюся на расстоянии более одного кадра от ячейки под курсором мыши (иначе нет смысла использовать эту функцию, достаточно просто провести курсор мыши чуть выше).</span></li>
<li class="rvps10"><span class="rvts22">Таким образом, при вращении колеса мыши вверх эта функция запоминает значение ячейки, предшествующей ячейке под курсором мыши. Затем функция начинает поиск ячейки, значение которой не совпадает с данным значением. Поиск идёт снизу вверх от ячейки, предшествующей ячейке под курсором мыши. При успешном обнаружении такой ячейки Piano Roll скроллируется таким образом, чтобы курсор мыши теперь указывал на найденную ячейку. Если же поиск дошёл до начала мувика, а ячейка не найдена, то Piano Roll не скроллируется.</span></li>
<li class="rvps10"><span class="rvts22">Аналогично при вращении колеса мыши вниз эта функция запоминает значение ячейки, следующей за ячейкой под курсором мыши. Затем функция начинает поиск ячейки, значение которой не совпадает с данным значением. Поиск идёт сверху вниз от ячейки, следующей за ячейкой под курсором мыши.</span></li>
</ul>
<p class="rvps10"><a name="SaveCompact"></a>
<span class="rvts22"><br/></span></p>
@ -428,7 +432,7 @@
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps10"><a name="PlannedIdeas"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts74">Запланированные идеи</span></p>
<p class="rvps10"><span class="rvts75">Запланированные идеи</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="OutputLog"></a>
<span class="rvts22"><br/></span></p>
@ -437,18 +441,18 @@
<p class="rvps10"><span class="rvts22">Следующий этап эволюции инструмента Memory Watch просмотр состояния игровых данных в динамике, а не только в статике. Аналогично Журналу лага, эта фича позволит легче и точнее анализировать принципы изменения игрового Вывода.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Список (ListView), вертикальный скроллинг которого синхронизирован со скроллингом Piano Roll. Высота списка равна высоте Piano Roll, количество строк также всегда равно количеству строк Piano Roll. Количество колонок Списка зависит от нужд пользователя.</span></li>
<li class="rvps15"><span class="rvts22">Можно гибко измененять ширину Списка (перетаскиванием узкой границы между ним и Piano Roll, соответственно изменяется ширина Piano Roll, таким образом их суммарная ширина всегда остаётся одинаковой). Можно также менять Список и Piano Roll местами, либо полностью отключать отображение Журнала Вывода. При отключении отображения Журнала Piano Roll расширяется на освобождённое пространство, в точности как в TAS Editor 1.0. Отключение отображения Журнала не означает отключение журналирования данных.</span></li>
<li class="rvps15"><span class="rvts22">В Заголовке Списка отображаются названия журналируемых ячеек. Можно добавлять и удалять колонки, изменять названия, менять колонки местами и изменять их ширину. При создании нового проекта ни одной колонки в Журнале Вывода нет, и, соответственно, журналирование не ведётся.</span></li>
<li class="rvps15"><span class="rvts22">В строках списка отображаются значения ячеек, сохранённые из состояния игры на соответствующем кадре мувика. Строки Списка раскрашиваются теми же цветами, что и соответствующие строки Piano Roll. При выделении строк в Piano Roll выделяются строки в Журнале.</span></li>
<li class="rvps15"><span class="rvts22">Помимо ячеек RAM необходимо реализовать журналирование переменных Lua. Например, предоставить Lua-скриптам Read/Write-доступ к дюжине int-ячеек Тасэдитора и дать пользователю возможность журналировать любые ячейки из этой дюжины.</span></li>
<li class="rvps15"><span class="rvts22">Кроме того, в будущем можно реализовать добавление колонки со скриншотами игры (либо выбранной прямоугольной областью игрового экрана). Причём отображаемый размер скриншота будет зависеть от текущей ширины колонки, и как следствие, скриншоты будут отображаться не на каждой строчке Журнала, а через каждые несколько строк. Однако съёмка скриншотов всегда осуществляется на каждом кадре.</span></li>
<li class="rvps15"><span class="rvts22">Все журналируемые данные хранятся в Гринзоне, наравне с Журналом лага. При добавлении ячейки RAM возможно автоматическое заполнение всей колонки (Тасэдитор пробегает по всем сэйвам Гринзоны, распаковывает их и берёт значение из сохранённой копии RAM). При добавлении переменной Lua значения ячеек будут неопределёнными (пустые ячейки в Списке), и для их заполнения пользователю необходимо будет заново просмотреть мувик с запущенным Lua-скриптом.</span></li>
<li class="rvps15"><span class="rvts22">При усечении Гринзоны старые данные, ставшие неактуальными, не удаляются, но отображаются менее ярким цветом, пока на их место не будут записаны новые данные. При удалении сэйвов из хвоста Гринзоны данные Журнала остаются и отображаются обычным цветом.</span></li>
<li class="rvps15"><span class="rvts22">Возможна гибкая расцветка ячеек, например, подсветка одинаковых значений в Выделении, подсветка искомых значений, автоматическое изменение цвета при изменении значения, автоматическая индикация при достижении заданного значения и т.д.</span></li>
<li class="rvps15"><span class="rvts22">Возможно чтение любых данных Гринзоны из Lua-скриптов с помощью API Тасэдитора.</span></li>
<li class="rvps15"><span class="rvts22">Акселераторы </span><span class="rvts34">Shift + Вправо</span><span class="rvts22"> / </span><span class="rvts34">Shift + Влево</span><span class="rvts22"> теперь будут горизонтально скроллировать не Piano Roll, а Список Журнала. Скроллинг осуществляется по целым колонкам.</span></li>
<li class="rvps15"><span class="rvts22">Необходимо также реализовать новые методы навигации по мувику в зависимости от значения ячеек. Например, с помощью </span><span class="rvts34">Alt</span><span class="rvts22"> и вращения колеса можно пересекать промежутки в Списке для поиска ближайшего неравного или, наоборот, равного значения.</span></li>
<li class="rvps10"><span class="rvts22">Список (ListView), вертикальный скроллинг которого синхронизирован со скроллингом Piano Roll. Высота списка равна высоте Piano Roll, количество строк также всегда равно количеству строк Piano Roll. Количество колонок Списка зависит от нужд пользователя.</span></li>
<li class="rvps10"><span class="rvts22">Можно гибко измененять ширину Списка (перетаскиванием узкой границы между ним и Piano Roll, соответственно изменяется ширина Piano Roll, таким образом их суммарная ширина всегда остаётся одинаковой). Можно также менять Список и Piano Roll местами, либо полностью отключать отображение Журнала Вывода. При отключении отображения Журнала Piano Roll расширяется на освобождённое пространство, в точности как в TAS Editor 1.0. Отключение отображения Журнала не означает отключение журналирования данных.</span></li>
<li class="rvps10"><span class="rvts22">В Заголовке Списка отображаются названия журналируемых ячеек. Можно добавлять и удалять колонки, изменять названия, менять колонки местами и изменять их ширину. При создании нового проекта ни одной колонки в Журнале Вывода нет, и, соответственно, журналирование не ведётся.</span></li>
<li class="rvps10"><span class="rvts22">В строках списка отображаются значения ячеек, сохранённые из состояния игры на соответствующем кадре мувика. Строки Списка раскрашиваются теми же цветами, что и соответствующие строки Piano Roll. При выделении строк в Piano Roll выделяются строки в Журнале.</span></li>
<li class="rvps10"><span class="rvts22">Помимо ячеек RAM необходимо реализовать журналирование переменных Lua. Например, предоставить Lua-скриптам Read/Write-доступ к дюжине int-ячеек Тасэдитора и дать пользователю возможность журналировать любые ячейки из этой дюжины.</span></li>
<li class="rvps10"><span class="rvts22">Кроме того, в будущем можно реализовать добавление колонки со скриншотами игры (либо выбранной прямоугольной областью игрового экрана). Причём отображаемый размер скриншота будет зависеть от текущей ширины колонки, и как следствие, скриншоты будут отображаться не на каждой строчке Журнала, а через каждые несколько строк. Однако съёмка скриншотов всегда осуществляется на каждом кадре.</span></li>
<li class="rvps10"><span class="rvts22">Все журналируемые данные хранятся в Гринзоне, наравне с Журналом лага. При добавлении ячейки RAM возможно автоматическое заполнение всей колонки (Тасэдитор пробегает по всем сэйвам Гринзоны, распаковывает их и берёт значение из сохранённой копии RAM). При добавлении переменной Lua значения ячеек будут неопределёнными (пустые ячейки в Списке), и для их заполнения пользователю необходимо будет заново просмотреть мувик с запущенным Lua-скриптом.</span></li>
<li class="rvps10"><span class="rvts22">При усечении Гринзоны старые данные, ставшие неактуальными, не удаляются, но отображаются менее ярким цветом, пока на их место не будут записаны новые данные. При удалении сэйвов из хвоста Гринзоны данные Журнала остаются и отображаются обычным цветом.</span></li>
<li class="rvps10"><span class="rvts22">Возможна гибкая расцветка ячеек, например, подсветка одинаковых значений в Выделении, подсветка искомых значений, автоматическое изменение цвета при изменении значения, автоматическая индикация при достижении заданного значения и т.д.</span></li>
<li class="rvps10"><span class="rvts22">Возможно чтение любых данных Гринзоны из Lua-скриптов с помощью API Тасэдитора.</span></li>
<li class="rvps10"><span class="rvts22">Акселераторы </span><span class="rvts34">Shift + Вправо</span><span class="rvts22"> / </span><span class="rvts34">Shift + Влево</span><span class="rvts22"> теперь будут горизонтально скроллировать не Piano Roll, а Список Журнала. Скроллинг осуществляется по целым колонкам.</span></li>
<li class="rvps10"><span class="rvts22">Необходимо также реализовать новые методы навигации по мувику в зависимости от значения ячеек. Например, с помощью </span><span class="rvts34">Alt</span><span class="rvts22"> и вращения колеса можно пересекать промежутки в Списке для поиска ближайшего неравного или, наоборот, равного значения.</span></li>
</ul>
<p class="rvps10"><a name="Minimap"></a>
<span class="rvts22"><br/></span></p>
@ -457,14 +461,14 @@
<p class="rvps10"><span class="rvts22">Графически отображает в окне Тасэдитора весь мувик Гринзону, лаг, Курсор Проигрывателя, Выделение, Маркеры, Закладки, точки Горячих Правок, подсветку Журнала Вывода и т.д. Предоставляет пользователю мгновенный образ текущего проекта, не обладающий детальностью, зато полностью умещающийся на экране. Также усовершенствует навигацию по мувику.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Миникарта представляет собой прямоугольный bitmap-холст, по высоте равный высоте Piano Roll, по ширине равный 30 пикселей. Может располагаться слева или справа от Piano Roll и Журнала Вывода.</span></li>
<li class="rvps15"><span class="rvts22">В пункте View можно гибко настраивать отображаемые элементы на миникарте (устанавливать галочки напротив желаемых элементов). Также можно отключить отображение Миникарты.</span></li>
<li class="rvps15"><span class="rvts22">Миникарта не хранит какие-либо данные проекта. Она втоматически перерисовывается с заданной периодичностью (по умолчанию раз в секунду).</span></li>
<li class="rvps15"><span class="rvts22">Маркеры отображаются горизонтальными линиями жёлтого цвета на левой половине Миникарты. Каждая такая линия занимает по высоте как минимум 1 пиксель, поэтому Маркеры не теряются даже при мелком масштабе Миникарты (когда в мувике намного больше кадров, чем высота Миникарты в пикселях). Ширина линии равна трети ширины Миникарты.</span></li>
<li class="rvps15"><span class="rvts22">Горячие Правки отображаются горизонтальными линиями соответствующего цвета на правой половине Миникарты. Каждая такая линия занимает по высоте как минимум 1 пиксель.</span></li>
<li class="rvps15"><span class="rvts22">Закладки отображаются соответствующими иконками слева от Миникарты. По этим иконкам можно щёлкать левой и правой кнопкой мыши, эффект будет аналогичен щелчкам по иконкам в Дереве Ответвлений.</span></li>
<li class="rvps15"><span class="rvts22">Щелчок правой кнопкой мыши мгновенный скроллинг видимой области Piano Roll к указанному месту в мувике. Далее можно перетаскивать видимую область вверх/вниз по мувику, не отпуская правую кнопку.</span></li>
<li class="rvps15"><span class="rvts22">Щелчок левой кнопкой мыши навигация Курсором Проигрывателя. Далее можно перетаскивать Курсор Проигрывателя, не отпуская левую кнопку.</span></li>
<li class="rvps10"><span class="rvts22">Миникарта представляет собой прямоугольный bitmap-холст, по высоте равный высоте Piano Roll, по ширине равный 30 пикселей. Может располагаться слева или справа от Piano Roll и Журнала Вывода.</span></li>
<li class="rvps10"><span class="rvts22">В пункте View можно гибко настраивать отображаемые элементы на миникарте (устанавливать галочки напротив желаемых элементов). Также можно отключить отображение Миникарты.</span></li>
<li class="rvps10"><span class="rvts22">Миникарта не хранит какие-либо данные проекта. Она втоматически перерисовывается с заданной периодичностью (по умолчанию раз в секунду).</span></li>
<li class="rvps10"><span class="rvts22">Маркеры отображаются горизонтальными линиями жёлтого цвета на левой половине Миникарты. Каждая такая линия занимает по высоте как минимум 1 пиксель, поэтому Маркеры не теряются даже при мелком масштабе Миникарты (когда в мувике намного больше кадров, чем высота Миникарты в пикселях). Ширина линии равна трети ширины Миникарты.</span></li>
<li class="rvps10"><span class="rvts22">Горячие Правки отображаются горизонтальными линиями соответствующего цвета на правой половине Миникарты. Каждая такая линия занимает по высоте как минимум 1 пиксель.</span></li>
<li class="rvps10"><span class="rvts22">Закладки отображаются соответствующими иконками слева от Миникарты. По этим иконкам можно щёлкать левой и правой кнопкой мыши, эффект будет аналогичен щелчкам по иконкам в Дереве Ответвлений.</span></li>
<li class="rvps10"><span class="rvts22">Щелчок правой кнопкой мыши мгновенный скроллинг видимой области Piano Roll к указанному месту в мувике. Далее можно перетаскивать видимую область вверх/вниз по мувику, не отпуская правую кнопку.</span></li>
<li class="rvps10"><span class="rvts22">Щелчок левой кнопкой мыши навигация Курсором Проигрывателя. Далее можно перетаскивать Курсор Проигрывателя, не отпуская левую кнопку.</span></li>
</ul>
<p class="rvps10"><a name="VirtualJoypad"></a>
<span class="rvts22"><br/></span></p>
@ -473,19 +477,19 @@
<p class="rvps10"><span class="rvts22">Альтернативный способ ввода инпута. Очень похож на изменение инпута щелчками по Заголовку Piano Roll, однако более удобен и нагляден.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Виртуальный Джойстик представляет собой всплывающее немодальное окно с изменяемыми размерами. Содержимое окна автоматически масштабируется при изменении размеров окна.</span></li>
<li class="rvps15"><span class="rvts22">Окно Виртуального Джойстика появляется под курсором мыши при щелчке правой кнопкой в Piano Roll по выделенному Вводу или Вводу под Курсором Проигрывателя. В настройках пользователь может отключить появление Виртуального Джойстика под курсором при правом щелчке. Тогда можно оставить это окно в удобном месте рабочего стола и при необходимости перемещать курсор мыши то к нему, то обратно к Piano Roll.</span></li>
<li class="rvps15"><span class="rvts22">По цвету рамки окна можно определить, отображает ли Виртуальный Джойстик состояние Ввода в Выделении (синяя рамка) или под Курсором Проигрывателя (голубая рамка).</span></li>
<li class="rvps15"><span class="rvts22">При уведении курсора мыши за пределы окна Виртуального Джойстика это окно автоматически скрывается (если установлена настройка "Hide on mouse leave") либо остаётся на месте.</span></li>
<li class="rvps15"><span class="rvts22">При нажатии левой кнопкой мыши по неактивным областям начинается перетаскивание окна.</span></li>
<li class="rvps15"><span class="rvts22">При нажатии правой кнопкой мыши в любом месте окна окно скрывается.</span></li>
<li class="rvps15"><span class="rvts22">В окне расположены управляющие элементы кнопки, соответствующие кнопкам реального джойстика эмулируемой приставки. Расположение кнопок соответствует реальному прототипу. По внешнему виду кнопок можно определить, являются ли соответствующая кнопка в Выделении нажатой, отпущенной или частично нажатой (когда выделено более одного кадра).</span></li>
<li class="rvps15"><span class="rvts22">Содержимое окна автоматически обновляется при каждом внешнем изменении Ввода.</span></li>
<li class="rvps15"><span class="rvts22">Виртуальный Джойстик отражает состояние только текущего джойстика (выбранного радиокнопкой в разделе Recorder).</span></li>
<li class="rvps15"><span class="rvts22">При щелчке по кнопке происходит изменение Ввода текущего джойстика. Нажатая кнопка становится отпущенной, а отпущенная или частично нажатая становится нажатой. Соответственно меняется Ввод во всех выделенных кадрах или на кадре Курсора Проигрывателя.</span></li>
<li class="rvps15"><span class="rvts22">В дополнение к кнопкам Ввода в окне Виртуального Джойстика можно разместить несколько кнопок-слотов для хранения макросов. Щелчок по кнопке Макроса будет аналогичен нескольким щелчкам по разным кнопкам Виртуального Джойстика. Это позволит ещё быстрее менять Ввод в Выделении, например, вместо трёх щелчков по кнопкам </span><span class="rvts32">Вверх</span><span class="rvts22">, </span><span class="rvts32">Вправо</span><span class="rvts22"> и </span><span class="rvts32">B</span><span class="rvts22"> можно будет сделать один щелчок по </span><span class="rvts73">Макросу1</span><span class="rvts22">.</span></li>
<li class="rvps15"><span class="rvts22">Если перед щелчком по кнопке Виртуального Джойстика или кнопке макроса зажать клавишу </span><span class="rvts34">Alt</span><span class="rvts22">, будет установлен Ввод по шаблону.</span></li>
<li class="rvps15"><span class="rvts22">После реализации Виртуального Джойстика можно изменить принцип действия щелчков по Заголовку Piano Roll. Теперь вместо изменения инпута щелчки по Заголовку будут выделять соответствующие столбцы Piano Roll.</span></li>
<li class="rvps10"><span class="rvts22">Виртуальный Джойстик представляет собой всплывающее немодальное окно с изменяемыми размерами. Содержимое окна автоматически масштабируется при изменении размеров окна.</span></li>
<li class="rvps10"><span class="rvts22">Окно Виртуального Джойстика появляется под курсором мыши при щелчке правой кнопкой в Piano Roll по выделенному Вводу или Вводу под Курсором Проигрывателя. В настройках пользователь может отключить появление Виртуального Джойстика под курсором при правом щелчке. Тогда можно оставить это окно в удобном месте рабочего стола и при необходимости перемещать курсор мыши то к нему, то обратно к Piano Roll.</span></li>
<li class="rvps10"><span class="rvts22">По цвету рамки окна можно определить, отображает ли Виртуальный Джойстик состояние Ввода в Выделении (синяя рамка) или под Курсором Проигрывателя (голубая рамка).</span></li>
<li class="rvps10"><span class="rvts22">При уведении курсора мыши за пределы окна Виртуального Джойстика это окно автоматически скрывается (если установлена настройка "Hide on mouse leave") либо остаётся на месте.</span></li>
<li class="rvps10"><span class="rvts22">При нажатии левой кнопкой мыши по неактивным областям начинается перетаскивание окна.</span></li>
<li class="rvps10"><span class="rvts22">При нажатии правой кнопкой мыши в любом месте окна окно скрывается.</span></li>
<li class="rvps10"><span class="rvts22">В окне расположены управляющие элементы кнопки, соответствующие кнопкам реального джойстика эмулируемой приставки. Расположение кнопок соответствует реальному прототипу. По внешнему виду кнопок можно определить, являются ли соответствующая кнопка в Выделении нажатой, отпущенной или частично нажатой (когда выделено более одного кадра).</span></li>
<li class="rvps10"><span class="rvts22">Содержимое окна автоматически обновляется при каждом внешнем изменении Ввода.</span></li>
<li class="rvps10"><span class="rvts22">Виртуальный Джойстик отражает состояние только текущего джойстика (выбранного радиокнопкой в разделе Recorder).</span></li>
<li class="rvps10"><span class="rvts22">При щелчке по кнопке происходит изменение Ввода текущего джойстика. Нажатая кнопка становится отпущенной, а отпущенная или частично нажатая становится нажатой. Соответственно меняется Ввод во всех выделенных кадрах или на кадре Курсора Проигрывателя.</span></li>
<li class="rvps10"><span class="rvts22">В дополнение к кнопкам Ввода в окне Виртуального Джойстика можно разместить несколько кнопок-слотов для хранения макросов. Щелчок по кнопке Макроса будет аналогичен нескольким щелчкам по разным кнопкам Виртуального Джойстика. Это позволит ещё быстрее менять Ввод в Выделении, например, вместо трёх щелчков по кнопкам </span><span class="rvts32">Вверх</span><span class="rvts22">, </span><span class="rvts32">Вправо</span><span class="rvts22"> и </span><span class="rvts32">B</span><span class="rvts22"> можно будет сделать один щелчок по </span><span class="rvts74">Макросу1</span><span class="rvts22">.</span></li>
<li class="rvps10"><span class="rvts22">Если перед щелчком по кнопке Виртуального Джойстика или кнопке макроса зажать клавишу </span><span class="rvts34">Alt</span><span class="rvts22">, будет установлен Ввод по шаблону.</span></li>
<li class="rvps10"><span class="rvts22">После реализации Виртуального Джойстика можно изменить принцип действия щелчков по Заголовку Piano Roll. Теперь вместо изменения инпута щелчки по Заголовку будут выделять соответствующие столбцы Piano Roll.</span></li>
</ul>
<p class="rvps10"><a name="BetterSelection"></a>
<span class="rvts22"><br/></span></p>
@ -495,19 +499,19 @@
<p class="rvps10"><span class="rvts22">Кроме того, необходимо усовершенствовать процесс рисования Выделения, чтобы пользователь мог видеть цвет строк Piano Roll под полупрозрачным Выделением.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Выделение столбцов производится аналогично выделению строк при щелчке левой кнопкой мыши по Заголовку Piano Roll соответствующий столбец становится выделенным, а все остальные столбцы перестают выть выделенными. Если перед щелчком зажать клавишу </span><span class="rvts34">Ctrl</span><span class="rvts22">, выделение остальных столбцов не изменится. Если зажать </span><span class="rvts34">Shift</span><span class="rvts22">, будет выделен регион столбцов от места предыдущего щелчка. Если зажать </span><span class="rvts34">Alt</span><span class="rvts22">, выделится регион по шаблону. После щелчка можно не отпускать левую кнопку и растягивать Выделение по горизонтали.</span></li>
<li class="rvps15"><span class="rvts22">Выделять можно только столбцы Ввода. Маркеры же зависят от настройки "Bind markers to Input".</span></li>
<li class="rvps15"><span class="rvts22">Выделенные столбцы отмечаются в Заголовке синим фоном в соответствующих ячейках.</span></li>
<li class="rvps15"><span class="rvts22">Отсутствие выделенных столбцов равносильно состоянию "выделены все столбцы".</span></li>
<li class="rvps15"><span class="rvts22">При рисовании строк Выделения ячейки Ввода из невыделенных столбцов рисуются с альфой ~0.4, в то время как ячейки из выделенных столбцов имеют альфу ~0.7.</span></li>
<li class="rvps15"><span class="rvts22">В колонке с номерами кадров выделенные строки имеют альфу ~0.4, когда Маркеры отвязаны, и ~0.7, когда Маркеры привязаны.</span></li>
<li class="rvps15"><span class="rvts22">В разделе Splicer отображается не только количество выделенных строк (rows), но и количество выделенных столбцов (columns).</span></li>
<li class="rvps15"><span class="rvts22">При копировании в Буфер Обмена попадает только Ввод из выделенных столбцов, причём он попадает в виде прямоугольной таблицы, без пропусков между столбцами. Благодаря этому можно изменить выделенные столбцы и вставить Ввод одних кнопок на место других кнопок.</span></li>
<li class="rvps15"><span class="rvts22">При изменении порядка следования столбцов или скрытии/раскрытии столбцоа Выделение сбрасывается в состояние "отсутствует выделение столбцов".</span></li>
<li class="rvps15"><span class="rvts22">При Записи Ввод фильтруется в соответствии с выделением столбцов. Невыделенные столбцы не будут изменяться, даже если пользователь записывает другое состояние кнопки этого столбца.</span></li>
<li class="rvps15"><span class="rvts22">При инициализации объекта SELECTION (то есть при запуске Тасэдитора или создании проекта) Выделение сбрасывается в состояние "отсутствует выделение столбцов".</span></li>
<li class="rvps15"><span class="rvts22">Выделение столбцов также сохраняется в файле проекта.</span></li>
<li class="rvps15"><span class="rvts22">На Историю Выделений это нововведение никак не влияет. Изменение выделения столбцов не сохраняется в Истории Выделений, так как навигация по истории изменения выделения столбцов не требуется.</span></li>
<li class="rvps10"><span class="rvts22">Выделение столбцов производится аналогично выделению строк при щелчке левой кнопкой мыши по Заголовку Piano Roll соответствующий столбец становится выделенным, а все остальные столбцы перестают выть выделенными. Если перед щелчком зажать клавишу </span><span class="rvts34">Ctrl</span><span class="rvts22">, выделение остальных столбцов не изменится. Если зажать </span><span class="rvts34">Shift</span><span class="rvts22">, будет выделен регион столбцов от места предыдущего щелчка. Если зажать </span><span class="rvts34">Alt</span><span class="rvts22">, выделится регион по шаблону. После щелчка можно не отпускать левую кнопку и растягивать Выделение по горизонтали.</span></li>
<li class="rvps10"><span class="rvts22">Выделять можно только столбцы Ввода. Маркеры же зависят от настройки "Bind markers to Input".</span></li>
<li class="rvps10"><span class="rvts22">Выделенные столбцы отмечаются в Заголовке синим фоном в соответствующих ячейках.</span></li>
<li class="rvps10"><span class="rvts22">Отсутствие выделенных столбцов равносильно состоянию "выделены все столбцы".</span></li>
<li class="rvps10"><span class="rvts22">При рисовании строк Выделения ячейки Ввода из невыделенных столбцов рисуются с альфой ~0.4, в то время как ячейки из выделенных столбцов имеют альфу ~0.7.</span></li>
<li class="rvps10"><span class="rvts22">В колонке с номерами кадров выделенные строки имеют альфу ~0.4, когда Маркеры отвязаны, и ~0.7, когда Маркеры привязаны.</span></li>
<li class="rvps10"><span class="rvts22">В разделе Splicer отображается не только количество выделенных строк (rows), но и количество выделенных столбцов (columns).</span></li>
<li class="rvps10"><span class="rvts22">При копировании в Буфер Обмена попадает только Ввод из выделенных столбцов, причём он попадает в виде прямоугольной таблицы, без пропусков между столбцами. Благодаря этому можно изменить выделенные столбцы и вставить Ввод одних кнопок на место других кнопок.</span></li>
<li class="rvps10"><span class="rvts22">При изменении порядка следования столбцов или скрытии/раскрытии столбцоа Выделение сбрасывается в состояние "отсутствует выделение столбцов".</span></li>
<li class="rvps10"><span class="rvts22">При Записи Ввод фильтруется в соответствии с выделением столбцов. Невыделенные столбцы не будут изменяться, даже если пользователь записывает другое состояние кнопки этого столбца.</span></li>
<li class="rvps10"><span class="rvts22">При инициализации объекта SELECTION (то есть при запуске Тасэдитора или создании проекта) Выделение сбрасывается в состояние "отсутствует выделение столбцов".</span></li>
<li class="rvps10"><span class="rvts22">Выделение столбцов также сохраняется в файле проекта.</span></li>
<li class="rvps10"><span class="rvts22">На Историю Выделений это нововведение никак не влияет. Изменение выделения столбцов не сохраняется в Истории Выделений, так как навигация по истории изменения выделения столбцов не требуется.</span></li>
</ul>
<p class="rvps10"><a name="BetterColumns"></a>
<span class="rvts22"><br/></span></p>
@ -516,14 +520,14 @@
<p class="rvps10"><span class="rvts22">В TAS Editor 1.0 столбцы Piano Roll имеют фиксированную ширину. Количество и порядок следования столбцов также фиксированы. Для команд приставки (сброс, вставка диска и т.д.) отдельные столбцы не отводятся, так как эти команды используются крайне редко. Однако при портировании Тасэдитора на другие эмуляторы количество столбцов будет возрастать (например, у PSX нужно отображать столбцы для 14 кнопок), необходимо предоставить пользователю возможность настраивать их.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Так как подобная настройка обычно производится только один раз при первом запуске программы, она не обязательно должна осуществляться средствами Piano Roll, можно и в отдельном окне, вызываемом из Config.</span></li>
<li class="rvps15"><span class="rvts22">Возможность отображать любые колонки Ввода, в том числе колонки команд.</span></li>
<li class="rvps15"><span class="rvts22">Возможность прятать любые колонки. Однако от каждого джойстика должна оставаться отображаемой как минимум одна колонка (но если пользователь настроил проект на режим 1P, то колонки второго джойстика в любом случае не будут отображаться).</span></li>
<li class="rvps15"><span class="rvts22">Возможность изменять порядок следования колонок.</span></li>
<li class="rvps15"><span class="rvts22">При копировании в Буфер Обмена копируются только абстрактные значения вида "кнопка нажата" / "не нажата". Поэтому если после копирования изменить порядок следования столбцов и вставить Ввод из Буфера Обмена, реальный Ввод мувика изменится (кнопки изменённых столбцов поменяются местами).</span></li>
<li class="rvps15"><span class="rvts22">Возможность изменять ширину колонок.</span></li>
<li class="rvps15"><span class="rvts22">Возможность одним щелчком восстановить значения по умолчанию (рекомендуемые автором).</span></li>
<li class="rvps15"><span class="rvts22">Все настройки сохраняются при выходе.</span></li>
<li class="rvps10"><span class="rvts22">Так как подобная настройка обычно производится только один раз при первом запуске программы, она не обязательно должна осуществляться средствами Piano Roll, можно и в отдельном окне, вызываемом из Config.</span></li>
<li class="rvps10"><span class="rvts22">Возможность отображать любые колонки Ввода, в том числе колонки команд.</span></li>
<li class="rvps10"><span class="rvts22">Возможность прятать любые колонки. Однако от каждого джойстика должна оставаться отображаемой как минимум одна колонка (но если пользователь настроил проект на режим 1P, то колонки второго джойстика в любом случае не будут отображаться).</span></li>
<li class="rvps10"><span class="rvts22">Возможность изменять порядок следования колонок.</span></li>
<li class="rvps10"><span class="rvts22">При копировании в Буфер Обмена копируются только абстрактные значения вида "кнопка нажата" / "не нажата". Поэтому если после копирования изменить порядок следования столбцов и вставить Ввод из Буфера Обмена, реальный Ввод мувика изменится (кнопки изменённых столбцов поменяются местами).</span></li>
<li class="rvps10"><span class="rvts22">Возможность изменять ширину колонок.</span></li>
<li class="rvps10"><span class="rvts22">Возможность одним щелчком восстановить значения по умолчанию (рекомендуемые автором).</span></li>
<li class="rvps10"><span class="rvts22">Все настройки сохраняются при выходе.</span></li>
</ul>
<p class="rvps10"><a name="RerecordsHeatmap"></a>
<span class="rvts22"><br/></span></p>
@ -532,22 +536,22 @@
<p class="rvps10"><span class="rvts22">Хранит и отображает статистику "изменений после просмотра" (перезаписей). Может быть полезна для выявления сложных мест в мувике.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Хранит массив int, по одному элементу на каждый кадр мувика (в том числе за пределами инпута). Значение элемента соответствует количеству усечений Гринзоны до данного кадра.</span></li>
<li class="rvps15"><span class="rvts22">Сохраняет и загружает свои данные из файла проекта.</span></li>
<li class="rvps15"><span class="rvts22">В качестве холста следует использовать холст Миникарты. При ТАСинге не имеет смысла постоянно видеть Теплокарту, пользователь может изредка (например, в конце каждого дня) переключать Миникарту в режим отображения Теплокарты и оценивать проделанный труд.</span></li>
<li class="rvps15"><span class="rvts22">Так как эта фича несёт не столько рабочую, сколько эстетическую функцию, необходимо продумать алгоритм рисования телокарты, чтобы было не только информативно, но и красиво.</span></li>
<li class="rvps10"><span class="rvts22">Хранит массив int, по одному элементу на каждый кадр мувика (в том числе за пределами инпута). Значение элемента соответствует количеству усечений Гринзоны до данного кадра.</span></li>
<li class="rvps10"><span class="rvts22">Сохраняет и загружает свои данные из файла проекта.</span></li>
<li class="rvps10"><span class="rvts22">В качестве холста следует использовать холст Миникарты. При ТАСинге не имеет смысла постоянно видеть Теплокарту, пользователь может изредка (например, в конце каждого дня) переключать Миникарту в режим отображения Теплокарты и оценивать проделанный труд.</span></li>
<li class="rvps10"><span class="rvts22">Так как эта фича несёт не столько рабочую, сколько эстетическую функцию, необходимо продумать алгоритм рисования телокарты, чтобы было не только информативно, но и красиво.</span></li>
</ul>
<p class="rvps10"><a name="Etc"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">Прочие мелочи</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Отдельный Журнал Истории для операций </span><a class="rvts28" href="Operations.html#Bookmark">Bookmark Set</a><span class="rvts22"> (</span><span class="rvts34">Alt + Z</span><span class="rvts22"> и </span><span class="rvts34">Alt + Y</span><span class="rvts22">), для отката изменений Ввода/Маркеров без отката изменений Закладок.</span></li>
<li class="rvps15"><span class="rvts22">Возможность работать с </span><span class="rvts22">мувиками, начинающимися с сэйва.</span></li>
<li class="rvps15"><span class="rvts22">Возможность работать с несколькими эмулируемыми играми одновременно (для Multi-TAS-проектов).</span></li>
<li class="rvps15"><span class="rvts22">Усовершенствование Lua API.</span></li>
<li class="rvps15"><span class="rvts22">Поддержка мультитач-управления.</span></li>
<li class="rvps15"><span class="rvts22">Продумать концепцию заполнения Гринзоны в фоне (насколько она соответствует особенностям ТАСинга).</span></li>
<li class="rvps10"><span class="rvts22">Отдельный Журнал Истории для операций </span><a class="rvts28" href="Operations.html#Bookmark">Bookmark Set</a><span class="rvts22"> (</span><span class="rvts34">Alt + Z</span><span class="rvts22"> и </span><span class="rvts34">Alt + Y</span><span class="rvts22">), для отката изменений Ввода/Маркеров без отката изменений Закладок.</span></li>
<li class="rvps10"><span class="rvts22">Возможность работать с </span><span class="rvts22">мувиками, начинающимися с сэйва.</span></li>
<li class="rvps10"><span class="rvts22">Возможность работать с несколькими эмулируемыми играми одновременно (для Multi-TAS-проектов).</span></li>
<li class="rvps10"><span class="rvts22">Усовершенствование Lua API.</span></li>
<li class="rvps10"><span class="rvts22">Поддержка мультитач-управления.</span></li>
<li class="rvps10"><span class="rvts22">Продумать концепцию заполнения Гринзоны в фоне (насколько она соответствует особенностям ТАСинга).</span></li>
</ul>
<p class="rvps10"><a name="OtherPlatforms"></a>
<span class="rvts22"><br/></span></p>
@ -556,15 +560,16 @@
<p class="rvps10"><span class="rvts22">Если Тасэдитор приобретёт популярность среди ТАСеров, необходимо расширить его доступность для всех эмулируемых платформ.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Продумать управляющие элементы для отображения и изменения аналогового Ввода в Piano Roll. Виртуальный Джойстик отчасти решает эту проблемы, однако должна быть возможность быстро и легко рисовать аналоговый Ввод мышкой. Например, растягивать на много кадров однократно установленное значение наклона стика, запоминать значение только что очищенной ячейки и предлагать его при рисовании. В ячейке отображается не один символ, а число от -1.0 до +1.0. При двойном щелчке по клетке можно набрать с клавиатуры точное значение этого числа. С зажатым </span><span class="rvts34">Ctrl</span><span class="rvts22"> можно растягивать значение ячейки левой кнопкой мыши вправо/влево или вверх/вниз. В столбце отображается значение наклона только по одной координатной оси (таким образом, для аналогового стика требуется две колонки Piano Roll).</span></li>
<li class="rvps15"><span class="rvts22">В Виртуальном Джойстике должна быть возможность рисовать огибающую для региона кадров, а не только устанавливать одинаковое значение для всех выделенных кадров. Также необходимо переработать формат Шаблонов, чтобы они могли представлять последовательности значений уровня, в том числе с относительными значениями (например, возрастание по параболе, где начальное и конечное значение берётся из начального и конечного кадра выделенного региона).</span></li>
<li class="rvps15"><span class="rvts22">Крайне желателен переход на 64-разрядную платформу, так как объёмы Гринзоны значительно возрастут при хранении сэйвов более продвинутых приставок.</span></li>
<li class="rvps10"><span class="rvts22">Продумать управляющие элементы для отображения и изменения аналогового Ввода в Piano Roll. Виртуальный Джойстик отчасти решает эту проблемы, однако должна быть возможность быстро и легко рисовать аналоговый Ввод мышкой. Например, растягивать на много кадров однократно установленное значение наклона стика, запоминать значение только что очищенной ячейки и предлагать его при рисовании. В ячейке отображается не один символ, а число от -1.0 до +1.0. При двойном щелчке по клетке можно набрать с клавиатуры точное значение этого числа. С зажатым </span><span class="rvts34">Ctrl</span><span class="rvts22"> можно растягивать значение ячейки левой кнопкой мыши вправо/влево или вверх/вниз. В столбце отображается значение наклона только по одной координатной оси (таким образом, для аналогового стика требуется две колонки Piano Roll).</span></li>
<li class="rvps10"><span class="rvts22">В Виртуальном Джойстике должна быть возможность рисовать огибающую для региона кадров, а не только устанавливать одинаковое значение для всех выделенных кадров. Также необходимо переработать формат Шаблонов, чтобы они могли представлять последовательности значений уровня, в том числе с относительными значениями (например, возрастание по параболе, где начальное и конечное значение берётся из начального и конечного кадра выделенного региона).</span></li>
<li class="rvps10"><span class="rvts22">Крайне желателен переход на 64-разрядную платформу, так как объёмы Гринзоны значительно возрастут при хранении сэйвов более продвинутых приставок.</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/feature-tour/create-ebooks-for-amazon-kindle">Produce Kindle eBooks easily</a></p>
</div>

View File

@ -3,7 +3,7 @@
<head>
<title>Реализация</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("Implementation");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("Implementation");
}
});
</script>
</head>
@ -52,6 +55,7 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">Реализация</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
@ -61,275 +65,275 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts75">Программные модули (классы)</span></p>
<p class="rvps10"><span class="rvts76">Программные модули (классы)</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts21">taseditor.cpp</span></p>
<p class="rvps10"><span class="rvts22">Main главный шлюз между эмулятором и Тасэдитором (Main gate between emulator and Taseditor)</span></p>
<p class="rvps10"><span class="rvts44">[единичный экземпляр]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">точка запуска Тасэдитора эмулятором</span></li>
<li class="rvps15"><span class="rvts22">точка выхода из Тасэдитора</span></li>
<li class="rvps15"><span class="rvts22">Регулярно (раз в кадр) вызывает обновление всех модулей, требующих регулярного обновления</span></li>
<li class="rvps15"><span class="rvts22">реализует функции раздела File: создание нового проекта, открытие файла, сохранение, компактное сохранение, импорт, экспорт</span></li>
<li class="rvps15"><span class="rvts22">обрабатывает некоторые хоткеи FCEUX</span></li>
<li class="rvps10"><span class="rvts22">точка запуска Тасэдитора эмулятором</span></li>
<li class="rvps10"><span class="rvts22">точка выхода из Тасэдитора</span></li>
<li class="rvps10"><span class="rvts22">Регулярно (раз в кадр) вызывает обновление всех модулей, требующих регулярного обновления</span></li>
<li class="rvps10"><span class="rvts22">реализует функции раздела File: создание нового проекта, открытие файла, сохранение, компактное сохранение, импорт, экспорт</span></li>
<li class="rvps10"><span class="rvts22">обрабатывает некоторые хоткеи FCEUX</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts21">taseditor_window.cpp</span></p>
<p class="rvps10"><span class="rvts22">Window пользовательский интерфейс (User Interface)</span></p>
<p class="rvps10"><span class="rvts44">[единичный экземпляр]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">реализует все операции с окном Тасэдитора: создание, перерисовка, изменение размера, перетаскивание окна, всплывающие подсказки, щелчки</span></li>
<li class="rvps15"><span class="rvts22">реализует обработчики для всех кнопок и чекбоксов в GUI Тасэдитора, чтобы запретить срабатывание клавиши Пробел, а также обрабатывать щелчок средней кнопкой мыши</span></li>
<li class="rvps15"><span class="rvts22">обрабатывает системные сообщения и передаёт сигналы от пользователя другим модулям Тасэдитора (а для некоторых простейших команд реализует логику на месте, например, диалог ввода настроек Greenzone capacity и т.п.)</span></li>
<li class="rvps15"><span class="rvts22">включает/выключает передачу клавиатурного управления эмулятору при получении/потере фокуса окна</span></li>
<li class="rvps15"><span class="rvts22">по требованию: обновляет текст заголовка окна; обновляет иконку курсора мыши</span></li>
<li class="rvps15"><span class="rvts22">обновляет состояние галочек при изменении соответствующих настроек</span></li>
<li class="rvps15"><span class="rvts22">хранит информацию о 10 последних проектах (File-&gt;Recent) и обновляет её при загрузках/сохранениях файлов</span></li>
<li class="rvps15"><span class="rvts22">Хранит ресурсы: текст заголовка окна, имя файла справки, размер, координаты и другие свойства всех элементов GUI</span></li>
<li class="rvps10"><span class="rvts22">реализует все операции с окном Тасэдитора: создание, перерисовка, изменение размера, перетаскивание окна, всплывающие подсказки, щелчки</span></li>
<li class="rvps10"><span class="rvts22">реализует обработчики для всех кнопок и чекбоксов в GUI Тасэдитора, чтобы запретить срабатывание клавиши Пробел, а также обрабатывать щелчок средней кнопкой мыши</span></li>
<li class="rvps10"><span class="rvts22">обрабатывает системные сообщения и передаёт сигналы от пользователя другим модулям Тасэдитора (а для некоторых простейших команд реализует логику на месте, например, диалог ввода настроек Greenzone capacity и т.п.)</span></li>
<li class="rvps10"><span class="rvts22">включает/выключает передачу клавиатурного управления эмулятору при получении/потере фокуса окна</span></li>
<li class="rvps10"><span class="rvts22">по требованию: обновляет текст заголовка окна; обновляет иконку курсора мыши</span></li>
<li class="rvps10"><span class="rvts22">обновляет состояние галочек при изменении соответствующих настроек</span></li>
<li class="rvps10"><span class="rvts22">хранит информацию о 10 последних проектах (File-&gt;Recent) и обновляет её при загрузках/сохранениях файлов</span></li>
<li class="rvps10"><span class="rvts22">Хранит ресурсы: текст заголовка окна, имя файла справки, размер, координаты и другие свойства всех элементов GUI</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts21">bookmarks.cpp</span></p>
<p class="rvps10"><span class="rvts22">Bookmarks Менеджер Закладок (Manager of Bookmarks)</span></p>
<p class="rvps10"><span class="rvts44">[единичный экземпляр]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">хранит 10 Закладок</span></li>
<li class="rvps15"><span class="rvts22">реализует все операции с Закладками: ининициализация, установка Закладки, прыжок на Закладку, загрузка Ответвления Закладки</span></li>
<li class="rvps15"><span class="rvts22">сохраняет и загружает данные всех Закладок из файла проекта. При ошибке: сбрасывает список Закладок и Ответвлений</span></li>
<li class="rvps15"><span class="rvts22">реализует всю логику работы Списка Закладок: создание, перерисовка, наведение мышью, щелчки</span></li>
<li class="rvps15"><span class="rvts22">Регулярно обновляет состояние анимированных вспышек в Списке Закладок</span></li>
<li class="rvps15"><span class="rvts22">по требованию: обновляет расцветку строк Списка закладок, поддерживая актуальное состояние каждой ячейки Списка</span></li>
<li class="rvps15"><span class="rvts22">Хранит ресурсы: идентификатор сохранения, идентификаторы команд по работе с Закладками, текст заголовка панели, градиенты анимированных вспышек, номер слота по умолчанию</span></li>
<li class="rvps10"><span class="rvts22">хранит 10 Закладок</span></li>
<li class="rvps10"><span class="rvts22">реализует все операции с Закладками: ининициализация, установка Закладки, прыжок на Закладку, загрузка Ответвления Закладки</span></li>
<li class="rvps10"><span class="rvts22">сохраняет и загружает данные всех Закладок из файла проекта. При ошибке: сбрасывает список Закладок и Ответвлений</span></li>
<li class="rvps10"><span class="rvts22">реализует всю логику работы Списка Закладок: создание, перерисовка, наведение мышью, щелчки</span></li>
<li class="rvps10"><span class="rvts22">Регулярно обновляет состояние анимированных вспышек в Списке Закладок</span></li>
<li class="rvps10"><span class="rvts22">по требованию: обновляет расцветку строк Списка закладок, поддерживая актуальное состояние каждой ячейки Списка</span></li>
<li class="rvps10"><span class="rvts22">Хранит ресурсы: идентификатор сохранения, идентификаторы команд по работе с Закладками, текст заголовка панели, градиенты анимированных вспышек, номер слота по умолчанию</span></li>
</ul>
<p class="rvps15"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts21">branches.cpp</span></p>
<p class="rvps10"><span class="rvts22">Branches Менеджер Ответвлений (Manager of Branches)</span></p>
<p class="rvps10"><span class="rvts44">[единичный экземпляр]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">хранит информацию об Ответвлениях (родственных связах Закладок), а также номер текущего Ответвления</span></li>
<li class="rvps15"><span class="rvts22">дополнительно хранит время последнего изменения проекта (см. файерболл), а также время начала проекта (см. тучка)</span></li>
<li class="rvps15"><span class="rvts22">кеширует и хранит данные, использованные при рассчётах (кадр первого расхождения нпута для каждой пары Закладок; номер самой дальней Закладки, соответвтвующей хронологии определённой Закладки)</span></li>
<li class="rvps15"><span class="rvts22">сохраняет и загружает свои данные из файла проекта. При ошибке: передаёт сигнал выше</span></li>
<li class="rvps15"><span class="rvts22">реализует всю логику работы Дерева Ответвлений: создание, пересчёт связей, анимация, перерисовка, наведение мышью, щелчки</span></li>
<li class="rvps15"><span class="rvts22">по требованию: реагирует на изменение Закладок или текущего мувика, изменяя структуру Дерева Ответвлений</span></li>
<li class="rvps15"><span class="rvts22">Регулярно анимирует Дерево Ответвлений и рассчитывает положение Курсора Проигрывателя на этом Дереве</span></li>
<li class="rvps15"><span class="rvts22">Хранит ресурсы: координаты элементов Дерева Ответвлений, тайминги анимаций</span></li>
<li class="rvps10"><span class="rvts22">хранит информацию об Ответвлениях (родственных связах Закладок), а также номер текущего Ответвления</span></li>
<li class="rvps10"><span class="rvts22">дополнительно хранит время последнего изменения проекта (см. файерболл), а также время начала проекта (см. тучка)</span></li>
<li class="rvps10"><span class="rvts22">кеширует и хранит данные, использованные при рассчётах (кадр первого расхождения нпута для каждой пары Закладок; номер самой дальней Закладки, соответвтвующей хронологии определённой Закладки)</span></li>
<li class="rvps10"><span class="rvts22">сохраняет и загружает свои данные из файла проекта. При ошибке: передаёт сигнал выше</span></li>
<li class="rvps10"><span class="rvts22">реализует всю логику работы Дерева Ответвлений: создание, пересчёт связей, анимация, перерисовка, наведение мышью, щелчки</span></li>
<li class="rvps10"><span class="rvts22">по требованию: реагирует на изменение Закладок или текущего мувика, изменяя структуру Дерева Ответвлений</span></li>
<li class="rvps10"><span class="rvts22">Регулярно анимирует Дерево Ответвлений и рассчитывает положение Курсора Проигрывателя на этом Дереве</span></li>
<li class="rvps10"><span class="rvts22">Хранит ресурсы: координаты элементов Дерева Ответвлений, тайминги анимаций</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts21">bookmark.cpp</span></p>
<p class="rvps10"><span class="rvts22">Bookmark данные одной Закладки (Single Bookmark data)</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">хранит всю информацию одной конкретной Закладки: снимок состояния мувика, копию сэйва одного кадра Гринзоны, скриншот этого кадра, состояние вспышки данной Закладки</span></li>
<li class="rvps15"><span class="rvts22">сохраняет и загружает свои данные из файла проекта. При ошибке: передаёт сигнал выше</span></li>
<li class="rvps15"><span class="rvts22">реализует процедуру установки Закладки: создание снимка мувика, установка ключевого кадра снимка на текущее положение Проигрывателя, копирование сэйва из Гринзоны, взятие и компрессия скриншота с экрана, запуск анимации вспышки</span></li>
<li class="rvps15"><span class="rvts22">запускает соответствующие вспышки при прыжке на Закладку и при загрузке Ответвления</span></li>
<li class="rvps10"><span class="rvts22">хранит всю информацию одной конкретной Закладки: снимок состояния мувика, копию сэйва одного кадра Гринзоны, скриншот этого кадра, состояние вспышки данной Закладки</span></li>
<li class="rvps10"><span class="rvts22">сохраняет и загружает свои данные из файла проекта. При ошибке: передаёт сигнал выше</span></li>
<li class="rvps10"><span class="rvts22">реализует процедуру установки Закладки: создание снимка мувика, установка ключевого кадра снимка на текущее положение Проигрывателя, копирование сэйва из Гринзоны, взятие и компрессия скриншота с экрана, запуск анимации вспышки</span></li>
<li class="rvps10"><span class="rvts22">запускает соответствующие вспышки при прыжке на Закладку и при загрузке Ответвления</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts21">snapshot.cpp</span></p>
<p class="rvps10"><span class="rvts22">Snapshot Моментальный снимок всех редактируемых данных (Snapshot of all edited data)</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">хранит всю информацию одного снимка мувика: :Журнал Ввода, Журнал Лага на момент создания снимка, номер ключевого кадра, начальный и конечный кадр операции, тип операции и текстовое описание снимка (включая время создания)</span></li>
<li class="rvps15"><span class="rvts22">дополнительно хранит информацию о последовательной Записи/рисовании Ввода</span></li>
<li class="rvps15"><span class="rvts22">организует создание снимка: копирование Ввода из мувика, копирование Маркеров из Менеджера Маркеров, запоминание времени создания</span></li>
<li class="rvps15"><span class="rvts22">организует восстановление Маркеров из снимка</span></li>
<li class="rvps15"><span class="rvts22">сохраняет и загружает свои данные из файла проекта, при ошибке загрузки передаёт сигнал выше</span></li>
<li class="rvps10"><span class="rvts22">хранит всю информацию одного снимка мувика: :Журнал Ввода, Журнал Лага на момент создания снимка, номер ключевого кадра, начальный и конечный кадр операции, тип операции и текстовое описание снимка (включая время создания)</span></li>
<li class="rvps10"><span class="rvts22">дополнительно хранит информацию о последовательной Записи/рисовании Ввода</span></li>
<li class="rvps10"><span class="rvts22">организует создание снимка: копирование Ввода из мувика, копирование Маркеров из Менеджера Маркеров, запоминание времени создания</span></li>
<li class="rvps10"><span class="rvts22">организует восстановление Маркеров из снимка</span></li>
<li class="rvps10"><span class="rvts22">сохраняет и загружает свои данные из файла проекта, при ошибке загрузки передаёт сигнал выше</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts21">inputlog.cpp</span></p>
<p class="rvps10"><span class="rvts22">InputLog Журнал Ввода (Log of Input)</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">хранит снимок Ввода мувика: размер и содержимое Ввода для всех кадров (кнопочные нажатия и команды)</span></li>
<li class="rvps15"><span class="rvts22">опционально может хранить или не хранить карту Горячих Правок</span></li>
<li class="rvps15"><span class="rvts22">реализует копирование Ввода из мувика себе в Журнал, а также опциональное копирование карты Горячих Правок</span></li>
<li class="rvps15"><span class="rvts22">реализует детали полного/частичного восстановления данных из снимка: Ввода, карты Горячих Правок</span></li>
<li class="rvps15"><span class="rvts22">реализует компрессию и декомпрессию хранимых данных</span></li>
<li class="rvps15"><span class="rvts22">сохраняет и загружает свои данные из файла проекта, при ошибке загрузки передаёт сигнал выше</span></li>
<li class="rvps15"><span class="rvts22">реализует поиск первого несовпадения в содержимом двух снимков или в содержимом данного снимка и текущего состояния мувика</span></li>
<li class="rvps15"><span class="rvts22">предоставляет интерфейс для чтения отдельно взятых данных: чтение Ввода отдельного кадра, чтение любой ячейки карты горячих правок</span></li>
<li class="rvps15"><span class="rvts22">реализует все операции с картами Горячих Правок: копирование, частичное копирование, обновление/угасание, установка новых точек на карте горячих правок, сравнением Ввода двух снимков</span></li>
<li class="rvps10"><span class="rvts22">хранит снимок Ввода мувика: размер и содержимое Ввода для всех кадров (кнопочные нажатия и команды)</span></li>
<li class="rvps10"><span class="rvts22">опционально может хранить или не хранить карту Горячих Правок</span></li>
<li class="rvps10"><span class="rvts22">реализует копирование Ввода из мувика себе в Журнал, а также опциональное копирование карты Горячих Правок</span></li>
<li class="rvps10"><span class="rvts22">реализует детали полного/частичного восстановления данных из снимка: Ввода, карты Горячих Правок</span></li>
<li class="rvps10"><span class="rvts22">реализует компрессию и декомпрессию хранимых данных</span></li>
<li class="rvps10"><span class="rvts22">сохраняет и загружает свои данные из файла проекта, при ошибке загрузки передаёт сигнал выше</span></li>
<li class="rvps10"><span class="rvts22">реализует поиск первого несовпадения в содержимом двух снимков или в содержимом данного снимка и текущего состояния мувика</span></li>
<li class="rvps10"><span class="rvts22">предоставляет интерфейс для чтения отдельно взятых данных: чтение Ввода отдельного кадра, чтение любой ячейки карты горячих правок</span></li>
<li class="rvps10"><span class="rvts22">реализует все операции с картами Горячих Правок: копирование, частичное копирование, обновление/угасание, установка новых точек на карте горячих правок, сравнением Ввода двух снимков</span></li>
</ul>
<p class="rvps15"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts21">laglog.cpp</span></p>
<p class="rvps10"><span class="rvts22">LagLog :Журнал лага (Log og Lag appearance)</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">хранит данные о наличии/отсутствии лага для каждого кадра мувика</span></li>
<li class="rvps15"><span class="rvts22">реализует компрессию и декомпрессию хранимых данных</span></li>
<li class="rvps15"><span class="rvts22">сохраняет и загружает свои данные из файла проекта, при ошибке загрузки передаёт сигнал выше</span></li>
<li class="rvps15"><span class="rvts22">предоставляет интерфейс для чтения и записи в Журнал лага</span></li>
<li class="rvps10"><span class="rvts22">хранит данные о наличии/отсутствии лага для каждого кадра мувика</span></li>
<li class="rvps10"><span class="rvts22">реализует компрессию и декомпрессию хранимых данных</span></li>
<li class="rvps10"><span class="rvts22">сохраняет и загружает свои данные из файла проекта, при ошибке загрузки передаёт сигнал выше</span></li>
<li class="rvps10"><span class="rvts22">предоставляет интерфейс для чтения и записи в Журнал лага</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts21">markers.cpp</span></p>
<p class="rvps10"><span class="rvts22">Markers Моментальный снимок состояния маркеров (Snapshot of Markers state)</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">хранит данные о состоянии Маркеров: массив распределения Маркеров по кадрам и массив Заметок</span></li>
<li class="rvps15"><span class="rvts22">реализует компрессию и декомпрессию хранимых данных</span></li>
<li class="rvps15"><span class="rvts22">сохраняет и загружает свои данные из файла проекта, при ошибке загрузки передаёт сигнал выше</span></li>
<li class="rvps15"><span class="rvts22">Хранит ресурсы: максимальная длина Заметки</span></li>
<li class="rvps10"><span class="rvts22">хранит данные о состоянии Маркеров: массив распределения Маркеров по кадрам и массив Заметок</span></li>
<li class="rvps10"><span class="rvts22">реализует компрессию и декомпрессию хранимых данных</span></li>
<li class="rvps10"><span class="rvts22">сохраняет и загружает свои данные из файла проекта, при ошибке загрузки передаёт сигнал выше</span></li>
<li class="rvps10"><span class="rvts22">Хранит ресурсы: максимальная длина Заметки</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts21">popup_display.cpp</span></p>
<p class="rvps10"><span class="rvts22">Popup display Менеджер всплывающих окон (Manager of popup windows)</span></p>
<p class="rvps10"><span class="rvts44">[единичный экземпляр]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">реализует все операции с всплывающими окнами: инициализацию, перерисовку, центрирование, декомпрессию и конвертирование скриншотов</span></li>
<li class="rvps15"><span class="rvts22">Регулярно отслеживает изменения Менеджера закладок и запускает/обновляет/закрывает всплывающие окна</span></li>
<li class="rvps15"><span class="rvts22">по требованию: обновляет содержимое всплывающих окон</span></li>
<li class="rvps15"><span class="rvts22">Хранит ресурсы: координаты и внешний вид всплывающих окон, тайминги всплывания/исчезания</span></li>
<li class="rvps10"><span class="rvts22">реализует все операции с всплывающими окнами: инициализацию, перерисовку, центрирование, декомпрессию и конвертирование скриншотов</span></li>
<li class="rvps10"><span class="rvts22">Регулярно отслеживает изменения Менеджера закладок и запускает/обновляет/закрывает всплывающие окна</span></li>
<li class="rvps10"><span class="rvts22">по требованию: обновляет содержимое всплывающих окон</span></li>
<li class="rvps10"><span class="rvts22">Хранит ресурсы: координаты и внешний вид всплывающих окон, тайминги всплывания/исчезания</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts21">history.cpp</span></p>
<p class="rvps10"><span class="rvts22">History История изменений мувика (History of movie modifications)</span></p>
<p class="rvps10"><span class="rvts44">[единичный экземпляр]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">хранит массив записей в Журнал Истории (снимки мувика, резервные копии Закладок, резервные копии номера текущей Закладки) и указатель на текущий снимок</span></li>
<li class="rvps15"><span class="rvts22">сохраняет и загружает массив снимков из файла проекта, при ошибке загрузки очищает массив и начинает новую историю со снимка текущего состояния мувика</span></li>
<li class="rvps15"><span class="rvts22">по требованию: проверяет различия между последним снимком и текущим мувиком, принимает решение о необходимости создания новой точки отката. А в особых случаях может создать точку отката без проверки изменений, полагаясь, что вызывающий модуль сам проверил различия</span></li>
<li class="rvps15"><span class="rvts22">реализует все операции восстановления состояния мувика: откат (undo), повторение (redo), возврат на произвольный снимок из массива</span></li>
<li class="rvps15"><span class="rvts22">дополнительно хранит состояние курсора-указки</span></li>
<li class="rvps15"><span class="rvts22">Регулярно следит за обновлением состояние курсора-указки</span></li>
<li class="rvps15"><span class="rvts22">Регулярно (во время паузы эмулятора) ищет в Журнале несжатые пункты и сжимает первый попавшийся</span></li>
<li class="rvps15"><span class="rvts22">реализует всю логику работы Списка истории: создание, перерисовка, щелчки, автоскроллинг</span></li>
<li class="rvps15"><span class="rvts22">Хранит ресурсы: идентификатор сохранения, идентификаторы и текстовые обозначения всех возможных типов изменения мувика, тайминг указки</span></li>
<li class="rvps10"><span class="rvts22">хранит массив записей в Журнал Истории (снимки мувика, резервные копии Закладок, резервные копии номера текущей Закладки) и указатель на текущий снимок</span></li>
<li class="rvps10"><span class="rvts22">сохраняет и загружает массив снимков из файла проекта, при ошибке загрузки очищает массив и начинает новую историю со снимка текущего состояния мувика</span></li>
<li class="rvps10"><span class="rvts22">по требованию: проверяет различия между последним снимком и текущим мувиком, принимает решение о необходимости создания новой точки отката. А в особых случаях может создать точку отката без проверки изменений, полагаясь, что вызывающий модуль сам проверил различия</span></li>
<li class="rvps10"><span class="rvts22">реализует все операции восстановления состояния мувика: откат (undo), повторение (redo), возврат на произвольный снимок из массива</span></li>
<li class="rvps10"><span class="rvts22">дополнительно хранит состояние курсора-указки</span></li>
<li class="rvps10"><span class="rvts22">Регулярно следит за обновлением состояние курсора-указки</span></li>
<li class="rvps10"><span class="rvts22">Регулярно (во время паузы эмулятора) ищет в Журнале несжатые пункты и сжимает первый попавшийся</span></li>
<li class="rvps10"><span class="rvts22">реализует всю логику работы Списка истории: создание, перерисовка, щелчки, автоскроллинг</span></li>
<li class="rvps10"><span class="rvts22">Хранит ресурсы: идентификатор сохранения, идентификаторы и текстовые обозначения всех возможных типов изменения мувика, тайминг указки</span></li>
</ul>
<p class="rvps15"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts21">piano_roll.cpp</span></p>
<p class="rvps10"><span class="rvts22">Piano Roll интерфейс в виде перфоленты (Piano Roll interface)</span></p>
<p class="rvps10"><span class="rvts44">[единичный экземпляр]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">реализует всю логику работы Списка Piano Roll: создание, перерисовка, скроллинг, наведение, щелчки, перетаскивание</span></li>
<li class="rvps15"><span class="rvts22">регулярно обновляет размер Списка в соответствии с размером Ввода мувика</span></li>
<li class="rvps15"><span class="rvts22">по требованию: скроллирует видимую область Списка к указанному элементу или позиции: к Курсору Проигрывателя, к Курсору Выделения, к курсору-указке, к целевому кадру Проигрывателя, к Маркеру</span></li>
<li class="rvps15"><span class="rvts22">сохраняет и загружает текущую позицию вертикального скроллинга из файла проекта, при ошибке загрузки скроллирует список в начало</span></li>
<li class="rvps15"><span class="rvts22">реализует все операции с Заголовком Списка: создание, перерисовка, анимация, наведение мышью, щелчки</span></li>
<li class="rvps15"><span class="rvts22">регулярно подсвечивает символы Заголовка в соответствии с текущими данными от Рекордера</span></li>
<li class="rvps15"><span class="rvts22">по требованию: запускает вспышки символов Заголовка</span></li>
<li class="rvps15"><span class="rvts22">реализует всю логику работы колеса мыши: скроллинг Списка, навигация Курсором Проигрывателя, навигация Курсором Выделения, пересечение пустот колесом</span></li>
<li class="rvps15"><span class="rvts22">реализует контекстное меню по правому щелчку</span></li>
<li class="rvps15"><span class="rvts22">Хранит ресурсы: идентификатор сохранения, идентификаторы колонок списка, ширины колонок списка, таблицы цветов ячеек, градиент карты Горячих Правок, градиент вспышек символов Заголовка, тайминги вспышек, все шрифты Тасэдитора, изображения</span></li>
<li class="rvps10"><span class="rvts22">реализует всю логику работы Списка Piano Roll: создание, перерисовка, скроллинг, наведение, щелчки, перетаскивание</span></li>
<li class="rvps10"><span class="rvts22">регулярно обновляет размер Списка в соответствии с размером Ввода мувика</span></li>
<li class="rvps10"><span class="rvts22">по требованию: скроллирует видимую область Списка к указанному элементу или позиции: к Курсору Проигрывателя, к Курсору Выделения, к курсору-указке, к целевому кадру Проигрывателя, к Маркеру</span></li>
<li class="rvps10"><span class="rvts22">сохраняет и загружает текущую позицию вертикального скроллинга из файла проекта, при ошибке загрузки скроллирует список в начало</span></li>
<li class="rvps10"><span class="rvts22">реализует все операции с Заголовком Списка: создание, перерисовка, анимация, наведение мышью, щелчки</span></li>
<li class="rvps10"><span class="rvts22">регулярно подсвечивает символы Заголовка в соответствии с текущими данными от Рекордера</span></li>
<li class="rvps10"><span class="rvts22">по требованию: запускает вспышки символов Заголовка</span></li>
<li class="rvps10"><span class="rvts22">реализует всю логику работы колеса мыши: скроллинг Списка, навигация Курсором Проигрывателя, навигация Курсором Выделения, пересечение пустот колесом</span></li>
<li class="rvps10"><span class="rvts22">реализует контекстное меню по правому щелчку</span></li>
<li class="rvps10"><span class="rvts22">Хранит ресурсы: идентификатор сохранения, идентификаторы колонок списка, ширины колонок списка, таблицы цветов ячеек, градиент карты Горячих Правок, градиент вспышек символов Заголовка, тайминги вспышек, все шрифты Тасэдитора, изображения</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts21">selection.cpp</span></p>
<p class="rvps10"><span class="rvts22">Selection Менеджер выделений (Manager of selections)</span></p>
<p class="rvps10"><span class="rvts44">[единичный экземпляр]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">содержит определение типа данных "Набор выделенных кадров"</span></li>
<li class="rvps15"><span class="rvts22">хранит массив наборов выделенных кадров ("история выделений")</span></li>
<li class="rvps15"><span class="rvts22">сохраняет и загружает массив выделений из файла проекта, при ошибке загрузки очищает массив и начинает новую историю с пустого выделения</span></li>
<li class="rvps15"><span class="rvts22">постоянно отслеживает изменения выделенных строк в Списке и принимает решение о необходимости создания новой точки отката выделений</span></li>
<li class="rvps15"><span class="rvts22">реализует все операции восстановления состояния выделения: откат выделения (selection undo), повторение выделения (selection redo)</span></li>
<li class="rvps15"><span class="rvts22">по требованию: изменяет текущее выделение: очистить выделение, прыгнуть Курсором Выделения на указанный кадр, выделить регион, выделить всё, выделить между Маркерами, выделить содержимое Буфера Обмена</span></li>
<li class="rvps15"><span class="rvts22">Регулярно проверяет выход текущего выделения за рамки Списка и при необходимости корректирует текущее выделение, определяет факт перехода выделения на другой Маркер и обновляет Заметку в нижнем текстовом поле</span></li>
<li class="rvps15"><span class="rvts22">реализует логику работы нижних кнопок &lt;&lt; и &gt;&gt; (прыжки Курсора Выделения по Маркерам)</span></li>
<li class="rvps15"><span class="rvts22">здесь же размещается код нижнего текстового поля для редактирования Заметок</span></li>
<li class="rvps15"><span class="rvts22">Хранит ресурсы: идентификатор сохранения, префикс подписи к нижнему полю</span></li>
<li class="rvps10"><span class="rvts22">содержит определение типа данных "Набор выделенных кадров"</span></li>
<li class="rvps10"><span class="rvts22">хранит массив наборов выделенных кадров ("история выделений")</span></li>
<li class="rvps10"><span class="rvts22">сохраняет и загружает массив выделений из файла проекта, при ошибке загрузки очищает массив и начинает новую историю с пустого выделения</span></li>
<li class="rvps10"><span class="rvts22">постоянно отслеживает изменения выделенных строк в Списке и принимает решение о необходимости создания новой точки отката выделений</span></li>
<li class="rvps10"><span class="rvts22">реализует все операции восстановления состояния выделения: откат выделения (selection undo), повторение выделения (selection redo)</span></li>
<li class="rvps10"><span class="rvts22">по требованию: изменяет текущее выделение: очистить выделение, прыгнуть Курсором Выделения на указанный кадр, выделить регион, выделить всё, выделить между Маркерами, выделить содержимое Буфера Обмена</span></li>
<li class="rvps10"><span class="rvts22">Регулярно проверяет выход текущего выделения за рамки Списка и при необходимости корректирует текущее выделение, определяет факт перехода выделения на другой Маркер и обновляет Заметку в нижнем текстовом поле</span></li>
<li class="rvps10"><span class="rvts22">реализует логику работы нижних кнопок &lt;&lt; и &gt;&gt; (прыжки Курсора Выделения по Маркерам)</span></li>
<li class="rvps10"><span class="rvts22">здесь же размещается код нижнего текстового поля для редактирования Заметок</span></li>
<li class="rvps10"><span class="rvts22">Хранит ресурсы: идентификатор сохранения, префикс подписи к нижнему полю</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts21">editor.cpp</span></p>
<p class="rvps10"><span class="rvts22">Editor Инструмент для редактирования (Tool for editing)</span></p>
<p class="rvps10"><span class="rvts44">[единичный экземпляр]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">реализует операции изменения Ввода: установка/снятие Ввода на заданном участке, установка по шаблону, установка в Выделении, установка по шаблону в Выделении</span></li>
<li class="rvps15"><span class="rvts22">реализует операции изменения Маркеров: установка/снятие в Выделении, установка по шаблону в Выделении, установка всех в Выделении, снятие всех в Выделении</span></li>
<li class="rvps15"><span class="rvts22">Хранит данные Шаблонов и код их загрузки/генерации</span></li>
<li class="rvps15"><span class="rvts22">Хранит ресурсы: имя файла шаблонов, идентификатор нажатия кнопки в шаблонах</span></li>
<li class="rvps10"><span class="rvts22">реализует операции изменения Ввода: установка/снятие Ввода на заданном участке, установка по шаблону, установка в Выделении, установка по шаблону в Выделении</span></li>
<li class="rvps10"><span class="rvts22">реализует операции изменения Маркеров: установка/снятие в Выделении, установка по шаблону в Выделении, установка всех в Выделении, снятие всех в Выделении</span></li>
<li class="rvps10"><span class="rvts22">Хранит данные Шаблонов и код их загрузки/генерации</span></li>
<li class="rvps10"><span class="rvts22">Хранит ресурсы: имя файла шаблонов, идентификатор нажатия кнопки в шаблонах</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts21">splicer.cpp</span></p>
<p class="rvps10"><span class="rvts22">Splicer Инструмент для монтажа (Tool for montage)</span></p>
<p class="rvps10"><span class="rvts44">[единичный экземпляр]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">реализует все операции массового редактирования Ввода: копипаст, клонирование, очистка региона, вставка и удаление кадров, обрезка</span></li>
<li class="rvps15"><span class="rvts22">хранит данные о выделении, использованном при последнем копировании в Буфер Обмена</span></li>
<li class="rvps15"><span class="rvts22">Регулярно проверяет состояние текущего выделения и выводит информацию о нём на панель, также выводит информацию о данных в Буфере Обмена</span></li>
<li class="rvps15"><span class="rvts22">при запуске Тасэдитора проверяет содержимое Буфера Обмена</span></li>
<li class="rvps15"><span class="rvts22">Хранит ресурсы: символьные коды кнопок Ввода, текст для информационной панели Splicer</span></li>
<li class="rvps10"><span class="rvts22">реализует все операции массового редактирования Ввода: копипаст, клонирование, очистка региона, вставка и удаление кадров, обрезка</span></li>
<li class="rvps10"><span class="rvts22">хранит данные о выделении, использованном при последнем копировании в Буфер Обмена</span></li>
<li class="rvps10"><span class="rvts22">Регулярно проверяет состояние текущего выделения и выводит информацию о нём на панель, также выводит информацию о данных в Буфере Обмена</span></li>
<li class="rvps10"><span class="rvts22">при запуске Тасэдитора проверяет содержимое Буфера Обмена</span></li>
<li class="rvps10"><span class="rvts22">Хранит ресурсы: символьные коды кнопок Ввода, текст для информационной панели Splicer</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts21">taseditor_config.cpp</span></p>
<p class="rvps10"><span class="rvts22">Config текущая конфигурация (Current settings)</span></p>
<p class="rvps10"><span class="rvts44">[единичный экземпляр]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">хранит состояние всех настроек Тасэдитора</span></li>
<li class="rvps15"><span class="rvts22">все модули Тасэдитора могут обращаться к этому классу для получения или изменения текущих настроек</span></li>
<li class="rvps15"><span class="rvts22">при запуске FCEUX эмулятор записывает данные из файла fceux.cfg в этот класс, при выходе считывает данные из этого класса в файл fceux.cfg</span></li>
<li class="rvps15"><span class="rvts22">Хранит ресурсы: значения настроек по умолчанию, предельные значения настроек</span></li>
<li class="rvps10"><span class="rvts22">хранит состояние всех настроек Тасэдитора</span></li>
<li class="rvps10"><span class="rvts22">все модули Тасэдитора могут обращаться к этому классу для получения или изменения текущих настроек</span></li>
<li class="rvps10"><span class="rvts22">при запуске FCEUX эмулятор записывает данные из файла fceux.cfg в этот класс, при выходе считывает данные из этого класса в файл fceux.cfg</span></li>
<li class="rvps10"><span class="rvts22">Хранит ресурсы: значения настроек по умолчанию, предельные значения настроек</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts21">playback.cpp</span></p>
<p class="rvps10"><span class="rvts22">Playback проигрыватель состояний эмулятора (Player of emulation states)</span></p>
<p class="rvps10"><span class="rvts44">[единичный экземпляр]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">реализует функции проигрывателя мувика: показ любого кадра (прыжок), запуск/отмена добегания к указанному кадру, пауза, перемотка</span></li>
<li class="rvps15"><span class="rvts22">Регулярно следит за изменениями текущего кадра эмуляции (и управляет эмулятором), вызывает перерисовку соответствующих ячеек Списка, останавливает добегание при достижении цели, анимирует перерисовку кадра цели, обеспечивает следование Списка за курсором, определяет факт перехода курсора на другой маркер и обновляет текст в верхнем поле</span></li>
<li class="rvps15"><span class="rvts22">реализует логику работы верхних кнопок &lt;&lt; и &gt;&gt; (прыжки курсора по маркерам)</span></li>
<li class="rvps15"><span class="rvts22">реализует логику работы кнопок &lt; и &gt; (покадровое перемещение курсора)</span></li>
<li class="rvps15"><span class="rvts22">реализует логику работы кнопки || (пауза) и средней кнопки мыши, а также реагирует на внешние изменения паузы эмуляции</span></li>
<li class="rvps15"><span class="rvts22">реализует все операции с прогрессбаром: сброс, установка значений, щелчки (отмена добегания)</span></li>
<li class="rvps15"><span class="rvts22">здесь же размещается код верхнего поля для редактирования Заметок</span></li>
<li class="rvps15"><span class="rvts22">Хранит ресурсы: префикс подписи к верхнему полю, тайминги анимации кадра цели, длительность задержки перед повторным срабатыванием зажатых кнопок GUI, масштаб прогрессбара</span></li>
<li class="rvps10"><span class="rvts22">реализует функции проигрывателя мувика: показ любого кадра (прыжок), запуск/отмена добегания к указанному кадру, пауза, перемотка</span></li>
<li class="rvps10"><span class="rvts22">Регулярно следит за изменениями текущего кадра эмуляции (и управляет эмулятором), вызывает перерисовку соответствующих ячеек Списка, останавливает добегание при достижении цели, анимирует перерисовку кадра цели, обеспечивает следование Списка за курсором, определяет факт перехода курсора на другой маркер и обновляет текст в верхнем поле</span></li>
<li class="rvps10"><span class="rvts22">реализует логику работы верхних кнопок &lt;&lt; и &gt;&gt; (прыжки курсора по маркерам)</span></li>
<li class="rvps10"><span class="rvts22">реализует логику работы кнопок &lt; и &gt; (покадровое перемещение курсора)</span></li>
<li class="rvps10"><span class="rvts22">реализует логику работы кнопки || (пауза) и средней кнопки мыши, а также реагирует на внешние изменения паузы эмуляции</span></li>
<li class="rvps10"><span class="rvts22">реализует все операции с прогрессбаром: сброс, установка значений, щелчки (отмена добегания)</span></li>
<li class="rvps10"><span class="rvts22">здесь же размещается код верхнего поля для редактирования Заметок</span></li>
<li class="rvps10"><span class="rvts22">Хранит ресурсы: префикс подписи к верхнему полю, тайминги анимации кадра цели, длительность задержки перед повторным срабатыванием зажатых кнопок GUI, масштаб прогрессбара</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts21">greenzone.cpp</span></p>
<p class="rvps10"><span class="rvts22">Greenzone зона доступа (Access zone)</span></p>
<p class="rvps10"><span class="rvts44">[единичный экземпляр]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">хранит массив сэйвов, используемых для ускорения перехода Проигрывателя на любой указанный кадр</span></li>
<li class="rvps15"><span class="rvts22">также хранит журнал проявлений лага в кадрах</span></li>
<li class="rvps15"><span class="rvts22">сохраняет и загружает массив сэйвов и историю лага из файла проекта, при ошибке загрузки гринзона усекается до последнего успешно загруженного сэйва</span></li>
<li class="rvps15"><span class="rvts22">Регулярно проверяет наличие сэйва для текущего кадра в своём массиве, при отсутствии создаёт его, а также записывает информацию о проявлении лага в предыдущем кадре</span></li>
<li class="rvps15"><span class="rvts22">реализует авто-подгонку Ввода по лагу</span></li>
<li class="rvps15"><span class="rvts22">Регулярно производит постепенную очистку массива сэйвов для экономии памяти, удаляя самые старые сэйвы</span></li>
<li class="rvps15"><span class="rvts22">по требованию: (при изменении Ввода мувика) усекает размеры Гринзоны, удаляя сэйвы, ставшие неактуальными вследствие изменения Ввода. После усечения может также переместить Курсор Проигрывателя (который обязан всегда находиться внутри Гринзоны), а также запустить добегание к цели</span></li>
<li class="rvps15"><span class="rvts22">Хранит ресурсы: идентификатор сохранения, настройки постепенной очистки, тайминг очистки</span></li>
<li class="rvps10"><span class="rvts22">хранит массив сэйвов, используемых для ускорения перехода Проигрывателя на любой указанный кадр</span></li>
<li class="rvps10"><span class="rvts22">также хранит журнал проявлений лага в кадрах</span></li>
<li class="rvps10"><span class="rvts22">сохраняет и загружает массив сэйвов и историю лага из файла проекта, при ошибке загрузки гринзона усекается до последнего успешно загруженного сэйва</span></li>
<li class="rvps10"><span class="rvts22">Регулярно проверяет наличие сэйва для текущего кадра в своём массиве, при отсутствии создаёт его, а также записывает информацию о проявлении лага в предыдущем кадре</span></li>
<li class="rvps10"><span class="rvts22">реализует авто-подгонку Ввода по лагу</span></li>
<li class="rvps10"><span class="rvts22">Регулярно производит постепенную очистку массива сэйвов для экономии памяти, удаляя самые старые сэйвы</span></li>
<li class="rvps10"><span class="rvts22">по требованию: (при изменении Ввода мувика) усекает размеры Гринзоны, удаляя сэйвы, ставшие неактуальными вследствие изменения Ввода. После усечения может также переместить Курсор Проигрывателя (который обязан всегда находиться внутри Гринзоны), а также запустить добегание к цели</span></li>
<li class="rvps10"><span class="rvts22">Хранит ресурсы: идентификатор сохранения, настройки постепенной очистки, тайминг очистки</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts21">recorder.cpp</span></p>
<p class="rvps10"><span class="rvts22">Recorder инструмент для записи Ввода (Tool for input recording)</span></p>
<p class="rvps10"><span class="rvts44">[единичный экземпляр]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">в момент записи кнопочных нажатий в мувик (в самом конце кадра) по сигналу эмулятора перехватывает запись и накладывает свои фильтры мультитрекинга, а затем отражает изменения Ввода в Истории и Гринзоне</span></li>
<li class="rvps15"><span class="rvts22">Регулярно отслеживает нажатые кнопки виртуальных джойстиков и предоставляет данные для подсветки символов Заголовка Списка. Также реагирует на использование хоткея Switch Read Only и обновляет элементы интерфейса на панели Recorder и заголовок панели Закладок</span></li>
<li class="rvps15"><span class="rvts22">реализует функцию редактирования Ввода в режиме Read Only (ColumnSet кнопками виртуального джойстика)</span></li>
<li class="rvps15"><span class="rvts22">Хранит ресурсы: идентификаторы и текстовые обозначения режимов мультитрекинга, суффиксы для заголовка окна TAS Editor</span></li>
<li class="rvps10"><span class="rvts22">в момент записи кнопочных нажатий в мувик (в самом конце кадра) по сигналу эмулятора перехватывает запись и накладывает свои фильтры мультитрекинга, а затем отражает изменения Ввода в Истории и Гринзоне</span></li>
<li class="rvps10"><span class="rvts22">Регулярно отслеживает нажатые кнопки виртуальных джойстиков и предоставляет данные для подсветки символов Заголовка Списка. Также реагирует на использование хоткея Switch Read Only и обновляет элементы интерфейса на панели Recorder и заголовок панели Закладок</span></li>
<li class="rvps10"><span class="rvts22">реализует функцию редактирования Ввода в режиме Read Only (ColumnSet кнопками виртуального джойстика)</span></li>
<li class="rvps10"><span class="rvts22">Хранит ресурсы: идентификаторы и текстовые обозначения режимов мультитрекинга, суффиксы для заголовка окна TAS Editor</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts21">markers_manager.cpp</span></p>
<p class="rvps10"><span class="rvts22">Markers_manager Менеджер Маркеров (Manager of Markers)</span></p>
<p class="rvps10"><span class="rvts44">[единичный экземпляр]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">хранит один снимок состояния Маркеров, отвечающий за текущее (актуальное) состояние Маркеров в проекте</span></li>
<li class="rvps15"><span class="rvts22">сохраняет и загружает свои данные из файла проекта, при ошибке загрузки очищает данные</span></li>
<li class="rvps15"><span class="rvts22">Регулярно следит, чтобы размер массива Маркеров был не меньше количества кадров в мувике</span></li>
<li class="rvps15"><span class="rvts22">реализует все операции с Маркерами: установка Маркера на кадр, удаление Маркера, вставка и удаление кадров между Маркерами, усечение массива Маркеров, изменение Заметок, поиск кадра по номеру Маркера, интерфейс доступа к данным внутри снимка состояния Маркеров</span></li>
<li class="rvps15"><span class="rvts22">реализует копирование данных между снимками состояния Маркеров, а также поиск первого несовпадения в содержимом двух снимков состояния Маркеров</span></li>
<li class="rvps15"><span class="rvts22">здесь же размещается код поиска "похожих" Заметок</span></li>
<li class="rvps15"><span class="rvts22">здесь же размещается код редактирования Заметок к Маркерам</span></li>
<li class="rvps15"><span class="rvts22">здесь же размещается код диалога Find Note</span></li>
<li class="rvps15"><span class="rvts22">Хранит ресурсы: идентификатор сохранения, настройки поиска похожих Заметок</span></li>
<li class="rvps10"><span class="rvts22">хранит один снимок состояния Маркеров, отвечающий за текущее (актуальное) состояние Маркеров в проекте</span></li>
<li class="rvps10"><span class="rvts22">сохраняет и загружает свои данные из файла проекта, при ошибке загрузки очищает данные</span></li>
<li class="rvps10"><span class="rvts22">Регулярно следит, чтобы размер массива Маркеров был не меньше количества кадров в мувике</span></li>
<li class="rvps10"><span class="rvts22">реализует все операции с Маркерами: установка Маркера на кадр, удаление Маркера, вставка и удаление кадров между Маркерами, усечение массива Маркеров, изменение Заметок, поиск кадра по номеру Маркера, интерфейс доступа к данным внутри снимка состояния Маркеров</span></li>
<li class="rvps10"><span class="rvts22">реализует копирование данных между снимками состояния Маркеров, а также поиск первого несовпадения в содержимом двух снимков состояния Маркеров</span></li>
<li class="rvps10"><span class="rvts22">здесь же размещается код поиска "похожих" Заметок</span></li>
<li class="rvps10"><span class="rvts22">здесь же размещается код редактирования Заметок к Маркерам</span></li>
<li class="rvps10"><span class="rvts22">здесь же размещается код диалога Find Note</span></li>
<li class="rvps10"><span class="rvts22">Хранит ресурсы: идентификатор сохранения, настройки поиска похожих Заметок</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts21">taseditor_lua.cpp</span></p>
<p class="rvps10"><span class="rvts22">Lua Менеджер возможностей Луа (Manager of Lua features)</span></p>
<p class="rvps10"><span class="rvts44">[единичный экземпляр]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">реализует логику всех функций Lua-библиотеки taseditor</span></li>
<li class="rvps15"><span class="rvts22">содержит список отложенных изменений Ввода</span></li>
<li class="rvps15"><span class="rvts22">по требованию (от FCEUX Lua engine): обновляет кнопку "</span><span class="rvts32">Run function</span><span class="rvts22">"</span></li>
<li class="rvps15"><span class="rvts22">Хранит ресурсы: идентификаторы джойпадов для изменений Ввода, максимальная длина имени для функции </span><span class="rvts21">applychanges()</span><span class="rvts22">, текст для кнопки "</span><span class="rvts32">Run function</span><span class="rvts22">" по умолчанию</span></li>
<li class="rvps10"><span class="rvts22">реализует логику всех функций Lua-библиотеки taseditor</span></li>
<li class="rvps10"><span class="rvts22">содержит список отложенных изменений Ввода</span></li>
<li class="rvps10"><span class="rvts22">по требованию (от FCEUX Lua engine): обновляет кнопку "</span><span class="rvts32">Run function</span><span class="rvts22">"</span></li>
<li class="rvps10"><span class="rvts22">Хранит ресурсы: идентификаторы джойпадов для изменений Ввода, максимальная длина имени для функции </span><span class="rvts21">applychanges()</span><span class="rvts22">, текст для кнопки "</span><span class="rvts32">Run function</span><span class="rvts22">" по умолчанию</span></li>
</ul>
<p class="rvps15"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts21">taseditor_project.cpp</span></p>
<p class="rvps10"><span class="rvts22">Project Менеджер рабочего проекта (Manager of working project)</span></p>
<p class="rvps10"><span class="rvts44">[единичный экземпляр]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">хранит информацию о файловом имени проекта и о наличии несохранённых изменений</span></li>
<li class="rvps15"><span class="rvts22">реализует сохранение и загрузку проектов из файловой системы</span></li>
<li class="rvps15"><span class="rvts22">реализует функцию автоматического сохранения проекта</span></li>
<li class="rvps15"><span class="rvts22">Хранит ресурсы: масштаб настройки автосохранения, имя проекта по умолчанию</span></li>
<li class="rvps10"><span class="rvts22">хранит информацию о файловом имени проекта и о наличии несохранённых изменений</span></li>
<li class="rvps10"><span class="rvts22">реализует сохранение и загрузку проектов из файловой системы</span></li>
<li class="rvps10"><span class="rvts22">реализует функцию автоматического сохранения проекта</span></li>
<li class="rvps10"><span class="rvts22">Хранит ресурсы: масштаб настройки автосохранения, имя проекта по умолчанию, смещения для формата fm3</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts75">Модификация эмулятора</span></p>
<p class="rvps10"><span class="rvts76">Модификация эмулятора</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Тасэдитор требует внесения следующих модификаций в код самого эмулятора.</span></p>
@ -339,7 +343,7 @@
<li class="rvps10"><span class="rvts22">вызывать центральную функцию Тасэдитора после эмуляции каждого кадра, а также, когда эмулятор на паузе. Частота вызова должна быть не менее 20 раз в секунду (это требуется для плавности анимаций)</span></li>
<li class="rvps10"><span class="rvts22">передавать системные сообщения окну Тасэдитора, в том числе сообщения клавиатурных акселераторов</span></li>
<li class="rvps10"><span class="rvts22">если эмулятор не использует колесо мыши, он должен пересылать WM_MOUSEWHEEL Тасэдитору, а не игнорировать это сообщение. То же самое с обработкой средней кнопки</span></li>
<li class="rvps10"><span class="rvts22">при выходе из эмулятора, если запущен Тасэдитор, необходимо вызывать функцию AskSave(), чтобы Тасэдитор проверил наличие несохранённых изменений и позволил пользователю сохранить их. Если функция AskSave() возвращает </span><span class="rvts71">false</span><span class="rvts22">, отменять выход из эмулятора (это означает, что пользователь выбрал Отмену)</span></li>
<li class="rvps10"><span class="rvts22">при выходе из эмулятора, если запущен Тасэдитор, необходимо вызывать функцию AskSave(), чтобы Тасэдитор проверил наличие несохранённых изменений и позволил пользователю сохранить их. Если функция AskSave() возвращает </span><span class="rvts72">false</span><span class="rvts22">, отменять выход из эмулятора (это означает, что пользователь выбрал Отмену)</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">В модуль, ответственный за </span><span class="rvts26">Movie</span><span class="rvts22">:</span></p>
@ -371,8 +375,8 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">В модуль, ответственный за </span><span class="rvts26">Config</span><span class="rvts22">:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps10"><span class="rvts22">при запуске эмулятор должен загружать данные </span><span class="rvts71">taseditor_config</span><span class="rvts22"> из файла общих настроек эмулятора, если же файл не найден, не трогать </span><span class="rvts71">taseditor_config</span><span class="rvts22"> (тогда в нём останутся настроки по умолчанию)</span></li>
<li class="rvps10"><span class="rvts22">при выходе эмулятор должен сохранять данные </span><span class="rvts71">taseditor_config</span><span class="rvts22"> в файл общих настроек</span></li>
<li class="rvps10"><span class="rvts22">при запуске эмулятор должен загружать данные </span><span class="rvts72">taseditor_config</span><span class="rvts22"> из файла общих настроек эмулятора, если же файл не найден, не трогать </span><span class="rvts72">taseditor_config</span><span class="rvts22"> (тогда в нём останутся настроки по умолчанию)</span></li>
<li class="rvps10"><span class="rvts22">при выходе эмулятор должен сохранять данные </span><span class="rvts72">taseditor_config</span><span class="rvts22"> в файл общих настроек</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">В модуль, ответственный за </span><span class="rvts26">Lua engine</span><span class="rvts22">:</span></p>
@ -400,6 +404,7 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/help-authoring-tool">Single source CHM, PDF, DOC and HTML Help creation</a></p>
</div>

View File

@ -3,7 +3,7 @@
<head>
<title>1. Введение</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("Introduction");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("Introduction");
}
});
</script>
</head>
@ -52,6 +55,7 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">Введение</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
@ -68,29 +72,29 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Разработка инструментального комплекса под названием "TAS Editor" преследует две основные цели:</span></p>
<ol style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">понизить порог вхождения в ТАСинг</span></li>
<li class="rvps15"><span class="rvts22">повысить объективность анализа игрового процесса</span></li>
<li class="rvps14"><span class="rvts22">понизить порог вхождения в ТАСинг</span></li>
<li class="rvps14"><span class="rvts22">повысить объективность анализа игрового процесса</span></li>
</ol>
<p class="rvps15"><span class="rvts22"><br/></span></p>
<p class="rvps14"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Первая цель достигается с помощью детальной визуализации важнейших аспектов ТАСинга.</span></p>
<p class="rvps10"><span class="rvts22">Вторая цель достигается с помощью </span><span class="rvts22">перехода от линейного переписывания отрезков мувика к нелинейному редактированию Ввода. Более высокий уровень абстрагирования от правил проходимой игры </span><span class="rvts22">достигается за счёт появления у ТАСера новых возможностей:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps14"><span class="rvts0"><span class="rvts22">изменять Ввод в произвольной последовательности (а не только в той последовательности, в которой протекают события игры) </span></span><span class="rvts0"><span class="rvts30"></span></span><span class="rvts0"><span class="rvts22"> благодаря интерфейсу Piano Roll</span></span></li>
<li class="rvps14"><span class="rvts0"><span class="rvts22">просматривать игровые события в произвольном порядке (а не только кадр за кадром) </span></span><span class="rvts0"><span class="rvts30"></span></span><span class="rvts0"><span class="rvts22"> благодаря Гринзоне</span></span></li>
<li class="rvps14"><span class="rvts0"><span class="rvts22">акцентировать причинно-следственную связь между </span></span><span class="rvts0"><span class="rvts22">Ввод</span></span><span class="rvts0"><span class="rvts22">ом и его отдалёнными последствиями (а не только ближайшими) </span></span><span class="rvts0"><span class="rvts30"></span></span><span class="rvts0"><span class="rvts22"> благодаря функции турбо-добегания</span></span></li>
<li class="rvps14"><span class="rvts0"><span class="rvts22">возможность реализовать собственное логическое разбиение мувика на составные части (а не только на TV-кадры или на уровни игры) </span></span><span class="rvts0"><span class="rvts30"></span></span><span class="rvts0"><span class="rvts22"> благодаря Маркерам</span></span></li>
<li class="rvps15"><span class="rvts0"><span class="rvts22">изменять Ввод в произвольной последовательности (а не только в той последовательности, в которой протекают события игры) </span></span><span class="rvts0"><span class="rvts30"></span></span><span class="rvts0"><span class="rvts22"> благодаря интерфейсу Piano Roll</span></span></li>
<li class="rvps15"><span class="rvts0"><span class="rvts22">просматривать игровые события в произвольном порядке (а не только кадр за кадром) </span></span><span class="rvts0"><span class="rvts30"></span></span><span class="rvts0"><span class="rvts22"> благодаря Гринзоне</span></span></li>
<li class="rvps15"><span class="rvts0"><span class="rvts22">акцентировать причинно-следственную связь между </span></span><span class="rvts0"><span class="rvts22">Ввод</span></span><span class="rvts0"><span class="rvts22">ом и его отдалёнными последствиями (а не только ближайшими) </span></span><span class="rvts0"><span class="rvts30"></span></span><span class="rvts0"><span class="rvts22"> благодаря функции турбо-добегания</span></span></li>
<li class="rvps15"><span class="rvts0"><span class="rvts22">возможность реализовать собственное логическое разбиение мувика на составные части (а не только на TV-кадры или на уровни игры) </span></span><span class="rvts0"><span class="rvts30"></span></span><span class="rvts0"><span class="rvts22"> благодаря Маркерам</span></span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Кроме того, в TAS Editor 1.0 некоторые старые инструменты ТАСинга выведены на новый уровень:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">журнал Лага эволюция Счётчика Лага</span></li>
<li class="rvps15"><span class="rvts22">журнал Ввода эволюция Индикатора </span><span class="rvts22">Ввод</span><span class="rvts22">а</span></li>
<li class="rvps15"><span class="rvts22">пошаговый откат в дополнение к загрузкам старого состояния мувика</span></li>
<li class="rvps15"><span class="rvts22">встроенный редактор вместо хекс-редактора и Блокнота</span></li>
<li class="rvps15"><span class="rvts22">авто-идентификация текущего логического блока в дополнение к индикатору текущего кадра</span></li>
<li class="rvps15"><span class="rvts22">счётчик Выделения (линейка) в дополнение к счётчику кадров</span></li>
<li class="rvps15"><span class="rvts22">шаблоны вместо настроек Autofire</span></li>
<li class="rvps15"><span class="rvts22">Superimpose (наложение) вместо настроек Auto-hold</span></li>
<li class="rvps14"><span class="rvts22">журнал Лага эволюция Счётчика Лага</span></li>
<li class="rvps14"><span class="rvts22">журнал Ввода эволюция Индикатора </span><span class="rvts22">Ввод</span><span class="rvts22">а</span></li>
<li class="rvps14"><span class="rvts22">пошаговый откат в дополнение к загрузкам старого состояния мувика</span></li>
<li class="rvps14"><span class="rvts22">встроенный редактор вместо хекс-редактора и Блокнота</span></li>
<li class="rvps14"><span class="rvts22">авто-идентификация текущего логического блока в дополнение к индикатору текущего кадра</span></li>
<li class="rvps14"><span class="rvts22">счётчик Выделения (линейка) в дополнение к счётчику кадров</span></li>
<li class="rvps14"><span class="rvts22">шаблоны вместо настроек Autofire</span></li>
<li class="rvps14"><span class="rvts22">Superimpose (наложение) вместо настроек Auto-hold</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Запуская Тасэдитор, приготовьтесь к управлению игрой с высоты птичьего полёта. Следующие главы этого учебного курса расскажут вам почти всё, что нужно знать продуктивному ТАСеру. Если вы уже имеете опыт ТАСинга традиционным способом, некоторые аспекты обучения покажутся вам проще, а некоторые сложнее, чем для новичка. Так или иначе, постарайтесь прочитать этот учебник до конца, вы наверняка узнаете много нового о ТАСинге в целом.</span></p>
@ -104,10 +108,10 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Интересные факты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Во время разработки Тасэдитора на написание кода.ушло меньше времени, чем на продумывание способов усовершенствования рабочего процесса.</span></li>
<li class="rvps15"><span class="rvts22">Большинство действий в Тасэдиторе можно совершить несколькими способами.</span></li>
<li class="rvps15"><span class="rvts22">Любую совершённую операцию можно откатить или повторить.</span></li>
<li class="rvps15"><span class="rvts22">Можно полностью игнорировать любую часть функционала Тасэдитора, используя только приглянувшиеся фичи.</span></li>
<li class="rvps10"><span class="rvts22">Во время разработки Тасэдитора на написание кода.ушло меньше времени, чем на продумывание способов усовершенствования рабочего процесса.</span></li>
<li class="rvps10"><span class="rvts22">Большинство действий в Тасэдиторе можно совершить несколькими способами.</span></li>
<li class="rvps10"><span class="rvts22">Любую совершённую операцию можно откатить или повторить.</span></li>
<li class="rvps10"><span class="rvts22">Можно полностью игнорировать любую часть функционала Тасэдитора, используя только приглянувшиеся фичи.</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Особое внимание было уделено пользовательскому интерфейсу. Когда наберётесь опыта, сможете совершать многие действия машинально, не отвлекаясь от анализа игровой ситуации.</span></p>
@ -118,7 +122,7 @@
<p class="rvps10"><span class="rvts22">У программистов есть ценная традиция повышение читабельности кода с помощью комментариев. Это позволяет держать в голове более чёткую картину проекта и обходиться без постоянной перепроверки результатов, потому что в большинстве случаев результат весьма предсказуем, когда известен контекст.</span></p>
<p class="rvps10"><span class="rvts22">Более того, высокая читабельность кода позволяет при возвращении к отложенному проекту быстро освежить все необходимые воспоминания. Конечно, если этот проект добросовестно документировался.</span></p>
<p class="rvps10"><span class="rvts22">Тасэдитор помогает непринуждённо документировать свою работу прямо в процессе создания на лету писать комментарии, присваивать структурам (шаблонам и блокам </span><span class="rvts22">Ввод</span><span class="rvts22">а) понятные имена, тестировать различные версии кода в отдельных ветках репозитория (Дерева ответвлений), продуктивно работать в соавторстве. При этом от пользователя не требуется соблюдать какие-либо конвенции. Вы сами определяете правила оформления своего проекта. Например, если вы не поленились в первом уровне дать название использованному трюку, в следующих уровнях вы сможете продублировать нужную последовательность кнопок всего несколькими нажатиями клавиш, если поленились придётся отыскать место выполнения трюка вручную. В простеньких ТАСах можно обойтись без комментариев и долгосрочных планов, однако в сложных проектах этот функционал Тасэдитора может весьма пригодиться.</span></p>
<p class="rvps10"><span class="rvts22">Сайт </span><a class="rvts28" href="http://tasvideos.org" target="_blank">TASVideos.org</a><span class="rvts22"> поддерживает загрузку проектов Тасэдитора (fm3-файлов), так что вы можете делиться не только готовым мувиком, но и своими наработками, поощряя атмосферу открытости и взаимопомощи. Если не хотите делиться, можете экспортировать данные в формат fm2 и опубликовать только его.</span></p>
<p class="rvps10"><span class="rvts22">Сайт </span><a class="rvts28" href="http://tasvideos.org" target="_blank">TASVideos.org</a><span class="rvts22"> поддерживает загрузку и публикацию проектов Тасэдитора (fm3-файлов), так что вы можете делиться не только готовым мувиком, но и своими наработками, поощряя атмосферу открытости и взаимопомощи. Если не хотите делиться, можете экспортировать данные в формат fm2 и опубликовать только его.</span></p>
<p class="rvps10"><span class="rvts22">FM3-файлы проигрываются эмулятором FCEUX начиная с версии 2.2.0 точно так же, как FM2-файлы. В более ранних версиях FCEUX fm3-файлы также можно проиграть, предварительно поменяв расширение файла на fm2.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">В следующей главе: </span><a class="rvts29" href="ProgramInterface.html">обучение основам обращения с программой</a><span class="rvts22">.</span></p>
@ -127,6 +131,7 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/feature-tour/iphone-website-generation">Easily create iPhone documentation</a></p>
</div>

View File

@ -3,7 +3,7 @@
<head>
<title>Lua-функции</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("LuaAPI");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("LuaAPI");
}
});
</script>
</head>
@ -52,6 +55,7 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">Lua-функции</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
@ -99,17 +103,17 @@
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps10"><a name="registerauto"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">taseditor.registerauto(function func)</span></p>
<p class="rvps9"><span class="rvts70">taseditor.registerauto(function func)</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Регистрирует функцию ("Auto Function", Автофункция), которая будет периодически вызываться эмулятором. Можно зарегистрировать и исполнять Автофункцию, даже когда Тасэдитор не запущен.</span></p>
<p class="rvps10"><span class="rvts22">Когда FCEUX эмулирует игру, Автофункция запускается по окончании каждого кадра (то есть 60 раз в секунду в NTSC-играх и 50 раз в PAL).</span></p>
<p class="rvps10"><span class="rvts22">Когда FCEUX стоит на паузе, Автофункция запускается 20 раз в секунду.</span></p>
<p class="rvps10"><span class="rvts22">Пользователь может включать и отключать вызовы Автофункции с помощью галочки "Auto function" в интерфейсе Тасэдитора.</span></p>
<p class="rvps10"><span class="rvts22">Как и в случае с остальными регистрируемыми Луа-функциями в FCEUX, одновременно может быть зарегистрирована только одна Автофункция. Если вы зарегистрируете две Автофункции, вторая заменит первую, причём второй вызов </span><span class="rvts21">taseditor.registerauto()</span><span class="rvts22"> возвратит ссылку на код старой Автофункции. Вы можете удалить зарегистрированную Автофункцию, вызвав </span><span class="rvts21">taseditor.registerauto(</span><span class="rvts71">nil</span><span class="rvts21">)</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Как и в случае с остальными регистрируемыми Луа-функциями в FCEUX, одновременно может быть зарегистрирована только одна Автофункция. Если вы зарегистрируете две Автофункции, вторая заменит первую, причём второй вызов </span><span class="rvts21">taseditor.registerauto()</span><span class="rvts22"> возвратит ссылку на код старой Автофункции. Вы можете удалить зарегистрированную Автофункцию, вызвав </span><span class="rvts21">taseditor.registerauto(</span><span class="rvts72">nil</span><span class="rvts21">)</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Если скрипт заканчивает свою работу, а зарегистрированные функции остались, FCEUX не удаляет скрипт из памяти, чтобы была возможность вызывать эти функции. Скрипт завершается, если пользователь останавливает его вручную, или же если все зарегистрированные функции оказываются удалены.</span></p>
<p class="rvps10"><a name="registermanual"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">taseditor.registermanual(function func, [string name])</span></p>
<p class="rvps9"><span class="rvts70">taseditor.registermanual(function func, [string name])</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Регистрирует функцию ("Manual Function", Ручная функция), которая может быть вызвана пользователем Тасэдитора вручную. Можно зарегистрировать Ручную функцию даже когда Тасэдитор не запущен.</span></p>
<p class="rvps10"><span class="rvts22">Ручная функция не зависит от состояния паузы эмуляции. Она будет вызвана в конце кадра, в течение которого пользователь нажал кнопку </span><span class="rvts32">Run function</span><span class="rvts22"> в интерфейсе Тасэдитора.</span></p>
@ -117,30 +121,30 @@
<p class="rvps10"><span class="rvts22">Ручную функцию невозможно вызвать чаще, чем частота обновления окна Тасэдитора (60/50 FPS или 20FPS во время паузы).</span></p>
<p class="rvps10"><span class="rvts22">Выполнение Ручной функции расположено в коде FCEUX сразу после выполнения Автофункции.</span></p>
<p class="rvps10"><span class="rvts22">С помощью регистрации Луа-функций вы можете создавать новые инструменты для Тасэдитора. Например, можно написать скрипт, который инвертирует выделенный Ввод, так что пользователь сможет в любой момент выделить регион мувика и нажать кнопку </span><span class="rvts32">Run function</span><span class="rvts22"> для инвертирования Ввода в этом регионе.</span></p>
<p class="rvps10"><span class="rvts22">Как и в случае с остальными регистрируемыми Луа-функциями в FCEUX, одновременно может быть зарегистрирована только одна Ручная функция. Если вы зарегистрируете две Ручные функции, вторая заменит первую, причём второй вызов </span><span class="rvts21">taseditor.registermanual()</span><span class="rvts22"> возвратит ссылку на старую Ручную функцию. Вы можете удалить зарегистрированную Ручную функцию, вызвав </span><span class="rvts21">taseditor.registermanual(</span><span class="rvts71">nil</span><span class="rvts21">)</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Как и в случае с остальными регистрируемыми Луа-функциями в FCEUX, одновременно может быть зарегистрирована только одна Ручная функция. Если вы зарегистрируете две Ручные функции, вторая заменит первую, причём второй вызов </span><span class="rvts21">taseditor.registermanual()</span><span class="rvts22"> возвратит ссылку на старую Ручную функцию. Вы можете удалить зарегистрированную Ручную функцию, вызвав </span><span class="rvts21">taseditor.registermanual(</span><span class="rvts72">nil</span><span class="rvts21">)</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Если скрипт заканчивает свою работу, а зарегистрированные функции остались, FCEUX не удаляет скрипт из памяти, чтобы была возможность вызывать эти функции. Скрипт завершается, если пользователь останавливает его вручную, или же если все зарегистрированные функции оказываются удалены.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="engaged"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">bool taseditor.engaged()</span></p>
<p class="rvps9"><span class="rvts70">bool taseditor.engaged()</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Возвращает </span><span class="rvts71">true</span><span class="rvts22">, если Тасэдитор в данный момент запущен, иначе возвращает </span><span class="rvts71">false</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Возвращает </span><span class="rvts72">true</span><span class="rvts22">, если Тасэдитор в данный момент запущен, иначе возвращает </span><span class="rvts72">false</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Кроме того, когда Тасэдитор запущен, вызов функции </span><span class="rvts21">movie.mode()</span><span class="rvts22"> возвращает строку "taseditor".</span></p>
<p class="rvps10"><a name="markedframe"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">bool taseditor.markedframe(int frame)</span></p>
<p class="rvps9"><span class="rvts70">bool taseditor.markedframe(int frame)</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Возвращает </span><span class="rvts71">true</span><span class="rvts22">, если в текущем мувике на указанном кадре установлен Маркер, иначе возвращает </span><span class="rvts71">false</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, возвращает </span><span class="rvts71">false</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Возвращает </span><span class="rvts72">true</span><span class="rvts22">, если в текущем мувике на указанном кадре установлен Маркер, иначе возвращает </span><span class="rvts72">false</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, возвращает </span><span class="rvts72">false</span><span class="rvts22">.</span></p>
<p class="rvps10"><a name="getmarker"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">int taseditor.getmarker(int frame)</span></p>
<p class="rvps9"><span class="rvts70">int taseditor.getmarker(int frame)</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Возвращает порядковый номер Маркера, под которым находится указанный кадр.</span></p>
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, возвращает -1.</span></p>
<p class="rvps10"><a name="setmarker"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">int taseditor.setmarker(int frame)</span></p>
<p class="rvps9"><span class="rvts70">int taseditor.setmarker(int frame)</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Устанавливает Маркер на указанный кадр. Возвращает порядковый номер установленного Маркера.</span></p>
<p class="rvps10"><span class="rvts22">Если на этом кадре уже есть Маркер, никаких изменений не производится, будет возвращён номер существующего Маркера на указанном кадре.</span></p>
@ -148,34 +152,34 @@
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, возвращает -1.</span></p>
<p class="rvps10"><a name="removemarker"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">taseditor.removemarker(int frame)</span></p>
<p class="rvps9"><span class="rvts70">taseditor.removemarker(int frame)</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Удаляет Маркер с указанного кадра. Если на этом кадре не было Маркера, никаких изменений не производится.</span></p>
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, никаких изменений не производится.</span></p>
<p class="rvps10"><a name="getnote"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">string taseditor.getnote(int index)</span></p>
<p class="rvps9"><span class="rvts70">string taseditor.getnote(int index)</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Возвращает строку с текстом Заметки указанного Маркера.</span></p>
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, возвращает </span><span class="rvts71">nil</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, возвращает </span><span class="rvts72">nil</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Если указанный Маркер не существует, возвращает текст Заметки нулевого Маркера.</span></p>
<p class="rvps10"><a name="setnote"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">taseditor.setnote(int index, string newtext)</span></p>
<p class="rvps9"><span class="rvts70">taseditor.setnote(int index, string newtext)</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Изменяет текст Заметки указанного Маркера.</span></p>
<p class="rvps10"><span class="rvts22">Если указанный Маркер не существует, никаких изменений не производится.</span></p>
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, никаких изменений не производится.</span></p>
<p class="rvps10"><a name="getcurrentbranch"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">int taseditor.getcurrentbranch()</span></p>
<p class="rvps9"><span class="rvts70">int taseditor.getcurrentbranch()</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Возвращает число от 0 до 9, представляющее собой номер текущего ответвления.</span></p>
<p class="rvps10"><span class="rvts22">Если в проекте отсутствуют ответвления, возвращает -1.</span></p>
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, возвращает -1.</span></p>
<p class="rvps10"><a name="getrecordermode"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">string taseditor.getrecordermode()</span></p>
<p class="rvps9"><span class="rvts70">string taseditor.getrecordermode()</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Возвращает строку, соответствующую текущему режиму Рекордера:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
@ -185,11 +189,11 @@
<li class="rvps10"><span class="rvts22">"3P"</span></li>
<li class="rvps10"><span class="rvts22">"4P"</span></li>
</ul>
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, возвращает </span><span class="rvts71">nil</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, возвращает </span><span class="rvts72">nil</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Когда вам требуется узнать состояние Записи (Read-only или Read+Write), воспользуйтесь функцией </span><span class="rvts21">emu.readonly()</span><span class="rvts22">.</span></p>
<p class="rvps10"><a name="getsuperimpose"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">int taseditor.getsuperimpose()</span></p>
<p class="rvps9"><span class="rvts70">int taseditor.getsuperimpose()</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Возвращает текущее состояние галочки "Superimpose" в интерфейсе Тасэдитора.</span></p>
<p class="rvps10"><span class="rvts22">0 галочка не установлена (пустой чекбокс)</span></p>
@ -198,49 +202,49 @@
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, возвращает -1.</span></p>
<p class="rvps10"><a name="getlostplayback"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">int taseditor.getlostplayback()</span></p>
<p class="rvps9"><span class="rvts70">int taseditor.getlostplayback()</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Возвращает номер кадра, на котором находился Курсор Проигрывателя до изменения Ввода.</span></p>
<p class="rvps10"><span class="rvts22">Если Курсор Проигрывателя не терял позицию при усечении Гринзоны, возвращает -1.</span></p>
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, возвращает -1.</span></p>
<p class="rvps10"><a name="getplaybacktarget"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">int taseditor.getplaybacktarget()</span></p>
<p class="rvps9"><span class="rvts70">int taseditor.getplaybacktarget()</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Если Проигрыватель Тасэдитора в данный момент добегает (seek) к целевому кадру, эта функция возвращает номер целевого кадра.</span></p>
<p class="rvps10"><span class="rvts22">Если же Проигрыватель не занят добеганием, возвращает -1.</span></p>
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, возвращает -1.</span></p>
<p class="rvps10"><a name="setplayback"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">taseditor.setplayback(int frame)</span></p>
<p class="rvps9"><span class="rvts70">taseditor.setplayback(int frame)</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Посылает Курсор Проигрывателя на указанный кадр.</span></p>
<p class="rvps10"><span class="rvts22">Если указанный кадр не находится в Гринзоне, Проигрыватель Тасэдитора начинает добегание к этому кадру.</span></p>
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, ничего не производится.</span></p>
<p class="rvps10"><a name="stopseeking"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">taseditor.stopseeking()</span></p>
<p class="rvps9"><span class="rvts70">taseditor.stopseeking()</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Прекращает добегание и ставит эмулятор на паузу.</span></p>
<p class="rvps10"><span class="rvts22">Если Проигрыватель не занят добеганием, просто ставит эмулятор на паузу.</span></p>
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, ничего не производится.</span></p>
<p class="rvps10"><a name="getselection"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">table taseditor.getselection()</span></p>
<p class="rvps9"><span class="rvts70">table taseditor.getselection()</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Возвращает таблицу (массив), содержащую номера выделенных в данынй момент кадров. Эти номера отсортированы по возрастанию.</span></p>
<p class="rvps10"><span class="rvts22">Если выделенных кадров в данный момент нет, возвращает </span><span class="rvts71">nil</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, возвращает </span><span class="rvts71">nil</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Если выделенных кадров в данный момент нет, возвращает </span><span class="rvts72">nil</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, возвращает </span><span class="rvts72">nil</span><span class="rvts22">.</span></p>
<p class="rvps10"><a name="setselection"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">taseditor.setselection(table new_set)</span></p>
<p class="rvps9"><span class="rvts70">taseditor.setselection(table new_set)</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Изменяет текущее Выделение на указанный набор кадров. Номера кадров в вашей таблице не обязательно отсортировывать.</span></p>
<p class="rvps10"><span class="rvts22">Если нужно очистить Выделение, используйте </span><span class="rvts21">taseditor.setselection(</span><span class="rvts71">nil</span><span class="rvts21">)</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Если нужно очистить Выделение, используйте </span><span class="rvts21">taseditor.setselection(</span><span class="rvts72">nil</span><span class="rvts21">)</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, ничего не производится.</span></p>
<p class="rvps10"><a name="getinput"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">int taseditor.getinput(int frame, int joypad)</span></p>
<p class="rvps9"><span class="rvts70">int taseditor.getinput(int frame, int joypad)</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Возвращает число, представляющее собой Ввод указанного джойстика на указанном кадре.</span></p>
<p class="rvps10"><span class="rvts22">Если указан отрицательный номер кадра, возвращает -1.</span></p>
@ -256,7 +260,7 @@
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, возвращает -1.</span></p>
<p class="rvps10"><a name="submitinputchange"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">taseditor.submitinputchange(int frame, int joypad, int input)</span></p>
<p class="rvps9"><span class="rvts70">taseditor.submitinputchange(int frame, int joypad, int input)</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Отправляет запрос Тасэдитору, требуя изменить Ввод указанного джойстика на указанном кадре.</span></p>
<p class="rvps10"><span class="rvts22">Сам Ввод мувика будет изменён только после вызова </span><span class="rvts21">taseditor.applyinputchanges()</span><span class="rvts22">.</span></p>
@ -269,7 +273,7 @@
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, ничего не производится.</span></p>
<p class="rvps10"><a name="submitinsertframes"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">taseditor.submitinsertframes(int frame, int number)</span></p>
<p class="rvps9"><span class="rvts70">taseditor.submitinsertframes(int frame, int number)</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Отправляет запрос Тасэдитору, требуя вставить указанное количество пустых кадров перед указанным номером кадра мувика.</span></p>
<p class="rvps10"><span class="rvts22">Сам Ввод мувика будет изменён только после вызова </span><span class="rvts21">taseditor.applyinputchanges()</span><span class="rvts22">.</span></p>
@ -280,7 +284,7 @@
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, ничего не производится.</span></p>
<p class="rvps10"><a name="submitdeleteframes"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">taseditor.submitdeleteframes(int frame, int number)</span></p>
<p class="rvps9"><span class="rvts70">taseditor.submitdeleteframes(int frame, int number)</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Отправляет запрос Тасэдитору, требуя удалить из мувика указанное количество кадров, начиная с указанного кадра.</span></p>
<p class="rvps10"><span class="rvts22">Сам Ввод мувика будет изменён только после вызова </span><span class="rvts21">taseditor.applyinputchanges()</span><span class="rvts22">.</span></p>
@ -291,7 +295,7 @@
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, ничего не производится.</span></p>
<p class="rvps10"><a name="applyinputchanges"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">int taseditor.applyinputchanges([string name])</span></p>
<p class="rvps9"><span class="rvts70">int taseditor.applyinputchanges([string name])</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Моментально применяет список накопившихся запросов к текущему мувику. Если эти запросы действительно внесли какие-то изменения во Ввод мувика, в Журнале Истории появится новый пункт (чтобы пользователь мог откатить эти изменения), как следствие, Гринзона может быть усечена, Курсор Проигрывателя может отступить назад и запустить автоматическое добегание.</span></p>
<p class="rvps10"><span class="rvts22">Возвращает номер кадра, на котором были обнаружен первый факт изменения Ввода.</span></p>
@ -302,7 +306,7 @@
<p class="rvps10"><span class="rvts22">Если Тасэдитор не запущен, ничего не производится.</span></p>
<p class="rvps10"><a name="clearinputchanges"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps9"><span class="rvts69">taseditor.clearinputchanges()</span></p>
<p class="rvps9"><span class="rvts70">taseditor.clearinputchanges()</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Очищает список накопившихся запросов, позволяя отменить их до вызова </span><span class="rvts21">applyinputchanges()</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Рекомендуется вызывать эту функцию перед формированием нового списка запросов, чтобы быть уверенным, что в список не попадут какие-нибудь старые запросы.</span></p>
@ -312,7 +316,8 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com">Full featured Documentation generator</a></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com">Full-featured Documentation generator</a></p>
</div>
<div id="topic_footer">

View File

@ -3,7 +3,7 @@
<head>
<title>Защита от ошибок</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("MistakeProofing");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("MistakeProofing");
}
});
</script>
</head>
@ -52,6 +55,7 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">Защита от ошибок</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
@ -63,14 +67,14 @@
<li class="rvps10"><span class="rvts22">Когда в эмулятор загружен РОМ, запустить Тасэдитор можно в любой момент. Если открыть окно Тасэдитора во время записи или проигрывания мувика, Тасэдитор автоматически создаст безымянный проект, содержащий Ввод из этого мувика. При этом, если мувик начинается с сэйва, Тасэдитор выдаст предупреждение об отсутствии поддержки таких мувиков и создаст чистый мувик.</span></li>
<li class="rvps10"><span class="rvts22">Пока проекту не присвоено имя, функция автоматического сохранения не работает.</span></li>
<li class="rvps10"><span class="rvts22">При первом сохранении безымянного проекта Тасэдитор предлагает в качестве имени fm3-файла имя текущего РОМа с расширением, изменённым на fm3.</span></li>
<li class="rvps10"><span class="rvts22">Так как формат fm3 является надстройкой над форматом fm2, пользователь может открывать fm2-файлы как обычные проекты через диалог "Open TAS Editor Project", выбрав фильтр "All Files (*.*)". При открытии fm2-файлов Тасэдитор дополнительно информирует об этом с помощью диалога Yes/No. Пользователь может либо загрузить fm2-файл в качестве проекта, либо отменить загрузку.</span></li>
<li class="rvps10"><span class="rvts22">Так как формат fm3 является надстройкой над форматом fm2, пользователь может открывать fm2-файлы как обычные проекты через диалог "Open TAS Editor Project", выбрав фильтр "All Files (*.*)". При открытии fm2-файлов Тасэдитор дополнительно информирует об этом с помощью диалога Yes/No. Пользователь может либо загрузить fm2-файл в качестве нового проекта, либо отменить загрузку.</span></li>
<li class="rvps10"><span class="rvts22">После открытия fm2-файла или запорченного fm3-файла этот проект считается безымянным, хотя в заголовке окна Тасэдитора отображается имя загруженного файла. При первом сохранении (</span><span class="rvts34">Ctrl + S</span><span class="rvts22">) появится диалог SaveAs, где в качестве имени будет предложено имя загруженного fm2/fm3-файла с расширением, изменённым на fm3. Пользователь может либо сохранить проект под этим именем, либо изменить имя. Таким образом Тасэдитор акцентирует внимание пользователя на том, что сохраняемый проект значительно отличается от имеющегося на диске файла под тем же именем.</span></li>
<li class="rvps10"><span class="rvts22">В fm3-проектах хранится номер версии используемого fm3-формата. Разные версии могут быть полностью или частично не совместимы между собой. Если при загрузке проекта его версия не совпадает с текущей поддерживаемой версией, проект считается запорченным. Тасэдитор выводит диалог Yes/No/Cancel. Пользователь может либо продолжить попытку загрузки всего проекта (не рекомендуется), либо загрузить из проекта только fm2-данные о Вводе (рекомендуется), либо отменить загрузку.</span></li>
<li class="rvps10"><span class="rvts22">Формат fm2 (а значит, и fm3) поддерживает хранение MD5-чексуммы РОМа, использованного при создании мувика/проекта. При загрузке проектов Тасэдитор сверяет чексумму текущего РОМа с чексуммой из проекта, и если они не совпадают, выводит диалог Yes/No, отображающий оригинальное и текущее имя РОМа. Пользователь может либо продолжить загрузку, либо отменить её. Далее, при сохранении этого проекта Тасэдитор вновь обнаружит несовпадение чексумм и предложит заменить в сохраняемом файле имя РОМа и его MD5-чексумму. Пользователь может либо подтвердить замену, либо сохранить проект со старым именем и чексуммой, либо отменить сохранение.</span></li>
<li class="rvps10"><span class="rvts22">Формат fm2 (а значит, и fm3) хранит MD5-чексумму РОМа, использованного при создании мувика/проекта. При загрузке проектов Тасэдитор сверяет чексумму текущего РОМа с чексуммой из проекта, и если они не совпадают, выводит диалог Yes/No, отображающий оригинальное и текущее имя РОМа. Пользователь может либо продолжить загрузку, либо отменить её. Далее, при сохранении этого проекта Тасэдитор вновь обнаружит несовпадение чексумм и предложит заменить в сохраняемом файле имя РОМа и его MD5-чексумму. Пользователь может либо подтвердить замену, либо сохранить проект со старым именем и чексуммой, либо отменить сохранение.</span></li>
<li class="rvps10"><span class="rvts22">При загрузке запорченных файлов проектов Тасэдитор в меру сил пытается не допустить зависание эмулятора. При обнаружении ошибки во время загрузки дальнейшая загрузка прекращается, и незагруженные данные заменяются данными по умолчанию. В частности, если ошибка произошла во время загрузки Гринзоны, в проекте останутся только кадры Гринзоны, успешно вытащенные из файла, остальные кадры будут бледными. Сообщения об ошибках, произошедших при загрузке проекта, помещаются в Message Log эмулятора FCEUX.</span></li>
<li class="rvps10"><span class="rvts22">Во время загрузки проекта Тасэдитор принимает во внимание текущие настройки "Greenzone capacity" и "Undo levels". Например, если при сохранении проекта </span><span class="rvts37">Greenzone capacity = 5000</span><span class="rvts22">, а при загрузке </span><span class="rvts37">Greenzone capacity = 3000</span><span class="rvts22">, часть кадров во время загрузки будет пропущена. Это необходимо для того, чтобы проекты, сохранённые на более мощном компьютере, легко загружались на слабом компьютере, у которого могло бы не хватить памяти для загрузки проекта в том же виде, в котором он был сохранён.</span></li>
<li class="rvps10"><span class="rvts22">Во время загрузки проекта Тасэдитор принимает во внимание текущие настройки "Greenzone capacity" и "Undo levels". Например, если при сохранении проекта </span><span class="rvts37">Greenzone capacity = 5000</span><span class="rvts22">, а при загрузке </span><span class="rvts37">Greenzone capacity = 3000</span><span class="rvts22">, часть кадров во время загрузки будет пропущена. Это необходимо для того, чтобы проекты, сохранённые на более мощном компьютере, можно было загрузить и на слабом компьютере, у которого недостаточно памяти.</span></li>
<li class="rvps10"><span class="rvts22">При запуске Тасэдитор загружает данные о шаблонах из файла </span><span class="rvts21">taseditor_patterns.txt</span><span class="rvts22">. Если этот файл невозможно открыть (например, он удалён), Тасэдитор создаёт небольшой набор шаблонов по умолчанию, чтобы меню Patterns никогда не пустовало.</span></li>
<li class="rvps10"><span class="rvts22">Сохранения, используемые Гринзоной, немного отличаются от обычных сохранений. Они не содержат данные мувика, так как для Гринзоны это лишняя информация. Кроме того, они всегда сжаты. Это необходимо для экономии памяти.</span></li>
<li class="rvps10"><span class="rvts22">Сохранения, используемые Гринзоной, немного отличаются от обычных сохранений. Они не содержат данные мувика, так как для Гринзоны это лишняя информация. Кроме того, они всегда сжаты, ради экономии памяти.</span></li>
<li class="rvps10"><span class="rvts22">Если в результате операции </span><a class="rvts28" href="Operations.html#Delete">Delete</a><span class="rvts22"> или </span><a class="rvts28" href="Operations.html#LUAChange">Lua Change</a><span class="rvts22"> пользователь удалит весь Ввод из мувика, Тасэдитор в тот же момент создаст один пустой кадр в начале мувика.</span></li>
<li class="rvps10"><span class="rvts22">Во время выделения региона кадров с помощью растягивания мышкой пользователь может второй рукой нажимать акселераторы и хоткеи. Чтобы не было конфликта, во время DRAG_MODE_SELECTION и DRAG_MODE_DESELECTION не срабатывают функции, свзанные с изменением выделения:</span></li>
</ul>
@ -86,11 +90,11 @@
<li class="rvps10"><span class="rvts21">selection.JumpNextMarker()</span><span class="rvts22"> </span><span class="rvts34">Ctrl + Page Down</span></li>
</ul>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps10"><span class="rvts22">При перетаскивании Курсора Проигрывателя действует небольшое ограничение, связанное с добеганием. Обычно в Тасэдиторе сразу после щелчка левой кнопкой по столбцу иконок начинается перетаскивание (DRAG_MODE_PLAYBACK), при котором Курсор Проигрывателя перемещается на строку, на которую указывает курсор мыши при зажатой левой кнопке. Однако возможна ситуация, когда пользователь щёлкнул по кадру далеко от головы Гринзоны и не хочет тащить голубой курсор туда вручную. При щелчке запустилось добегание к этому кадру, и началось перетаскивание голубого курсора, но из-за галочки "Follow cursor" Piano Roll прыгнул к текущему положению голубого курсора, и курсор мыши стал указывать уже на другой кадр. Пользователь может не успеть отпустить левую кнопку мыши до момента, когда курсор мыши стал указывать на другой кадр. Чтобы разрешить данную ситуацию, Тасэдитор при перетаскивании считает, что самое первое добегание имеет более высокий приоритет, чем перетаскивание Курсора Проигрывателя. Поэтому во время первого добегания, запущенного при щелчке по столбцу иконок, пользователь не может перетаскивать голубой курсор вверх и вниз. Он может только отменить перетаскивание, отпустив левую кнопку мыши, а затем сделать новый щелчок по столбцу иконок, если требуется. Во время первого добегания курсор мыши заменяется на стрелку с песочными часами. Как только первое добегание окончено, перетаскивание Курсора Проигрывателя будет полноценным.</span></li>
<li class="rvps10"><span class="rvts22">Так как столбец иконок в Piano Roll довольно узкий, пользователь может случайно промахнуться во время щелчка по этому столбцу. При щелчке по левой границе Piano Roll, а также &nbsp;по пространству слева Piano Roll &nbsp;Тасэдитор считает, что был осуществлён щелчок по колонке иконок. В результате пользователю не нужно точно прицеливаться, когда требуется передвинуть Курсор Проигрывателя или начать его перетаскивание. Благодаря этому возрастает скорость и комфортность работы.</span></li>
<li class="rvps10"><span class="rvts22">При перетаскивании Курсора Проигрывателя действует небольшое ограничение, связанное с добеганием. После щелчка левой кнопкой по столбцу иконок начинается добегание к указанному кадру, и пока Курсор Проигрывателя не окажется на этом кадре, перетаскивание не будет действовать. Во время первого добегания курсор мыши заменяется на стрелку с песочными часами. Как только первое добегание окончено, перетаскивание Курсора Проигрывателя будет полноценным. Это нужно, т.к. возможна ситуация, когда пользователь щёлкнул по кадру далеко от головы Гринзоны, а из-за галочки "Follow cursor" Piano Roll прыгает к текущему положению голубого курсора, и курсор мыши указывает уже на другой кадр, ещё до того, как пользователь отпустит левую кнопку.</span></li>
<li class="rvps10"><span class="rvts22">Так как столбец иконок в Piano Roll довольно узкий, пользователь может случайно промахнуться во время щелчка по этому столбцу. Поэтому при щелчке по левой границе Piano Roll, а также &nbsp;по пространству слева Piano Roll &nbsp;Тасэдитор считает, что был осуществлён щелчок по колонке иконок. В результате пользователю не нужно точно прицеливаться, когда требуется передвинуть Курсор Проигрывателя или начать его перетаскивание.</span></li>
<li class="rvps10"><span class="rvts22">Когда эмулятор стоит на паузе, средняя кнопка мыши работает только при условии, что правая кнопка мыши отпущена. Так как средняя кнопка обычно является колесом, пользователь может случайно надавить её при вращении колеса с зажатой правой кнопкой (перемещение Курсора Проигрывателя). Вращение колеса с зажатыми клавишами-модификаторами используется гораздо реже, поэтому для них защита не требуется.</span></li>
<li class="rvps10"><span class="rvts22">Щелчок средней кнопкой по окну FCEUX передаётся окну Тасэдитора. Точно так же передаётся сообщение в вращении колеса, когда фокус у окна FCEUX. А щелчок правой кнопкой по окну FCEUX никак не действует. Благодаря этому пользователь может использовать среднюю кнопку (колесо мыши), даже когда курсор мыши находится над окном FCEUX.</span></li>
<li class="rvps10"><span class="rvts22">Даже если включен режим Записи, во время добегания Тасэдитор не будет менять Ввод. Благодаря этой особенности можно свободно перетаскивать Курсор Проигрывателя без выключения режима Записи, не опасаясь затереть Ввод.</span></li>
<li class="rvps10"><span class="rvts22">Даже если включен режим Записи, во время добегания Тасэдитор не будет перезаписывать Ввод. Благодаря этой особенности можно свободно перетаскивать Курсор Проигрывателя без выключения режима Записи, не опасаясь затереть Ввод.</span></li>
<li class="rvps10"><span class="rvts22">Когда запущен Тасэдитор, следующие команды в меню FCEUX доступны только в режиме Записи и при отсутствии добегания:</span></li>
</ul>
<ul style="text-indent: 30px; margin-left: 40px; list-style-position: inside;">
@ -134,7 +138,8 @@
<li class="rvps10"><span class="rvts22">ListBox с выбором port2</span></li>
</ul>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps10"><span class="rvts22">Когда запущен Тасэдитор, следующие хоткеи не работают:</span></li>
<li class="rvps10"><a name="DisabledHotkeys"></a>
<span class="rvts22">Когда запущен Тасэдитор, следующие хоткеи не работают:</span></li>
</ul>
<ul style="text-indent: 30px; margin-left: 40px; list-style-position: inside;">
<li class="rvps10"><span class="rvts22">Hide Menu Toggle</span></li>
@ -144,7 +149,7 @@
<li class="rvps10"><span class="rvts22">Record Movie To...</span></li>
<li class="rvps10"><span class="rvts22">Play Movie From...</span></li>
<li class="rvps10"><span class="rvts22">Stop Movie</span></li>
<li class="rvps10"><span class="rvts22">Insert Coin / Toggle Dipswitch эти команды пока не поддерживаются форматом fm2</span></li>
<li class="rvps10"><span class="rvts22">Insert Coin / Toggle Dipswitch т.к. эти команды пока не поддерживаются форматом FM2</span></li>
<li class="rvps10"><span class="rvts22">Load Last Auto-save</span></li>
<li class="rvps10"><span class="rvts22">View save slots</span></li>
<li class="rvps10"><span class="rvts22">Open ROM</span></li>
@ -170,19 +175,20 @@
<li class="rvps10"><span class="rvts22">Open TAS Editor</span></li>
</ul>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps10"><span class="rvts22">Так как клавиши </span><span class="rvts34">Alt</span><span class="rvts22"> и </span><span class="rvts27">F10</span><span class="rvts22"> активно используются при работе в Тасэдиторе, их стандартное действие (открытие меню программы) отключено.</span></li>
<li class="rvps10"><span class="rvts22">Так как клавиша </span><span class="rvts27">Пробел</span><span class="rvts22"> по умолчанию используется в качестве хоткея, её стандартное действие (симуляция щелчка по элементу GUI, на котором находится фокус клавиатуры) отключена. Также для каждого элемента GUI в окне Тасэдитора реализована обработка щелчка средней кнопкой мыши, чтобы этот щелчок срабатывал независимо от положения курсора мыши.</span></li>
<li class="rvps10"><span class="rvts22">Так как контекстное меню при щелчке правой кнопкой по Piano Roll почти никогда не требуется, оно появляется только когда пользователь щёлкает по выделенной строке в столбце номеров кадров (Frame#). В остальных случаях контекстное меню не появляется, зато при щелчке правой кнопкой по Piano Roll начинается удобное перетаскивание содержимого Piano Roll во все стороны.</span></li>
<li class="rvps10"><span class="rvts22">Так как правая кнопка часто используется для перемещения Курсора Проигрывателя колесом, пользователь может щёлкать ею без оглядки на текущее положение курсора мыши. При этом возможен случайный щелчок по Закладке и, соответственно, перезапись Закладки. Чтобы этого не допустить, Список Закладок и Дерево ответвлений требуют от пользователя нажать и отпустить правую кнопку на одной и той же Закладке. При этом, если между нажатием и отпусканием правой кнопки пользователь совершил вращение колесом, установка Закладки отменяется.</span></li>
<li class="rvps10"><span class="rvts22">Пользователь может осуществлять прыжки на Закладки одинарным щелчком по желаемой иконке в Дереве ответвлений. При этом он ожидает, что голубой треугольник (Курсор Проигрывателя) после щелчка окажется на этом месте в Дереве ответвлений. Это справедливо для Закладок, ответвления которых находятся в текущей хронологии, но это не так для Закладок, представляющих альтернативные стратегии прохождения. При прыжках на кадры этих Закладок Курсор Проигрывателя будет находиться в другом ответвлении (хотя и на том же самом кадре). Чтобы заранее уведомить пользователя о возможном недопонимании с его стороны, при наведении на иконки таких Закладок курсор мыши превращается в стрелку с вопросительным знаком.</span></li>
<li class="rvps10"><span class="rvts22">Во время трансформации Дерева ответвлений наведение курсора мыши на его элементы не работает, потому что активная область элементов постоянно перемещается и убегает от курсора мыши. Наведение начинает работать сразу после остановки всех иконок.</span></li>
<li class="rvps10"><span class="rvts22">Так как клавиши </span><span class="rvts34">Alt</span><span class="rvts22"> и </span><span class="rvts27">F10</span><span class="rvts22"> активно используются при работе в Тасэдиторе, их стандартное поведение (открытие меню программы) отключено.</span></li>
<li class="rvps10"><span class="rvts22">Так как клавиша </span><span class="rvts27">Пробел</span><span class="rvts22"> по умолчанию используется в качестве хоткея, её стандартное действие (симуляция щелчка по элементу GUI, на котором находится фокус клавиатуры) отключена. Также каждый элемент GUI в окне Тасэдитора реализует обработку щелчка средней кнопкой мыши, отсылая это сообщение Проигрывателю, чтобы этот щелчок срабатывал независимо от положения курсора мыши.</span></li>
<li class="rvps10"><span class="rvts22">Так как контекстное меню при щелчке правой кнопкой по Piano Roll используется редко, оно появляется только когда пользователь щёлкает по выделенной строке в столбце номеров кадров (Frame#). В остальных случаях контекстное меню не появляется, зато при щелчке правой кнопкой по Piano Roll начинается удобное перетаскивание содержимого Piano Roll во все стороны.</span></li>
<li class="rvps10"><span class="rvts22">Так как правая кнопка часто используется для перемещения Курсора Проигрывателя колесом, программа поощряет щелчки этой кнопкой без оглядки на текущее положение курсора мыши. Теоретически пользователь может случайно щёлкнуть по Закладке. Чтобы не допустить случайных команд, Список Закладок и Дерево ответвлений требуют от пользователя нажать и отпустить правую кнопку на одной и той же Закладке. При этом, если между нажатием и отпусканием правой кнопки пользователь совершил вращение колесом, Закладка изменяться не будет.</span></li>
<li class="rvps10"><span class="rvts22">Пользователь может осуществлять прыжки на Закладки одинарным щелчком по желаемой иконке в Дереве ответвлений. При этом он ожидает, что голубой треугольник (иконка Курсора Проигрывателя) после щелчка окажется на этом месте в Дереве ответвлений. Это справедливо для Закладок, которые не противоречат текущей хронологии, но это не так для Закладок, представляющих альтернативные стратегии прохождения. При прыжках на кадры этих Закладок Курсор Проигрывателя будет находиться в другом ответвлении (хотя и на том же самом кадре). Чтобы заранее уведомить пользователя о возможном недопонимании с его стороны, при наведении на иконки таких Закладок курсор мыши превращается в стрелку с вопросительным знаком.</span></li>
<li class="rvps10"><span class="rvts22">Во время трансформации Дерева ответвлений наведение курсора мыши на его элементы не работает, потому что активная область элементов постоянно перемещается и убегает от курсора мыши.</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com">Full featured Documentation generator</a></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com">Full-featured Documentation generator</a></p>
</div>
<div id="topic_footer">

View File

@ -3,7 +3,7 @@
<head>
<title>Навигация</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("Navigation");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("Navigation");
}
});
</script>
</head>
@ -52,6 +55,7 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">Навигация</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
@ -59,138 +63,139 @@
<p class="rvps10"><span class="rvts22">В данной документации эта деятельность называется "навигацией по мувику". Во время ТАСинга на неё тратится много времени. Для ускорения работы Тасэдитор </span><span class="rvts22">предлагает множество новых способов навигации. В зависимости от конкретной ситуации более удобным будет являться тот или иной способ, поэтому не рекомендуется привязываться к одному из них.</span></p>
<p class="rvps10"><span class="rvts22">В идеале все навыки навигации должны переместиться в моторную память, тогда вы сможете молниеносно появляться в нужной точке мувика, при этом не переставая обдумывать текущую задачу.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts51">Все способы навигации по мувику:</span></p>
<p class="rvps10"><span class="rvts57"><br/></span></p>
<p class="rvps10"><span class="rvts52">Все способы навигации по мувику:</span></p>
<p class="rvps10"><span class="rvts58"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><a class="rvts62" href="Navigation.html#scrolling-piano-roll">Скроллинг Piano Roll</a></li>
<li class="rvps10"><a class="rvts63" href="Navigation.html#scrolling-piano-roll">Скроллинг Piano Roll</a></li>
</ul>
<ol style="text-indent: 32px; margin-left: 20px; list-style-position: inside;">
<li class="rvps15" style="text-indent: 32px"><a class="rvts62" href="Navigation.html#scrollbar-drag">Использование вертикального скроллбара</a></li>
<li class="rvps15" style="text-indent: 32px"><a class="rvts62" href="Navigation.html#wheel">Скроллинг колесом мыши</a></li>
<li class="rvps15" style="text-indent: 32px"><a class="rvts62" href="Navigation.html#crossing-gaps">Пересечение промежутков во Вводе и Маркерах</a></li>
<li class="rvps15" style="text-indent: 32px"><a class="rvts62" href="Navigation.html#jumping-by-pages">Листание страниц</a></li>
<li class="rvps15" style="text-indent: 32px"><a class="rvts62" href="Navigation.html#jump-home-end">Прыжок в начало/конец мувика</a></li>
<li class="rvps15" style="text-indent: 32px"><a class="rvts62" href="Navigation.html#scroll-to-playback">Прыжок к Курсору Проигрывателя</a></li>
<li class="rvps15" style="text-indent: 32px"><a class="rvts62" href="Navigation.html#scroll-to-selection">Прыжок к Курсору Выделения</a></li>
<li class="rvps15" style="text-indent: 32px"><a class="rvts62" href="Navigation.html#scroll-to-playback-marker">Прыжок к Маркеру над Курсором Проигрывателя</a></li>
<li class="rvps15" style="text-indent: 32px"><a class="rvts62" href="Navigation.html#scroll-to-selection-marker">Прыжок к Маркеру над Курсором Выделения</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts63" href="Navigation.html#scrollbar-drag">Использование вертикального скроллбара</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts63" href="Navigation.html#wheel">Скроллинг колесом мыши</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts63" href="Navigation.html#crossing-gaps">Пересечение промежутков</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts63" href="Navigation.html#jumping-by-pages">Листание страниц</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts63" href="Navigation.html#jump-home-end">Прыжок в начало/конец мувика</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts63" href="Navigation.html#scroll-to-playback">Прыжок к Курсору Проигрывателя</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts63" href="Navigation.html#scroll-to-selection">Прыжок к Курсору Выделения</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts63" href="Navigation.html#scroll-to-playback-marker">Прыжок к Маркеру над Курсором Проигрывателя</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts63" href="Navigation.html#scroll-to-selection-marker">Прыжок к Маркеру над Курсором Выделения</a></li>
</ol>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><a class="rvts62" href="Navigation.html#playback-cursor">Навигация Курсором Проигрывателя</a></li>
<li class="rvps10"><a class="rvts63" href="Navigation.html#playback-cursor">Навигация Курсором Проигрывателя</a></li>
</ul>
<ol style="text-indent: 32px; margin-left: 20px; list-style-position: inside;">
<li class="rvps15" style="text-indent: 32px"><a class="rvts62" href="Navigation.html#frame-advance-rewind">Покадровое перемещение</a></li>
<li class="rvps15" style="text-indent: 32px"><a class="rvts62" href="Navigation.html#rewinding-by-wheel">Перемотка колесом мыши</a></li>
<li class="rvps15" style="text-indent: 32px"><a class="rvts62" href="Navigation.html#drag-playback">Перетаскивание мышью</a></li>
<li class="rvps15" style="text-indent: 32px"><a class="rvts62" href="Navigation.html#playback-jumping-markers">Прыжки по Маркерам</a></li>
<li class="rvps15" style="text-indent: 32px"><a class="rvts62" href="Navigation.html#jump-bookmark">Прыжки по Закладкам</a></li>
<li class="rvps15" style="text-indent: 32px"><a class="rvts62" href="Navigation.html#playback-home-end">Прыжок в начало/конец мувика</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts63" href="Navigation.html#frame-advance-rewind">Покадровое перемещение</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts63" href="Navigation.html#rewinding-by-wheel">Перемотка колесом мыши</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts63" href="Navigation.html#drag-playback">Перетаскивание мышью</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts63" href="Navigation.html#playback-jumping-markers">Прыжки по Маркерам</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts63" href="Navigation.html#jump-bookmark">Прыжки по Закладкам</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts63" href="Navigation.html#playback-home-end">Прыжок в начало/конец мувика</a></li>
</ol>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><a class="rvts62" href="Navigation.html#selection-cursor">Навигация Курсором Выделения</a></li>
<li class="rvps10"><a class="rvts63" href="Navigation.html#selection-cursor">Навигация Курсором Выделения</a></li>
</ul>
<ol style="text-indent: 32px; margin-left: 20px; list-style-position: inside;">
<li class="rvps15" style="text-indent: 32px"><a class="rvts62" href="Navigation.html#selection-up-down">Покадровое смещение Выделения</a></li>
<li class="rvps15" style="text-indent: 32px"><a class="rvts62" href="Navigation.html#selection-home-end">Смещение Выделения в начало/конец мувика</a></li>
<li class="rvps15" style="text-indent: 32px"><a class="rvts62" href="Navigation.html#selection-jumping-markers">Прыжки по Маркерам</a></li>
<li class="rvps15" style="text-indent: 32px"><a class="rvts62" href="Navigation.html#selection-history">Откаты истории Выделения</a></li>
<li class="rvps15" style="text-indent: 32px"><a class="rvts62" href="Navigation.html#reselect-clipboard">Прыжок к источнику данных в Буфере Обмена</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts63" href="Navigation.html#selection-up-down">Покадровое смещение Выделения</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts63" href="Navigation.html#selection-home-end">Смещение Выделения в начало/конец мувика</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts63" href="Navigation.html#selection-jumping-markers">Прыжки по Маркерам</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts63" href="Navigation.html#selection-history">Откаты истории Выделения</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts63" href="Navigation.html#reselect-clipboard">Прыжок к источнику данных в Буфере Обмена</a></li>
</ol>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><a class="rvts62" href="Navigation.html#special">Особые приёмы навигации</a></li>
<li class="rvps10"><a class="rvts63" href="Navigation.html#special">Особые приёмы навигации</a></li>
</ul>
<ol style="text-indent: 32px; margin-left: 20px; list-style-position: inside;">
<li class="rvps15" style="text-indent: 32px"><a class="rvts62" href="Navigation.html#find-note">Поиск Маркеров с нужным текстом</a></li>
<li class="rvps15" style="text-indent: 32px"><a class="rvts62" href="Navigation.html#similar-note">Прыжок к участку с похожим описанием</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts63" href="Navigation.html#find-note">Поиск Маркеров с нужным текстом</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts63" href="Navigation.html#similar-note">Прыжок к участку с похожим описанием</a></li>
</ol>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps2"><a name="scrolling-piano-roll"></a>
<p class="rvps26"><a name="scrolling-piano-roll"></a>
<span class="rvts22"><br/></span></p>
<p><span class="rvts58">Скроллинг Piano Roll</span></p>
<p class="rvps27"><span class="rvts59">Скроллинг Piano Roll</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="scrollbar-drag"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts51">1. Использование вертикального скроллбара</span></p>
<p class="rvps10"><span class="rvts52">1. Использование вертикального скроллбара</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">С помощью скроллбара можно скроллировать Список Piano Roll, просматривая содержимое мувика.</span></p>
<p class="rvps10"><span class="rvts22">Курсор Проигрывателя и Выделение останутся на своих местах.</span></p>
<p class="rvps10"><span class="rvts22">Когда предпочтительнее использовать:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">когда нужно попасть в дальнюю область мувика. Одним махом можно проскроллировать Piano Roll на сотню тысяч кадров</span></li>
<li class="rvps15"><span class="rvts22">при ручном поиске нужного участка </span><span class="rvts22">Ввод</span><span class="rvts22">а, который может быть где угодно в мувике</span></li>
<li class="rvps10"><span class="rvts22">когда нужно попасть в дальнюю область мувика. Одним махом можно проскроллировать Piano Roll на сотню тысяч кадров</span></li>
<li class="rvps10"><span class="rvts22">при ручном поиске нужного участка </span><span class="rvts22">Ввод</span><span class="rvts22">а, который может быть где угодно в мувике</span></li>
</ul>
<p class="rvps10"><a name="wheel"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts51">2. Скроллинг колесом мыши</span></p>
<p class="rvps10"><span class="rvts52">2. Скроллинг колесом мыши</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">С помощью колеса можно также скроллировать содержимое Piano Roll. Скорость скроллинга будет зависеть от скорости вращения, поэтому этот способ подходит для внимательного просмотра данных в окрестностях одного участка.</span></p>
<p class="rvps10"><span class="rvts22">Курсор мыши при скроллировании может быть где угодно, кроме Журнала Истории.</span></p>
<p class="rvps10"><span class="rvts22">Когда предпочтительнее использовать:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">при обзоре одного участка, который не умещается на экране</span></li>
<li class="rvps15"><span class="rvts22">при ручном поиске нужного участка, расположение которого может быть где угодно поблизости</span></li>
<li class="rvps10"><span class="rvts22">при обзоре одного участка, который не умещается на экране</span></li>
<li class="rvps10"><span class="rvts22">при ручном поиске нужного участка, расположение которого может быть где угодно поблизости</span></li>
</ul>
<p><a name="crossing-gaps"></a>
<span class="rvts63"><br/></span></p>
<p class="rvps10"><span class="rvts23">3. Пересечение промежутков во Вводе и Маркерах</span></p>
<p class="rvps27"><a name="crossing-gaps"></a>
<span class="rvts64"><br/></span></p>
<p class="rvps10"><span class="rvts23">3. Пересечение промежутков</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Навести курсор мыши на интересующую ячейку посреди Ввода/Маркеров, зажать </span><span class="rvts34">Alt</span><span class="rvts22"> и </span><span class="rvts22">повернуть колесо мыши вверх или вниз таким образом можно перейти к ближайшей ячейке, содержимое которой отличается от содержимого соседней ячейки.</span></p>
<p class="rvps10"><span class="rvts22">Навести курсор мыши на интересующую ячейку посреди Ввода/Маркеров/иконок, зажать </span><span class="rvts34">Alt</span><span class="rvts22"> и </span><span class="rvts22">повернуть колесо мыши вверх или вниз таким образом можно перейти к ближайшей ячейке, содержимое которой отличается от содержимого соседней ячейки.</span></p>
<p class="rvps10"><span class="rvts22">Когда предпочтительнее использовать:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">когда вы видите пустоту в колонке интересующей кнопки, и вам нужно найти ближайший кадр, в котором эта кнопка нажата</span></li>
<li class="rvps15"><span class="rvts22">когда вы видите,что интересующая кнопка зажата на протяжении множества кадров, и вам нужно найти первый кадр этого ряда или кадр, где кнопка будет отпущена</span></li>
<li class="rvps15"><span class="rvts22">когда нужно найти предыдущий или следующий Маркер</span></li>
<li class="rvps15"><span class="rvts22">когда нужно найти предыдущее или следующее нажатие кнопки</span></li>
<li class="rvps10"><span class="rvts22">когда вы видите пустоту в колонке интересующей кнопки, и вам нужно найти ближайший кадр, в котором эта кнопка нажата</span></li>
<li class="rvps10"><span class="rvts22">когда вы видите,что интересующая кнопка зажата на протяжении множества кадров, и вам нужно найти первый кадр этого длинного ряда или кадр, где кнопка будет отпущена</span></li>
<li class="rvps10"><span class="rvts22">когда нужно найти предыдущий или следующий Маркер</span></li>
<li class="rvps10"><span class="rvts22">когда нужно найти предыдущее или следующее нажатие кнопки</span></li>
<li class="rvps10"><span class="rvts22">когда нужно найти вышестоящую или нижестоящую Закладку (в колонке иконок)</span></li>
</ul>
<p class="rvps10"><a name="jumping-by-pages"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts51">4. Листание страниц</span></p>
<p class="rvps10"><span class="rvts52">4. Листание страниц</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Нажатие клавиш</span><span class="rvts22"> </span><span class="rvts34">Page Up</span><span class="rvts22"> и </span><span class="rvts34">Page Down</span><span class="rvts22"> скроллирует содержимое Piano Roll вверх и вниз на целую страницу (зависит от размера окна Piano Roll).</span></p>
<p class="rvps10"><span class="rvts22">Когда предпочтительнее использовать:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">при ручном поиске нужного участка </span><span class="rvts22">Ввод</span><span class="rvts22">а, расположение которого может быть где угодно поблизости</span></li>
<li class="rvps10"><span class="rvts22">при ручном поиске нужного участка </span><span class="rvts22">Ввод</span><span class="rvts22">а, расположение которого может быть где угодно поблизости</span></li>
</ul>
<p class="rvps10"><a name="jump-home-end"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts51">5. Прыжок в начало/конец мувика</span></p>
<p class="rvps10"><span class="rvts52">5. Прыжок в начало/конец мувика</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Нажатие клавиши</span><span class="rvts22"> </span><span class="rvts34">Home</span><span class="rvts22"> или </span><span class="rvts34">End</span><span class="rvts22"> скроллирует содержимое Piano Roll в начало или конец мувика.</span></p>
<p class="rvps10"><span class="rvts22">Когда предпочтительнее использовать:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">к</span><span class="rvts22">огда нужно попасть в начало или конец мувика</span></li>
<li class="rvps10"><span class="rvts22">к</span><span class="rvts22">огда нужно попасть в начало или конец мувика</span></li>
</ul>
<p class="rvps10"><a name="scroll-to-playback"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts51">6. Прыжок к Курсору Проигрывателя</span></p>
<p class="rvps10"><span class="rvts52">6. Прыжок к Курсору Проигрывателя</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">При щелчке левой кнопкой мыши по верхнему номеру Маркера Piano Roll мгновенно скроллируется к Курсору Проигрывателя. Кроме того, вместо щелчка можно быстро дважды нажать клавишу </span><span class="rvts34">Shift</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Когда предпочтительнее использовать:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">к</span><span class="rvts22">огда нужно осмотреть контекст текущего кадра в мувике</span></li>
<li class="rvps15"><span class="rvts22">к</span><span class="rvts22">огда нужно вернуться к проигрываемому участку из любого другого места</span></li>
<li class="rvps10"><span class="rvts22">к</span><span class="rvts22">огда нужно осмотреть контекст текущего кадра в мувике</span></li>
<li class="rvps10"><span class="rvts22">к</span><span class="rvts22">огда нужно вернуться к проигрываемому участку из любого другого места</span></li>
</ul>
<p class="rvps10"><a name="scroll-to-selection"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts51">7. Прыжок к Курсору Выделения</span></p>
<p class="rvps10"><span class="rvts52">7. Прыжок к Курсору Выделения</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">При щелчке левой кнопкой мыши по нижнему номеру Маркера Piano Roll мгновенно скроллируется к началу Выделения.</span><span class="rvts22"> Кроме того, вместо щелчка можно быстро дважды нажать клавишу </span><span class="rvts34">Ctrl</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Когда предпочтительнее использовать:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">к</span><span class="rvts22">огда нужно вернуться к редактируемому участку</span></li>
<li class="rvps10"><span class="rvts22">к</span><span class="rvts22">огда нужно вернуться к редактируемому участку</span></li>
</ul>
<p class="rvps10"><a name="scroll-to-playback-marker"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts51">8. Прыжок к Маркеру над Курсором Проигрывателя</span></p>
<p class="rvps10"><span class="rvts52">8. Прыжок к Маркеру над Курсором Проигрывателя</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">При щелчке по верхнему полю для редактирования Заметок Piano Roll автоматически скроллируется к Маркеру, Заметка которого сейчас будет редактироваться.</span></p>
<p class="rvps10"><span class="rvts22">Работает, только если установлена галочка </span><a class="rvts28" href="ProgramCustomization.html#FollowMarkerNotecontext">View -&gt; Follow Marker Note context</a><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Когда предпочтительнее использовать:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">к</span><span class="rvts22">огда нужно увидеть начало просматриваемого участка (при условии, что там стоит Маркер)</span></li>
<li class="rvps10"><span class="rvts22">к</span><span class="rvts22">огда нужно увидеть начало просматриваемого участка (при условии, что там стоит Маркер)</span></li>
</ul>
<p class="rvps15"><a name="scroll-to-selection-marker"></a>
<p class="rvps10"><a name="scroll-to-selection-marker"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">9. Прыжок к Маркеру над Курсором Выделения</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
@ -198,12 +203,12 @@
<p class="rvps10"><span class="rvts22">Работает, только если установлена галочка </span><a class="rvts28" href="ProgramCustomization.html#FollowMarkerNotecontext">View -&gt; Follow Marker Note context</a><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Когда предпочтительнее использовать:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">к</span><span class="rvts22">огда нужно увидеть начало редактируемого участка (при условии, что там стоит Маркер)</span></li>
<li class="rvps10"><span class="rvts22">к</span><span class="rvts22">огда нужно увидеть начало редактируемого участка (при условии, что там стоит Маркер)</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="playback-cursor"></a>
<span class="rvts22"><br/></span></p>
<p><span class="rvts58">Навигация Курсором Проигрывателя</span></p>
<p class="rvps27"><span class="rvts59">Навигация Курсором Проигрывателя</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Курсор Проигрывателя привязан к текущему состоянию эмуляторуемой игры. Это означает, что эмулятор автоматически перемещает курсор во время своей работы, и наоборот, когда вы перемещаете Курсор Проигрывателя, изменяется состояние эмулятора.</span></p>
<p class="rvps10"><span class="rvts22">В управлении этим курсором есть одно ограничение: иногда он не может мгновенно переместиться на требуемый кадр, добегание занимает некоторое время.</span></p>
@ -215,7 +220,7 @@
<p class="rvps10"><span class="rvts22">Нажатие кнопки </span><span class="rvts32">&lt;</span><span class="rvts22"> или </span><span class="rvts32">&gt;</span><span class="rvts22"> в панели Playback, либо нажатие </span><span class="rvts34">Shift + Вверх</span><span class="rvts22"> или </span><span class="rvts34">Shift + Вниз</span><span class="rvts22">, либо нажатие хоткея </span><span class="rvts27">Frame Rewind </span><span class="rvts22">или </span><span class="rvts27">Frame Advance</span><span class="rvts22"> перемещает Курсор Проигрывателя на 1 кадр назад или вперёд.</span></p>
<p class="rvps10"><span class="rvts22">Когда предпочтительнее использовать:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">к</span><span class="rvts22">огда нужно тщательно просматривать события на текущем участке</span></li>
<li class="rvps10"><span class="rvts22">к</span><span class="rvts22">огда нужно тщательно просматривать события на текущем участке</span></li>
</ul>
<p class="rvps10"><a name="rewinding-by-wheel"></a>
<span class="rvts22"><br/></span></p>
@ -225,16 +230,16 @@
<p class="rvps10"><span class="rvts22">Курсор мыши при этом может быть где угодно.</span></p>
<p class="rvps10"><span class="rvts22">Когда предпочтительнее использовать:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">к</span><span class="rvts22">огда нужно тщательно/быстро просматривать события на текущем участке</span></li>
<li class="rvps10"><span class="rvts22">к</span><span class="rvts22">огда нужно тщательно/быстро просматривать события на текущем участке</span></li>
</ul>
<p class="rvps10"><a name="drag-playback"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts51">3. Перетаскивание Курсора Проигрывателя</span></p>
<p class="rvps10"><span class="rvts52">3. Перетаскивание Курсора Проигрывателя</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">С помощью курсора мыши можно перетаскивать Курсор Проигрывателя вверх и вниз по мувику. Для этого нужно щёлкнуть левой кнопкой по любой клетке в самом левом столбце Piano Roll (колонка с иконками) и, не отпуская левую кнопку, переместить курсор мыши вверх или вниз. Этот способ позволяет не только смотреть события игры на экране FCEUX, но и скроллировать Piano Roll.</span></p>
<p class="rvps10"><span class="rvts22">Когда предпочтительнее использовать:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">при поиске игровых событий в мувике</span></li>
<li class="rvps10"><span class="rvts22">при поиске игровых событий в мувике</span></li>
</ul>
<p class="rvps10"><a name="playback-jumping-markers"></a>
<span class="rvts22"><br/></span></p>
@ -243,8 +248,8 @@
<p class="rvps10"><span class="rvts22">Нажатие кнопок </span><span class="rvts32">&lt;&lt;</span><span class="rvts22"> или </span><span class="rvts32">&gt;&gt;</span><span class="rvts22"> в панели Playback, либо нажатие акселераторов </span><span class="rvts34">Shift + Page Up</span><span class="rvts22"> или </span><span class="rvts34">Shift + Page Down</span><span class="rvts22">, либо вращение </span><span class="rvts22">колеса мыши с зажатой клавишей </span><span class="rvts34">Shift</span><span class="rvts22"> перемещает Курсор Проигрывателя на предыдущий или следующий Маркер.</span></p>
<p class="rvps10"><span class="rvts22">Когда предпочтительнее использовать:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">к</span><span class="rvts22">огда нужно вернуться на начало просматриваемого участка (при условии, что там стоит Маркер)</span></li>
<li class="rvps15"><span class="rvts22">когда нужно просмотреть события предыдущих/следующих участков</span></li>
<li class="rvps10"><span class="rvts22">к</span><span class="rvts22">огда нужно вернуться на начало просматриваемого участка (при условии, что там стоит Маркер)</span></li>
<li class="rvps10"><span class="rvts22">когда нужно просмотреть события предыдущих/следующих участков</span></li>
</ul>
<p class="rvps10"><a name="jump-bookmark"></a>
<span class="rvts22"><br/></span></p>
@ -253,8 +258,8 @@
<p class="rvps10"><span class="rvts22">Нажатие хоткея, соответствующего номеру Закладки (</span><span class="rvts27">0-9</span><span class="rvts22">), посылает Курсор Проигрывателя на кадр этой Закладки. То же самое происходит при щелчке по номеру кадра в Списке Закладок или по иконке Закладки в Дереве ответвлений.</span></p>
<p class="rvps10"><span class="rvts22">Когда предпочтительнее использовать:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">к</span><span class="rvts22">огда нужно просмотреть события мувика, начиная с кадра, на котором была оставлена Закладка (например, просмотреть мувик с начала Уровня 2)</span></li>
<li class="rvps15"><span class="rvts22">когда вы изменили Ввод перед кадром Закладки, и хотите узнать, как изменились события на этом кадре</span></li>
<li class="rvps10"><span class="rvts22">к</span><span class="rvts22">огда нужно просмотреть события мувика, начиная с кадра, на котором была оставлена Закладка (например, просмотреть мувик с начала Уровня 2)</span></li>
<li class="rvps10"><span class="rvts22">когда вы изменили Ввод перед кадром Закладки, и хотите узнать, как изменились события на этом кадре</span></li>
</ul>
<p class="rvps10"><a name="playback-home-end"></a>
<span class="rvts22"><br/></span></p>
@ -264,13 +269,13 @@
<p class="rvps10"><span class="rvts22">Также при нажатии хоткея "</span><span class="rvts27">Play movie from the beginning</span><span class="rvts22">" (по умолчанию </span><span class="rvts27">Shift + R</span><span class="rvts22">) Курсор Проигрывателя прыгает на начальный кадр мувика.</span></p>
<p class="rvps10"><span class="rvts22">Когда предпочтительнее использовать:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">к</span><span class="rvts22">огда нужно просмотреть мувик с самого начала</span></li>
<li class="rvps15"><span class="rvts22">к</span><span class="rvts22">огда нужно заполнить весь мувик Гринзоной до конца</span></li>
<li class="rvps10"><span class="rvts22">к</span><span class="rvts22">огда нужно просмотреть мувик с самого начала</span></li>
<li class="rvps10"><span class="rvts22">к</span><span class="rvts22">огда нужно заполнить весь мувик Гринзоной до конца</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="selection-cursor"></a>
<span class="rvts22"><br/></span></p>
<p><span class="rvts58">Навигация Курсором Выделения</span></p>
<p class="rvps27"><span class="rvts59">Навигация Курсором Выделения</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Курсор Выделения обычно находится на кадре, где были произведены последние изменения Ввода, но при необходимости его можно поставить и на другой кадр.</span></p>
<p class="rvps10"><span class="rvts22">Piano Roll автоматически скроллируется вслед за Выделением.</span></p>
@ -281,7 +286,7 @@
<p class="rvps10"><span class="rvts22">Нажатие клавиатурных акселераторов </span><span class="rvts34">Ctrl + </span><span class="rvts34">Вверх</span><span class="rvts22"> или </span><span class="rvts34">Ctrl + </span><span class="rvts34">Вниз</span><span class="rvts22"> перемещает Выделение на 1 кадр вверх или вниз.</span></p>
<p class="rvps10"><span class="rvts22">Когда предпочтительнее использовать:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">к</span><span class="rvts22">огда нужно передвинуть Выделение выше или ниже</span></li>
<li class="rvps10"><span class="rvts22">к</span><span class="rvts22">огда нужно передвинуть Выделение выше или ниже</span></li>
</ul>
<p class="rvps10"><a name="selection-home-end"></a>
<span class="rvts22"><br/></span></p>
@ -290,7 +295,7 @@
<p class="rvps10"><span class="rvts22">Нажатие </span><span class="rvts22">акселераторов</span><span class="rvts22"> </span><span class="rvts34">Ctrl + </span><span class="rvts34">Home</span><span class="rvts22"> и </span><span class="rvts34">Ctrl + </span><span class="rvts34">End</span><span class="rvts22"> перемещает Выделение в начало и в конец мувика.</span></p>
<p class="rvps10"><span class="rvts22">Когда предпочтительнее использовать:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">к</span><span class="rvts22">огда нужно выделить точно такой же набор кадров в начале или в конце мувика</span></li>
<li class="rvps10"><span class="rvts22">к</span><span class="rvts22">огда нужно выделить точно такой же набор кадров в начале или в конце мувика</span></li>
</ul>
<p class="rvps10"><a name="selection-jumping-markers"></a>
<span class="rvts22"><br/></span></p>
@ -300,8 +305,8 @@
<p class="rvps10"><span class="rvts22">Аналогично можно вращать колесо мыши с зажатой клавишей </span><span class="rvts34">Ctrl</span><span class="rvts22"> Курсор Выделения будет прыгать по Маркерам.</span></p>
<p class="rvps10"><span class="rvts22">Когда предпочтительнее использовать:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">к</span><span class="rvts22">огда нужно вернуться на начало редактируемого участка (при условии, что там стоит Маркер)</span></li>
<li class="rvps15"><span class="rvts22">к</span><span class="rvts22">огда нужно перейти на предыдущие/следующие участки</span></li>
<li class="rvps10"><span class="rvts22">к</span><span class="rvts22">огда нужно вернуться на начало редактируемого участка (при условии, что там стоит Маркер)</span></li>
<li class="rvps10"><span class="rvts22">к</span><span class="rvts22">огда нужно перейти на предыдущие/следующие участки</span></li>
</ul>
<p class="rvps10"><a name="selection-history"></a>
<span class="rvts22"><br/></span></p>
@ -311,8 +316,8 @@
<p class="rvps10"><span class="rvts22">Это способ навигации позволяет вернуться к ранее отредактированным участкам и быстро впомнить всю последовательность редактирования.</span></p>
<p class="rvps10"><span class="rvts22">Когда предпочтительнее использовать:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">к</span><span class="rvts22">огда нужно вернуться к недавно отредактированному участку</span></li>
<li class="rvps15"><span class="rvts22">к</span><span class="rvts22">огда нужно снова выделить </span><span class="rvts22">точно такой же набор кадров, как раньше</span></li>
<li class="rvps10"><span class="rvts22">к</span><span class="rvts22">огда нужно вернуться к недавно отредактированному участку</span></li>
<li class="rvps10"><span class="rvts22">к</span><span class="rvts22">огда нужно снова выделить </span><span class="rvts22">точно такой же набор кадров, как раньше</span></li>
</ul>
<p class="rvps10"><a name="reselect-clipboard"></a>
<span class="rvts22"><br/></span></p>
@ -321,13 +326,13 @@
<p class="rvps10"><span class="rvts22">Нажатие акселератора </span><span class="rvts34">Ctrl + B</span><span class="rvts22"> возвращает Выделение к состоянию на момент последнего копирования Ввода в Буфер Обмена.</span></p>
<p class="rvps10"><span class="rvts22">Когда предпочтительнее использовать:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">к</span><span class="rvts22">огда нужно вспомнить, откуда был скопирован </span><span class="rvts22">Ввод</span></li>
<li class="rvps10"><span class="rvts22">к</span><span class="rvts22">огда нужно вспомнить, откуда был скопирован </span><span class="rvts22">Ввод</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="special"></a>
<span class="rvts22"><br/></span></p>
<p><span class="rvts58">Особые приёмы навигации</span></p>
<p><span class="rvts22"><br/></span></p>
<p class="rvps27"><span class="rvts59">Особые приёмы навигации</span></p>
<p class="rvps27"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="find-note"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">1. Поиск Маркеров с нужным текстом</span></p>
@ -335,7 +340,7 @@
<p class="rvps10"><span class="rvts22">Нужно открыть окно </span><span class="rvts26">Find Note</span><span class="rvts22">, ввести искомый текст и нажать кнопку </span><span class="rvts32">Find next</span><span class="rvts22"> или клавишу Enter. Курсор Выделения переместится на ближайший Маркер, Заметка которого содержит этот текст. Piano Roll автоматически проскроллируется к найденному месту. </span><span class="rvts22">Искать можно либо вверх от текущего положения Курсора Выделения, либо вниз.</span></p>
<p class="rvps10"><span class="rvts22">Когда предпочтительнее использовать:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">когда нужно найти участок, зная часть текста из его описания</span></li>
<li class="rvps10"><span class="rvts22">когда нужно найти участок, зная часть текста из его описания</span></li>
</ul>
<p class="rvps10"><a name="similar-note"></a>
<span class="rvts22"><br/></span></p>
@ -345,13 +350,14 @@
<p class="rvps10"><span class="rvts22">Этот способ описан в главе </span><a class="rvts28" href="AdvancedFeatures.html#UsingMarkers">Продвинутые возможности</a><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Когда предпочтительнее использовать:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">когда нужно найти участок, описываемый теми же словами, что и текущий участок.</span></li>
<li class="rvps10"><span class="rvts22">когда нужно найти участок, описываемый теми же словами, что и текущий участок.</span></li>
</ul>
<p class="rvps15"><span class="rvts22"><br/></span></p>
<p class="rvps15"><span class="rvts22"><br/></span></p>
<p class="rvps15"><span class="rvts22"><br/></span></p>
<p class="rvps15"><span class="rvts22"><br/></span></p>
<p class="rvps15"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps14"><span class="rvts22"><br/></span></p>
<p class="rvps14"><span class="rvts22"><br/></span></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/create-epub-ebooks">Write EPub books for the iPad</a></p>
</div>

View File

@ -3,7 +3,7 @@
<head>
<title>4.2. Нелинейный ТАСинг</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("NonlinearTASing");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("NonlinearTASing");
}
});
</script>
</head>
@ -52,133 +55,102 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">Нелинейный ТАСинг</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/toolbox-method2.png"/></p>
<p class="rvps10"><span class="rvts22">Это основной метод при работе в Тасэдиторе. Для полного осознания всех его преимуществ вам потребуется несколько дней практики. Особенно долгим может быть переход, если вы уже прочно привязались к традиционному методу и не любите изучать новые технологии.</span></p>
<p class="rvps10"><span class="rvts22">При работе с этим методом режим Записи должен быть всегда выключен. Галочка "Auto-restore last position" должна быть выключена. Галочки "Turbo seek" и "Follow cursor" по умолчанию отключены и включаются по мере необходимости.</span></p>
<p class="rvps10"><span class="rvts22">Это основной метод при работе в Тасэдиторе. Поначалу может показаться, что он не похож на традиционный метод ТАСинга, однако по сути у них очень много общего.</span></p>
<p class="rvps10"><span class="rvts22">При использовании этого метода режим Записи должен быть всегда выключен. Галочка "Auto-restore last position" должна быть выключена. Галочки "Turbo seek" и "Follow cursor" обычно отключены, и включаются по мере необходимости.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">Основное занятие ТАСера:</span></p>
<p class="rvps10"><span class="rvts53"><br/></span></p>
<p class="rvps10"><span class="rvts23">Основное занятие:</span></p>
<p class="rvps10"><span class="rvts54"><br/></span></p>
<ol style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Проскроллировать Piano Roll к началу редактируемого участка мувика, доставить сюда Курсор Проигрывателя, определиться с целью. Полезно также отметить начало участка Маркером.</span></li>
<li class="rvps15"><span class="rvts22">Предположить наличие ошибки на участке, взвесить имеющиеся факторы оптимальности и прикинуть способ исправления ошибки (как именно требуется изменить </span><span class="rvts22">Ввод</span><span class="rvts22">, на каких кадрах и т.д.</span><span class="rvts22">).</span></li>
<li class="rvps15"><span class="rvts22">Н</span><span class="rvts22">авигация курсором мыши к любому кадру мувика осуществляется почти мгновенно.</span></li>
<li class="rvps15"><span class="rvts22">Отредактировать участок мышью. М</span><span class="rvts22">ожно менять Ввод либо вслепую (не просматривая состояние игры), либо время от времени перемещать Курсор Проигрывателя, чтобы засвидетельствовать изменения мувика.</span></li>
<li class="rvps15"><span class="rvts22">Просмотреть участок до момента наступления конечного события. Если целевое событие в игре не наступает в разумные сроки, вернуться к пункту 2.</span></li>
<li class="rvps15"><span class="rvts22">[</span><span class="rvts37">необязательный пункт</span><span class="rvts22">] </span><span class="rvts22">Определить кадр конца участка, поставив Курсор Проигрывателя на начальный кадр целевого события. </span><span class="rvts22">Полезно также отметить конец участка Маркером.</span><span class="rvts22"> Рекомендуется с</span><span class="rvts22">охранить полученный вариант прохождения участка в любую свободную Закладку.</span></li>
<li class="rvps15"><span class="rvts22">Если это не первый вариант прохождения участка, с</span><span class="rvts22">равнить </span><span class="rvts22">полученный результат с лучшим результатом, используя критерий оптимальности (например, сравнить номер кадра нового и старого конца участка). Если новый вариант оказался лучше&nbsp;</span><span class="rvts22"> (или если это ваш первый вариант прохождения участка), </span><span class="rvts31">рекомендуется</span><span class="rvts22"> сохранить результат в Закладку 9. </span><span class="rvts22">Слот 9 будет отвечать за хранение самого лучшего результата шлифовки участка. Если не сохранять лучший вариант в Закладку, он останется только в текущем мувике и в Журнале Истории.</span></li>
<li class="rvps15"><span class="rvts22">Вернуться к пункту 2 и опробовать ещё варианты, до тех пор пока не иссякнут идеи по данному участку.</span></li>
<li class="rvps15"><span class="rvts22">[</span><span class="rvts37">необязательный пункт</span><span class="rvts22">]</span><span class="rvts22"> Если идеи иссякают, можно почерпнуть информацию из прошлого или будущего: пересмотреть несколько участков, перетаскивая Курсор Проигрывателя или отпустив паузу эмулятора. При необходимости можно по-быстрому дорисовать </span><span class="rvts22">Ввод</span><span class="rvts22"> для событий игры, идущих после окончания текущего участка.</span></li>
<li class="rvps15"><span class="rvts22">Когда идеи полностью иссякли, восстановить лучший вариант прохождения из Журнала Истории или из Закладки 9</span><span class="rvts22"> в текущий мувик</span><span class="rvts22">, определиться со следующим участком и вернуться к пункту 1.</span></li>
<li class="rvps10"><span class="rvts22">Проскроллировать Piano Roll к началу редактируемого участка мувика, доставить сюда Курсор Проигрывателя, определиться с целью. Полезно также отметить начало участка Маркером.</span></li>
<li class="rvps10"><span class="rvts22">Предположить наличие ошибки на участке, взвесить имеющиеся факторы оптимальности и прикинуть способ исправления ошибки.</span></li>
<li class="rvps10"><span class="rvts22">Н</span><span class="rvts22">авигация курсором мыши к любому кадру текущего участка осуществляется практически мгновенно.</span></li>
<li class="rvps10"><span class="rvts22">Отредактировать участок мышью. М</span><span class="rvts22">ожно менять Ввод либо вслепую, либо время от времени перемещать Курсор Проигрывателя, чтобы свериться с игрой. </span><span class="rvts22">Шаги 3 и 4 непрерывно чередуются, пока редактирование не считается законченным.</span></li>
<li class="rvps10"><span class="rvts22">Определить кадр конца участка, поставив Курсора Проигрывателя на целевое событие.</span></li>
<li class="rvps10"><span class="rvts22">[</span><span class="rvts37">необязательный шаг</span><span class="rvts22">] </span><span class="rvts22">Сохранить готовый подход в любую свободную Закладку, например, в слот </span><span class="rvts27">8</span><span class="rvts22">.</span></li>
<li class="rvps10"><span class="rvts22">Если это не первый подход к прохождению участка, с</span><span class="rvts22">равнить новый</span><span class="rvts22"> результат с лучшим </span><span class="rvts22">старым</span><span class="rvts22"> результатом, используя критерий оптимальности. Если новый подход оказался лучше</span><span class="rvts22"> (или это первый </span><span class="rvts22">подход</span><span class="rvts22">),</span><span class="rvts22"> следует </span><span class="rvts22">сохранить его в Закладку </span><span class="rvts27">9</span><span class="rvts22">. </span><span class="rvts22">Слот </span><span class="rvts27">9</span><span class="rvts22"> будет отвечать за хранение самого лучшего результата шлифовки участка.</span></li>
<li class="rvps10"><span class="rvts22">Если осталось желание испробовать другие подходы, следует вернуться к шагу 2, и так до тех пор пока не иссякнут идеи по данному участку.</span></li>
<li class="rvps10"><span class="rvts22">[</span><span class="rvts37">необязательный шаг</span><span class="rvts22">]</span><span class="rvts22"> </span><span class="rvts22">Когда идеи начинают иссякать, </span><span class="rvts22">можно почерпнуть информацию из прошлого или будущего: пересмотреть несколько участков, перетаскивая Курсор Проигрывателя или отпустив паузу эмулятора. При необходимости можно по-быстрому дорисовать </span><span class="rvts22">Ввод</span><span class="rvts22"> для просмотра предстоящих событий игры.</span></li>
<li class="rvps10"><span class="rvts22">Когда идеи полностью иссякли, восстановить лучший </span><span class="rvts22">подход</span><span class="rvts22"> из Журнала Истории или из Закладки </span><span class="rvts27">9</span><span class="rvts22"> в текущий мувик</span><span class="rvts22"> и перейти к следующему участку</span><span class="rvts22">.</span></li>
</ol>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Так как все создаваемые варианты прохождения участка автоматически сохраняются в Журнале Истории, у ТАСера-новичка может возникнуть соблазн не сохранять варианты в Закладки, а просто один раз дойти до конечного события, а затем экспериментировать с этим Вводом, постепенно улучшая его (а если вместо улучшения получилось ухудшение сразу же откатывать изменения с помощью </span><span class="rvts34">Ctrl + Z</span><span class="rvts22">). Такой способ ТАСинга крайне не рекомендуется, так как он не позволяет вам мыслить далеко за рамками первоначального варианта (из-за подсознательного страха потерять имеющийся лучший вариант, если уйти от него слишком далеко). Даже если в результате последнего изменения Ввода у вас получилось ухудшение прохождения участка, нужно не откатываться к старому варианту, а пытаться разобраться в причинах ухудшения и продолжать осмысленную модификацию, чтобы получить улучшение.</span></p>
<p class="rvps10"><span class="rvts22">Чтобы не бояться, что предыдущее успешное прохождение участка затеряется в глубине Журнала Истории, рекомендуется поступать так же, как делают в традиционном методе отвести специальный слот для лучшего варианта прохождения участка и каждый раз ставить эту Закладку на конец участка, когда результат стал ещё лучше. </span></p>
<p class="rvps10"><span class="rvts22">Точно так же нужно поступать с перспективными вариантами прохождения участка, которые в чём-то лучше, а в чём-то хуже друг друга. Если вы сохраняете все альтернативные варианты в отдельные Закладки, вы можете со спокойной душой удалять их из мувика или изменять до неузнаваемости для возврата к ним вам потребуется всего одно нажатие клавиши, а не долгий поиск по Журналу Истории.</span></p>
<p class="rvps10"><span class="rvts22">Так как все создаваемые </span><span class="rvts22">подходы к</span><span class="rvts22"> прохождению участка автоматически сохраняются в Журнале Истории, у вас может возникнуть соблазн не сохранять </span><span class="rvts22">подходы</span><span class="rvts22"> в Закладки (шаги 6 и 7), а просто один раз дойти до конечного события, а затем экспериментировать с этим Вводом, постепенно улучшая его (а если вместо улучшения получилось ухудшение сразу же откатывать изменения). Такой поверхностный способ ТАСинга, в принципе, имеет право на жизнь, но не рекомендуется, так как он не позволяет вам мыслить далеко за рамками первоначального подхода (из-за подсознательного страха потерять наилучший старый подход, если уйти от него слишком далеко).</span></p>
<p class="rvps10"><span class="rvts22">Даже если в результате последнего изменения Ввода у вас получилось ухудшение прохождения участка, не нужно сразу откатываться к прошлому состоянию мувика, надо попытаться разобраться в причинах ухудшения и продолжить осмысленную модификацию, чтобы превратить его в улучшение. А для того чтобы не бояться, что предыдущее успешное прохождение затеряется в глубине Журнала Истории, следует поступать в точности так, как делают в традиционном методе отвести специальный слот для хранения лучшего результата и каждый раз ставить эту Закладку на конец участка, когда результат стал ещё лучше.</span></p>
<p class="rvps10"><span class="rvts22">Точно так же нужно поступать с перспективными подходами, которые в чём-то лучше, а в чём-то хуже текущего лучшего результата. Когда вы сохраняете все альтернативные подходы в отдельные Закладки, вы можете со спокойной душой удалять их Ввод из рабочего мувика или изменять до неузнаваемости, ведь для возврата к любому из них вам потребуется всего одно нажатие клавиши, а не долгий поиск по Журналу Истории.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">В этом методе ТАСинга, в отличие от традиционного, можно не заметить разделение мувика на логические участки, так как не требуется постоянно обозначать начало и конец текущего участка Закладками. Однако рекомендуется всё-таки соблюдать порядок и отмечать хотя бы начало участка Маркером (чтобы ограничить количество факторов оптимальности и не править </span><span class="rvts22">Ввод</span><span class="rvts22"> на предыдущих участках).</span></p>
<p class="rvps10"><span class="rvts22">Начало и конец участка обычно ассоциируются не с номером кадра, а с определёнными событиями игры. Но так как на начальное событие редактируемый </span><span class="rvts22">Ввод</span><span class="rvts22"> участка никак не влияет, то начальный кадр участка не изменяется в процессе оптимизации, и этот кадр можно однозначно зафиксировать Маркером.</span></p>
<p class="rvps10"><span class="rvts22">Конечное событие участка может наступить в разное время в зависимости от </span><span class="rvts22">Ввод</span><span class="rvts22">а на участке. Поэтому, если вы отмечаете конец участка Маркером, необходимо будет перетаскивать этот Маркер выше или ниже, когда из-за изменения </span><span class="rvts22">Ввод</span><span class="rvts22">а конечное событие изменилось. Если вам лень это делать, можно обойтись установкой Закладки, в которой заодно сохранится полученный вариант прохождения участка. Ну а для самых простых участков можно вообще никак не отмечать конечный кадр, полагаясь на собственную память и на зелёную стрелку Тасэдитора.</span></p>
<p class="rvps10"><span class="rvts22">В этом методе ТАСинга, в отличие от традиционного, можно не заметить разделение мувика на логические участки, так как не требуется постоянно обозначать начало и конец текущего участка Закладками. Однако рекомендуется всё-таки соблюдать порядок и отмечать начало каждого важного участка Маркером, чтобы ограничить количество факторов оптимальности.</span></p>
<p class="rvps10"><span class="rvts22">Начало и конец участка обычно ассоциируются не с бездушным номером кадра, а с определёнными событиями игры. Но так как на начальное событие редактируемый </span><span class="rvts22">Ввод</span><span class="rvts22"> участка никак не влияет, то это событие будет всегда происходить в одном и том же кадре, и этот кадр можно зафиксировать Маркером.</span></p>
<p class="rvps10"><span class="rvts22">Конечное событие участка может наступить в разное время, в зависимости от </span><span class="rvts22">Ввод</span><span class="rvts22">а на участке. Поэтому, если вы отмечаете конец участка Маркером, необходимо будет перемещать этот Маркер выше или ниже, когда из-за изменения </span><span class="rvts22">Ввод</span><span class="rvts22">а конечное событие изменилось. Зачастую непрактично тратить время на перетаскивание, поэтому вместо замыкающего Маркера можно обойтись вышеописанной установкой Закладки, в которой сохраняется полученный вариант прохождения участка, и при этом она служит отметкой конца участка.</span></p>
<p class="rvps10"><a name="GreenArrow"></a>
<span class="rvts22">С помощью зелёной стрелки Тасэдитор может подсказать, на каком кадре вы остановили просмотр участка в прошлый раз (до того как начали изменять </span><span class="rvts22">Ввод</span><span class="rvts22"> участка). Обычно это и есть кадр, в котором происходило конечное событие до недавних изменений </span><span class="rvts22">Ввод</span><span class="rvts22">а. Так что, если после изменения </span><span class="rvts22">Ввод</span><span class="rvts22">а конечное событие стало детектироваться на 2 кадра выше зелёной стрелки, это означает, что вы обогнали предыдущий результат на 2 кадра, значит, новый </span><span class="rvts22">Ввод</span><span class="rvts22"> лучше старого (если ваш критерий скорость). Вся эта логическая цепочка пролетает в голове за один миг при взгляде на Piano Roll после просмотра результата Ввода.</span></p>
<p class="rvps10"><span class="rvts22">Возьмём пример из Super Mario Bros.</span></p>
<p class="rvps10"><span class="rvts22">Пункт 1. При просмотре готовой части мувика вы остановили Курсор Проигрывателя в момент появления Марио на экране. Решили создать участок от этого места до события, когда координата X будет равна 100. Критерий чем быстрее, тем лучше. Поставили на начальный кадр Маркер, возможно даже ввели Заметку в духе "start running".</span></p>
<p class="rvps10"><span class="rvts22">Пункт 2. Сразу понятна первая ошибка во Вводе на участке нет ни одного нажатия.</span></p>
<p class="rvps10"><span class="rvts22">Пункты 3 и 4. Одним махом вы рисуете зажатие кнопки </span><span class="rvts32">R</span><span class="rvts22"> на протяжении пары десятков кадров.</span></p>
<p class="rvps10"><span class="rvts22">Пункт 5: Отпустили паузу эмуляции (средняя кнопка) и заметили, что Марио пробежал только до X=30, а потом остановился и стоит бесконечно долго. Ставим эмулятор на паузу и возвращаемся к пункту 2.</span></p>
<p class="rvps10"><span class="rvts22">Пункт 2. Очевидно, ошибка в том, что надо дольше жать </span><span class="rvts32">R</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Пункты 3 и 4. Дорисовали зажатие кнопки </span><span class="rvts32">R</span><span class="rvts22"> ещё на сотню кадров, чтобы уж наверняка хватило.</span></p>
<p class="rvps10"><span class="rvts22">Пункт 5: Отпустили паузу эмуляции и увидели, как Марио пробежал до X=100 и даже дальше.</span></p>
<p class="rvps10"><span class="rvts22">Пункты 6, 7 и 8: Поставили эмулятор на паузу и отвели Курсор Проигрывателя немного назад, на кадр с X=100. Это будет конец участка, допустим, это оказался кадр с номером 200.</span></p>
<p class="rvps10"><span class="rvts22">Пункт 2. Очевидно, надо бы ещё держать </span><span class="rvts32">B </span><span class="rvts22">во время бега.</span></p>
<p class="rvps10"><span class="rvts22">Пункты 3 и 4. Дорисовали зажатие кнопки </span><span class="rvts32">B</span><span class="rvts22"> параллельно столбику из нажатий </span><span class="rvts32">R</span><span class="rvts22"> на участке от начального Маркера до конца участка или даже дальше. Курсор Проигрывателя во время рисования отпрыгнул в начало участка, а на его месте в конце участка осталась зелёная стрелка.</span></p>
<p class="rvps10"><span class="rvts22">Пункт 5: Отпустили паузу эмуляции (средняя кнопка) и увидели, как Марио пробежал быстрее, достиг X=100 и бежит дальше. Если вы не нажали на паузу самостоятельно, эмулятор автоматически остановится на кадре с зелёной стрелкой.</span></p>
<p class="rvps10"><span class="rvts22">Пункты 6, 7 и 8: После остановки эмулятора отводим Курсор Проигрывателя на кадр с X=100. Допустим, это кадр с номером 150. Зелёная стрелка напоминает, что в прошлый раз концом участка был кадр 200, значит новый вариант прохождения лучше старого. Можно даже не считать, на сколько кадров было улучшено прохождение, а просто выделить регион кадров от Курсора Проигрывателя до зелёной стрелки и увидеть размер Выделения в панели Splicer.</span></p>
<p class="rvps10"><span class="rvts22">Пункт 2. Надо бы поэкспериментировать с прыжками и т.д...</span></p>
<p class="rvps10"><span class="rvts22">Курсор Проигрывателя каждый раз будет автоматически отпрыгивать вверх, а на его месте будет оставаться зелёная стрелка.</span></p>
<p class="rvps10"><span class="rvts22">Кроме того, вы можете сосредоточиться на первой части участка, мысленно определив подучасток, задачей которого будет, например, наибыстрейшее получение максимума горизонтальной скорости. Для создания такого подучастка нужно перемотать Курсор Проигрывателя на кадр, в котором скорость (согласно окну Memory Watch) достигает максимума в текущей стратегии прохождения участка, а затем просто начать редактирование </span><span class="rvts22">Ввод</span><span class="rvts22">а над этим кадром. При усечении Гринзоны зелёная стрелка перескочит на этот кадр, автоматически обозначив конец подучастка, и вы сможете, как обычно, сравнивать результат новой стратегии с результатом старой.</span></p>
<span class="rvts22">Ну а для простых участков можно вообще никак не отмечать конечный кадр, полагаясь на собственную память и на зелёную стрелку Тасэдитора. С помощью зелёной стрелки Тасэдитор может подсказать, на каком кадре вы остановили просмотр участка в прошлый раз (до того как начали изменять </span><span class="rvts22">Ввод</span><span class="rvts22"> участка). Обычно это и есть кадр, в котором происходило конечное событие в предыдущем подходе. Так что вы можете проиграть и обновлённый участок до этого кадра. Если после изменения </span><span class="rvts22">Ввод</span><span class="rvts22">а конечное событие стало детектироваться на 2 кадра выше зелёной стрелки, это означает, что вы обогнали предыдущий результат на 2 кадра, значит, новый </span><span class="rvts22">Ввод</span><span class="rvts22"> лучше (если ваш критерий скорость). Вся эта логическая цепочка пролетает в уме за один миг при взгляде на Piano Roll после просмотра результата недавнего изменения Ввода.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Процесс создания </span><span class="rvts22">Ввод</span><span class="rvts22">а в нелинейном методе представляет собой постоянное чередование редактирования и просмотра участка. Анализ ситуации происходит как во время просмотра, так и во время редактирования.</span></p>
<p class="rvps10"><span class="rvts22">Оптимальное соотношение времени на редактирование и просмотр формируется само по себе в процессе ТАСинга. Более того, это соотношение может меняться в процессе работы над проектом. Чем больше вы ТАСите одну игру, тем лучше вы ощущаете её закономерности. Поэтому ближе к концу своего мувика вы сможете интуитивно предсказывать результаты изменений </span><span class="rvts22">Ввод</span><span class="rvts22">а ещё во время редактирования, или даже раньше во время обдумывания их в голове. А просмотр участка будет нужен только для подтверждения догадки.</span></p>
<p class="rvps10"><span class="rvts22">В некоторых случаях можно судить об оптимальности </span><span class="rvts22">Ввод</span><span class="rvts22">а по промежуточным результатам, даже не просматривая участок до конца. Например, если персонаж на середине участка спотыкается об уступ и обнуляет скорость, можно сразу догадаться, что к концу участка он дойдёт позже, чем в прошлый раз. Поэтому не всегда хочется просматривать участок полностью, зачастую достаточно просмотреть пару актуальных кадров и продолжить редактирование. Однако такая спешка чревата тем, что вы мимоходом отвергнете решение, которое на первый взгляд кажется неоптимальным, хотя имеет огромный потенциал для успеха. Например, споткнувшись об уступ, Марио может случайно проникнуть внутрь стенки и пройти насквозь быстрее, чем обычно. Поэтому на всякий случай рекомендуется не торопиться, а досматривать участок до конца, когда критерий оптимальности уж наверняка не подведёт.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Способы просмотра результатов </span><span class="rvts22">Ввод</span><span class="rvts22">а на участке:</span></p>
<p class="rvps10"><span class="rvts22">Процесс шлифовки </span><span class="rvts22">Ввод</span><span class="rvts22">а в нелинейном методе представляет собой постоянное чередование редактирования и просмотра участка. Анализ ситуации происходит во время просмотра и сразу после остановки прсмотра.</span></p>
<p class="rvps10"><span class="rvts22">Способы просмотра результатов </span><span class="rvts22">Ввод</span><span class="rvts22">а:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">отпускание паузы хоткеем </span><span class="rvts27">Pause</span><span class="rvts22"> или нажатием средней кнопки мыши. После окончания участка требуется вручную поставить эмулятор на паузу (обычно не страшно, если вышло чуть позже, в крайнем случае можно потом отмотать наверх)</span></li>
<li class="rvps15"><span class="rvts22">запуск добегания к зелёной стрелке хоткеем </span><span class="rvts27">Restore Playback </span><span class="rvts22">или нажатием средней кнопки мыши, когда зелёная стрелка находится за пределами Гринзоны</span></li>
<li class="rvps15"><span class="rvts22">запуск добегания к ближайшему Маркеру нажатием средней кнопки при зажатой клавише </span><span class="rvts34">Shift</span><span class="rvts22">, если в конце участка поставлен Маркер</span></li>
<li class="rvps15"><span class="rvts22">запуск добегания к Курсору Выделения нажатием средней кнопки при зажатой клавише </span><span class="rvts34">Ctrl</span><span class="rvts22">, если Курсор Выделения стоит ниже Курсора Проигрывателя</span></li>
<li class="rvps15"><span class="rvts22">повторный просмотр участка от Курсора Выделения до Курсора Проигрывателя нажатием средней кнопки при зажатой клавише </span><span class="rvts34">Ctrl</span><span class="rvts22">, если Курсор Выделения стоит выше Курсора Проигрывателя</span></li>
<li class="rvps15"><span class="rvts22">перетаскивание Курсора Проигрывателя курсором мыши вручную на нужный кадр</span></li>
<li class="rvps15"><span class="rvts22">перемещение Курсора Проигрывателя колесом мыши с зажатой правой кнопкой</span></li>
<li class="rvps15"><span class="rvts22">покадровое перемещение Курсора Проигрывателя хоткеями </span><span class="rvts27">Frame Rewind</span><span class="rvts22"> и </span><span class="rvts27">Frame Advance</span><span class="rvts22">, либо кнопками </span><span class="rvts32">&lt;</span><span class="rvts22"> и </span><span class="rvts32">&gt; </span><span class="rvts22">или </span><span class="rvts22">акселераторами </span><span class="rvts34">Shift + Вверх</span><span class="rvts22"> и </span><span class="rvts34">Shift + Вниз</span></li>
<li class="rvps15"><span class="rvts22">а также остальные </span><a class="rvts28" href="Navigation.html#playback-cursor">способы навигации Курсором Проигрывателя</a></li>
<li class="rvps10"><span class="rvts22">отпускание паузы хоткеем </span><span class="rvts27">Pause</span><span class="rvts22"> или нажатием средней кнопки мыши. После окончания участка требуется вручную поставить эмулятор на паузу (и не страшно, если вышло чуть позже целевого события, можно потом отмотать наверх)</span></li>
<li class="rvps10"><span class="rvts22">запуск добегания к зелёной стрелке хоткеем </span><span class="rvts27">Restore Playback </span><span class="rvts22">или нажатием средней кнопки мыши, когда зелёная стрелка находится за пределами Гринзоны</span></li>
<li class="rvps10"><span class="rvts22">запуск добегания к ближайшему Маркеру нажатием средней кнопки при зажатой клавише </span><span class="rvts34">Shift</span></li>
<li class="rvps10"><span class="rvts22">запуск добегания к Курсору Выделения нажатием средней кнопки при зажатой клавише </span><span class="rvts34">Ctrl</span><span class="rvts22">, если Курсор Выделения стоит ниже Курсора Проигрывателя</span></li>
<li class="rvps10"><span class="rvts22">повторный просмотр участка от Курсора Выделения до Курсора Проигрывателя нажатием средней кнопки при зажатой клавише </span><span class="rvts34">Ctrl</span><span class="rvts22">, если Курсор Выделения стоит выше Курсора Проигрывателя</span></li>
<li class="rvps10"><span class="rvts22">перетаскивание Курсора Проигрывателя вручную курсором мыши</span></li>
<li class="rvps10"><span class="rvts22">перемещение Курсора Проигрывателя колесом мыши с зажатой правой кнопкой</span></li>
<li class="rvps10"><span class="rvts22">покадровое перемещение Курсора Проигрывателя хоткеями </span><span class="rvts27">Frame Rewind</span><span class="rvts22"> и </span><span class="rvts27">Frame Advance</span><span class="rvts22">, либо кнопками </span><span class="rvts32">&lt;</span><span class="rvts22"> и </span><span class="rvts32">&gt; </span><span class="rvts22">или </span><span class="rvts22">акселераторами </span><span class="rvts34">Shift + Вверх</span><span class="rvts22"> и </span><span class="rvts34">Shift + Вниз</span></li>
<li class="rvps10"><span class="rvts22">а также остальные </span><a class="rvts28" href="Navigation.html#playback-cursor">способы навигации Курсором Проигрывателя</a></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Не стоит привязываться к одному из этих способов, лучше чередовать их в зависимости от ситуации. Для тестирования мелких изменений проще использовать колесо мыши или </span><span class="rvts27">Frame Advance</span><span class="rvts22">/</span><span class="rvts27">Rewind</span><span class="rvts22">. А для просмотра всего участка уже имеет смысл перетащить Курсор Проигрывателя в начало и нажать среднюю кнопку или </span><span class="rvts27">Pause</span><span class="rvts22">/</span><span class="rvts27">Restore Playback</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Важно отметить, что вы можете просматривать и редактировать </span><span class="rvts22">Ввод</span><span class="rvts22"> одновременно. Когда галочка "Follow cursor" снята, Piano Roll во время проигрывания мувика остаётся на месте редактирования, и вы можете дорисовывать нажатия кнопок прямо в момент их выполнения. Например, попробуйте во время исполнения прыжка Марио начать изменять высоту этого прыжка, дорисовывая или стирая лишние нажатия </span><span class="rvts32">A</span><span class="rvts22"> на текущем участке. Останавливать эмуляцию при этом не требуется.</span></p>
<p class="rvps10"><span class="rvts22">При необходимости можно замедлить</span><span class="rvts22"> эмуляцию хоткеями </span><span class="rvts27">-</span><span class="rvts22"> и </span><span class="rvts27">=</span><span class="rvts22">, чтобы во время просмотра было достаточно времени для неспешных щелчков мышью. Однако, когда требуется не только пощёлкать, но ещё и подумать, следует вернуть эмулятор на паузу.</span></p>
<p class="rvps10"><span class="rvts22">Чаще всего используется либо просмотр участка средней кнопкой, либо перемещение Курсора Проигрывателя колесом. Не стоит привязываться к одному из этих способов, лучше использовать их в зависимости от ситуации.</span></p>
<p class="rvps10"><span class="rvts22">Соотношение времени на редактирование и просмотр зависит от сложности текущего участка и от объёма ваших знаний об игре. Чем больше вы ТАСите одну игру, тем лучше вы ощущаете её закономерности. Поэтому ближе к концу своего мувика вы сможете предвидеть результаты изменений </span><span class="rvts22">Ввод</span><span class="rvts22">а ещё во время редактирования, или даже раньше во время обдумывания их в голове. А просмотр участка будет нужен только для подтверждения догадки.</span></p>
<p class="rvps10"><span class="rvts22">В некоторых случаях можно судить об оптимальности </span><span class="rvts22">Ввод</span><span class="rvts22">а по промежуточным результатам, даже не просматривая участок до конца. Например, если персонаж на середине участка спотыкается об уступ и обнуляет скорость, можно сразу догадаться, что к целевому событию он дойдёт позже, чем в прошлый раз. Поэтому порой хочется просмотреть только пару кадров и продолжить редактирование. Однако такая спешка чревата тем, что вы мимоходом отвергнете решение, которое на первый взгляд кажется неоптимальным, хотя имеет огромный потенциал для успеха на другом участке. Например, споткнувшись об уступ, Марио может случайно проникнуть внутрь стенки и пройти насквозь. Поэтому на всякий случай рекомендуется не торопиться, а досматривать участок до конца, когда критерий оптимальности уж наверняка не подведёт.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps10"><span class="rvts22">В принципе, вы можете просматривать и редактировать </span><span class="rvts22">Ввод</span><span class="rvts22"> одновременно. Когда галочка "Follow cursor" снята, Piano Roll во время проигрывания мувика остаётся на месте редактирования, и вы можете дорисовывать нажатия кнопок прямо в момент их выполнения (проигрывания). Например, попробуйте во время исполнения прыжка Марио начать изменять высоту этого прыжка, дорисовывая или стирая лишние нажатия </span><span class="rvts32">A</span><span class="rvts22"> на текущем участке. Останавливать эмуляцию при этом не требуется. При необходимости можно замедлить</span><span class="rvts22"> эмуляцию хоткеями </span><span class="rvts27">-</span><span class="rvts22"> и </span><span class="rvts27">=</span><span class="rvts22">, чтобы во время просмотра было достаточно времени для щелчков мышью.</span></p>
<p class="rvps10"><span class="rvts22">Но когда требуется не только пощёлкать, но ещё и подумать, следует вернуть эмулятор на паузу и ТАСить правильно.</span></p>
<p class="rvps10"><a name="turbo-seeking"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Процесс эмуляции можно не только замедлять, но и ускорять. Раньше ускорение эмуляции использовалось только для быстрой навигации Курсором Проигрывателя к нужному уровню в игре. В Тасэдиторе турбо-эмуляция ещё используется в качестве оригинального способа ТАСинга.</span></p>
<p class="rvps10"><span class="rvts22">С помощью ускоренной эмуляции можно наглядно ощутить взаимосвязь не только между нажатием и следующим кадром, но также между нажатием и отдалённым событием.</span></p>
<p class="rvps10"><span class="rvts22">Процесс эмуляции можно не только замедлять, но и ускорять. Раньше ускорение эмуляции использовалось только для быстрого проигрывания готовой части мувика. В Тасэдиторе </span><span class="rvts31">турбо-эмуляция</span><span class="rvts22"> ещё используется в качестве оригинального способа ТАСинга. </span><span class="rvts22">С помощью максимально ускоренной эмуляции можно ощутить взаимосвязь не только между нажатием и следующим кадром, но также между нажатием и отдалённым событием.</span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/dw-luck_manipulation.gif"/></p>
<p class="rvps10"><a name="LuckManipulation"></a>
<span class="rvts22">Возьмём в качестве примера манипуляцию удачей.</span></p>
<p class="rvps10"><span class="rvts22">Без </span><span class="rvts22">турбо-добегания</span><span class="rvts22"> вы можете увидеть взаимосвязь между нажатием кнопки </span><span class="rvts32">B</span><span class="rvts22"> и появлением пули в следующем кадре. Соответственно, в голове появляется ассоциация "</span><span class="rvts32">B</span><span class="rvts22"> = выстрел", и мысли идут в направлении "чем позже поставлю нажатие </span><span class="rvts32">B</span><span class="rvts22">, тем позже вылетит пуля".</span></p>
<span class="rvts22">Возьмём в качестве примера процесс манипуляции удачей.</span></p>
<p class="rvps10"><span class="rvts22">Обычно при стрельбе</span><span class="rvts22"> вы можете увидеть взаимосвязь между нажатием кнопки </span><span class="rvts32">B</span><span class="rvts22"> и появлением пули в следующем кадре. Соответственно, в голове появляется ассоциация "</span><span class="rvts32">B</span><span class="rvts22"> = выстрел", и мысли идут в направлении "чем позже поставлю нажатие </span><span class="rvts32">B</span><span class="rvts22">, тем позже вылетит пуля".</span></p>
<p class="rvps10"><span class="rvts22">А с турбо вы можете сразу после установки </span><span class="rvts32">B</span><span class="rvts22"> увидеть выпавший из убитого врага приз, пропустив неважные промежуточные шаги (выстрел, полёт пули, столкновение, смерть врага и т.д.). В голове появляется ассоциация "</span><span class="rvts32">B</span><span class="rvts22"> = вероятность приза", и мысли идут в направлении "от времени нажатия </span><span class="rvts32">B</span><span class="rvts22"> зависит тип приза".</span></p>
<p class="rvps10"><span class="rvts22">Таким образом турбо позволяет автоматически отфильтровать ненужную информацию, идущую посреди участка, и сразу получить только нужную, появляющуюся в конце участка.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Таким образом турбо позволяет автоматически отфильтровать ненужную информацию, которую игра производит посреди участка, и получить только нужную, появляющуюся в конце участка.</span></p>
<p class="rvps10"><span class="rvts22">Делается это так:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Включаете галочку "Turbo seek". </span><span class="rvts22">Отключаете галочку "Follow cursor", чтобы Piano Roll не убегал вслед за Курсором Проигрывателя.</span></li>
<li class="rvps15"><span class="rvts22">Устанавливаете пробное нажатие кнопки </span><span class="rvts32">B</span><span class="rvts22"> в начало участка, на котором требуется стрелять во врага.</span></li>
<li class="rvps15"><span class="rvts22">Просматриваете попадение пули во врага и выпадение/отсутствие приза, оставляете Курсор Проигрывателя на этом месте (когда приз уже пару секунд должен лежать на земле) это и будет конец участка.</span></li>
<li class="rvps15"><span class="rvts22">Допустим, с первого раза выпал неудачный приз, но вы знаете, что в этой игре можно манипулировать удачей, выстрелив во врага чуть раньше или позже.</span></li>
<li class="rvps15"><span class="rvts22">Переносите нажатие на один кадр вперёд (достаточно вставить перед старым нажатием пустой кадр с помощью </span><span class="rvts34">Ctrl + </span><span class="rvts34">Shift + Insert</span><span class="rvts22">).</span></li>
<li class="rvps15"><span class="rvts22">В этот момент события игры автоматически откатываются назад, на экране FCEUX можно увидеть момент перед выстрелом.</span></li>
<li class="rvps15"><span class="rvts22">Нажимаете среднюю кнопку мыши или </span><span class="rvts27">Пробел</span><span class="rvts22"> (ту клавишу, которая назначена на хоткей </span><span class="rvts27">Restore Playback</span><span class="rvts22">). События игры мгновенно прокрутятся на максимально возможной скорости, и вы практически сразу увидите, какой из врага выпадает приз теперь.</span></li>
<li class="rvps15"><span class="rvts22">Если приз опять не тот, вновь нажимаете </span><span class="rvts34">Ctrl + </span><span class="rvts34">Shift + Insert</span><span class="rvts22"> для вставки ещё одного пустого кадра (а значит выстрел откладывается ещё на один кадр) и вновь нажимаете </span><span class="rvts27">Restore Playback</span><span class="rvts22">, чтобы увидеть новый вариант.</span></li>
<li class="rvps15"><span class="rvts22">Так можно продолжать, пока не будет найден номер кадра, на котором нажатие выстрела будет давать игроку требуемый приз. Всего за одну минуту можно успеть протестировать более сотни вариантов, машинально нажимая хоткеи и глядя только на экран FCEUX.</span></li>
<li class="rvps10"><span class="rvts22">Включаете галочку "Turbo seek". </span><span class="rvts22">Отключаете галочку "Follow cursor".</span></li>
<li class="rvps10"><span class="rvts22">Устанавливаете пробное нажатие кнопки </span><span class="rvts32">B</span><span class="rvts22"> в начало участка, на котором можно стрелять во врага.</span></li>
<li class="rvps10"><span class="rvts22">Просматриваете попадение пули во врага и оставляете Курсор Проигрывателя на кадре, где предполагаемый приз уже с 1-2 секунды должен лежать на земле. Это и будет конец участка.</span></li>
<li class="rvps10"><span class="rvts22">Допустим, с первой попытки нужный приз не выпал, но вы знаете, что в этой игре можно манипулировать удачей, выстрелив во врага чуть позже.&nbsp;</span><span class="rvts22"> Перенесите нажатие </span><span class="rvts32">B</span><span class="rvts22"> на один кадр вперёд (достаточно вставить перед старым нажатием пустой кадр).</span></li>
<li class="rvps10"><span class="rvts22">В этот момент события игры автоматически откатываются назад, и на экране FCEUX можно увидеть момент перед выстрелом.</span></li>
<li class="rvps10"><span class="rvts22">Нажимаете среднюю кнопку мыши или </span><span class="rvts27">Пробел</span><span class="rvts22"> (ту клавишу, которая назначена на хоткей </span><span class="rvts27">Restore Playback</span><span class="rvts22">). События игры мгновенно прокрутятся на максимально возможной скорости, и вы практически сразу увидите, какой из врага выпадает приз теперь.</span></li>
<li class="rvps10"><span class="rvts22">Если результат не удовлетворителен, вновь нажимаете </span><span class="rvts34">Ctrl + </span><span class="rvts34">Shift + Insert</span><span class="rvts22"> для вставки ещё одного пустого кадра перед имеюшимся нажатием </span><span class="rvts32">B</span><span class="rvts22">. Выстрел откладывается ещё на один кадр. Вновь нажимаете </span><span class="rvts27">Restore Playback</span><span class="rvts22">, чтобы увидеть новый результат.</span></li>
<li class="rvps10"><span class="rvts22">Так можно продолжать, пока не будет найден номер кадра, на котором нажатие выстрела будет давать игроку требуемый приз. Всего за одну минуту можно успеть протестировать более сотни вариантов, просто нажимая хоткеи и глядя только на экран FCEUX.</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Если у вас очень медленный компьютер, ассоциирование выстрела с выпавшим призом может не сработать, так как турбо-перемотка будет работать медленно, и вам придётся ждать результат, теряя концентрацию внимания. К счастью, FCEUX очень быстрый эмулятор (при использовании Old PPU).</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Итак, второй метод ТАСинга можно разделить на три подвида:</span></p>
<ol style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">редактирование на паузе</span></li>
<li class="rvps15"><span class="rvts22">редактирование во время просмотра (в частности, замедленного просмотра)</span></li>
<li class="rvps15"><span class="rvts22">редактирование на паузе с просмотром итогового результата (с помощью турбо-добегания)</span></li>
</ol>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Выбор конкретного метода зависит от текущей задачи ТАСера. Начинать обучение следует с редактирования во время паузы эмулятора. Можно осуществлять полный или частичный просмотр после каждого мелкого изменения, а можно перерисовать весь участок и только потом просмотреть получившийся результат.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Плюсы нелинейного ТАСинга:</span></p>
<p class="rvps15"><span class="rvts23">+ </span><span class="rvts22">Мгновенная навигация к месту редактирования.</span></p>
<p class="rvps15"><span class="rvts23">+ </span><span class="rvts22">Возможность пропускать ненужные сцены и ассоциировать действие с итогом.</span></p>
<p class="rvps15"><span class="rvts23">+ </span><span class="rvts22">Отстранённость ТАСера от игрового потока позволяет изучать поведение игры более объективно.</span></p>
<p class="rvps10"><span class="rvts22">Плюсы метода:</span></p>
<p class="rvps14"><span class="rvts23">+ </span><span class="rvts22">Мгновенная навигация.</span></p>
<p class="rvps14"><span class="rvts23">+ </span><span class="rvts22">Возможность пропускать ненужные сцены.</span></p>
<p class="rvps14"><span class="rvts23">+ </span><span class="rvts22">Отстранённость ТАСера от игрового потока повышает объективность.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Минусы метода:</span></p>
<p class="rvps15"><span class="rvts23"> </span><span class="rvts22">Отсутствие геймерской "отдачи" при редактировании на паузе. Для объективности это полезно, но нередко требуется слиться с игрой более плотно.</span></p>
<p class="rvps15"><span class="rvts23"> </span><span class="rvts22">Упор на мышиное управление. Клавиатура/джойстик в этом методе могут помочь быстро генерировать </span><span class="rvts22">Ввод</span><span class="rvts22">, но их возможности для навигации очень ограничены. А во время шлифовки навигация требуется очень часто.</span></p>
<p class="rvps14"><span class="rvts23"> </span><span class="rvts22">Отсутствие отдачи, присущей обычному игровому процессу.</span></p>
<p class="rvps14"><span class="rvts23"> </span><span class="rvts22">Упор на мышиное управление.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts26">Когда использовать:</span><span class="rvts22"> в большинстве случаев оптимизации участков. Полезно также комбинировать этот метод со следующим методом, переключаясь между ними для формирования в голове наиболее объективной картины игровых возможностей.</span></p>
<p class="rvps10"><span class="rvts26">Когда рекомендуется использовать:</span><span class="rvts22"> в большинстве случаев. Полезно также комбинировать этот метод со следующим методом для формирования в голове наиболее полной картины игровых возможностей.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a class="rvts28" href="SemiautomaticTASing.html">Следующий метод</a><span class="rvts22"> исправляет главный минус этого метода и в ряде случаев полностью заменяет его.</span></p>
<p class="rvps10"><a class="rvts28" href="SemiautomaticTASing.html">Следующий метод</a><span class="rvts22"> исправляет главный минус этого метода.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/feature-tour">Easily create EBooks</a></p>
</div>

View File

@ -3,7 +3,7 @@
<head>
<title>Операции</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("Operations");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("Operations");
}
});
</script>
</head>
@ -52,6 +55,7 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">Операции</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
@ -60,129 +64,129 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<div class="rvps21"><table width="420" border="1" cellpadding="0" cellspacing="0" style="border-color: #000000 #ffffff #ffffff #000000; border-style: solid;">
<tr valign="middle">
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #0000ff; width: 132px; height: 10px;"><p class="rvps5"><span class="rvts68">Изменение Ввода</span></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #0000ff; width: 132px; height: 10px;"><p class="rvps5"><span class="rvts69">Изменение Ввода</span></p>
</td>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #0000ff; width: 150px; height: 10px;"><p class="rvps5"><span class="rvts68">Изменение Маркеров</span></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #0000ff; width: 150px; height: 10px;"><p class="rvps5"><span class="rvts69">Изменение Маркеров</span></p>
</td>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #0000ff; width: 124px; height: 10px;"><p class="rvps5"><span class="rvts68">Прочее</span></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #0000ff; width: 124px; height: 10px;"><p class="rvps5"><span class="rvts69">Прочее</span></p>
</td>
</tr>
<tr valign="middle">
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #ccffff; width: 132px; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#Set">Set</a></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #ccffff; width: 132px; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#Set">Set</a></p>
</td>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #f2f2c8; width: 150px; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#MarkerSet">Marker Set</a></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #f2f2c8; width: 150px; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#MarkerSet">Marker Set</a></p>
</td>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #ede4e4; width: 124px; height: 10px;"><p class="rvps5"><span class="rvts67">Initialization</span></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #ede4e4; width: 124px; height: 10px;"><p class="rvps5"><span class="rvts68">Initialization</span></p>
</td>
</tr>
<tr valign="middle">
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #ccffff; width: 132px; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#Unset">Unset</a></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #ccffff; width: 132px; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#Unset">Unset</a></p>
</td>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #f2f2c8; width: 150px; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#MarkerRemove">Marker Remove</a></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #f2f2c8; width: 150px; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#MarkerRemove">Marker Remove</a></p>
</td>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #ede4e4; width: 124px; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#Undefined">Undefined</a></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #ede4e4; width: 124px; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#Undefined">Undefined</a></p>
</td>
</tr>
<tr valign="middle">
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #ccffff; width: 132px; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#Pattern">Pattern</a></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #ccffff; width: 132px; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#Pattern">Pattern</a></p>
</td>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #f2f2c8; width: 150px; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#MarkerPattern">Marker Pattern</a></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #f2f2c8; width: 150px; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#MarkerPattern">Marker Pattern</a></p>
</td>
<td rowspan="12" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; width: 124px;"><p class="rvps5"><span class="rvts66"><br/></span></p>
<td rowspan="12" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; width: 124px;"><p class="rvps5"><span class="rvts67"><br/></span></p>
</td>
</tr>
<tr valign="middle">
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #ccffff; width: 132px; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#Clear">Clear</a></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #ccffff; width: 132px; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#Clear">Clear</a></p>
</td>
<td rowspan="3" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #ffffff; width: 150px;"><br/>
</td>
</tr>
<tr valign="middle">
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #ccffff; width: 132px; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#Cut">Cut</a></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #ccffff; width: 132px; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#Cut">Cut</a></p>
</td>
</tr>
<tr valign="middle">
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #ccffff; width: 132px; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#Paste">Paste</a></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #ccffff; width: 132px; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#Paste">Paste</a></p>
</td>
</tr>
<tr valign="top">
<td colspan="2" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #d3f8d6; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#PasteInsert">PasteInsert</a></p>
<td colspan="2" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #d3f8d6; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#PasteInsert">PasteInsert</a></p>
</td>
</tr>
<tr valign="top">
<td colspan="2" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #d3f8d6; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#Clone">Clone</a></p>
<td colspan="2" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #d3f8d6; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#Clone">Clone</a></p>
</td>
</tr>
<tr valign="top">
<td colspan="2" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #d3f8d6; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#Insert">Insert</a></p>
<td colspan="2" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #d3f8d6; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#Insert">Insert</a></p>
</td>
</tr>
<tr valign="top">
<td colspan="2" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #d3f8d6; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#InsertNum">Insert#</a></p>
<td colspan="2" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #d3f8d6; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#InsertNum">Insert#</a></p>
</td>
</tr>
<tr valign="top">
<td colspan="2" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #d3f8d6; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#Delete">Delete</a></p>
<td colspan="2" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #d3f8d6; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#Delete">Delete</a></p>
</td>
</tr>
<tr valign="top">
<td colspan="2" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #d3f8d6; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#Truncate">Truncate</a></p>
<td colspan="2" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #d3f8d6; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#Truncate">Truncate</a></p>
</td>
</tr>
<tr valign="top">
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #ccffff; width: 132px; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#Record">Record</a></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #ccffff; width: 132px; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#Record">Record</a></p>
</td>
<td rowspan="2" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; width: 150px; height: 10px;"><p class="rvps5"><span class="rvts66"><br/></span></p>
<td rowspan="2" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; width: 150px; height: 10px;"><p class="rvps5"><span class="rvts67"><br/></span></p>
</td>
</tr>
<tr valign="top">
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #ccffff; width: 132px; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#Import">Import</a></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #ccffff; width: 132px; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#Import">Import</a></p>
</td>
</tr>
<tr valign="top">
<td colspan="2" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #d3f8d6; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#Branch">Branch</a></p>
<td colspan="2" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #d3f8d6; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#Branch">Branch</a></p>
</td>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #ede4e4; width: 124px;"><p class="rvps5"><a class="rvts67" href="Operations.html#Bookmark">Bookmark</a></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #ede4e4; width: 124px;"><p class="rvps5"><a class="rvts68" href="Operations.html#Bookmark">Bookmark</a></p>
</td>
</tr>
<tr valign="top">
<td rowspan="8" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; width: 132px; height: 10px;"><p class="rvps5"><span class="rvts66"><br/></span></p>
<td rowspan="8" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; width: 132px; height: 10px;"><p class="rvps5"><span class="rvts67"><br/></span></p>
</td>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #f2f2c8; width: 150px; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#MarkerBranch">Marker Branch</a></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #f2f2c8; width: 150px; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#MarkerBranch">Marker Branch</a></p>
</td>
<td rowspan="9" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; width: 124px;"><p class="rvps5"><span class="rvts6"><br/></span></p>
</td>
</tr>
<tr valign="top">
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #f2f2c8; width: 150px; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#MarkerRename">Marker Rename</a></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #f2f2c8; width: 150px; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#MarkerRename">Marker Rename</a></p>
</td>
</tr>
<tr valign="top">
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #f2f2c8; width: 150px; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#MarkerDrag">Marker Drag</a></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #f2f2c8; width: 150px; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#MarkerDrag">Marker Drag</a></p>
</td>
</tr>
<tr valign="top">
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #f2f2c8; width: 150px; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#MarkerSwap">Marker Swap</a></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #f2f2c8; width: 150px; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#MarkerSwap">Marker Swap</a></p>
</td>
</tr>
<tr valign="top">
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #f2f2c8; width: 150px; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#MarkerShift">Marker Shift</a></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #f2f2c8; width: 150px; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#MarkerShift">Marker Shift</a></p>
</td>
</tr>
<tr valign="top">
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #f2f2c8; width: 150px; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#LUAMarkerSet">LUA Marker Set</a></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #f2f2c8; width: 150px; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#LUAMarkerSet">LUA Marker Set</a></p>
</td>
</tr>
<tr valign="top">
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #f2f2c8; width: 150px; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#LUAMarkerRemove">LUA Marker Remove</a></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #f2f2c8; width: 150px; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#LUAMarkerRemove">LUA Marker Remove</a></p>
</td>
</tr>
<tr valign="top">
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #f2f2c8; width: 150px; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#LUAMarkerRename">LUA Marker Rename</a></p>
<td valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #f2f2c8; width: 150px; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#LUAMarkerRename">LUA Marker Rename</a></p>
</td>
</tr>
<tr valign="top">
<td colspan="2" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #d3f8d6; height: 10px;"><p class="rvps5"><a class="rvts67" href="Operations.html#LUAChange">LUA Change</a></p>
<td colspan="2" valign="middle" style="border-color : #ffffff #000000 #000000 #ffffff; border-style: solid; background-color: #d3f8d6; height: 10px;"><p class="rvps5"><a class="rvts68" href="Operations.html#LUAChange">LUA Change</a></p>
</td>
</tr>
</table>
@ -192,7 +196,7 @@
<p class="rvps10"><a name="Initialization"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps11"><span class="rvts23">Initialization</span></p>
<p class="rvps10"><span class="rvts47">Категория: прочее</span></p>
<p class="rvps10"><span class="rvts48">Категория: прочее</span></p>
<p class="rvps10"><span class="rvts22">Эта запись создаётся автоматически при создании Журнала Истории.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
@ -207,23 +211,23 @@
<p class="rvps10"><a name="Undefined"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps11"><span class="rvts23">Undefined</span></p>
<p class="rvps10"><span class="rvts47">Категория: прочее</span></p>
<p class="rvps10"><span class="rvts48">Категория: прочее</span></p>
<p class="rvps10"><span class="rvts22">Неопределённое изменение. В Тасэдиторе 1.0 эта запись не используется.</span></p>
<p class="rvps10"><span class="rvts22">Частота использования: </span><span class="rvts31">никогда</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="Set"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps11"><span class="rvts23">Set</span></p>
<p class="rvps10"><span class="rvts47">Категория: изменение Ввода</span></p>
<p class="rvps10"><span class="rvts48">Категория: изменение Ввода</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при установке одного или нескольких кнопочных нажатий в один или несколько кадров.</span></p>
<p class="rvps10"><span class="rvts22">The record is created when one or more buttonpresses appear in the movie.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps24" style="text-indent: 30px"><span class="rvts22">щелчок по пустой клетке Ввода в Piano Roll</span></li>
<li class="rvps24" style="text-indent: 30px"><span class="rvts22">рисование Ввода при помощи щелчка по пустой клетке и дальнейшего перемещения курсора мыши без отпускания левой кнопки</span></li>
<li class="rvps24" style="text-indent: 30px"><span class="rvts34">Shift</span><span class="rvts22"> + щелчок по пустой клетке </span><span class="rvts22">Ввод</span><span class="rvts22">а</span></li>
<li class="rvps24" style="text-indent: 30px"><span class="rvts22">щелчок по символу в Заголовке Piano Roll (когда есть Выделение)</span></li>
<li class="rvps24" style="text-indent: 30px"><span class="rvts22">нажатие кнопки виртуального джойстика </span><span class="rvts22">(когда есть Выделение)</span></li>
<li class="rvps29" style="text-indent: 30px"><span class="rvts22">щелчок по пустой клетке Ввода в Piano Roll</span></li>
<li class="rvps29" style="text-indent: 30px"><span class="rvts22">рисование Ввода при помощи щелчка по пустой клетке и дальнейшего перемещения курсора мыши без отпускания левой кнопки</span></li>
<li class="rvps29" style="text-indent: 30px"><span class="rvts34">Shift</span><span class="rvts22"> + щелчок по пустой клетке </span><span class="rvts22">Ввод</span><span class="rvts22">а</span></li>
<li class="rvps29" style="text-indent: 30px"><span class="rvts22">щелчок по символу в Заголовке Piano Roll (когда есть Выделение)</span></li>
<li class="rvps29" style="text-indent: 30px"><span class="rvts22">нажатие кнопки виртуального джойстика </span><span class="rvts22">(когда есть Выделение)</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:25:18 Set 15-21</span></p>
@ -233,15 +237,15 @@
<p class="rvps11"><a name="Unset"></a>
<span class="rvts23"><br/></span></p>
<p class="rvps11"><span class="rvts23">Unset</span></p>
<p class="rvps10"><span class="rvts47">Категория: изменение Ввода</span></p>
<p class="rvps10"><span class="rvts48">Категория: изменение Ввода</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при снятии </span><span class="rvts22">одного или нескольких кнопочных нажатий</span><span class="rvts22"> с одного или нескольких кадров.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">щелчок по заполненной клетке </span><span class="rvts22">Ввод</span><span class="rvts22">а в Piano Roll</span></li>
<li class="rvps24" style="text-indent: 30px"><span class="rvts22">стирание Ввода при помощи щелчка по заполненной клетке и дальнейшего перемещения курсора мыши без отпускания левой кнопки</span></li>
<li class="rvps15"><span class="rvts34">Shift</span><span class="rvts22"> + щелчок по заполненной клетке </span><span class="rvts22">Ввод</span><span class="rvts22">а в Piano Roll</span></li>
<li class="rvps15"><span class="rvts22">щелчок по символу в Заголовке Piano Roll </span><span class="rvts22">(когда есть Выделение)</span></li>
<li class="rvps15"><span class="rvts22">нажатие кнопки виртуального джойстика </span><span class="rvts22">(когда есть Выделение)</span></li>
<li class="rvps10"><span class="rvts22">щелчок по заполненной клетке </span><span class="rvts22">Ввод</span><span class="rvts22">а в Piano Roll</span></li>
<li class="rvps29" style="text-indent: 30px"><span class="rvts22">стирание Ввода при помощи щелчка по заполненной клетке и дальнейшего перемещения курсора мыши без отпускания левой кнопки</span></li>
<li class="rvps10"><span class="rvts34">Shift</span><span class="rvts22"> + щелчок по заполненной клетке </span><span class="rvts22">Ввод</span><span class="rvts22">а в Piano Roll</span></li>
<li class="rvps10"><span class="rvts22">щелчок по символу в Заголовке Piano Roll </span><span class="rvts22">(когда есть Выделение)</span></li>
<li class="rvps10"><span class="rvts22">нажатие кнопки виртуального джойстика </span><span class="rvts22">(когда есть Выделение)</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:25:22 Unset 21</span></p>
@ -251,15 +255,15 @@
<p class="rvps10"><a name="Pattern"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps11"><span class="rvts23">Pattern</span></p>
<p class="rvps10"><span class="rvts47">Категория: изменение Ввода</span></p>
<p class="rvps10"><span class="rvts48">Категория: изменение Ввода</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при установке нажатий/отпусканий одной кнопки по шаблону.</span></p>
<p class="rvps10"><span class="rvts22">В текст записи добавляется название использованного шаблона.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps23" style="text-indent: 30px"><span class="rvts34">Alt</span><span class="rvts22"> + щелчок по любой клетке </span><span class="rvts22">Ввод</span><span class="rvts22">а в Piano Roll</span></li>
<li class="rvps23" style="text-indent: 30px"><span class="rvts34">Alt</span><span class="rvts22"> + </span><span class="rvts22">рисование Ввода перемещением курсора мыши с зажатой левой кнопкой</span></li>
<li class="rvps15"><span class="rvts34">Alt</span><span class="rvts22"> + щелчок по символу в Заголовке Piano Roll </span><span class="rvts22">(когда есть Выделение)</span></li>
<li class="rvps15"><span class="rvts34">Alt</span><span class="rvts22"> + нажатие кнопки виртуального джойстика </span><span class="rvts22">(когда есть Выделение)</span></li>
<li class="rvps24" style="text-indent: 30px"><span class="rvts34">Alt</span><span class="rvts22"> + щелчок по любой клетке </span><span class="rvts22">Ввод</span><span class="rvts22">а в Piano Roll</span></li>
<li class="rvps24" style="text-indent: 30px"><span class="rvts34">Alt</span><span class="rvts22"> + </span><span class="rvts22">рисование Ввода перемещением курсора мыши с зажатой левой кнопкой</span></li>
<li class="rvps10"><span class="rvts34">Alt</span><span class="rvts22"> + щелчок по символу в Заголовке Piano Roll </span><span class="rvts22">(когда есть Выделение)</span></li>
<li class="rvps10"><span class="rvts34">Alt</span><span class="rvts22"> + нажатие кнопки виртуального джойстика </span><span class="rvts22">(когда есть Выделение)</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:25:40 Pattern 21-30 Alternating (1010...)</span></p>
@ -269,13 +273,13 @@
<p class="rvps10"><a name="Clear"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps11"><span class="rvts23">Clear</span></p>
<p class="rvps10"><span class="rvts47">Категория: изменение Ввода</span></p>
<p class="rvps10"><span class="rvts48">Категория: изменение Ввода</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при снятии нажатий всех кнопок с одного или нескольких кадров.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">нажатие клавиши </span><span class="rvts34">Delete</span><span class="rvts22"> </span><span class="rvts22">(когда есть Выделение)</span></li>
<li class="rvps15"><span class="rvts22">выбор в меню Тасэдитора пункта </span><span class="rvts26">Edit -&gt; Clear</span><span class="rvts22"> </span><span class="rvts22">(когда есть Выделение)</span></li>
<li class="rvps15"><span class="rvts22">щелчок правой кнопкой </span><span class="rvts22">по выделенному номеру кадра </span><span class="rvts22">и выбор контекстном меню пункта </span><span class="rvts26">Clear</span></li>
<li class="rvps10"><span class="rvts22">нажатие клавиши </span><span class="rvts34">Delete</span><span class="rvts22"> </span><span class="rvts22">(когда есть Выделение)</span></li>
<li class="rvps10"><span class="rvts22">выбор в меню Тасэдитора пункта </span><span class="rvts26">Edit -&gt; Clear</span><span class="rvts22"> </span><span class="rvts22">(когда есть Выделение)</span></li>
<li class="rvps10"><span class="rvts22">щелчок правой кнопкой </span><span class="rvts22">по выделенному номеру кадра </span><span class="rvts22">и выбор контекстном меню пункта </span><span class="rvts26">Clear</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:26:51 Clear 15-20</span></p>
@ -285,14 +289,14 @@
<p class="rvps10"><a name="Cut"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps11"><span class="rvts23">Cut</span></p>
<p class="rvps10"><span class="rvts47">Категория: изменение Ввода</span></p>
<p class="rvps10"><span class="rvts48">Категория: изменение Ввода</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при снятии нажатий всех кнопок с одного или нескольких кадров при помощи операции </span><span class="rvts22">Cut ("Вырезать" копирование данных в Буфер Обмена).</span></p>
<p class="rvps10"><span class="rvts22">Эта операция идентична операции </span><a class="rvts28" href="Operations.html#Clear">Clear</a><span class="rvts22">, за исключением того, что Ввод перед очисткой попадают в Буфер Обмена.</span></p>
<p class="rvps10"><span class="rvts37">Замечание:</span><span class="rvts22"> хотя последствия операции Cut можно откатывать, данные в Буфере Обмена при этом не восстановятся.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">нажатие клавиатурного акселератора </span><span class="rvts34">Ctrl + X</span><span class="rvts22"> (когда есть Выделение)</span></li>
<li class="rvps15"><span class="rvts22">выбор в меню Тасэдитора пункта </span><span class="rvts26">Edit -&gt; Cut</span><span class="rvts22"> (когда есть Выделение)</span></li>
<li class="rvps10"><span class="rvts22">нажатие клавиатурного акселератора </span><span class="rvts34">Ctrl + X</span><span class="rvts22"> (когда есть Выделение)</span></li>
<li class="rvps10"><span class="rvts22">выбор в меню Тасэдитора пункта </span><span class="rvts26">Edit -&gt; Cut</span><span class="rvts22"> (когда есть Выделение)</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:27:05 Cut 21-23</span></p>
@ -302,13 +306,13 @@
<p class="rvps10"><a name="Paste"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps11"><span class="rvts23">Paste</span></p>
<p class="rvps10"><span class="rvts47">Категория: изменение Ввода</span></p>
<p class="rvps10"><span class="rvts48">Категория: изменение Ввода</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при вставке данных из Буфера Обмена в мувик (поверх старых данных).</span></p>
<p class="rvps10"><span class="rvts22">В зависимости от состояния галочки "Superimpose" старый Ввод на этих кадрах либо очищается, либо объединяется с новым. В Заголовке Piano Roll вспыхивают символы кнопок, для которых было установлено хотя бы одно нажатие в выделенных кадрах.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">нажатие клавиатурного акселератора </span><span class="rvts34">Ctrl + V</span><span class="rvts22"> (когда есть Выделение)</span></li>
<li class="rvps15"><span class="rvts22">выбор в меню Тасэдитора пункта </span><span class="rvts26">Edit -&gt; Paste</span><span class="rvts22"> (когда есть Выделение)</span></li>
<li class="rvps10"><span class="rvts22">нажатие клавиатурного акселератора </span><span class="rvts34">Ctrl + V</span><span class="rvts22"> (когда есть Выделение)</span></li>
<li class="rvps10"><span class="rvts22">выбор в меню Тасэдитора пункта </span><span class="rvts26">Edit -&gt; Paste</span><span class="rvts22"> (когда есть Выделение)</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:27:11 Paste 21</span></p>
@ -318,12 +322,12 @@
<p class="rvps10"><a name="PasteInsert"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps11"><span class="rvts23">PasteInsert</span></p>
<p class="rvps10"><span class="rvts47">Категории: изменение Ввода, изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts48">Категории: изменение Ввода, изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при вставке данных из Буфера Обмена в мувик (с раздвиганием старых данных). Также смещаются вниз Маркеры, если они привязаны.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">нажатие клавиатурного акселератора </span><span class="rvts34">Ctrl + Shift + V</span><span class="rvts22"> (когда есть Выделение)</span></li>
<li class="rvps15"><span class="rvts22">выбор в меню Тасэдитора пункта </span><span class="rvts26">Edit -&gt; PasteInsert</span><span class="rvts22"> (когда есть Выделение)</span></li>
<li class="rvps10"><span class="rvts22">нажатие клавиатурного акселератора </span><span class="rvts34">Ctrl + Shift + V</span><span class="rvts22"> (когда есть Выделение)</span></li>
<li class="rvps10"><span class="rvts22">выбор в меню Тасэдитора пункта </span><span class="rvts26">Edit -&gt; PasteInsert</span><span class="rvts22"> (когда есть Выделение)</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:27:16 PasteInsert 21</span></p>
@ -333,13 +337,13 @@
<p class="rvps10"><a name="Clone"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps11"><span class="rvts23">Clone</span></p>
<p class="rvps10"><span class="rvts47">Категория: изменение Ввода, изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts48">Категория: изменение Ввода, изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при вставке копий одного или нескольких кадров посреди мувика, что приводит к сдвиганию Ввода (и Маркеров, если они привязаны к Вводу) вниз.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">нажатие клавиатурного акселератора </span><span class="rvts34">Ctrl + Insert</span><span class="rvts22"> </span><span class="rvts22">(когда есть Выделение)</span></li>
<li class="rvps15"><span class="rvts22">выбор в меню Тасэдитора пункта </span><span class="rvts26">Edit -&gt; Clone</span><span class="rvts22"> </span><span class="rvts22">(когда есть Выделение)</span></li>
<li class="rvps15"><span class="rvts22">щелчок правой кнопкой </span><span class="rvts22">по выделенному номеру кадра</span><span class="rvts22"> и выбор в контекстном меню пункта </span><span class="rvts26">Clone</span></li>
<li class="rvps10"><span class="rvts22">нажатие клавиатурного акселератора </span><span class="rvts34">Ctrl + Insert</span><span class="rvts22"> </span><span class="rvts22">(когда есть Выделение)</span></li>
<li class="rvps10"><span class="rvts22">выбор в меню Тасэдитора пункта </span><span class="rvts26">Edit -&gt; Clone</span><span class="rvts22"> </span><span class="rvts22">(когда есть Выделение)</span></li>
<li class="rvps10"><span class="rvts22">щелчок правой кнопкой </span><span class="rvts22">по выделенному номеру кадра</span><span class="rvts22"> и выбор в контекстном меню пункта </span><span class="rvts26">Clone</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:27:34 Clone 23</span></p>
@ -347,15 +351,15 @@
<p class="rvps10"><span class="rvts43">Гринзона усекается: после первого же кадра, где изменился Ввод или Лаг.</span></p>
<p class="rvps10"><span class="rvts43"><br/></span></p>
<p class="rvps10"><a name="Insert"></a>
<span class="rvts65"><br/></span></p>
<span class="rvts66"><br/></span></p>
<p class="rvps11"><span class="rvts23">Insert</span></p>
<p class="rvps10"><span class="rvts47">Категории: изменение Ввода, изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts48">Категории: изменение Ввода, изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при вставке одного или нескольких пустых кадров посреди мувика, что приводит к сдвиганию </span><span class="rvts22">Ввод</span><span class="rvts22">а (и Маркеров, если они привязаны к </span><span class="rvts22">Ввод</span><span class="rvts22">у) вниз.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">нажатие клавиатурного акселератора </span><span class="rvts34">Ctrl + Shift + Insert</span><span class="rvts22"> </span><span class="rvts22">(когда есть Выделение)</span></li>
<li class="rvps15"><span class="rvts22">выбор в меню Тасэдитора пункта </span><span class="rvts26">Edit -&gt; Insert</span><span class="rvts22"> </span><span class="rvts22">(когда есть Выделение)</span></li>
<li class="rvps15"><span class="rvts22">щелчок правой кнопкой по выделенному номеру кадра и выбор в контекстном меню пункта </span><span class="rvts26">Insert</span></li>
<li class="rvps10"><span class="rvts22">нажатие клавиатурного акселератора </span><span class="rvts34">Ctrl + Shift + Insert</span><span class="rvts22"> </span><span class="rvts22">(когда есть Выделение)</span></li>
<li class="rvps10"><span class="rvts22">выбор в меню Тасэдитора пункта </span><span class="rvts26">Edit -&gt; Insert</span><span class="rvts22"> </span><span class="rvts22">(когда есть Выделение)</span></li>
<li class="rvps10"><span class="rvts22">щелчок правой кнопкой по выделенному номеру кадра и выбор в контекстном меню пункта </span><span class="rvts26">Insert</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:25:58 Insert 21</span></p>
@ -365,15 +369,15 @@
<p class="rvps10"><a name="InsertNum"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps11"><span class="rvts23">Insert#</span></p>
<p class="rvps10"><span class="rvts47">Категории: изменение Ввода, изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts48">Категории: изменение Ввода, изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при вставке заданного количества пустых кадров посреди мувика, что приводит к сдвиганию </span><span class="rvts22">Ввод</span><span class="rvts22">а (и Маркеров, если они привязаны к </span><span class="rvts22">Ввод</span><span class="rvts22">у) вниз.</span></p>
<p class="rvps10"><span class="rvts22">Если в Piano Roll есть Выделение, </span><span class="rvts22">то требуемое количество пустых строк появляется перед Курсором Выделения</span><span class="rvts22">. </span><span class="rvts22">Если Выделения нет, то требуемое количество пустых строк появляется перед Курсором Проигрывателя.</span></p>
<p class="rvps10"><span class="rvts22">В текст записи добавляется количество вставленных кадров.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">нажатие клавиши </span><span class="rvts34">Insert</span><span class="rvts22"> и введение требуемого числа кадров</span></li>
<li class="rvps15"><span class="rvts22">выбор в меню Тасэдитора пункта </span><span class="rvts26">Edit -&gt; Insert # of Frames</span></li>
<li class="rvps15"><span class="rvts22">щелчок правой кнопкой </span><span class="rvts22">по выделенному номеру кадра </span><span class="rvts22">и выбор в контекстном меню пункта </span><span class="rvts26">Insert # of Frames</span></li>
<li class="rvps10"><span class="rvts22">нажатие клавиши </span><span class="rvts34">Insert</span><span class="rvts22"> и введение требуемого числа кадров</span></li>
<li class="rvps10"><span class="rvts22">выбор в меню Тасэдитора пункта </span><span class="rvts26">Edit -&gt; Insert # of Frames</span></li>
<li class="rvps10"><span class="rvts22">щелчок правой кнопкой </span><span class="rvts22">по выделенному номеру кадра </span><span class="rvts22">и выбор в контекстном меню пункта </span><span class="rvts26">Insert # of Frames</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:26:09 Insert#4 29</span></p>
@ -383,13 +387,13 @@
<p class="rvps10"><a name="Delete"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps11"><span class="rvts23">Delete</span></p>
<p class="rvps10"><span class="rvts47">Категории: изменение Ввода, изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts48">Категории: изменение Ввода, изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при удалении одного или нескольких кадров посреди мувика, что приводит к сдвиганию </span><span class="rvts22">Ввод</span><span class="rvts22">а (и Маркеров, если они привязаны к </span><span class="rvts22">Ввод</span><span class="rvts22">у) вверх.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">нажатие клавиатурного акселератора </span><span class="rvts34">Ctrl + Delete</span><span class="rvts22"> </span><span class="rvts22">(когда есть Выделение)</span></li>
<li class="rvps15"><span class="rvts22">выбор в меню Тасэдитора пункта </span><span class="rvts26">Edit -&gt; Delete</span><span class="rvts22"> </span><span class="rvts22">(когда есть Выделение)</span></li>
<li class="rvps15"><span class="rvts22">щелчок правой кнопкой </span><span class="rvts22">по выделенному номеру кадра </span><span class="rvts22">и выбор в контекстном меню пункта </span><span class="rvts26">Delete</span></li>
<li class="rvps10"><span class="rvts22">нажатие клавиатурного акселератора </span><span class="rvts34">Ctrl + Delete</span><span class="rvts22"> </span><span class="rvts22">(когда есть Выделение)</span></li>
<li class="rvps10"><span class="rvts22">выбор в меню Тасэдитора пункта </span><span class="rvts26">Edit -&gt; Delete</span><span class="rvts22"> </span><span class="rvts22">(когда есть Выделение)</span></li>
<li class="rvps10"><span class="rvts22">щелчок правой кнопкой </span><span class="rvts22">по выделенному номеру кадра </span><span class="rvts22">и выбор в контекстном меню пункта </span><span class="rvts26">Delete</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:26:12 Delete 33</span></p>
@ -399,12 +403,12 @@
<p class="rvps10"><a name="Truncate"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps11"><span class="rvts23">Truncate</span></p>
<p class="rvps10"><span class="rvts47">Категории: изменение Ввода, изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts48">Категории: изменение Ввода, изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при усечении хвоста мувика, что приводит удалению Ввода (и Маркеров, если они привязаны к Вводу), начиная с указанной строки. Е</span><span class="rvts22">сли в Piano Roll есть Выделение, мувик усекается сразу после первого выделенного кадра. Если выделения нет, то мувик усекается сразу после Курсора Проигрывателя.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">выбор в меню Тасэдитора пункта </span><span class="rvts26">Edit -&gt; Truncate movie</span></li>
<li class="rvps15"><span class="rvts22">щелчок правой кнопкой </span><span class="rvts22">по выделенному номеру кадра </span><span class="rvts22">и выбор в контекстном меню пункта </span><span class="rvts26">Truncate movie</span></li>
<li class="rvps10"><span class="rvts22">выбор в меню Тасэдитора пункта </span><span class="rvts26">Edit -&gt; Truncate movie</span></li>
<li class="rvps10"><span class="rvts22">щелчок правой кнопкой </span><span class="rvts22">по выделенному номеру кадра </span><span class="rvts22">и выбор в контекстном меню пункта </span><span class="rvts26">Truncate movie</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:26:28 Truncate 42</span></p>
@ -414,15 +418,15 @@
<p class="rvps10"><a name="Record"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps11"><span class="rvts23">Record</span></p>
<p class="rvps10"><span class="rvts47">Категория: изменение Ввода</span></p>
<p class="rvps10"><span class="rvts48">Категория: изменение Ввода</span></p>
<p class="rvps10"><span class="rvts22">Эта запись в Журнал Истории создаётся при Записывании Ввода в мувик с помощью виртуальных джойстиков в режиме Recording.</span></p>
<p class="rvps10"><span class="rvts22">Новый Ввод появляется на кадре, где находится Курсор Проигрывателя. В зависимости от состояния галочки "Superimpose" старый Ввод на этом кадре либо очищается, либо объединяется с новым. </span><span class="rvts22">В Заголовке Piano Roll вспыхивают символы кнопок, для которых было установлено нажатие.</span></p>
<p class="rvps10"><span class="rvts22">В текст записи добавляются номера виртуальных джойстиков, Ввод которых был изменён.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">нажатие кнопок виртуального джойстика (когда отжата пауза эмулятора, и включен режим Recording)</span></li>
<li class="rvps15"><span class="rvts22">отсутствие нажатий кнопок виртуального джойстика (когда отжата пауза эмулятора, и включен режим Recording)</span></li>
<li class="rvps15"><span class="rvts22">нажатие кнопок виртуального джойстика одновременно с нажатием хоткея </span><span class="rvts27">Frame Advance</span><span class="rvts22"> (когда эмулятор стоит на паузе, и включен режим Recording)</span></li>
<li class="rvps10"><span class="rvts22">нажатие кнопок виртуального джойстика (когда отжата пауза эмулятора, и включен режим Recording)</span></li>
<li class="rvps10"><span class="rvts22">отсутствие нажатий кнопок виртуального джойстика (когда отжата пауза эмулятора, и включен режим Recording)</span></li>
<li class="rvps10"><span class="rvts22">нажатие кнопок виртуального джойстика одновременно с нажатием хоткея </span><span class="rvts27">Frame Advance</span><span class="rvts22"> (когда эмулятор стоит на паузе, и включен режим Recording)</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:28:01 Record(1P) 18-24</span></p>
@ -432,13 +436,13 @@
<p class="rvps10"><a name="Import"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps11"><span class="rvts23">Import</span></p>
<p class="rvps10"><span class="rvts47">Категория: изменение Ввода</span></p>
<p class="rvps10"><span class="rvts48">Категория: изменение Ввода</span></p>
<p class="rvps10"><span class="rvts22">Эта запись создаётся при импорте Ввода из любого другого FM2/FM3-файла.</span></p>
<p class="rvps10"><span class="rvts22">Текущий Ввод мувика полностью заменяется на Ввод из выбранного файла. Маркеры остаются без изменений</span></p>
<p class="rvps10"><span class="rvts22">В текст записи добавляется имя файла, из которого был взят Ввод. Номер кадра в этих записях отсутствует, так как заменяется весь Ввод, начиная с нулевого кадра.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">выбор пункта меню </span><span class="rvts26">File -&gt; Import Input</span><span class="rvts22"> и открытие файла-источника</span></li>
<li class="rvps10"><span class="rvts22">выбор пункта меню </span><span class="rvts26">File -&gt; Import Input</span><span class="rvts22"> и открытие файла-источника</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:28:53 Import Battletoads-WIP1.fm2</span></p>
@ -457,15 +461,15 @@
<p class="rvps11"><span class="rvts23">Bookmark7</span></p>
<p class="rvps11"><span class="rvts23">Bookmark8</span></p>
<p class="rvps11"><span class="rvts23">Bookmark9</span></p>
<p class="rvps10"><span class="rvts47">Категория: прочее</span></p>
<p class="rvps10"><span class="rvts48">Категория: прочее</span></p>
<p class="rvps10"><span class="rvts22">Эта запись создаётся при изменении данных одного слота Закладок.</span></p>
<p class="rvps10"><span class="rvts22">Пересохранение Закладки в уже заполненный слот срабатывает, только если новые данные отличаются от имеющихся в данном слоте. Например, если отличается кадр Закладки или мувик её ответвления.</span></p>
<p class="rvps10"><span class="rvts22">При успешном сохранении Закладки её ответвление становится текущим, а в окне эмулятора появляется сообщение "Branch # saved."</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">нажатие хоткея "сохранить состояние": </span><span class="rvts26">Shift +</span><span class="rvts22"> клавиша в ряду от </span><span class="rvts27">F1</span><span class="rvts22"> до </span><span class="rvts27">F10</span></li>
<li class="rvps15"><span class="rvts22">щелчок правой кнопкой мыши по любой строке Списка Закладок</span></li>
<li class="rvps15"><span class="rvts22">щелчок правой кнопкой мыши по любой иконке Закладок в Дереве ответвлений</span></li>
<li class="rvps10"><span class="rvts22">нажатие хоткея "сохранить состояние": </span><span class="rvts26">Shift +</span><span class="rvts22"> клавиша в ряду от </span><span class="rvts27">F1</span><span class="rvts22"> до </span><span class="rvts27">F10</span></li>
<li class="rvps10"><span class="rvts22">щелчок правой кнопкой мыши по любой строке Списка Закладок</span></li>
<li class="rvps10"><span class="rvts22">щелчок правой кнопкой мыши по любой иконке Закладок в Дереве ответвлений</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:28:53 Bookmark1 10</span></p>
@ -484,15 +488,15 @@
<p class="rvps11"><span class="rvts23">Branch7 to</span></p>
<p class="rvps11"><span class="rvts23">Branch8 to</span></p>
<p class="rvps11"><span class="rvts23">Branch9 to</span></p>
<p class="rvps10"><span class="rvts47">Категории: изменение Ввода, изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts48">Категории: изменение Ввода, изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при замене текущего мувика на данные из ответвления Закладки. Заменяется и Ввод, и Маркеры.</span></p>
<p class="rvps10"><span class="rvts22">В текст записи добавляется время создания этой Закладки, так как фактически содержимое мувика возвращается во времени на этот момент.</span></p>
<p class="rvps10"><span class="rvts22">При успешной загрузке Закладки её ответвление становится текущим, а в окне эмулятора появляется сообщение "Branch # loaded."</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">нажатие хоткея "загрузить состояние": клавиша в ряду от </span><span class="rvts27">F1</span><span class="rvts22"> до </span><span class="rvts27">F10</span></li>
<li class="rvps15"><span class="rvts22">щелчок левой кнопкой мыши по правой половине Списка Закладок</span></li>
<li class="rvps15"><span class="rvts22">двойной щелчок по любой иконке Закладок в Дереве ответвлений</span></li>
<li class="rvps10"><span class="rvts22">нажатие хоткея "загрузить состояние": клавиша в ряду от </span><span class="rvts27">F1</span><span class="rvts22"> до </span><span class="rvts27">F10</span></li>
<li class="rvps10"><span class="rvts22">щелчок левой кнопкой мыши по правой половине Списка Закладок</span></li>
<li class="rvps10"><span class="rvts22">двойной щелчок по любой иконке Закладок в Дереве ответвлений</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:29:02 Branch1 to 20:28:15</span></p>
@ -511,13 +515,13 @@
<p class="rvps11"><span class="rvts23">Marker Branch7 to</span></p>
<p class="rvps11"><span class="rvts23">Marker Branch8 to</span></p>
<p class="rvps11"><span class="rvts23">Marker Branch9 to</span></p>
<p class="rvps10"><span class="rvts47">Категория: изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts48">Категория: изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при замене текущего мувика на данные из ответвления Закладки, когда Ввод Закладки совпадал с Вводом мувика, а отличались только Маркеры.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">нажатие хоткея "загрузить состояние": клавиша в ряду от </span><span class="rvts27">F1</span><span class="rvts22"> до </span><span class="rvts27">F10</span></li>
<li class="rvps15"><span class="rvts22">щелчок левой кнопкой мыши по правой половине Списка Закладок</span></li>
<li class="rvps15"><span class="rvts22">двойной щелчок по любой иконке Закладок в Дереве ответвлений</span></li>
<li class="rvps10"><span class="rvts22">нажатие хоткея "загрузить состояние": клавиша в ряду от </span><span class="rvts27">F1</span><span class="rvts22"> до </span><span class="rvts27">F10</span></li>
<li class="rvps10"><span class="rvts22">щелчок левой кнопкой мыши по правой половине Списка Закладок</span></li>
<li class="rvps10"><span class="rvts22">двойной щелчок по любой иконке Закладок в Дереве ответвлений</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:29:33 Marker Branch1 to 20:28:15</span></p>
@ -527,13 +531,13 @@
<p class="rvps10"><a name="MarkerSet"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps11"><span class="rvts23">Marker Set</span></p>
<p class="rvps10"><span class="rvts47">Категория: изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts48">Категория: изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при установке Маркера на один или несколько кадров.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">двойной щелчок по номеру кадра в Piano Roll (при условии, что на этом кадре ещё нет Маркера)</span></li>
<li class="rvps15"><span class="rvts22">щелчок по "Frame#" в Заголовке Piano Roll (когда есть Выделение, и среди выделенных кадров есть кадры без Маркеров)</span></li>
<li class="rvps15"><span class="rvts22">щелчок правой кнопкой </span><span class="rvts22">по выделенному номеру кадра </span><span class="rvts22">и выбор в контекстном меню пункта </span><span class="rvts26">Set Markers</span></li>
<li class="rvps10"><span class="rvts22">двойной щелчок по номеру кадра в Piano Roll (при условии, что на этом кадре ещё нет Маркера)</span></li>
<li class="rvps10"><span class="rvts22">щелчок по "Frame#" в Заголовке Piano Roll (когда есть Выделение, и среди выделенных кадров есть кадры без Маркеров)</span></li>
<li class="rvps10"><span class="rvts22">щелчок правой кнопкой </span><span class="rvts22">по выделенному номеру кадра </span><span class="rvts22">и выбор в контекстном меню пункта </span><span class="rvts26">Set Markers</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:29:47 Marker Set 15-18</span></p>
@ -543,13 +547,13 @@
<p class="rvps10"><a name="MarkerRemove"></a>
<span class="rvts43"><br/></span></p>
<p class="rvps11"><span class="rvts23">Marker Remove</span></p>
<p class="rvps10"><span class="rvts47">Категория: изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts48">Категория: изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при снятии Маркера с одного или нескольких кадров.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">двойной щелчок по номеру кадра в Piano Roll (при условии, что на этом кадре есть Маркер), перетаскивание Маркера за пределы Piano Roll и отпускание</span></li>
<li class="rvps15"><span class="rvts22">щелчок по "Frame#" в Заголовке Piano Roll (когда есть Выделение, и на всех выделенных кадрах есть Маркеры)</span></li>
<li class="rvps15"><span class="rvts22">щелчок правой кнопкой </span><span class="rvts22">по выделенному номеру кадра </span><span class="rvts22">и выбор в контекстном меню пункта </span><span class="rvts26">Remove Markers</span></li>
<li class="rvps10"><span class="rvts22">двойной щелчок по номеру кадра в Piano Roll (при условии, что на этом кадре есть Маркер), перетаскивание Маркера за пределы Piano Roll и отпускание</span></li>
<li class="rvps10"><span class="rvts22">щелчок по "Frame#" в Заголовке Piano Roll (когда есть Выделение, и на всех выделенных кадрах есть Маркеры)</span></li>
<li class="rvps10"><span class="rvts22">щелчок правой кнопкой </span><span class="rvts22">по выделенному номеру кадра </span><span class="rvts22">и выбор в контекстном меню пункта </span><span class="rvts26">Remove Markers</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:29:52 Marker Remove 16-18</span></p>
@ -559,12 +563,12 @@
<p class="rvps10"><a name="MarkerPattern"></a>
<span class="rvts43"><br/></span></p>
<p class="rvps11"><span class="rvts23">Marker Pattern</span></p>
<p class="rvps10"><span class="rvts47">Категория: изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts48">Категория: изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при установке Маркеров по шаблону.</span></p>
<p class="rvps10"><span class="rvts22">В текст записи добавляется название использованного шаблона.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts34">Alt</span><span class="rvts22"> + щелчок по "Frame#" в Заголовке Piano Roll (когда есть Выделение)</span></li>
<li class="rvps10"><span class="rvts34">Alt</span><span class="rvts22"> + щелчок по "Frame#" в Заголовке Piano Roll (когда есть Выделение)</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:30:11 Marker Pattern 20-30 One Quarter (10001000...)</span></p>
@ -574,14 +578,14 @@
<p class="rvps10"><a name="MarkerRename"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps11"><span class="rvts23">Marker Rename</span></p>
<p class="rvps10"><span class="rvts47">Категория: изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts48">Категория: изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при изменении текста Заметки одного Маркера.</span></p>
<p class="rvps10"><span class="rvts22">В текст записи добавляется новый текст Заметки.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">ввести текст Заметки сразу же после создания нового Маркера двойным щелчком</span></li>
<li class="rvps15"><span class="rvts22">щёлкнуть мышью по верхнему текстовому полю, стереть старый текст и ввести новый текст, затем нажать </span><span class="rvts26">Enter</span><span class="rvts22"> или </span><span class="rvts22">щёлкнуть по любому месту окна TAS Editor</span></li>
<li class="rvps15"><span class="rvts22">щёлкнуть мышью по нижнему текстовому полю, ввести новый текст, затем нажать </span><span class="rvts26">Enter</span><span class="rvts22"> или щёлкнуть по любому месту окна TAS Editor</span></li>
<li class="rvps10"><span class="rvts22">ввести текст Заметки сразу же после создания нового Маркера двойным щелчком</span></li>
<li class="rvps10"><span class="rvts22">щёлкнуть мышью по верхнему текстовому полю, стереть старый текст и ввести новый текст, затем нажать </span><span class="rvts26">Enter</span><span class="rvts22"> или </span><span class="rvts22">щёлкнуть по любому месту окна TAS Editor</span></li>
<li class="rvps10"><span class="rvts22">щёлкнуть мышью по нижнему текстовому полю, ввести новый текст, затем нажать </span><span class="rvts26">Enter</span><span class="rvts22"> или щёлкнуть по любому месту окна TAS Editor</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:31:01 Marker Rename 20 Testing...</span></p>
@ -591,12 +595,12 @@
<p class="rvps10"><a name="MarkerDrag"></a>
<span class="rvts43"><br/></span></p>
<p class="rvps11"><span class="rvts23">Marker Drag</span></p>
<p class="rvps10"><span class="rvts47">Категория: изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts48">Категория: изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при перемещении Маркера с одного кадра на другой.</span></p>
<p class="rvps10"><span class="rvts22">В текст записи помещается старый и новый номер кадра данного Маркера, а также текст его Заметки.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">сделать двойной щелчок по </span><span class="rvts22">Маркеру и зажать левую кнопку, затем перетащить Маркер на кадр, где нет Маркера, и отпустить</span></li>
<li class="rvps10"><span class="rvts22">сделать двойной щелчок по </span><span class="rvts22">Маркеру и зажать левую кнопку, затем перетащить Маркер на кадр, где нет Маркера, и отпустить</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:31:08 Marker Drag 20=&gt;15 Testing...</span></p>
@ -606,12 +610,12 @@
<p class="rvps10"><a name="MarkerSwap"></a>
<span class="rvts43"><br/></span></p>
<p class="rvps11"><span class="rvts23">Marker Swap</span></p>
<p class="rvps10"><span class="rvts47">Категория: изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts48">Категория: изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся, когда два Маркера меняются местами.</span></p>
<p class="rvps10"><span class="rvts22">В текст записи помещается старый и новый номер кадра перетаскиваемого Маркера, а также текст его Заметки.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">сделать двойной щелчок по </span><span class="rvts22">Маркеру и зажать левую кнопку, затем перетащить Маркер на кадр с другим Маркером и отпустить</span></li>
<li class="rvps10"><span class="rvts22">сделать двойной щелчок по </span><span class="rvts22">Маркеру и зажать левую кнопку, затем перетащить Маркер на кадр с другим Маркером и отпустить</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:31:14 Marker Swap 24&lt;=&gt;28</span></p>
@ -621,13 +625,13 @@
<p class="rvps10"><a name="MarkerShift"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps11"><span class="rvts23">Marker Shift</span></p>
<p class="rvps10"><span class="rvts47">Категория: изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts48">Категория: изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при изменении мувика, которое не изменило Ввод, но привело к смещению Маркеров вверх или вниз.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">вставить пустой кадр перед самым концом мувика, за которым нет нажатий, но есть Маркер</span></li>
<li class="rvps15"><span class="rvts22">склонировать пустой кадр перед самым концом мувика, за которым нет нажатий, но есть Маркер</span></li>
<li class="rvps15"><span class="rvts22">скопировать в Буфер Обмена пустой кадр, затем сделать </span><span class="rvts26">PasteInsert</span><span class="rvts22"> перед самым концом мувика, за которым нет нажатий, но есть Маркер</span></li>
<li class="rvps10"><span class="rvts22">вставить пустой кадр перед самым концом мувика, за которым нет нажатий, но есть Маркер</span></li>
<li class="rvps10"><span class="rvts22">склонировать пустой кадр перед самым концом мувика, за которым нет нажатий, но есть Маркер</span></li>
<li class="rvps10"><span class="rvts22">скопировать в Буфер Обмена пустой кадр, затем сделать </span><span class="rvts26">PasteInsert</span><span class="rvts22"> перед самым концом мувика, за которым нет нажатий, но есть Маркер</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:31:44 Marker Shift 21</span></p>
@ -637,11 +641,11 @@
<p class="rvps10"><a name="LUAMarkerSet"></a>
<span class="rvts43"><br/></span></p>
<p class="rvps11"><span class="rvts23">LUA Marker Set</span></p>
<p class="rvps10"><span class="rvts47">Категория: изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts48">Категория: изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при установке Маркера на один кадр с помощью вызова функции </span><span class="rvts21">taseditor.setmarker()</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">исполнить Луа-скрипт со строкой </span><span class="rvts21">taseditor.setmarker(framenum)</span></li>
<li class="rvps10"><span class="rvts22">исполнить Луа-скрипт со строкой </span><span class="rvts21">taseditor.setmarker(framenum)</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:35:14 LUA Marker Set 0</span></p>
@ -651,11 +655,11 @@
<p class="rvps10"><a name="LUAMarkerRemove"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps11"><span class="rvts23">LUA Marker Remove</span></p>
<p class="rvps10"><span class="rvts47">Категория: изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts48">Категория: изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при снятии Маркера с одного кадра с помощью вызова функции </span><span class="rvts21">taseditor.removemarker()</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">исполнить Луа-скрипт со строкой </span><span class="rvts21">taseditor.removemarker(framenum)</span></li>
<li class="rvps10"><span class="rvts22">исполнить Луа-скрипт со строкой </span><span class="rvts21">taseditor.removemarker(framenum)</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:36:12 LUA Marker Remove 0</span></p>
@ -665,12 +669,12 @@
<p class="rvps10"><a name="LUAMarkerRename"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps11"><span class="rvts23">LUA Marker Rename</span></p>
<p class="rvps10"><span class="rvts47">Категория: изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts48">Категория: изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при изменении текста Заметки одного Маркера с помощью вызова функции </span><span class="rvts21">taseditor.setnote()</span><span class="rvts22"> из Луа-скрипта.</span></p>
<p class="rvps10"><span class="rvts22">В текст записи добавляется новый текст Заметки.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">исполнить Луа-скрипт со строкой </span><span class="rvts21">taseditor.setnote(markernum, newtext)</span></li>
<li class="rvps10"><span class="rvts22">исполнить Луа-скрипт со строкой </span><span class="rvts21">taseditor.setnote(markernum, newtext)</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:37:03 LUA Marker Rename 0 Hello from Lua!</span></p>
@ -680,13 +684,13 @@
<p class="rvps10"><a name="LUAChange"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps11"><span class="rvts23">LUA Change</span></p>
<p class="rvps10"><span class="rvts47">Категории: изменение Ввода, изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts48">Категории: изменение Ввода, изменение Маркеров</span></p>
<p class="rvps10"><span class="rvts22">Запись создаётся при изменении Ввода/Маркеров одного или нескольких кадров с помощью вызова функции </span><span class="rvts21">taseditor.applyinputchanges()</span><span class="rvts22"> из Луа-скрипта.</span></p>
<p class="rvps10"><span class="rvts22">Вместо слова "Change" в тексте записи может фигурировать любое другое слово или словосочетание, которое указывается в качестве параметра функции </span><span class="rvts21">taseditor.applyinputchanges()</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Варианты:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">исполнить Луа-скрипт со строками </span><span class="rvts21">taseditor.submitinputchange(frame, joypad, input)</span><span class="rvts22"> и </span><span class="rvts21">taseditor.applyinputchanges(name)</span></li>
<li class="rvps15"><span class="rvts22">исполнить Луа-скрипт со строками </span><span class="rvts21">taseditor.submitinsertframes(frame, number)</span><span class="rvts22"> либо </span><span class="rvts21">taseditor.submitdeleteframes(frame, number)</span><span class="rvts22"> и </span><span class="rvts21">taseditor.applyinputchanges(name)</span></li>
<li class="rvps10"><span class="rvts22">исполнить Луа-скрипт со строками </span><span class="rvts21">taseditor.submitinputchange(frame, joypad, input)</span><span class="rvts22"> и </span><span class="rvts21">taseditor.applyinputchanges(name)</span></li>
<li class="rvps10"><span class="rvts22">исполнить Луа-скрипт со строками </span><span class="rvts21">taseditor.submitinsertframes(frame, number)</span><span class="rvts22"> либо </span><span class="rvts21">taseditor.submitdeleteframes(frame, number)</span><span class="rvts22"> и </span><span class="rvts21">taseditor.applyinputchanges(name)</span></li>
</ul>
<p class="rvps22"><span class="rvts44">Пример:</span></p>
<p class="rvps22"><span class="rvts44">20:39:56 LUA Corruptor 10</span></p>
@ -697,6 +701,7 @@
<p class="rvps10"><span class="rvts43"><br/></span></p>
<p class="rvps10"><span class="rvts43"><br/></span></p>
<p class="rvps10"><span class="rvts43"><br/></span></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/feature-tour/create-ebooks-for-amazon-kindle">Free Kindle producer</a></p>
</div>

View File

@ -3,7 +3,7 @@
<head>
<title>2.1. Piano Roll</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("PianoRoll");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("PianoRoll");
}
});
</script>
</head>
@ -52,6 +55,7 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">Piano Roll</span></p>
<p class="rvps5"><span class="rvts39"><br/></span></p>
<p class="rvps5"><img alt="" style="padding : 1px;" src="lib/taseditor-smb.png"/></p>
@ -71,14 +75,14 @@
<p class="rvps10"><span class="rvts22">Чтобы добавлять и изменять </span><span class="rvts22">Ввод</span><span class="rvts22"> мувика, щёлкайте мышкой по клеткам в столбцах, находящихся правее столбика с номерами кадров. Если щёлкнуть по пустой клетке, то на ней появится символ, соответствующий кнопке реального джойстика эмулируемой приставки (NES).</span></p>
<div class="rvps21"><table width="600" border="0" cellpadding="6" cellspacing="0" style="border-width: 0px;">
<tr valign="middle">
<td style="width: 586px; height: 14px;"><p class="rvps15"><span class="rvts26">A</span><span class="rvts22"> кнопка </span><span class="rvts32">A</span></p>
<p class="rvps15"><span class="rvts26">B</span><span class="rvts22"> кнопка </span><span class="rvts32">B</span></p>
<p class="rvps15"><span class="rvts26">S</span><span class="rvts22"> кнопка </span><span class="rvts32">Select</span></p>
<p class="rvps15"><span class="rvts26">T</span><span class="rvts22"> кнопка </span><span class="rvts32">Start</span></p>
<p class="rvps15"><span class="rvts26">U</span><span class="rvts22"> крестовина </span><span class="rvts32">Вверх</span></p>
<p class="rvps15"><span class="rvts26">D</span><span class="rvts22"> </span><span class="rvts22">крестовина</span><span class="rvts22"> </span><span class="rvts32">Вниз</span></p>
<p class="rvps15"><span class="rvts26">L</span><span class="rvts22"> </span><span class="rvts22">крестовина</span><span class="rvts22"> </span><span class="rvts32">Влево</span></p>
<p class="rvps15"><span class="rvts26">R</span><span class="rvts22"> </span><span class="rvts22">крестовина</span><span class="rvts22"> </span><span class="rvts32">Вправо</span></p>
<td style="width: 586px; height: 14px;"><p class="rvps14"><span class="rvts26">A</span><span class="rvts22"> кнопка </span><span class="rvts32">A</span></p>
<p class="rvps14"><span class="rvts26">B</span><span class="rvts22"> кнопка </span><span class="rvts32">B</span></p>
<p class="rvps14"><span class="rvts26">S</span><span class="rvts22"> кнопка </span><span class="rvts32">Select</span></p>
<p class="rvps14"><span class="rvts26">T</span><span class="rvts22"> кнопка </span><span class="rvts32">Start</span></p>
<p class="rvps14"><span class="rvts26">U</span><span class="rvts22"> крестовина </span><span class="rvts32">Вверх</span></p>
<p class="rvps14"><span class="rvts26">D</span><span class="rvts22"> </span><span class="rvts22">крестовина</span><span class="rvts22"> </span><span class="rvts32">Вниз</span></p>
<p class="rvps14"><span class="rvts26">L</span><span class="rvts22"> </span><span class="rvts22">крестовина</span><span class="rvts22"> </span><span class="rvts32">Влево</span></p>
<p class="rvps14"><span class="rvts26">R</span><span class="rvts22"> </span><span class="rvts22">крестовина</span><span class="rvts22"> </span><span class="rvts32">Вправо</span></p>
</td>
<td style="width: 258px; height: 178px;"><p class="rvps5"><img alt="" style="padding : 1px;" src="lib/NES-controller.png"/></p>
</td>
@ -137,7 +141,8 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com">Full featured Documentation generator</a></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com">Full-featured Documentation generator</a></p>
</div>
<div id="topic_footer">

View File

@ -3,7 +3,7 @@
<head>
<title>5. Настройка программы</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("ProgramCustomization");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("ProgramCustomization");
}
});
</script>
</head>
@ -52,12 +55,12 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">Настройка программы</span></p>
<p class="rvps2"><span class="rvts39"><br/></span></p>
<p class="rvps2"><span class="rvts39"><br/></span></p>
<p class="rvps10"><span class="rvts22">Перед тем, как начинать серьёзный ТАСинг, настройте Тасэдитор согласно своим предпочтениям.</span></p>
<p class="rvps10"><span class="rvts22">В этой главе перечислены все настройки инструмента, а также настройки эмулятора FCEUX, которые влияют на работу в Тасэдиторе.</span></p>
<p class="rvps10"><span class="rvts22">Все настройки хранятся в файле </span><span class="rvts31">fceux.cfg</span><span class="rvts22"> в папке эмулятора. Если вы удалите этот файл, при следующем запуске FCEUX настройки сбросятся на значения по умолчанию.</span></p>
<p class="rvps10"><span class="rvts22">Некоторые полезные функции Тасэдитора по умолчанию отключены, так как перед их использованием нужно понять принцип их работы. В этой главе описаны все настройки инструмента, а также настройки эмулятора FCEUX, которые влияют на работу в Тасэдиторе.</span></p>
<p class="rvps10"><span class="rvts22">Настройки хранятся в файле </span><span class="rvts31">fceux.cfg</span><span class="rvts22"> в папке эмулятора. Если вы удалите этот файл, при следующем запуске FCEUX все настройки сбросятся на значения по умолчанию.</span></p>
<div class="rvps10"><table width="100%" border="0" cellpadding="4" cellspacing="0" style="border-width: 0px;">
<tr valign="top">
<td style="width: 847px;"><p class="rvps10"><span class="rvts22">Для начала, если вы уже прочитали </span><a class="rvts28" href="ProgramInterface.html">главу 2</a><span class="rvts22"> и поняли назначение всех элементов интерфейса, стоит отключить всплывающие подсказки (предназначенные исключительно для новичка). </span><span class="rvts22">Для этого зайдите в пункт меню Тасэдитора "Help" (Справка) и уберите галочку с подпункта "Enable Tooltips". Можете предварительно прочитать все подсказки, наводя курсор мыши на различные элементы окна Тасэдитора, чтобы закрепить уже имеющиеся знания об интерфейсе программы.</span></p>
@ -70,13 +73,13 @@
<p class="rvps10"><a name="view-menu"></a>
<span class="rvts22">Теперь откройте пункт "View" (Вид).</span></p>
<p class="rvps10"><img align="left" alt="" style="padding : 6px;" src="lib/view-menu.png"/></p>
<p class="rvps10"><span class="rvts22">Подпункт "Find Note window" вызывает окно поиска текста в Заметках Маркеров. Эта функция будет полезной, если вы документируете свой мувик с помощью Заметок.</span></p>
<p class="rvps10"><span class="rvts22">Далее в меню "View" идут галочки настроек внешнего вида программы. Чтобы не делать настройки наугад, прямо сейчас создайте пробный проект (просто открыв Тасэдитор) и экспериментируйте с ним.</span></p>
<p class="rvps10"><span class="rvts22">Подпункт "Find Note window" вызывает окно поиска текста в Заметках Маркеров. Эта функция будет полезной, если вы документируете свой мувик с помощью Заметок. Она описана в следующей главе.</span></p>
<p class="rvps10"><span class="rvts22">Далее в меню "View" идут галочки настроек внешнего вида программы. Чтобы опробовать все возможности, прямо сейчас создайте пробный проект (просто открыв Тасэдитор) и экспериментируйте с ним.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="DisplayBranchScreenshots"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">View -&gt; Display Branch Screenshots</span></p>
<p class="rvps10"><span class="rvts22">Отображает всплывающие скриншоты (снимки экрана) при наведении курсором мыши на Закладки. С помощью скриншота вы можете быстро восстановить в уме события, сохранённые в мувике данной Закладки. Таким образом облегчается поиск нужного ответвления не обязательно загружать Закладку, чтобы иметь представление о её содержимом. Переводя курсор мыши с одной Закладки на другую, можно очень быстро сравнивать альтернативные стратегии, не загружая ответвления.</span></p>
<p class="rvps10"><span class="rvts22">Отображает всплывающие скриншоты (снимки экрана) при наведении курсором мыши на Закладки. С помощью скриншота вы можете быстро восстановить в уме события, сохранённые в мувике данной Закладки. Таким образом облегчается поиск нужного ответвления не обязательно загружать Закладку, чтобы иметь представление о её содержимом. Переводя курсор мыши с одной Закладки на другую, можно также быстро сравнивать результаты альтернативных подходов.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию эта опция включена. Если отключить, скриншоты не будут появляться при наведении.</span></p>
<p class="rvps10"><span class="rvts22">Рекомендуется включить эту функцию, если вас не раздражают всплывающие картинки, частично загораживающие Piano Roll.</span></p>
<p class="rvps10"><a name="DisplayBranchDescriptions"></a>
@ -84,111 +87,117 @@
<p class="rvps10"><span class="rvts23">View -&gt; Display Branch Descriptions</span></p>
<p class="rvps10"><span class="rvts22">Отображает всплывающие текстовые описания при наведении курсором мыши на Закладки. С помощью этого текста, как и с помощью скриншота, вы можете ещё до загрузки Закладки понять, требуется ли загружать данное ответвление.</span></p>
<p class="rvps10"><span class="rvts22">Текст описания берётся из Заметки Маркера, под которым находится кадр данной Закладки. Сам Маркер может быть уже давно удалён из текущего мувика, но если Закладка была создана, когда Маркер ещё существовал, то значит, она содержит в себе ответвление мувика, где Маркер существует. И при возврате во времени на эту Закладку мувик восстановится на состояние, где Маркер существует.</span></p>
<p class="rvps10"><span class="rvts22">Таким образом, при записи альтернативных стратегий прохождения вы можете перед сохранением очередной стратегии в отдельное ответвление поставить Маркер на Курсор Проигрывателя и ввести текстовое описание созданной стратегии, например "</span><span class="rvts31">тут я прошёл уровень поверху</span><span class="rvts22">". После этого можно создать Закладку на этом кадре, сохранив в ней текущий мувик. Затем можно удалить этот Маркер вместе с частью </span><span class="rvts22">Ввод</span><span class="rvts22">а и записать другую стратегию прохождения. В конце, после просмотра альтернативной стратегии ставите новый Маркер с Заметкой в духе "</span><span class="rvts31">тут я прошёл уровень понизу</span><span class="rvts22">" и следует сохранить текущее ответвление мувика в новую Закладку. Теперь вы можете сохранить проект и выключить Тасэдитор. На следующий день вы легко вспомните плюсы и минусы двух записанных стратегий прохождения, ещё даже не загружая их в Тасэдитор, а только наводя курсор мыши то на одну Закладку, то на другую. </span><span class="rvts22">При наведении на первую Закладку будет появляться скриншот финального кадра уровня (где был поставлен Курсор Проигрывателя при создании первой Закладки) и надпись "</span><span class="rvts31">тут я прошёл уровень поверху</span><span class="rvts22">", а при наведении на вторую Закладку будет тоже появляться скриншот финального кадра уровня (где был оставлен голубой курсор при создании второй Закладки) и надпись "</span><span class="rvts31">тут я прошёл уровень понизу</span><span class="rvts22">". В данном случае по скриншоту трудно отличить два ответвления, т.к. обе стратегии заканчиваются в одном и том же месте игры. А по текстовым описаниям это сделать легко.</span></p>
<p class="rvps10"><span class="rvts22">Таким образом, при тестировании альтернативных стратегий прохождения для большого участка (например, для целого уровня игры) вы можете перед сохранением очередной стратегии в отдельное ответвление поставить Маркер на Курсор Проигрывателя и ввести текстовое описание созданной стратегии, например "</span><span class="rvts31">тут я прошёл уровень поверху</span><span class="rvts22">". После этого следует создать Закладку на этом кадре, сохранив в неё текущий мувик. Затем можно удалить этот Маркер вместе с частью </span><span class="rvts22">Ввод</span><span class="rvts22">а и записать другую стратегию прохождения текущего участка. В конце, после просмотра альтернативного подхода нужно поставить новый Маркер с Заметкой в духе "</span><span class="rvts31">тут я прошёл уровень понизу</span><span class="rvts22">" и сохранить текущее ответвление мувика в другую Закладку. После этого вы можете сохранить проект и, скажем, выключить Тасэдитор. На следующий день вы легко вспомните плюсы и минусы двух записанных стратегий прохождения. </span><span class="rvts22">При наведении на первую Закладку будет появляться скриншот финального кадра уровня (где был поставлен Курсор Проигрывателя при создании первой Закладки) и надпись "</span><span class="rvts31">тут я прошёл уровень поверху</span><span class="rvts22">", а при наведении на вторую Закладку будет тоже появляться скриншот финального кадра уровня (где был оставлен голубой курсор при создании второй Закладки) и надпись "</span><span class="rvts31">тут я прошёл уровень понизу</span><span class="rvts22">". В данном случае по скриншоту трудно отличить два ответвления, т.к. обе стратегии заканчиваются на одном и том же событии игры. А по текстовым описаниям это сделать легко.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию эта опция включена. Если отключить, текстовые описания не будут появляться при наведении.</span></p>
<p class="rvps10"><span class="rvts22">Рекомендуется включить эту функцию, если вас не раздражают всплывающие текстовые поля.</span></p>
<p class="rvps10"><a name="EnableHotChanges"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">View -&gt; Enable Hot Changes</span></p>
<p class="rvps10"><span class="rvts22">Включает и отключает функцию Горячих Правок.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию эта опция включена. Если отключить, то символы установленных нажатий кнопок на Piano Roll будут отображаться только стандартным чёрным цветом. Если включить, то у каждого символа будет своя степень "горячести", зависящая от того, как давно была изменена соответствующая клетка в Piano Roll. Более горячими являются символы, установленные недавно. Они отображаются более ярким оттенком красного цвета. По мере уменьшения горячести цвет символа постепенно темнеет и переходит в стандартный чёрный.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию эта опция включена. Если отключить, то символы установленных нажатий кнопок в Piano Roll будут отображаться стандартным чёрным цветом. Если включить, то у каждого символа будет своя степень "горячести", зависящая от того, как давно была изменена соответствующая клетка в Piano Roll. Более горячими являются символы, установленные недавно. Они отображаются более ярким оттенком красного цвета. По мере уменьшения горячести цвет символа постепенно темнеет (остывает) и переходит в стандартный чёрный.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps18"><img alt="" style="padding : 1px;" src="lib/hotchanges-colors.png"/></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Всего Тасэдитор поддерживает 15 оттенков горячести + нулевой чёрный. Когда вы меняете состояние ячейки </span><span class="rvts22">Ввод</span><span class="rvts22">а, ей присваивается максимальное значение горячести (15), а все ячейки, изменённые перед этим, остывают на 1 единицу. Таким образом, по одному взгляду на Piano Roll сразу понятно, какие изменения были произведены только что, какие перед этим, какие недавно, а какие давно.</span></p>
<p class="rvps10"><span class="rvts22">Благодаря Горячим Правкам можно видеть недавно удалённые нажатия на их месте вместо пустой клетки отображается чёрточка соответствующего цвета. По мере редактирования другого </span><span class="rvts22">Ввод</span><span class="rvts22">а цвет этой чёрточки будет остывать, и после 15 посторонних правок чёрточка окончательно исчезнет.</span></p>
<p class="rvps10"><span class="rvts22">Такие же чёрточки будут показывать место вставки новых кадров посреди мувика, чтобы пользователю было проще ориентироваться в </span><span class="rvts22">Ввод</span><span class="rvts22">е.</span></p>
<p class="rvps10"><span class="rvts22">Рекомендуется включить эту функцию, чтобы повысить удобство работы в Тасэдиторе. Теоретически, даже скорость работы должна повыситься, так как вам придётся меньше вспоминать, какое действие было совершено полминуты назад. Конечно, даже без Горячих Правок можно легко восстановить в уме цепочку прошедших событий с помощью отката Истории (несколько нажатий </span><span class="rvts34">Ctrl + Z</span><span class="rvts22">), а затем вернуть мувик обратно (столько же нажатий </span><span class="rvts34">Ctrl + Y</span><span class="rvts22">). Но в этом случае возможно нежелательное усечение Гринзоны из-за изменения </span><span class="rvts22">Ввод</span><span class="rvts22">а. Так что лучше просто оставить Горячие Правки включенными.</span></p>
<p class="rvps10"><span class="rvts22">Единственным минусом этой функции является тот факт, что карта Горячих Правок сохраняется в Журнале Истории и в FM3-файле проекта, увеличивая занимаемый объём памяти.</span></p>
<p class="rvps10"><span class="rvts22">Также благодаря Горячим Правкам можно видеть недавно удалённые нажатия на их месте вместо пустой клетки отображается чёрточка соответствующего цвета. По мере редактирования другого </span><span class="rvts22">Ввод</span><span class="rvts22">а цвет этой чёрточки будет остывать, и после 15 посторонних правок чёрточка окончательно исчезнет.</span></p>
<p class="rvps10"><span class="rvts22">Такие же чёрточки показывают место вставки новых кадров посреди мувика.</span></p>
<p class="rvps10"><span class="rvts22">Рекомендуется включить эту функцию, чтобы повысить удобство работы в Тасэдиторе. Теоретически, даже скорость работы должна повыситься, так как вам придётся меньше вспоминать, какое действие было совершено полминуты назад. Конечно, даже без Горячих Правок можно легко восстановить в уме цепочку прошедших событий с помощью отката Истории (несколько нажатий </span><span class="rvts34">Ctrl + Z</span><span class="rvts22">), а затем вернуть мувик обратно (столько же нажатий </span><span class="rvts34">Ctrl + Y</span><span class="rvts22">). Но в этом случае произойдёт усечение Гринзоны из-за изменений </span><span class="rvts22">Ввод</span><span class="rvts22">а. Так что лучше просто оставить Горячие Правки включенными.</span></p>
<p class="rvps10"><span class="rvts22">Единственным недостатком этой функции является тот факт, что карта Горячих Правок сохраняется в Журнале Истории и в FM3-файле проекта, увеличивая занимаемый объём памяти.</span></p>
<p class="rvps10"><a name="Followundocontext"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">View -&gt; Follow undo context</span></p>
<p class="rvps10"><span class="rvts22">При откатах Истории (undo) эта функция автоматически скроллирует Piano Roll к месту совершения изменений. На кадре, где произведено изменение, на короткое время появляется фиолетовая указка, чтобы акцентировать внимание пользователя на произведённых изменениях мувика.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию эта опция включена. Если отключить, то Piano Roll не будет самостоятельно скроллироваться к месту изменений.</span></p>
<p class="rvps10"><span class="rvts22">Рекомендуется включить эту функцию, чтобы было легче отслеживать глазами отменяемые правки. Обычно после отката требуется сразу же внести подобные правки на том же кадре или рядом с ним, поэтому автоматический скроллинг в большинстве случаев полезен.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию эта опция включена. Если отключить, то Piano Roll не будет самостоятельно скроллироваться фиолетовой указке.</span></p>
<p class="rvps10"><span class="rvts22">Рекомендуется включить эту функцию, чтобы было легче отслеживать глазами отменяемые правки. Обычно после отката требуется сразу же внести другие правки на том же кадре или рядом с ним, поэтому автоматический скроллинг в большинстве случаев полезен.</span></p>
<p class="rvps10"><a name="FollowMarkerNotecontext"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">View -&gt; Follow Marker Note context</span></p>
<p class="rvps10"><span class="rvts22">При редактировании текста Заметки эта функция автоматически скроллирует Piano Roll к Маркеру этой Заметки. Например, когда вы щёлкаете по верхнему текстовому полю, чтобы начать редактирование Заметки Маркера над Курсором Проигрывателя, Piano Roll перескакивает на этот Маркер, чтобы вы могли видеть его контекст (соседние Маркеры и </span><span class="rvts22">Ввод</span><span class="rvts22">). А при щелчке по нижнему текстовом полю (Заметка Маркера над Курсором Выделения) Piano Roll скроллируется к Маркеру над Курсором Выделения. Таким образом вы можете увидеть окружение нужного Маркера, отредактировать текст его Заметки, а потом вернуться к редактированию </span><span class="rvts22">Ввод</span><span class="rvts22">а.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию эта опция включена. Если отключить, то Piano Roll не будет самостоятельно скроллироваться к Маркерам при редактировании их Заметок.</span></p>
<p class="rvps10"><span class="rvts22">Рекомендуется включить эту функцию, чтобы лучше ориентироваться в Маркерах.</span></p>
<p class="rvps10"><span class="rvts22">При редактировании текста Заметки эта функция автоматически скроллирует Piano Roll к Маркеру этой Заметки. Например, когда вы щёлкаете по верхнему текстовому полю, чтобы начать редактирование Заметки Маркера над Курсором Проигрывателя, Piano Roll перескакивает на этот Маркер, чтобы вы могли видеть его контекст (соседние Маркеры и </span><span class="rvts22">Ввод</span><span class="rvts22">). А при щелчке по нижнему текстовом полю (Заметка над Курсором Выделения) Piano Roll скроллируется к Маркеру над Курсором Выделения. Таким образом вы можете видеть окружение соответствующего Маркера во время редактирования его Заметки.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию эта опция включена. Если отключить, то Piano Roll не будет самостоятельно скроллироваться к Маркерам.</span></p>
<p class="rvps10"><span class="rvts22">Рекомендуется включить эту функцию.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">На этом настройка внешнего вида программы завершена. При дальнейшей работе вам вряд ли понадобится перенастраивать эти галочки.</span></p>
<p class="rvps10"><img align="left" alt="" style="padding : 6px;" src="lib/config-menu.png"/></p>
<p class="rvps10"><span class="rvts22">Теперь откройте пункт меню "Config" (Конфигурация). Здесь уже находятся опции, существенно влияющие на ход работы в Тасэдиторе. Перенастройка некоторых из них вам может понадобиться неоднократно.</span></p>
<p class="rvps10"><span class="rvts22">Теперь откройте пункт меню "Config" (Конфигурация). Перечисленные здесь опции влияют на ход работы в Тасэдиторе более существенно. Перенастройка некоторых из них вам может понадобиться неоднократно.</span></p>
<p class="rvps10"><a name="SetGreenzonecapacity"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/greenzone-capacity.png"/></p>
<p class="rvps10"><span class="rvts23">Config -&gt; Set Greenzone capacity</span></p>
<p class="rvps10"><span class="rvts22">Определяет максимальный объём Гринзоны. Гринзона используется для упрощения навигации Курсором Проигрывателя, позволяя ТАСеру мгновенно возвращаться на любой ранее проигранный кадр мувика. Естественно, для запоминания информации Гринзоне требуется много оперативной памяти, а также много места на диске для сохранения FM3-проекта.</span></p>
<p class="rvps10"><span class="rvts22">Чем больше зелёных и красных кадров в Piano Roll, тем больше памяти занимает Гринзона. Для большинства NES-игр на 1 кадр уходит примерно по 10 килобайт. Проекты больших мувиков могут занимать несколько сотен мегабайт. Это сказывается на времени загрузки/сохранения проекта.</span></p>
<p class="rvps10"><span class="rvts22">Для уменьшения объёма требуемой памяти Тасэдитор использует некоторые ухищрения. В частности, производит регулярную очистку хвоста Гринзоны, забывая наиболее дальние от Курсора Проигрывателя участки. Очистка старых кадров не означает, что Гринзона на этих кадрах становится недоступной, и что все эти кадры становятся вновь белыми. Это было бы слишком неудобно, ведь при перетаскивании Курсора Проигрывателя на белую строку Piano Roll вам придётся ждать, пока эмуляция добежит от начала мувика до этого кадра.</span></p>
<p class="rvps10"><span class="rvts22">Чтобы не допускать неудобства и при этом всё-таки освобождать память от старых участков Гринзоны, в Тасэдиторе применяется постепенное разреживание хвоста Гринзоны.</span></p>
<p class="rvps10"><span class="rvts22">Внешне это выглядит примерно как на картинке справа: голубой курсор бежит вниз по Piano Roll в голове Гринзоны, оставляя за собой зелёные строки, а далеко вверху над ним постепенно очищаются некоторые старые строки (становясь бледно-зелёными, но всё-таки не белыми). Удаляются не все кадры, ставшие слишком дальними от Курсора Проигрывателя, а только некоторые из них. Сначала удаляется каждый чётный кадр, затем каждые три из четырёх, ещё дальше каждые семь из восьми, в конце 15 из 16-ти.</span></p>
<p class="rvps10"><span class="rvts22">Таким образом получается, что хвост Гринзоны содержит в себе множество пустот, и чем дальше, тем пустоты становятся больше. Если вы захотите попасть на кадр внутри пустого участке Гринзоны, вам придётся подождать, пока эмуляция добежит до него от ближайшего заполненного кадра Гринзоны. Но так как ближайший заполненный кадр Гринзоны идёт через каждые 2 или 4 кадра, ожидание продлится лишь сотую долю секунды, так что вы вряд ли заметите разницу между прыжком на заполненный кадр Гринзоны (мгновенный переход) и на очищенный кадр в хвосте Гринзоны (добегание за долю секунды).</span></p>
<p class="rvps10"><span class="rvts22">С помощью настройки "</span><span class="rvts26">Set greenzone capacity</span><span class="rvts22">" вы можете указать, сколько кадров Гринзоны, начиная с её головы, должны оставаться нетронутыми при очистке хвоста. Например, на картинке справа это число равно 8.</span></p>
<p class="rvps10"><span class="rvts22">Выбираете подпункт "</span><span class="rvts26">Set greenzone capacity</span><span class="rvts22">", появляется окошко для ввода числа, вводите 100 и нажимаете OK. Это означает, что вверх от текущего положения голубого курсора первая сотня кадров Гринзоны не будет очищаться. На этом пространстве любое перемещение Курсора Проигрывателя будет мгновенным, и вы можете перетаскивать голубой курсор и использовать обратную перемотку с максимальным удобством. После первой сотни начнётся удаление каждого второго кадра вы заметите чередование зелёных и бледно-зелёных строк на Piano Roll. Это чередование продлится на протяжении 200 кадров. На этом пространстве перемещение Курсора Проигрывателя тоже будет практически мгновенным.</span></p>
<p class="rvps10"><span class="rvts22">Таким образом, Гринзона будет способна охватить 100 + 200 = 300 кадров, хотя в памяти хранится лишь информация о 100 + 100 = 200 кадров. Дальше на протяжении ещё 400 кадров будут чередоваться одна заполненная строка и три очищенных, и так далее. В итоге общий объём Гринзоны может занимать в памяти 500 кадров (чуть больше 5 мегабайт), но при этом в зоне доступа будет оставаться область в 3100 кадров (чуть меньше минуты).</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию объём Гринзоны составляет 10000 кадров. Этого должно быть достаточно для большинства ТАСов. При желании вы можете увеличить или уменьшить это значение. В реальной работе рекомендуется использовать значение не ниже 1000, так как дальнейшая экономия будет незначительной. Желательно ставить такое значение, чтобы в окрестностях оптимизируемого участка Гринзона всегда оставалась без пустот.</span></p>
<p class="rvps10"><span class="rvts22">Минимальное значение этого параметра равно единице (исключительно для тестов, ТАСить при таком значении просто невыносимо), максимальное значение 50000 кадров.</span></p>
<p class="rvps10"><span class="rvts22">Задаёт значение максимального объёма Гринзоны. Гринзона используется для упрощения навигации Курсором Проигрывателя, позволяя ТАСеру мгновенно возвращаться на любой ранее проигранный кадр мувика. Естественно, для запоминания информации Гринзоне требуется много оперативной памяти, а также много места на диске для сохранения FM3-проекта.</span></p>
<p class="rvps10"><span class="rvts22">Чем больше зелёных и красных кадров в Piano Roll, тем больше памяти занимает Гринзона. Для большинства NES-игр на 1 кадр уходит примерно по 10 килобайт (в сжатом виде). Проекты больших мувиков могут занимать несколько сотен мегабайт. Это сказывается на времени загрузки/сохранения проекта.</span></p>
<p class="rvps10"><span class="rvts22">Для уменьшения объёма требуемой памяти Тасэдитор производит регулярную очистку хвоста Гринзоны, забывая наиболее дальние от Курсора Проигрывателя участки.</span></p>
<p class="rvps10"><span class="rvts22">Очистка старых кадров не означает, что Гринзона на этих кадрах становится недоступной, и что все эти кадры становятся вновь белыми. Это было бы слишком неудобно, ведь для проигрывания этих кадров вам пришлось бы ждать, пока эмуляция добежит от начала мувика &nbsp;</span><span class="rvts22">Чтобы не допускать неудобства и при этом всё-таки освобождать часть памяти от старых участков Гринзоны, в Тасэдиторе применяется </span><span class="rvts31">постепенное разреживание</span><span class="rvts22"> хвоста Гринзоны.</span></p>
<p class="rvps10"><span class="rvts22">Внешне это выглядит примерно как на картинке справа: голубой курсор бежит вниз по Piano Roll в голове Гринзоны, оставляя за собой зелёные строки, а далеко вверху над ним постепенно очищаются некоторые старые строки (становясь бледно-зелёными, но всё-таки не белыми). Сначала удаляется каждый чётный кадр, затем каждые три из четырёх, ещё дальше каждые семь из восьми, в конце 15 из 16-ти.</span></p>
<p class="rvps10"><span class="rvts22">Таким образом получается, что хвост Гринзоны содержит в себе множество пустот. Если вы захотите попасть на кадр внутри пустого участка Гринзоны, вам придётся подождать, пока эмуляция добежит до него от ближайшего заполненного кадра Гринзоны. Но так как ближайший заполненный кадр Гринзоны идёт через каждые 2 или 4 кадра, ожидание продлится лишь долю секунды, так что вы вряд ли заметите разницу между прыжком на заполненный кадр Гринзоны (мгновенный переход) и на очищенный кадр в хвосте Гринзоны (мгновенное добегание).</span></p>
<p class="rvps10"><span class="rvts22">С помощью настройки "</span><span class="rvts22">Set greenzone capacity</span><span class="rvts22">" вы можете указать, сколько кадров Гринзоны, начиная с её головы, должны оставаться нетронутыми при очистке хвоста. Например, на картинке справа это число равно 8.</span></p>
<p class="rvps10"><span class="rvts22">В качестве пробы выберите пункт "</span><span class="rvts22">Set greenzone capacity</span><span class="rvts22">", появится окошко для ввода числа, введите 100 и нажмите OK. Это означает, что вверх от текущего положения голубого курсора первая сотня кадров Гринзоны не будет очищаться. На этом пространстве любое перемещение Курсора Проигрывателя будет мгновенным, и вы можете перетаскивать его и использовать обратную перемотку с максимальным удобством. После первой сотни начнётся удаление каждого второго кадра вы заметите чередование зелёных и бледно-зелёных строк на Piano Roll. Это чередование продлится на протяжении около 200 кадров. На этом пространстве перемещение Курсора Проигрывателя тоже будет практически мгновенным.</span></p>
<p class="rvps10"><span class="rvts22">Таким образом Гринзона будет способна охватить 100 + 200 = 300 кадров, хотя в памяти хранится лишь информация о 100 + 100 = 200 кадров. Дальше на протяжении ещё 400 кадров будут чередоваться одна заполненная строка и три очищенных, и так далее. В итоге общий объём Гринзоны может занимать в памяти 500 кадров (чуть больше 5 мегабайт), но при этом в зоне доступа будет оставаться область в 3100 кадров (чуть меньше минуты).</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию объём Гринзоны составляет 10000 кадров. Этого должно быть достаточно для большинства ТАСов. В реальной работе рекомендуется использовать значение не ниже 1000, так как дальнейшая экономия будет незначительной.</span></p>
<p class="rvps10"><span class="rvts22">Минимальное значение этого параметра равно единице (исключительно для тестов), максимальное значение 50000.</span></p>
<p class="rvps10"><a name="Setmaxundolevels"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">Config -&gt; Set max undo levels</span></p>
<p class="rvps10"><span class="rvts22">Определяет количество уровней отката изменений. Столько раз вы сможете нажать </span><span class="rvts34">Ctrl + Z</span><span class="rvts22">, возвращая проект на предыдущие состояния. И столько же строк (плюс одна текущая) содержится в Журнале Истории.</span></p>
<p class="rvps10"><span class="rvts22">Определяет количество уровней отката изменений. Столько раз вы сможете возвратить проект на предыдущее состояние нажатием </span><span class="rvts34">Ctrl + Z</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Журналу Истории требуется много оперативной памяти и немного места на диске для сохранения FM3-проекта. Весь Журнал сохраняется в файле проекта в сжатом виде, сжатие производится постепенно во моменты простоев в работе, незаметно для пользователя. Благодаря этому на время сохранения проекта объём Журнала Истории влияет незначительно.</span></p>
<p class="rvps10"><span class="rvts22">С помощью этой настройки можно регулировать используемый объём памяти. </span><span class="rvts22">По умолчанию установлено 100 уровней отката. Это значит, что вы сможете отменить 100 совершённых с мувиком действий. Это не так уж и много, ведь в реальном ТАСинге действия совершаются очень быстро, а время летит незаметно. Если в вашем компьютере более 2GB оперативной памяти, можете увеличить значение "max undo levels" вплоть до максимально возможного 1000 уровней.</span></p>
<p class="rvps10"><span class="rvts22">С помощью этой настройки можно регулировать используемый объём памяти. </span><span class="rvts22">По умолчанию установлено 100 уровней отката. Это значит, что вы сможете отменить 100 совершённых с мувиком действий. Это не очень много, ведь в реальном ТАСинге действия совершаются очень быстро, а время летит незаметно. Если в вашем компьютере достаточно оперативной памяти, можете увеличить значение "max undo levels" вплоть до максимально возможного 1000 уровней.</span></p>
<p class="rvps10"><a name="SetAutosaveperiod"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">Config -&gt; Set Autosave period</span></p>
<p class="rvps10"><span class="rvts22">Определяет, сколько минут несохранённые изменения могут оставаться без присмотра.</span></p>
<p class="rvps10"><span class="rvts22">В Тасэдиторе реализована функция автоматического сохранения проекта на диск. Раньше ТАСерам не требовалось периодически сохранять на диск текущее состояние их ТАСа, так как мувик сохранялся в каждом использованном сэйве. Теперь же имеет смысл время от времени нажимать </span><span class="rvts34">Ctrl + S</span><span class="rvts22">, чтобы сохранить на диск состояние проекта весь </span><span class="rvts22">Ввод</span><span class="rvts22">, Маркеры, Закладки, всю Гринзону, Журнал Истории и т.д. Тогда при последующем открытии FM3-файла в Тасэдиторе вы окажетесь в той же самой обстановке, в которой прервали работу в прошлый раз. Даже Piano Roll будет указывать на тот же самый участок мувика.</span></p>
<p class="rvps10"><span class="rvts22">Так как сохранение проекта может занимать несколько секунд, нет смысла делать это слишком часто. По умолчанию установлено значение "autosave period" в 15 минут. Это означает, что если вы совершили в проекте какие-нибудь существенные изменения (например, изменили </span><span class="rvts22">Ввод</span><span class="rvts22">, и в заголовке окна Тасэдитора появилась звёздочка), а потом в течение 15 минут так и не сохранили проект на диск, Тасэдитор либо напомнит вам об этом, либо запустит сохранение самостоятельно (если установлена галочка "</span><a class="rvts28" href="ProgramCustomization.html#SilentAutosave">Silent autosave</a><span class="rvts22">").</span></p>
<p class="rvps10"><span class="rvts22">Функция автоматического сохранения начинает работать только после того, как проекту присвоено файловое имя на диске.</span></p>
<p class="rvps10"><span class="rvts22">Вы можете отключить эту функцию, установив значение 0. Но делать это не рекомендуется, так как теоретически возможна потеря данных в случае непредвиденного сбоя. Рекомендуется поставить значение 10 минут. Максимально возможное значение этого параметра равно 1440 минут или 24 часа (1 сутки).</span></p>
<p class="rvps10"><span class="rvts22">В Тасэдиторе реализована функция автоматического сохранения проекта на диск, когда пользователь долгое время не сохраняет его вручную (</span><span class="rvts34">Ctrl + S</span><span class="rvts22">). До Тасэдитора ТАСеры сохраняли свой мувик на диск при каждом &nbsp;сэйве. Но проекты Тасэдитора хранят гораздо больше данных, </span><span class="rvts22">и сохранение FM3-файла может занимать несколько секунд, поэтому нет смысла делать это слишком часто.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию установлено значение "autosave period" в 15 минут. Это означает, что если вы совершили в проекте какие-нибудь существенные изменения (например, изменили </span><span class="rvts22">Ввод</span><span class="rvts22">, и в заголовке окна Тасэдитора появилась звёздочка), а потом в течение 15 минут так и не сохранили проект на диск, Тасэдитор либо напомнит вам об этом, либо запустит сохранение самостоятельно (см. "</span><a class="rvts28" href="ProgramCustomization.html#SilentAutosave">Silent autosave</a><span class="rvts22">").</span></p>
<p class="rvps10"><span class="rvts22">Функция автоматического сохранения работает, только когда текущему проекту уже присвоено файловое имя на диске.</span></p>
<p class="rvps10"><span class="rvts22">Максимально возможное значение этого параметра равно 1440 минут (24 часа). Вы можете отключить эту функцию, установив в качестве периода значение 0, но делать это не рекомендуется.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Это были числовые настройки Тасэдитора, далее следуют галочки.</span></p>
<p class="rvps10"><a name="EnableGreenzoning"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">Config -&gt; Enable Greenzoning</span></p>
<p class="rvps10"><span class="rvts22">Управляет процессом собирания данных в Гринзону.</span></p>
<p class="rvps10"><span class="rvts22">Если галочка установлена, каждый новый кадр сохраняется в Гринзону сразу после его эмуляции. Это стандартное поведение Тасэдитора, так что п</span><span class="rvts22">о умолчанию галочка установлена.</span></p>
<p class="rvps10"><span class="rvts22">Отключение этой функции может понадобиться в редких ситуациях, например, при использовании ботов, которые требуют быстродействия. В обычных же ситуациях рекомендуется работать с включенной функцией.</span></p>
<p class="rvps10"><a name="SilentAutosave"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">Config -&gt; Silent Autosave</span></p>
<p class="rvps10"><span class="rvts22">Определяет поведение функции автоматического сохранения проекта.</span></p>
<p class="rvps10"><span class="rvts22">Определяет поведение функции автоматического сохранения.</span></p>
<p class="rvps10"><span class="rvts22">Если галочка установлена, по истечении периода автосохранения Тасэдитор молча сохраняет проект на диск под тем же именем.</span></p>
<p class="rvps10"><span class="rvts22">Если галочка снята, по истечении периода автосохранения Тасэдитор выводит на экран диалог сохранения файла (Save As), где вы можете либо подтвердить сохранение, либо отменить его тогда Тасэдитор подождёт ещё один период, прежде чем напомнить о наличии несохранённых данных.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию галочка установлена. Если вы хотите полностью контролировать ситуацию, например, не допустить сохранение случайных изменений, внесённых при просмотре чужого FM3-проекта, можете снять эту галочку. Но для повышения комфортности ТАСинга рекомендуется её включить.</span></p>
<p class="rvps10"><span class="rvts22">Если галочка снята, по истечении периода автосохранения Тасэдитор выводит на экран диалог сохранения файла (Save As), где вы можете либо подтвердить сохранение, либо отменить его. В последнем случае Тасэдитор подождёт ещё один период, прежде чем напомнить о наличии несохранённых данных.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию галочка установлена. Если вы хотите полностью контролировать ситуацию (например, не допустить сохранение случайных изменений, внесённых при просмотре чужого FM3-проекта), можете снять эту галочку. Но для повышения комфортности ТАСинга рекомендуется её включить.</span></p>
<p class="rvps10"><a name="AutofirePatternskipsLag"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">Config -&gt; Autofire Pattern skips Lag</span></p>
<p class="rvps10"><span class="rvts22">Учитывает лаг при использовании шаблонов (</span><span class="rvts34">Alt</span><span class="rvts22"> + щелчки по </span><span class="rvts22">Ввод</span><span class="rvts22">у или по Заголовку Piano Roll).</span></p>
<p class="rvps10"><span class="rvts22">Если галочка снята, при использовании шаблона появится последовательность нажатий и отпусканий, в точности соответствующая выбранному шаблону (например, для шаблона "Alternating (1010...)" нажатия будут строго чередоваться с отпусканиями).</span></p>
<p class="rvps10"><span class="rvts22">Если галочка установлена, при использовании шаблона будет учитываться информация о лаге из Гринзоны, и последовательность нажатий/отпусканий в Списке Piano Roll может визуально отличаться от шаблона (на лаговых кадрах будут дополнительные пропуски, которых не было в шаблоне).</span></p>
<p class="rvps10"><span class="rvts22">Так как лаговые кадры считаются потерянными для игры, нужно пропускать их для правильного подсчёта пустых расстояний между нажатиями. Например, если между двумя нажатиями должно пройти ровно три пустых кадра (шаблон вида "10001"), но посреди участка оказался один кадр лага, то требуется добавить ещё один пустой кадр (100</span><span class="rvts26">0</span><span class="rvts22">01, т.е. четыре пустых кадра посередине).</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию эта галочка установлена. Рекомендуется оставить её включенной, так как в большинстве случаев ТАСеру нужно ориентироваться не на визуальное отображение последовательности нажатий в Piano Roll, а на то, как воспринимает </span><span class="rvts22">Ввод сама</span><span class="rvts22"> игра.</span></p>
<p class="rvps10"><span class="rvts22">Принимает во внимание лаг при использовании шаблонов (</span><span class="rvts34">Alt</span><span class="rvts22"> + щелчки по </span><span class="rvts22">Вводу</span><span class="rvts22">).</span></p>
<p class="rvps10"><span class="rvts22">Если галочка снята, при использовании шаблона в Piano Roll появится последовательность нажатий и отпусканий, в точности соответствующая выбранному шаблону (например, для шаблона "Alternating (1010...)" нажатия будут строго чередоваться с отпусканиями).</span></p>
<p class="rvps10"><span class="rvts22">Если галочка установлена, последовательность нажатий/отпусканий в Piano Roll может отличаться от шаблона (на лаговых кадрах будут дополнительные пропуски, которых не было в шаблоне).</span></p>
<p class="rvps10"><span class="rvts22">Так как лаговые кадры в большинстве игр не учитываются, нужно пропускать красные строки Piano Roll для правильного подсчёта пустых расстояний между нажатиями. Например, если между каждым нажатием должно пройти ровно 3 пустых кадра (шаблон вида "10001000"), но посреди участка оказался один кадр лага, то требуется добавить ещё один пустой кадр (100</span><span class="rvts26">0</span><span class="rvts22">01000).</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию эта галочка установлена. Рекомендуется оставить её включенной, так как в большинстве случаев требуется пропускать лаговые кадры, чтобы подстраивать кнопочные нажатия под то, как игра воспринимает </span><span class="rvts22">Ввод</span><span class="rvts22">.</span></p>
<p class="rvps10"><a name="AutoAdjustInputAccordingtoLag"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">Config -&gt; Auto-adjust Input according to Lag</span></p>
<p class="rvps10"><span class="rvts22">Включает автоматическую подгонку Ввода в соответствии с изменениями лага на просматриваемом участке.</span></p>
<p class="rvps10"><span class="rvts22">Для игры имеет значение только Ввод на зелёных строках Piano Roll. На красных строках нет смысла ставить какие-либо нажатия, так как в кадрах с лагом игра не опрашивает Ввод. Для игрового движка эти кадры просто не существуют.</span></p>
<p class="rvps10"><span class="rvts22">Когда вы редактируете Ввод, вы изменяете ход игровых событий, и лаг тоже может проявляться уже в других кадрах, где его раньше не было. Если в этих кадрах ранее был нарисован Ввод, необходимо передвинуть этот Ввод на кадры без лага, чтобы он по-прежнему поступал в игру. Чтобы не передвигать Ввод каждый раз вручную, достаточно установить эту галочку, тогда Тасэдитор будет вставлять на место образующихся лаговых кадров пустые строки, тем самым передвигая Ввод вниз. А когда в результате изменений игровых событий лаговые кадры перестают появляться, Тасэдитор будет удалять эти кадры из мувика, тем самым передвигая Ввод вверх. В результате можно быть уверенным, что ранее созданный Ввод не перестанет синхронизироваться с игрой при изменении последовательности лаговых кадров.</span></p>
<p class="rvps10"><span class="rvts22">Операции по автоподгонке производятся Тасэдитором только во время проигрывания участка, когда Курсор Проигрывателя бежит по бледным строкам Piano Roll, поочерёдно занося новые кадры в Гринзону. Результаты этих операций сохраняются в текущий пункт Журнала Истории.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию эта функция отключена, так как при просмотре готовых мувиков подгонка Ввода не требуется. Однако, когда вы приступаете к сожданию собственных мувиков, р</span><span class="rvts22">екомендуется сразу установить эту галочку</span><span class="rvts22">, и</span><span class="rvts22"> всё время работать с включенной автоподгонкой. Она значительно повышает удобство ТАСинга, особенно в играх </span><span class="rvts22">с часто проявляющимся лагом. Эта функция успешно работает при любом методе ТАСинга.</span></p>
<p class="rvps10"><span class="rvts22">Отключать эту функцию имеет смысл в тех случаях, когда в проекте есть готовый Ввод, но нет информации о лаге. Например, когда вы импортируете Ввод из чужого мувика, следует выключить автоподгонку и просмотреть весь мувик, чтобы заполнить Гринзону информацией о лаге, не сдвигая имеющийся Ввод (подразумевается, что позаимствованный Ввод уже содержит пустоты на лаговых кадрах). После окончания просмотра следует снова включить автоподгонку.</span></p>
<p class="rvps10"><span class="rvts22">Включает автоматическую подгонку Ввода в соответствии с изменениями данных о лаге.</span></p>
<p class="rvps10"><span class="rvts22">По сути, для игр имеет значение только Ввод на зелёных строках Piano Roll. На красных строках нет смысла ставить какие-либо нажатия, так как в кадрах с лагом игра не опрашивает Ввод. С точки зрения игрового движка эти кадры просто не существуют.</span></p>
<p class="rvps10"><span class="rvts22">Когда вы редактируете Ввод, вы изменяете ход игровых событий, и лаг тоже может проявляться уже в других кадрах. Если в этих кадрах ранее был нарисован Ввод, необходимо передвинуть этот Ввод на кадры без лага, чтобы он по-прежнему поступал в игру.</span></p>
<p class="rvps10"><span class="rvts22">Если эта галочка установлена, вам не требуется передвигать Ввод каждый раз вручную. Тасэдитор будет самостоятельно вставлять на место образующихся лаговых кадров дополнительные строки, тем самым передвигая Ввод вниз. А когда в результате изменений игровых событий лаговые кадры перестают появляться, Тасэдитор будет удалять эти кадры из мувика, тем самым передвигая Ввод вверх. В результате можно быть уверенным, что игра корректно воспримет старый Ввод при любых изменениях лага.</span></p>
<p class="rvps10"><span class="rvts22">Операции по автоподгонке производятся Тасэдитором только во время проигрывания участка, когда Курсор Проигрывателя бежит по бледным строкам Piano Roll. Результаты этих операций сохраняются в текущий пункт Журнала Истории.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию эта функция включена, и р</span><span class="rvts22">екомендуется всегда работать с включенной автоподгонкой. Она значительно повышает удобство ТАСинга, особенно в играх </span><span class="rvts22">с часто проявляющимся лагом.</span></p>
<p class="rvps10"><a name="DrawInputbydragging"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">Config -&gt; Draw Input by dragging</span></p>
<p class="rvps10"><span class="rvts22">Позволяет рисовать </span><span class="rvts22">Ввод</span><span class="rvts22">, зажав левую кнопку мыши и перемещая курсор мыши над поверхностью Piano Roll.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию эта функция подключена, и вы можете быстро нарисовать длительное зажатие какой-нибудь кнопки, либо стереть часть </span><span class="rvts22">Ввод</span><span class="rvts22">а ластиком. При щелчке по пустой клетке начинается рисование </span><span class="rvts22">Ввод</span><span class="rvts22">а, при щелчке по заполненной клетке начинается стирание </span><span class="rvts22">Ввод</span><span class="rvts22">а.</span></p>
<p class="rvps10"><span class="rvts22">Рисование/стирание </span><span class="rvts22">Ввод</span><span class="rvts22">а по умолчанию ограничено одним столбцом (чтобы можно было совершать размашистые движения мышью при установке длительных зажатий). Однако, если после начала рисования зажать клавишу </span><span class="rvts34">Shift</span><span class="rvts22">, вы сможете рисовать/стирать </span><span class="rvts22">Ввод</span><span class="rvts22"> по всем колонкам (это не столько практично, сколько весело).</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию эта функция подключена, и вы можете быстро добавить или стереть длительное зажатие какой-нибудь кнопки.</span></p>
<p class="rvps10"><span class="rvts22">Рисование/стирание </span><span class="rvts22">Ввода обычно</span><span class="rvts22"> ограничено одним столбцом, чтобы можно было совершать размашистые движения мышью. Однако, если во время рисования зажать клавишу </span><span class="rvts34">Shift</span><span class="rvts22">, вы сможете рисовать/стирать </span><span class="rvts22">Ввод</span><span class="rvts22"> без ограничений (это не столько практично, сколько весело).</span></p>
<p class="rvps10"><span class="rvts22">Если снять эту галочку, вы сможете устанавливать только отдельные нажатия щелчками по клеткам </span><span class="rvts22">Ввод</span><span class="rvts22">а в Piano Roll, а рисование будет отключено. Это может пригодиться, если у вас дрожат руки, и способ рисования </span><span class="rvts22">Ввод</span><span class="rvts22">а вам не подходит. В остальных случаях рекомендуется включить эту функцию.</span></p>
<p class="rvps10"><a name="CombineconsecutiveRecordings"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">Config -&gt; Combine consecutive Recordings/Draws</span></p>
<p class="rvps10"><span class="rvts22">Объединяет последовательную Запись </span><span class="rvts22">Ввод</span><span class="rvts22">а в один пункт журнала Истории. А также объединяет в один пункт весь </span><span class="rvts22">Ввод</span><span class="rvts22">, нарисованный одним нажатием кнопки мыши.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию галочка снята. В режиме Recording каждый записанный кадр будет создавать отдельный пункт в Журнале Истории, и вы сможете откатывать изменения (с помощью </span><span class="rvts34">Ctrl + Z</span><span class="rvts22">) для каждого кадра. А при рисовании </span><span class="rvts22">Ввод</span><span class="rvts22">а (нажать левую кнопку мыши и водить курсором мыши по Piano Roll) каждый новый штрих будет создавать новый пункт в Журнале Истории, и вы сможете откатывать штрихи поодиночке.</span></p>
<p class="rvps10"><span class="rvts22">Однако в реальной работе такая точность отката не требуется, так как во время Записи проще вернуться Курсором Проигрывателя на предыдущий кадр (хоткеем </span><span class="rvts27">Rewind one frame</span><span class="rvts22">) и переписать его, чем откатывать изменения и потом всё равно возвращаться на предыдущий кадр для Записи нового </span><span class="rvts22">Ввод</span><span class="rvts22">а. В случае рисования обычно требуется либо откатить весь нарисованный </span><span class="rvts22">Ввод</span><span class="rvts22">, либо просто подтереть часть нарисованного </span><span class="rvts22">Ввод</span><span class="rvts22">а, не прибегая к </span><span class="rvts34">Ctrl + Z</span><span class="rvts22">. Поэтому для экономии места в Журнале Истории рекомендуется включить эту галочку.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию галочка снята. В режиме Recording каждый записанный кадр будет создавать отдельный пункт в Журнале Истории, и вы сможете откатывать изменения для каждого кадра. А при рисовании </span><span class="rvts22">Ввода</span><span class="rvts22"> каждый новый штрих будет создавать новый пункт в Журнале Истории, и вы сможете откатывать штрихи поодиночке.</span></p>
<p class="rvps10"><span class="rvts22">Однако в реальной работе такая точность отката не требуется. Поэтому для существенной экономии места в Журнале Истории рекомендуется включить эту галочку.</span></p>
<p class="rvps10"><a name="Use1PkeysforallsingleRecordings"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">Config -&gt; Use 1P keys for all single Recordings</span></p>
<p class="rvps10"><span class="rvts22">Позволяет записывать </span><span class="rvts22">Ввод</span><span class="rvts22"> любых джойстиков, пользуясь только кнопками первого джойстика. Эта функция используется в традиционном методе при Записи </span><span class="rvts22">Ввод</span><span class="rvts22">а способом мультитрекинга, когда ТАСер сначала записывает на нужном участке </span><span class="rvts22">Ввод</span><span class="rvts22"> первого игрока (при этом любые случайные нажатия на кнопки второго джойстика игнорируются), а затем </span><span class="rvts22">Ввод</span><span class="rvts22"> второго игрока.</span></p>
<p class="rvps10"><span class="rvts22">Благодаря мультитрекингу ТАСер освобождается от необходимости нажимать на кнопки двух джойстиков одновременно. </span><span class="rvts22">А благодаря опции "</span><span class="rvts26">Use 1P keys for all single Recordings</span><span class="rvts22">" ТАСер может вообще не настраивать второй джойстик, не назначать кнопки второго игрока на отдельные клавиши. Когда галочка установлена, при Записи второго игрока будут использоваться клавиши, назначенные на кнопки первого джойстика.</span></p>
<p class="rvps10"><span class="rvts22">Благодаря мультитрекингу ТАСер освобождается от необходимости нажимать на кнопки двух джойстиков одновременно. </span><span class="rvts22">А благодаря опции "</span><span class="rvts22">Use 1P keys for all single Recordings</span><span class="rvts22">" ТАСер может вообще не настраивать второй джойстик, не назначать кнопки второго игрока на отдельные клавиши. Когда галочка установлена, при Записи второго игрока будут использоваться клавиши, назначенные на кнопки первого джойстика.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию галочка включена. Если отключить эту функцию, то при Записи второго игрока будут использоваться настройки кнопок второго джойстика.</span></p>
<p class="rvps10"><span class="rvts22">Рекомендуется включить эту функцию, чтобы сэкономить место на клавиатуре.</span></p>
<p class="rvps10"><a name="UseInputkeysforColumnSet"></a>
@ -198,16 +207,15 @@
<p class="rvps10"><span class="rvts22">Эта функция предназначена для ускорения редактирования </span><span class="rvts22">Ввод</span><span class="rvts22">а. Для массовой установки/снятия нажатий пользователь либо рисует длинный ряд нажатий, либо выделяет ряд кадров и щёлкает по нужному символу в Заголовке Piano Roll </span><span class="rvts22"></span><span class="rvts22"> символ вспыхивает, а </span><span class="rvts22">Ввод</span><span class="rvts22"> в данном столбце изменяется сразу во всех выделенных кадрах.</span></p>
<p class="rvps10"><span class="rvts22">Если установлена галочка "</span><span class="rvts26">Use Input keys for Column Set</span><span class="rvts22">", вместо щелчка по Заголовку достаточно нажать желаемую кнопку на самом джойстике/клавиатуре будет тот же результат со вспышкой.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию эта функция отключена. Рекомендуется включить её, если вы пользуетесь преимущественно новыми методами ТАСинга, а не записываете </span><span class="rvts22">Ввод</span><span class="rvts22"> традиционным методом. При использовании Записи вам нужно либо отключить эту функцию, либо просто снять Выделение, чтобы при нажатиях кнопок джойстика не срабатывала функция установки кнопок в выделенных кадрах.</span></p>
<p class="rvps10"><span class="rvts22">Благодаря этой функции можно записывать кнопки с джойстика даже при отключенном режиме Recording. Нужно поставить Курсор Выделения на кадр, где требуется вписать </span><span class="rvts22">Ввод</span><span class="rvts22">, и нажимать кнопки на джойстике, чтобы записать их в мувик. Режим мультитрекинга в данном случае действует точно так же, как при обычной Записи. Например, если установлена радиокнопка 2P, при нажатии кнопки </span><span class="rvts32">A</span><span class="rvts22"> будет установлен </span><span class="rvts22">Ввод</span><span class="rvts22"> в колонке "</span><span class="rvts22">A</span><span class="rvts22">" второго джойстика.</span></p>
<p class="rvps10"><span class="rvts22">Благодаря этой функции можно записывать кнопки с джойстика даже при отключенном режиме Recording. Нужно поставить Курсор Выделения на кадр, где требуется вписать </span><span class="rvts22">Ввод</span><span class="rvts22">, и нажимать кнопки на джойстике, чтобы записать их в мувик.</span></p>
<p class="rvps10"><span class="rvts22">Режим мультитрекинга в данном случае действует точно так же, как при обычной Записи. Например, если установлена радиокнопка "2P", при нажатии кнопки </span><span class="rvts32">A</span><span class="rvts22"> будет установлен </span><span class="rvts22">Ввод</span><span class="rvts22"> в колонке "</span><span class="rvts22">A</span><span class="rvts22">" второго игрока.</span></p>
<p class="rvps10"><a name="BindMarkerstoInput"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">Config -&gt; Bind Markers to Input</span></p>
<p class="rvps10"><span class="rvts22">Привязывает Маркеры к </span><span class="rvts22">Ввод</span><span class="rvts22">у. Если галочка установлена, то функции редактирования </span><span class="rvts22">Ввод</span><span class="rvts22">а оказывают также влияние и на Маркеры. Например, вставка пустых кадров сдвигает вниз не только нижестоящий </span><span class="rvts22">Ввод</span><span class="rvts22">, но и все нижестоящие Маркеры.</span></p>
<p class="rvps10"><span class="rvts22">Прикрепляет Маркеры к </span><span class="rvts22">Ввод</span><span class="rvts22">у. Если галочка установлена, то функции редактирования </span><span class="rvts22">Ввод</span><span class="rvts22">а оказывают также влияние и на Маркеры. Например, вставка пустых кадров сдвигает вниз не только </span><span class="rvts22">Ввод</span><span class="rvts22">, но и Маркеры.</span></p>
<p class="rvps10"><span class="rvts22">Обычно Маркеры устанавливаются на определённые события, происходящие в игре. Когда ТАСер улучшает свой предыдущий результат и доходит до этого места в игре быстрее, чем раньше, то соответствующий Маркер (установленный ещё при первой попытке) должен теперь указывать на более ранний кадр. Иногда приходится перетаскивать его вручную. Но благодаря привязке Маркеры самостоятельно смещаются при внесении изменений в </span><span class="rvts22">Ввод, и ручная</span><span class="rvts22"> перестановка Маркеров в этом случае требуется крайне редко.</span></p>
<p class="rvps10"><span class="rvts22">При переборе вариантов прохождения участка имеет смысл работать с отвязанными Маркерами, чтобы Маркер, специально установленный в конце участка, всегда оставался на кадре, который требуется обогнать. Впрочем, в такой ситуации вместо Маркера предпочтительнее использовать Закладку.</span></p>
<p class="rvps10"><span class="rvts22">Также о</span><span class="rvts22">твязанные Маркеры &nbsp;могут понадобиться в случаях, когда требуется изменить </span><span class="rvts22">Ввод</span><span class="rvts22">, не трогая находящиеся на этих же кадрах Маркеры. Например, когда нужно удалить часть </span><span class="rvts22">Ввод</span><span class="rvts22">а, оставив старые Маркеры на своих местах.</span></p>
<p class="rvps10"><span class="rvts22">А при пересинхронизации участков удобно привязать Маркеры к Вводу, чтобы сосредоточиться только на синхронизации Ввода. Например, из-за найденного улучшения в первом уровне игры вам придётся передвинуть весь Ввод второго уровня на дюжину кадров вверх. Благодаря привязке Маркеры также сдвинутся на дюжину кадров вверх, встав на соответствующие события второго уровня.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию галочка установлена. Рекомендуется большую часть времени работать с привязанными Маркерами, при необходимости отвязывая их.</span></p>
<p class="rvps10"><span class="rvts22">Отвязанные Маркеры &nbsp;могут понадобиться в случаях, когда требуется изменить </span><span class="rvts22">Ввод</span><span class="rvts22">, не трогая находящиеся на этих же кадрах Маркеры. Например, когда нужно удалить часть </span><span class="rvts22">Ввод</span><span class="rvts22">а, оставив старые Маркеры на своих местах.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию галочка установлена. Рекомендуется большую часть времени работать с привязанными Маркерами, при необходимости отвязывая их на время.</span></p>
<p class="rvps10"><span class="rvts22">Для удобства Тасэдитор подсвечивает привязанные Маркеры в Piano Roll более бледным жёлтым цветом, а отвязанные более насыщенным жёлтым.</span></p>
<p class="rvps10"><a name="EmptynewMarkerNotes"></a>
<span class="rvts22"><br/></span></p>
@ -218,54 +226,51 @@
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">Config -&gt; Old control scheme for Branching</span></p>
<p class="rvps10"><span class="rvts22">Имитирует ограничения традиционного метода ТАСинга, связанные с управлением Закладками (сэйвами).</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию галочка снята, и клавиши </span><span class="rvts27">F1-F10</span><span class="rvts22"> используются для загрузки ответвления соответствующей Закладки, а цифровые клавиши </span><span class="rvts27">1-0</span><span class="rvts22"> используются для прыжка на кадр Закладки без смены мувика.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию галочка снята, и клавиши </span><span class="rvts27">F1</span><span class="rvts22">-</span><span class="rvts27">F10</span><span class="rvts22"> используются для загрузки ответвления соответствующей Закладки, а цифровые клавиши </span><span class="rvts27">1</span><span class="rvts22">-</span><span class="rvts27">0</span><span class="rvts22"> используются для прыжка на кадр Закладки без смены мувика.</span></p>
<p class="rvps10"><span class="rvts22">Кроме того, Запись Ввода включается простым нажатием хоткея </span><span class="rvts27">Toggle Read-Only</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Если же эту галочку установить, схема управления будет такой, как в старых эмуляторах. В Списке Закладок появится красная рамка вокруг цифры текущего слота, нажатия </span><span class="rvts22">цифровых клавиш </span><span class="rvts27">1-0 </span><span class="rvts22">будут переключать текущий слот, а нажатия клавиш </span><span class="rvts27">F1-F10</span><span class="rvts22"> будут срабатывать в зависимости от режима Записи. Когда режим Записи выключен, нажатия функциональных клавиш осуществляют прыжок на кадр Закладки, а когда Запись включена, нажатия </span><span class="rvts27">F1-F10</span><span class="rvts22"> загружают ответвление Закладки.</span></p>
<p class="rvps10"><span class="rvts22">Если же эту галочку установить, схема управления будет такой, как в старых эмуляторах. Нажатия клавиш </span><span class="rvts27">F1</span><span class="rvts22">-</span><span class="rvts27">F10</span><span class="rvts22"> будут срабатывать в зависимости от режима Записи. Когда режим Записи выключен, нажатия функциональных клавиш осуществляют прыжок на кадр Закладки, а когда Запись включена, нажатия </span><span class="rvts27">F1</span><span class="rvts22">-</span><span class="rvts27">F10</span><span class="rvts22"> загружают ответвление Закладки.</span></p>
<p class="rvps10"><span class="rvts22">Кроме того, Запись Ввода не будет работать, пока не осуществлена загрузка какой-либо Закладки</span><span class="rvts22">. Это позволяет нажимать </span><span class="rvts22">хоткей </span><span class="rvts27">Toggle Read-Only</span><span class="rvts22"> прямо во время просмотра мувика, будучи уверенным, что Ввод не начнёт затираться до того, как ТАСер решит загрузить сэйв.</span></p>
<p class="rvps10"><span class="rvts22">Эта настройка предназначена для помощи старым ТАСерам плавно перейти к ТАСингу в Тасэдиторе.</span></p>
<p class="rvps10"><span class="rvts22">Рекомендуется не устанавливать эту галочку, так как новая схема управления Закладками гораздо лучше вписывается в особенности рабочего процесса в Тасэдиторе.</span></p>
<p class="rvps10"><span class="rvts22">Также в Списке Закладок появится красная рамка вокруг цифры текущего слота, и нажатия </span><span class="rvts22">цифровых клавиш </span><span class="rvts27">1</span><span class="rvts22">-</span><span class="rvts27">0 </span><span class="rvts22">будут переключать текущий слот.</span></p>
<p class="rvps10"><span class="rvts22">Эта настройка предназначена для помощи старым ТАСерам плавно перейти к ТАСингу в Тасэдиторе. Однако её использование не р</span><span class="rvts22">екомендуется, так как новая схема управления Закладками гораздо лучше вписывается в особенности рабочего процесса в Тасэдиторе.</span></p>
<p class="rvps10"><a name="BranchesrestoreentireMovie"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">Config -&gt; Branches restore entire Movie</span></p>
<p class="rvps10"><span class="rvts22">Определяет способ восстановления ответвлений при прыжках на Закладки во времени.</span></p>
<p class="rvps10"><span class="rvts22">Определяет способ восстановления ответвления при загрузке Закладки.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию галочка установлена, и при загрузке Закладки весь текущий мувик полностью заменяется на мувик, сохранённый в ответвлении Закладки.</span></p>
<p class="rvps10"><span class="rvts22">Если же галочка отсутствует, то при загрузке Закладки </span><span class="rvts22">текущий мувик полностью заменяется на мувик из ответвления, но сразу усекается, начиная с кадра Закладки. </span><span class="rvts22">Таким образом имитируется загрузка сэйвов в традиционном методе ТАСинга: из сэйва восстанавливается только та часть мувика, которая предшествует Курсору Проигрывателя, а остальные кадры (начиная с голубого курсора и до конца мувика) не загружаются. Это имеет смысл при ТАСинге традиционным методом, так как </span><span class="rvts22">после загрузки сэйва ТАСер обычно сразу дописывает новый </span><span class="rvts22">Ввод</span><span class="rvts22"> на место голубого курсора, и незачем загружать из сэйва данные, которые тут же будут перезаписаны. Но в Тасэдиторе мувик редактируется независимо от положения Курсора Проигрывателя, поэтому можно загружать из Закладки всё содержимое мувика от начала до конца, невзирая на то, что голубой курсор может быть посередине.</span></p>
<p class="rvps10"><span class="rvts22">Рекомендуется не убирать эту галочку, если вы не планируете ограничиваться традиционным методом ТАСинга.</span></p>
<p class="rvps10"><span class="rvts22">Рекомендуется не убирать эту галочку.</span></p>
<p class="rvps10"><a name="HUDinBranchscreenshots"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">Config -&gt; HUD in Branch screenshots</span></p>
<p class="rvps10"><span class="rvts22">Определяет способ съёмки скриншотов для Закладок.</span></p>
<p class="rvps10"><span class="rvts22">Если галочка установлена, берётся полный снимок экрана, включая иконки и сообщения самого эмулятора, Lua-вывод и прочие данные поверх изображения игры. Если галочка снята, в Закладку попадает только игровое изображение.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию галочка включена. Рекомендуется оставить её включенной, чтобы использовать Lua-вывод при сравнении скриншотов двух альтернативных стратегий прохождения участка.</span></p>
<p class="rvps10"><span class="rvts22">Если галочка установлена, берётся полный снимок окна эмулятора, включая иконки и сообщения самого эмулятора, Lua-вывод и прочие данные поверх изображения игры. Если галочка снята, в Закладку попадает только игровое изображение.</span></p>
<p class="rvps10"><span class="rvts22">По умолчанию галочка включена. Рекомендуется оставить её включенной, чтобы использовать Lua-вывод и счётчик кадров при сравнении скриншотов двух альтернативных подходов к прохождению участка.</span></p>
<p class="rvps10"><a name="AutopauseattheendofMovie"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">Config -&gt; Autopause at the end of Movie</span></p>
<p class="rvps10"><span class="rvts22">Автоматически останавливает проигрывание мувика, если оно началось не с последнего кадра.</span></p>
<p class="rvps10"><span class="rvts22">При просмотре готового (или частично готового) мувика обычно не требуется выходить за пределы уже записанного </span><span class="rvts22">Ввод</span><span class="rvts22">а. Это требуется только для расширения границ мувика, когда, например, записан первый уровень, и нужно начинать запись второго.</span></p>
<p class="rvps10"><span class="rvts22">Поэтому галочка </span><span class="rvts22">"</span><span class="rvts53">Autopause at the end of Movie</span><span class="rvts54">" по умолчанию установлена, и после просмотра мувика эмулятор автоматически ставится на паузу. Если снять эту галочку, то эмулятор не будет останавливаться после окончания </span><span class="rvts22">Ввод</span><span class="rvts54">а, а будет продолжать проигрывание пустого места в конце мувика, бесконечно увеличивая размеры мувика, пока пользователь не нажмёт клавишу </span><span class="rvts27">Pause</span><span class="rvts54"> или среднюю кнопку мыши.</span></p>
<p class="rvps10"><span class="rvts22">Автоматически останавливает проигрывание мувика на последнем кадре, если оно началось не с последнего кадра.</span></p>
<p class="rvps10"><span class="rvts22">При просмотре готового (или частично готового) мувика обычно не требуется выходить за пределы уже записанного </span><span class="rvts22">Ввод</span><span class="rvts22">а. Поэтому галочка </span><span class="rvts22">"</span><span class="rvts55">Autopause at the end of Movie" по умолчанию установлена, и после просмотра мувика эмулятор автоматически ставится на паузу. Если снять эту галочку, то эмулятор не будет останавливаться после окончания </span><span class="rvts22">Ввод</span><span class="rvts55">а, а будет продолжать проигрывание пустого места в конце мувика, бесконечно увеличивая размеры мувика, пока пользователь не нажмёт клавишу </span><span class="rvts27">Pause</span><span class="rvts55"> или среднюю кнопку мыши.</span></p>
<p class="rvps10"><span class="rvts22">Рекомендуется оставить эту галочку включенной.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps10"><a name="fceux-config"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Теперь вы ознакомлены со всеми настройками Тасэдитора, осталось рассмотреть некоторые настройки эмулятора FCEUX, которые могут потребоваться ТАСеру в работе.</span></p>
<p class="rvps10"><span class="rvts22">Теперь вы ознакомлены со всеми настройками Тасэдитора, оставшаяся часть главы описывает настройки эмулятора FCEUX, которые могут потребоваться ТАСеру.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Если вы планируете ТАСить традиционным методом, обязательно нужно назначить кнопки джойстика первого игрока на такие клавиши клавиатуры, которые удобно нажимать одновременно с нажатием клавиши </span><span class="rvts27">Frame Advance</span><span class="rvts22">. Хотя FCEUX поддерживает настройку кнопок виртуального NES-джойстика на кнопки реального PC-геймпада, рекомендуется для ввода использовать именно клавиатуру, чтобы помимо игровых кнопок иметь быстрый доступ ещё и к </span><span class="rvts27">Frame Advance</span><span class="rvts22">, </span><span class="rvts27">Frame Rewind</span><span class="rvts22">, </span><span class="rvts27">Pause</span><span class="rvts22">, а также к 10 слотам сохранения.</span></p>
<p class="rvps10"><span class="rvts22">При правильной работе в Тасэдиторе Запись требуется не так часто, а в тех случаях, когда она требуется (например, при записи тестовой версии прохождения уровня), не обязательно иметь быстрый доступ к функциональным клавишам. Поэтому можно вынести игровое управление на USB-геймпад, если он у вас есть.</span></p>
<p class="rvps10"><span class="rvts22">Кнопки виртуального джойстика настраиваются в FCEUX следующим образом. В меню эмулятора выбрать </span><span class="rvts26">Config -&gt; Input</span><span class="rvts22">. В появившемся окне выбрать из левого ниспадающего списка пункт </span><span class="rvts37">Gamepad</span><span class="rvts22"> (обычно он уже выбран). Щёлкнуть по левой кнопке </span><span class="rvts32">Configure</span><span class="rvts22"> (нам требуется настроить только первый джойстик). В появившемся окне щёлкнуть по кнопке </span><span class="rvts32">Up</span><span class="rvts22">, появится маленькое окошко, теперь нужно дважды нажать на клавиатуре клавишу, которая должна отвечать за виртуальную кнопку </span><span class="rvts32">Вверх</span><span class="rvts22">. Первое нажатие назначит клавишу, второе подтвердит выбор (можно вместо второго нажатия просто щёлкнуть по кнопке </span><span class="rvts32">Close</span><span class="rvts22">). Далее нужно проделать то же самое с остальными виртуальными кнопками </span><span class="rvts32">Down</span><span class="rvts22">, </span><span class="rvts32">Left</span><span class="rvts22">, </span><span class="rvts32">Right</span><span class="rvts22">, </span><span class="rvts32">Select</span><span class="rvts22">, </span><span class="rvts32">Start</span><span class="rvts22">, </span><span class="rvts32">B</span><span class="rvts22">, </span><span class="rvts32">A</span><span class="rvts22">. После настройки всех восьми кнопок первого джойстика (Virtual Gamepad 1) можно закрыть окно Gamepad, а затем и окно Input Configuration.</span></p>
<p class="rvps10"><span class="rvts22">Если вы планируете ТАСить традиционным методом, обязательно нужно назначить кнопки джойстика первого игрока на такие клавиши клавиатуры, которые удобно нажимать одновременно с нажатием клавиши </span><span class="rvts27">Frame Advance</span><span class="rvts22">. Хотя FCEUX поддерживает настройку кнопок виртуального NES-джойстика на кнопки реального PC-геймпада, рекомендуется для ввода использовать именно клавиатуру, чтобы помимо игровых кнопок иметь быстрый доступ ещё и к </span><span class="rvts27">Frame Advance</span><span class="rvts22">, </span><span class="rvts27">Frame Rewind</span><span class="rvts22">, </span><span class="rvts27">Pause</span><span class="rvts22">, а также ко всем 10 слотам сохранения.</span></p>
<p class="rvps10"><span class="rvts22">Однако при правильной работе в Тасэдиторе Запись требуется не так часто, а в тех случаях, когда она требуется (например, при записи тестовой версии прохождения уровня), не обязательно иметь быстрый доступ к функциональным клавишам. Поэтому можно вынести игровое управление на USB-геймпад, если он у вас есть.</span></p>
<p class="rvps10"><span class="rvts22">Кнопки виртуального джойстика настраиваются в FCEUX следующим образом. В меню эмулятора выбрать </span><span class="rvts26">Config -&gt; Input</span><span class="rvts22">. В появившемся окне выбрать из левого ниспадающего списка пункт "</span><span class="rvts22">Gamepad"</span><span class="rvts22"> (обычно он уже выбран). Щёлкнуть по левой кнопке </span><span class="rvts32">Configure</span><span class="rvts22"> (нам требуется настроить только первый джойстик). В появившемся окне щёлкнуть по кнопке </span><span class="rvts32">Up</span><span class="rvts22">, появится маленькое окошко, теперь нужно нажать на клавиатуре клавишу, которая должна отвечать за виртуальную кнопку </span><span class="rvts32">Вверх</span><span class="rvts22">. Первое нажатие назначит клавишу, второе подтвердит выбор (можно вместо второго нажатия просто щёлкнуть по кнопке </span><span class="rvts32">Close</span><span class="rvts22">). Далее нужно проделать то же самое с остальными кнопками джойстика NES </span><span class="rvts32">Down</span><span class="rvts22">, </span><span class="rvts32">Left</span><span class="rvts22">, </span><span class="rvts32">Right</span><span class="rvts22">, </span><span class="rvts32">Select</span><span class="rvts22">, </span><span class="rvts32">Start</span><span class="rvts22">, </span><span class="rvts32">B</span><span class="rvts22">, </span><span class="rvts32">A</span><span class="rvts22">. После настройки всех восьми кнопок первого джойстика (Virtual Gamepad 1) можно закрыть окно Gamepad, а затем и окно Input Configuration.</span></p>
<p class="rvps10"><span class="rvts22">Проверить все назначенные кнопки можно либо во время игры, либо в самом Тасэдиторе при их нажатии должны загораться зелёным светом буквы в Заголовке Piano Roll. Кроме того, если включить показ </span><span class="rvts22">Ввод</span><span class="rvts22">а (FCEUX: </span><span class="rvts26">Config -&gt; Display -&gt; Input Display -&gt; 2 player</span><span class="rvts22">), то видеть нажимаемые кнопки можно будет и на экране FCEUX.</span></p>
<p class="rvps10"><span class="rvts22">Помимо записи обычной игровой сессии кнопки виртуального джойстика можно использовать для быстрой установки </span><span class="rvts22">Ввод</span><span class="rvts22">а при редактировании (для этого нужно установить галочку в меню Тасэдитора: </span><a class="rvts28" href="ProgramCustomization.html#UseInputkeysforColumnSet">Config -&gt; Use Input keys for Column Set</a><span class="rvts22">). Выделите ряд кадров, где нужно изменить </span><span class="rvts22">Ввод</span><span class="rvts22">, и нажмите клавишу, назначенную на кнопку виртуального джойстика, </span><span class="rvts22">Ввод</span><span class="rvts22"> этой кнопки в выделенных кадрах изменится.</span></p>
<p class="rvps10"><span class="rvts22">Помимо записи обычной игровой сессии кнопки виртуального джойстика можно использовать для быстрой установки </span><span class="rvts22">Ввод</span><span class="rvts22">а при редактировании (см. </span><a class="rvts28" href="ProgramCustomization.html#UseInputkeysforColumnSet">Config -&gt; Use Input keys for Column Set</a><span class="rvts22">). Выделите ряд кадров, где нужно изменить </span><span class="rvts22">Ввод</span><span class="rvts22">, и нажмите клавишу, назначенную на кнопку виртуального джойстика.</span></p>
<p class="rvps10"><span class="rvts22">Если вы назначаете кнопки виртуального геймпада на клавиши клавиатуры, убедитесь, что на эти же клавиши не установлены горячие клавиши эмулятора и Тасэдитора. Список хоткеев, назначенных по умолчанию можно увидеть в </span><a class="rvts28" href="Controls.html#hotkeys">Справочнике</a><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Некоторые хоткеи в FCEUX не имеют значений по умолчанию (то есть ещё не назначены ни на одну клавишу), и перед началом работы желательно их настроить. Для этого в меню эмулятора нужно выбрать </span><span class="rvts26">Config -&gt; Map Hotkeys</span><span class="rvts22">. Появится окно со списком всех возможных хоткеев эмулятора. Ориентируясь по названию команды, выберите нужный хоткей и сделайте двойной щелчок по нему, а затем нажмите желаемую клавишу на клавиатуре.</span></p>
<p class="rvps10"><span class="rvts22">Некоторые хоткеи в FCEUX не имеют значений по умолчанию (то есть ещё не назначены ни на одну клавишу), вы можете их настроить следующим образом. В меню эмулятора нужно выбрать </span><span class="rvts26">Config -&gt; Map Hotkeys</span><span class="rvts22">. Появится окно с длинным списком всех возможных хоткеев эмулятора. Выберите нужный хоткей и сделайте двойной щелчок по нему, а затем нажмите желаемую клавишу на клавиатуре.</span></p>
<p class="rvps10"><span class="rvts22">Во-первых, найдите в списке пункт "</span><span class="rvts26">Open TAS Editor</span><span class="rvts22">" и выберите его двойным щелчком. Появится окно, тут нужно нажать клавишу, которая будет в дальнейшем запускать Тасэдитор.</span></p>
<p class="rvps10"><span class="rvts22">Во-вторых, найдите пункт "</span><span class="rvts27">Reload ROM or TAS Editor Project</span><span class="rvts22">" и настройте его, либо запомните комбинацию, настроенную по умолчанию (</span><span class="rvts27">Ctrl + F1</span><span class="rvts22">). Это поможет вам каждый раз возвращаться к прерванной работе без лишних проволочек достаточно будет запустить FCEUX, сразу нажать хоткей </span><span class="rvts27">Reload ROM</span><span class="rvts22">, затем хоткей </span><span class="rvts26">Open TAS Editor</span><span class="rvts22">, потом опять </span><span class="rvts27">Reload ROM</span><span class="rvts22"> (сработает уже как </span><span class="rvts27">Reload TAS Editor Project</span><span class="rvts22">). В итоге всего за секунду вы вернётесь в то же состояние, в котором оставили работу вчера.</span></p>
<p class="rvps10"><span class="rvts22">В-третьих, присмотритесь к хоткеям "</span><span class="rvts27">Frame Advance</span><span class="rvts22">" и "</span><span class="rvts27">Frame Rewind</span><span class="rvts22">". Эти хоткеи нужны для навигации Курсором Проигрывателя. По умолчанию они настроены на клавиши "</span><span class="rvts27">\</span><span class="rvts22">" и "</span><span class="rvts27">Backspace</span><span class="rvts22">". Вы можете перенастроить их на более удобные клавиши, либо пользоваться вместо них колесом мыши для покадрового перемещения Курсора Проигрывателя.</span></p>
<p class="rvps10"><span class="rvts22">В-четвёртых, присмотритесь к группам хоткеев "</span><span class="rvts27">Savestate Slot</span><span class="rvts22"> #", "</span><span class="rvts27">Save State to Slot</span><span class="rvts22"> #" и "</span><span class="rvts27">Load State from Slot</span><span class="rvts22"> #". В традиционном методе они требуются постоянно (для перезаписи), в Тасэдиторе уже реже (только для Закладок). Рекомендуется оставить их значения по умолчанию.</span></p>
<p class="rvps10"><span class="rvts22">В-пятых, обратите внимание на хоткеи "</span><span class="rvts27">Speed Down</span><span class="rvts22">" и "</span><span class="rvts27">Speed Up</span><span class="rvts22">". Возможно, стоит переназначить их на серые клавиши "</span><span class="rvts26">-</span><span class="rvts22">" и "</span><span class="rvts26">+</span><span class="rvts22">" на Numpad'е. Однако в данной документации упоминаются их значения по умолчанию (белые клавиши "</span><span class="rvts27">-</span><span class="rvts22">" и "</span><span class="rvts27">=</span><span class="rvts22">" под F9 и F10).</span></p>
<p class="rvps10"><span class="rvts22">Для включения/выключения режима Записи используется хоткей "</span><span class="rvts27">Toggle Read-Only</span><span class="rvts22">", рекомендуется оставить его значение по умолчанию (клавиша "</span><span class="rvts27">Q</span><span class="rvts22">"). Для переключения режимов мультитрекинга используется хоткей "</span><span class="rvts27">Switch current Multitracking mode</span><span class="rvts22">" (по умолчанию клавиша "</span><span class="rvts27">W</span><span class="rvts22">").</span></p>
<p class="rvps10"><span class="rvts22">Во-вторых, найдите пункт "</span><span class="rvts27">Reload ROM or TAS Editor Project</span><span class="rvts22">" и настройте его, либо запомните комбинацию, настроенную по умолчанию (</span><span class="rvts27">Ctrl + F1</span><span class="rvts22">). Это поможет вам быстро возвращаться к прерванной работе достаточно будет запустить FCEUX, нажать хоткей </span><span class="rvts27">Reload ROM</span><span class="rvts22">, затем вышеописанный хоткей </span><span class="rvts26">Open TAS Editor</span><span class="rvts22">, потом опять </span><span class="rvts27">Reload ROM</span><span class="rvts22"> (сработает уже как </span><span class="rvts27">Reload TAS Editor Project</span><span class="rvts22">). В итоге всего за секунду вы вернётесь в то же состояние, в котором оставили работу вчера.</span></p>
<p class="rvps10"><span class="rvts22">Далее присмотритесь к хоткеям "</span><span class="rvts27">Frame Advance</span><span class="rvts22">" и "</span><span class="rvts27">Frame Rewind</span><span class="rvts22">". Эти хоткеи нужны для навигации Курсором Проигрывателя. По умолчанию они настроены на клавиши "</span><span class="rvts27">\</span><span class="rvts22">" и "</span><span class="rvts27">Backspace</span><span class="rvts22">". Вы можете перенастроить их на более удобные клавиши, либо пользоваться вместо них колесом мыши для покадрового перемещения Курсора Проигрывателя.</span></p>
<p class="rvps10"><span class="rvts22">Также обратите внимание на хоткеи "</span><span class="rvts27">Speed Down</span><span class="rvts22">" и "</span><span class="rvts27">Speed Up</span><span class="rvts22">". Возможно, стоит переназначить их на серые клавиши "</span><span class="rvts26">-</span><span class="rvts22">" и "</span><span class="rvts26">+</span><span class="rvts22">" на Numpad'е.</span></p>
<p class="rvps10"><span class="rvts22">Хоткеи "</span><span class="rvts27">Pause</span><span class="rvts22">" и "</span><span class="rvts27">Restore Playback</span><span class="rvts22">" по умолчанию назначены на клавиши "</span><span class="rvts27">Pause/Break</span><span class="rvts22">" и "</span><span class="rvts27">Пробел</span><span class="rvts22">", но в большинстве случаев вместо них проще использовать среднюю кнопку мыши, а клавишу "Пробел" можно переназначить на что-нибудь другое.</span></p>
<p class="rvps10"><span class="rvts22">Напоследок стоит запомнить хоткей "</span><span class="rvts27">Cancel Seeking</span><span class="rvts22">" (клавиша "</span><span class="rvts27">Esc</span><span class="rvts22">" по умолчанию). Нажатие этой клавиши является аналогом щелчка по прогрессбару Тасэдитора если Проигрыватель занимался добеганием к целевому кадру, добегание будет отменено.</span></p>
<p class="rvps10"><span class="rvts22">Остальные хоткеи почти не используются при работе в Тасэдиторе. Некоторые хоткеи FCEUX вообще не действуют при запущенном Тасэдиторе. Например, хоткей "Open ROM" не сработает необходимо загрузить РОМ до запуска Тасэдитора. Полный список хоткеев, работающих при запущенном Тасэдиторе, можно найти в </span><a class="rvts28" href="Controls.html#hotkeys">Справочнике</a><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Напоследок стоит отметить хоткей "</span><span class="rvts27">Cancel Seeking</span><span class="rvts22">" (клавиша "</span><span class="rvts27">Esc</span><span class="rvts22">" по умолчанию). Нажатие этой клавиши является аналогом щелчка по прогрессбару Тасэдитора если Проигрыватель занимался добеганием к целевому кадру, добегание будет отменено.</span></p>
<p class="rvps10"><span class="rvts22">Некоторые хоткеи FCEUX вообще не действуют при запущенном Тасэдиторе. Например, хоткей "</span><span class="rvts26">Open ROM</span><span class="rvts22">" не сработает необходимо загрузить РОМ до запуска Тасэдитора. Это сделано для </span><a class="rvts28" href="MistakeProofing.html#DisabledHotkeys">защиты от ошибок</a><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">В следующей главе раскрываются </span><a class="rvts28" href="AdvancedFeatures.html">дополнительные возможности программы</a><span class="rvts22">. Вы можете отложить чтение этой главы до тех пор, пока не освоитесь с основными возможностями. В любом случае, сейчас вы уже вполне готовы к продуктивной работе в Тасэдиторе.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
@ -273,6 +278,7 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/create-epub-ebooks">Write EPub books for the iPad</a></p>
</div>

View File

@ -3,7 +3,7 @@
<head>
<title>2. Интерфейс программы</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("ProgramInterface");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("ProgramInterface");
}
});
</script>
</head>
@ -52,6 +55,7 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">Интерфейс программы</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
@ -60,9 +64,9 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Для входа в Тасэдитор нужно проделать следующее:</span></p>
<ol style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">запустить эмулятор FCEUX</span></li>
<li class="rvps15"><span class="rvts22">загрузить РОМ любой игры (File -&gt; Open ROM)</span></li>
<li class="rvps15"><span class="rvts22">открыть окно Тасэдитора (Tools -&gt; TAS Editor)</span></li>
<li class="rvps14"><span class="rvts22">запустить эмулятор FCEUX</span></li>
<li class="rvps14"><span class="rvts22">загрузить РОМ любой игры (File -&gt; Open ROM)</span></li>
<li class="rvps14"><span class="rvts22">открыть окно Тасэдитора (Tools -&gt; TAS Editor)</span></li>
</ol>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">После запуска Тасэдитора игра сбрасывается, а эмулятор автоматически ставится на паузу. Во время ТАСинга эмулятор должен стоять на паузе, чтобы игра не подгоняла и не отвлекала от анализа информации.</span></p>
@ -110,6 +114,7 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com">Free PDF documentation generator</a></p>
</div>

View File

@ -3,7 +3,7 @@
<head>
<title>Справочник</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("Reference");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("Reference");
}
});
</script>
</head>
@ -48,6 +51,7 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">Справочник</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
@ -76,6 +80,7 @@
<p class="rvps12"><span class="rvts25"><br/></span></p>
<p class="rvps12"><span class="rvts25"><br/></span></p>
<p class="rvps12"><span class="rvts25"><br/></span></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/feature-tour/create-ebooks-for-amazon-kindle">Write eBooks for the Kindle</a></p>
</div>

View File

@ -3,7 +3,7 @@
<head>
<title>4.3. Полуавтоматический ТАСинг</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("SemiautomaticTASing");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("SemiautomaticTASing");
}
});
</script>
</head>
@ -52,89 +55,90 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">Полуавтоматический ТАСинг</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/toolbox-method3.png"/></p>
<p class="rvps10"><span class="rvts22">Этот метод является дальнейшим развитием идей нелинейного метода ТАСинга.</span></p>
<p class="rvps10"><span class="rvts22">Во многих случаях ТАСеру требуется сразу видеть результат своих изменений </span><span class="rvts22">Ввод</span><span class="rvts22">а. В идеале он должен осознавать последствия своего решения одновременно с принятием решения. Но в реальности драгоценные мгновенья уходят на введение своего решения в компьютер и последующую навигацию Курсором Проигрывателя от кадра изменения </span><span class="rvts22">Ввод</span><span class="rvts22">а до кадра конца участка.</span></p>
<p class="rvps10"><span class="rvts22">Третий метод ТАСинга позволяет переложить навигацию Курсором Проигрывателя на Тасэдитор и сосредоточить внимание только на редактировании. Тасэдитор будет мгновенно реагировать на каждое изменение </span><span class="rvts22">Ввод</span><span class="rvts22">а и сразу отображать его результат на экране FCEUX. Благодаря тому, что вы ощущаете воздействие каждого щелчка на игровой процесс, достигается высочайший уровень взаимосвязи между ТАСером и игрой. При таком тесном взаимодействии не только ТАСер управляет игрой, но и игра направляет действия ТАСера в нужное русло.</span></p>
<p class="rvps10"><span class="rvts22">На практике такой высокий уровень взаимозависимости между ТАСером и игрой требуется далеко не всегда. Ведь это суживает спектр мыслей ТАСера, не позволяя взглянуть на игру свысока и применить к ней логику из других игр или других сфер жизни. Однако, когда текущий участок небольшой, и все факторы оптимальности известны (требуется только найти их идеальное сочетание), можно отвлечься от всего остального и полностью сфокусироваться на переборе вариантов.</span></p>
<p class="rvps10"><span class="rvts22">Этот метод ТАСинга назван полуавтоматическим, потому что получилось нечто среднее между использованием автоматических ботов и ручным ТАСингом. Само по себе использование ботов не обладает высокой степенью гибкости, присущей человеческому мышлению. С другой стороны, ручной перебор (зацикленное тестирование множества однотипных вариантов </span><span class="rvts22">Ввод</span><span class="rvts22">а) угнетает своей рутинностью.</span></p>
<p class="rvps10"><span class="rvts22">Идея третьего метода ТАСинга в том, что вы редактируете </span><span class="rvts22">Ввод</span><span class="rvts22">, а Тасэдитор запускает и останавливает просмотр участка. Курсор Проигрывателя автоматически возвращается на то место, откуда его сбросило в момент усечения Гринзоны.</span></p>
<p class="rvps10"><span class="rvts22">Режим Записи и галочка "Follow cursor" должны быть выключены. Галочка "Auto-restore last position" должна быть включена. Галочка "Turbo seek" по умолчанию отключена и включается при необходимости.</span></p>
<p class="rvps10"><span class="rvts22">Во многих случаях ТАСеру требуется сразу видеть результат своих изменений </span><span class="rvts22">Ввод</span><span class="rvts22">а. В идеале он должен осознавать все последствия своего решения прямо в момент принятия решения. Но в реальности драгоценные мгновенья уходят на введение своего решения в компьютер и последующую навигацию Курсором Проигрывателя до конца участка.</span></p>
<p class="rvps10"><span class="rvts22">В таких случаях вы можете переложить навигацию Курсором Проигрывателя на Тасэдитор и сосредоточить внимание только на редактировании. Тасэдитор будет мгновенно реагировать на каждое изменение </span><span class="rvts22">Ввод</span><span class="rvts22">а и отображать новый результат, возвращая </span><span class="rvts22">Курсор Проигрывателя в конец текущего участка.</span></p>
<p class="rvps10"><span class="rvts22">Благодаря тому, что вы ощущаете воздействие каждого щелчка на игровой процесс, достигается высочайший уровень взаимосвязи между ТАСером и игрой. При таком тесном взаимодействии не только ТАСер управляет игрой, но и игра направляет действия ТАСера в нужное русло. </span><span class="rvts22">Конечно, такой высокий уровень взаимозависимости далеко не всегда полезен, ведь это суживает ваш спектр мыслей, не позволяя взглянуть на игру свысока и применить к ней логику из других игр или других сфер жизни.</span></p>
<p class="rvps10"><span class="rvts22">Однако, когда текущий участок несложен, и все факторы оптимальности уже известны (и требуется только найти их идеальное сочетание), полезно отвлечься от всего остального и посвятить всё внимание перебору вариантов. Тогда вы успеете проверить гораздо больше подходов, до того как вам надоест текущий участок.</span></p>
<p class="rvps10"><span class="rvts22">Режим Записи и галочка "Follow cursor" должны быть выключены. Галочка "Auto-restore last position" должна быть включена. Галочка "Turbo seek" может быть либо включена, либо выключена.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">Основное занятие ТАСера:</span></p>
<p class="rvps10"><span class="rvts53"><br/></span></p>
<p class="rvps10"><span class="rvts23">Основное занятие:</span></p>
<p class="rvps10"><span class="rvts54"><br/></span></p>
<ol style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Проскроллировать Piano Roll к началу редактируемого участка мувика, доставить сюда Курсор Проигрывателя, определиться с целью. Полезно также отметить начало участка Маркером.</span></li>
<li class="rvps15"><span class="rvts22">Приблизительно прикинуть кадр конца участка, доставить Курсор Проигрывателя на этот кадр и оставить его там, даже если на участке пока отсутствует Ввод, необходимый для достижения конечного события.</span></li>
<li class="rvps15"><span class="rvts22">Предположить наличие ошибки на участке, взвесить имеющиеся факторы оптимальности и прикинуть способ исправления ошибки (как именно требуется изменить </span><span class="rvts22">Ввод</span><span class="rvts22">, на каких кадрах и т.д.</span><span class="rvts22">).</span></li>
<li class="rvps15"><span class="rvts22">Н</span><span class="rvts22">авигация курсором мыши к любому кадру мувика осуществляется почти мгновенно.</span></li>
<li class="rvps15"><span class="rvts22">Редактировать участок мышью. </span><span class="rvts22">После каждого вносимого изменения Курсор Проигрывателя будет автоматически проигрывать участок от первого изменённого кадра до текущего конца участка. При необходимости можно передвигать текущий конец участка, перемещая Курсор Проигрывателя вручную (колесом).</span></li>
<li class="rvps15"><span class="rvts22">Продолжать редактирование, возвращаясь к пункту 4 или 3, пока целевое событие не наступит в рамках участка.</span></li>
<li class="rvps15"><span class="rvts22">[</span><span class="rvts37">необязательный пункт</span><span class="rvts22">] С</span><span class="rvts22">охранить полученный вариант прохождения участка в любую свободную Закладку.</span></li>
<li class="rvps15"><span class="rvts22">Если это не первый вариант прохождения участка, с</span><span class="rvts22">равнить </span><span class="rvts22">полученный результат с лучшим результатом, используя критерий оптимальности. Если новый вариант оказался лучше&nbsp;</span><span class="rvts22"> (или если это ваш первый вариант прохождения участка), </span><span class="rvts31">рекомендуется</span><span class="rvts22"> сохранить результат в Закладку 9. </span><span class="rvts22">Слот 9 будет отвечать за хранение самого лучшего результата шлифовки участка. Если не сохранять лучший вариант в Закладку, он останется только в текущем мувике и в Журнале Истории.</span></li>
<li class="rvps15"><span class="rvts22">Вернуться к пункту 3 и опробовать ещё варианты, до тех пор пока не иссякнут идеи по данному участку.</span></li>
<li class="rvps15"><span class="rvts22">Когда идеи полностью иссякли, восстановить лучший вариант прохождения из Журнала Истории или из Закладки 9</span><span class="rvts22"> в текущий мувик</span><span class="rvts22">, определиться со следующим участком и вернуться к пункту 1.</span></li>
<li class="rvps10"><span class="rvts22">Проскроллировать Piano Roll к началу редактируемого участка мувика, доставить сюда Курсор Проигрывателя, определиться с целью.</span></li>
<li class="rvps10"><span class="rvts22">Определить кадр конца участка и оставить там Курсор Проигрывателя.</span></li>
<li class="rvps10"><span class="rvts22">Предположить наличие ошибки на участке, взвесить имеющиеся факторы оптимальности и прикинуть способ исправления ошибки.</span></li>
<li class="rvps10"><span class="rvts22">Н</span><span class="rvts22">авигация курсором мыши к любому кадру </span><span class="rvts22">текущего участка</span><span class="rvts22"> осуществляется </span><span class="rvts22">практически</span><span class="rvts22"> мгновенно.</span></li>
<li class="rvps10"><span class="rvts22">Редактировать участок мышью. </span><span class="rvts22">После каждого вносимого изменения Курсор Проигрывателя будет автоматически проигрывать участок и останавливаться на кадре, который считался концом участка. При необходимости можно передвигать текущий конец участка, перемещая Курсор Проигрывателя вручную (колесом). </span><span class="rvts22">Шаги 4 и 5 непрерывно чередуются, пока редактирование не считается законченным в соответствии с критерием оптимальности.</span></li>
<li class="rvps10"><span class="rvts22">[</span><span class="rvts37">необязательный шаг</span><span class="rvts22">] </span><span class="rvts22">Сохранить готовый подход в любую свободную Закладку, например, в слот </span><span class="rvts27">8</span><span class="rvts22">.</span></li>
<li class="rvps10"><span class="rvts22">Если это не первый подход к прохождению участка, с</span><span class="rvts22">равнить новый</span><span class="rvts22"> результат с лучшим </span><span class="rvts22">старым</span><span class="rvts22"> результатом, используя критерий оптимальности. Если новый подход оказался лучше</span><span class="rvts22"> (или это первый </span><span class="rvts22">подход</span><span class="rvts22">),</span><span class="rvts22"> следует </span><span class="rvts22">сохранить его в Закладку </span><span class="rvts27">9</span><span class="rvts22">. </span><span class="rvts22">Слот </span><span class="rvts27">9</span><span class="rvts22"> будет отвечать за хранение самого лучшего результата шлифовки участка.</span></li>
<li class="rvps10"><span class="rvts22">Если осталось желание испробовать другую серию подходов, следует вернуться к шагу 3, и так до тех пор пока не иссякнут идеи по данному участку.</span></li>
<li class="rvps10"><span class="rvts22">[</span><span class="rvts37">необязательный шаг</span><span class="rvts22">]</span><span class="rvts22"> Когда идеи начинают иссякать, можно почерпнуть информацию из прошлого или будущего: пересмотреть несколько участков, перетаскивая Курсор Проигрывателя или отпустив паузу эмулятора.&nbsp;</span><span class="rvts22"> При необходимости можно по-быстрому дорисовать </span><span class="rvts22">Ввод</span><span class="rvts22"> для просмотра предстоящих событий игры. Но п</span><span class="rvts22">ри возвращении к редактированию участка нужно вернуть Курсор Проигрывателя на кадр целевого события.</span></li>
<li class="rvps10"><span class="rvts22">Когда идеи полностью иссякли, восстановить лучший </span><span class="rvts22">подход</span><span class="rvts22"> из Журнала Истории или из Закладки </span><span class="rvts27">9</span><span class="rvts22"> в текущий мувик</span><span class="rvts22"> и перейти к следующему участку</span><span class="rvts22">.</span></li>
</ol>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Основное отличие этого метода от простого нелинейного в том, что при редактировании участка Курсор Проигрывателя находится в конце участка, а не где-то в начале. При каждом усечении Гринзоны Курсор Проигрывателя автоматически добегает к концу участка, точнее, к тому месту, где был конец участка до изменения Ввода. Если после изменения Ввода кадр конца участка изменился, достаточно слегка передвинуть </span><span class="rvts22">голубой курсор колесом мыши на пару кадров выше или ниже. А во многих случаях даже это не требуется, так как ТАСеру не всегда нужно знать конечный кадр участка, порой надо только увидеть цепочку событий, происходящих на участке в результате изменённого Ввода.</span></p>
<p class="rvps10"><span class="rvts22">Просмотр участка запускается после каждого промежуточного изменения Ввода, даже если вы ещё не закончили свою мысль и не собираетесь сравнивать итоговый результат с результатом предыдущего способа прохождения участка. Обычно во время увлечённого редактирования ТАСер не смотрит на экран FCEUX, продолжая щёлкать по Piano Roll, пока не воплотит свою мысль в виде большой кнопочной комбинации. А когда </span><span class="rvts22">Ввод</span><span class="rvts22"> участка уже представляет интерес, ТАСер обращает внимание на экран эмулятора или Memory Watch, которые продолжают обновляться при каждом изменении Ввода на участке.</span></p>
<p class="rvps10"><span class="rvts22">Например, чтобы осуществить прыжок через яму, вы сначала рисуете длинное зажатие </span><span class="rvts32">R</span><span class="rvts22"> на участке и даже не смотрите на экран FCEUX, где в это время Марио на бегу проваливается в яму. Вы дорисовываете нажатие кнопки </span><span class="rvts32">A</span><span class="rvts22">, а затем уже смотрите на экран эмулятора и стираете/дорисовываете дополнительные нажатия </span><span class="rvts32">A</span><span class="rvts22">, перемещая начало и длительность прыжка и наблюдая траекторию прыгающего персонажа.</span></p>
<p class="rvps10"><span class="rvts22">Таким образом, процесс шлифовки </span><span class="rvts22">Ввод</span><span class="rvts22">а в данном методе представляет собой одновременный просмотр и редактирование участка. </span><span class="rvts22">Так как ТАСер каждый раз мгновенно видит в эмуляторе результат своих действий, он почти сразу входит в тесный информационный контакт с игрой и начинает мыслить синхронно с её регулярными откликами. Игра начинает помогать ТАСеру принимать и отфильтровывать решения, начинает играть вместе с ним, а иногда даже за него. </span><span class="rvts22">В результате можно потерять беспристрастность ума и пойти на поводу очевидных решений, поощряемых самой игрой. Поэтому не стоит использовать этот метод ТАСинга постоянно, рекомендуется чередовать его с предыдущим.</span></p>
<p class="rvps10"><span class="rvts22">Основное отличие этого метода от предыдущего в том, что Курсор Проигрывателя как правило находится в конце текущего участка, а не в начале. При каждом усечении Гринзоны Курсор Проигрывателя добегает к концу участка, точнее, к тому кадру, где был конец участка до изменения Ввода. Если после изменения Ввода изменился и кадр целевого события, можно дополнительно передвинуть </span><span class="rvts22">голубой курсор колесом мыши. Но зачастую точное позиционирование не требуется, порой достаточно только увидеть цепочку событий, происходящих на участке в результате изменённого Ввода.</span></p>
<p class="rvps10"><span class="rvts22">Проигрывание участка автоматически запускается после каждого промежуточного шага изменений Ввода, даже если вы ещё не закончили свою мысль и не собираетесь сравнивать текущий результат с результатом предыдущего подхода. К счастью, во время увлечённого редактирования ТАСер обычно не смотрит на экран FCEUX, продолжая щёлкать по Piano Roll, пока не воплотит свою мысль в виде полноценной кнопочной комбинации. А когда </span><span class="rvts22">Ввод</span><span class="rvts22"> уже представляет интерес, ТАСер обращает внимание на экран эмулятора или окно Memory Watch.</span></p>
<p class="rvps10"><span class="rvts22">Например, чтобы создать прыжок через яму, вы сначала рисуете длинное зажатие </span><span class="rvts32">R</span><span class="rvts22"> и даже не обращаете внимание, что на экране FCEUX в это время Марио на бегу проваливается в яму. Вы дорисовываете нажатие кнопки </span><span class="rvts32">A</span><span class="rvts22">, а затем уже смотрите на окно эмулятора и стираете/дорисовываете дополнительные нажатия </span><span class="rvts32">A</span><span class="rvts22">, тем самым изменяя начало и длительность прыжка и наблюдая траекторию спрайта Марио.</span></p>
<p class="rvps10"><span class="rvts22">Таким образом, процесс шлифовки </span><span class="rvts22">Ввод</span><span class="rvts22">а в данном методе представляет собой одновременный просмотр и редактирование участка. </span><span class="rvts22">ТАСер входит в тесный информационный контакт с игрой и вскоре начинает мыслить синхронно с её откликами. Игра начинает помогать ТАСеру отфильтровывать и принимать решения. </span><span class="rvts22">В результате можно потерять беспристрастность ума и пойти на поводу очевидных решений, поощряемых игрой. Поэтому не стоит использовать этот метод ТАСинга постоянно, рекомендуется чередовать его с предыдущим.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Как и в предыдущем методе, здесь можно менять скорость добегания, получая различные вариации метода:</span></p>
<p class="rvps10"><span class="rvts22">Как и в простом нелинейном методе, здесь можно менять скорость эмуляции, получая различные вариации полуавтоматического метода:</span></p>
<ol style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">редактирование в реальном времени с постоянным тестированием изменений</span></li>
<li class="rvps15"><span class="rvts22">редактирование при замедленной эмуляции с постоянным тестированием изменений</span></li>
<li class="rvps15"><span class="rvts22">редактирование с мгновенным просмотром итога (турбо)</span></li>
<li class="rvps10"><span class="rvts22">редактирование с </span><span class="rvts22">просмотром</span><span class="rvts22"> изменений в реальном времени</span></li>
<li class="rvps10"><span class="rvts22">редактирование с </span><span class="rvts22">просмотром</span><span class="rvts22"> изменений при замедленной эмуляции</span></li>
<li class="rvps10"><span class="rvts22">редактирование с мгновенным просмотром итога (турбо)</span></li>
</ol>
<p class="rvps10"><a name="turbo-seeking"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Как и в третьей вариации нелинейного ТАСинга, здесь турбо создаёт психологическую ассоциацию между двумя отдалёнными событиями (началом и концом участка). Но теперь эта ассоциация многократно усиляется благодаря окончательному убиранию посредников скоростной просмотр участка запускается ещё до отпускания кнопки мыши. Едва ТАСер щёлкает по какому-то кадру Piano Roll, он уже видит результат, который вообще-то наступает в игре через несколько секунд после нажатия кнопки.</span></p>
<p class="rvps10"><span class="rvts22">Турбо-добегание создаёт ассоциацию между двумя отдалёнными событиями (началом и концом участка). Здесь эта ассоциация многократно усиляется благодаря окончательному убиранию посредников добегание запускается ещё до отпускания кнопки мыши во время рисования Ввода. Едва ТАСер щёлкает по какому-то кадру Piano Roll, он уже видит результат, который вообще-то наступает в игре через несколько секунд после этого кадра.</span></p>
<p class="rvps10"><a name="FindStartButtonPress"></a>
<span class="rvts22">В качестве примера можно привести поиск первого кадра для нажатия кнопки </span><span class="rvts32">Start</span><span class="rvts22">. Во многих играх нажать эту кнопку можно раньше, чем отобразится графика на экране. Кроме того, нередко после срабатывания </span><span class="rvts32">Start</span><span class="rvts22"> игра на некоторое время задумывается, ничем не подавая вид, что нажатие сработало. Только через секунду или две мы видим смену заставки и тем самым узнаём, что нажатие </span><span class="rvts32">Start</span><span class="rvts22"> сработало.</span></p>
<p class="rvps10"><span class="rvts22">В традиционном методе на поиск самого первого кадра уйдёт 5-10 минут. В Тасэдиторе на это уходит менее минуты.</span></p>
<p class="rvps10"><span class="rvts22">Делается это так:</span></p>
<p class="rvps10"><span class="rvts22">В традиционном методе на перебор подходов (поиск самого первого кадра) уйдёт 5-10 минут, а полуавтоматический метод позволяет проверить все эти подходы гораздо быстрее</span><span class="rvts22">:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Включаете галочку </span><span class="rvts22">"Auto-restore last position" и </span><span class="rvts22">"Turbo seek". </span><span class="rvts22">Отключаете галочку "Follow cursor", чтобы Piano Roll не убегал вслед за Курсором Проигрывателя.</span></li>
<li class="rvps15"><span class="rvts22">Ставите пробное нажатие </span><span class="rvts32">Start</span><span class="rvts22"> на кадре, где оно точно сработает, например, на кадр 100.</span></li>
<li class="rvps15"><span class="rvts22">Просматриваете срабатывание кнопки до момента, когда по изображению на экране уже понятно, что </span><span class="rvts32">Start </span><span class="rvts22">сработал (например, появился экран World 1-1). Допустим, это кадр 200. Оставляете Курсор Проигрывателя на этом месте это и будет конец участка.</span></li>
<li class="rvps15"><span class="rvts22">Теперь удаляете своё пробное нажатие </span><span class="rvts32">Start</span><span class="rvts22"> (в окне FCEUX тут же мигнёт и исчезнет экран </span><span class="rvts22">World 1-1,</span><span class="rvts22"> и останется экран заставки, так как нажатия </span><span class="rvts32">Start</span><span class="rvts22"> больше нет).</span></li>
<li class="rvps15"><span class="rvts22">Ставите нажатие </span><span class="rvts32">Start</span><span class="rvts22"> на первый или второй кадр мувика, ещё до того, когда приставка начинает опрашивать джойстик. В окне FCEUX ничего не меняется, так как это нажатие не сработало.</span></li>
<li class="rvps15"><span class="rvts22">Зажимаете одной рукой </span><span class="rvts34">Ctrl + Shift</span><span class="rvts22">, другой начинаете периодически (раз в секунду или чаще это зависит от мощности вашего компьютера) нажимать </span><span class="rvts34">Insert</span><span class="rvts22">. После каждого нажатия </span><span class="rvts34">Ctrl + Shift + Insert</span><span class="rvts22"> символ кнопки </span><span class="rvts32">Start </span><span class="rvts22">отодвигается на один кадр вперёд, а в окне FCEUX вы видите, повлияло ли это нажатие на состояние игры в кадре 200, или не повлияло. Если у вас быстрый компьютер, то добегание голубого курсора до кадра 200 будет почти мгновенным, если же компьютер медленный, то придётся подождать около полсекунды (процесс добегания можно отслеживать по прогрессбару в разделе Playback).</span></li>
<li class="rvps15"><span class="rvts22">Пока нажатие </span><span class="rvts32">Start</span><span class="rvts22">, методично сдвигаемое вами вниз, не доходит до искомого кадра, окно FCEUX будет показывать заставку, но когда очередное нажатие </span><span class="rvts34">Ctrl + Shift + Insert</span><span class="rvts22"> передвинуло </span><span class="rvts32">Start</span><span class="rvts22"> на нужный кадр, в окне FCEUX появится экран </span><span class="rvts22">World 1-1</span><span class="rvts22">.</span></li>
<li class="rvps15"><span class="rvts22">Таким образом, вы обнаружили самый первый возможный кадр для нажатия </span><span class="rvts32">Start</span><span class="rvts22">. Номер этого кадра, скорее всего, будет намного меньше 100. Для уверенности можно тут же нажать </span><span class="rvts34">Ctrl + Delete</span><span class="rvts22">, чтобы сместить нажатие </span><span class="rvts32">Start</span><span class="rvts22"> на предыдущий кадр и увидеть в окне FCEUX экран заставки, а затем нажать </span><span class="rvts34">Ctrl + Z</span><span class="rvts22">, чтобы вернуть </span><span class="rvts32">Start </span><span class="rvts22">на место и увидеть </span><span class="rvts22">World 1-1.</span></li>
<li class="rvps10"><span class="rvts22">Включаете галочку </span><span class="rvts22">"Auto-restore last position" и </span><span class="rvts22">"Turbo seek". </span><span class="rvts22">Отключаете галочку "Follow cursor".</span></li>
<li class="rvps10"><span class="rvts22">Ставите пробное нажатие </span><span class="rvts32">Start</span><span class="rvts22"> на кадре, где оно точно сработает, например, на кадр 100.</span></li>
<li class="rvps10"><span class="rvts22">Просматриваете срабатывание кнопки до момента, когда по изображению на экране уже понятно, что </span><span class="rvts32">Start </span><span class="rvts22">сработал (например, на экране появился текст "World 1-1"). Допустим, это кадр 150. Оставляете Курсор Проигрывателя на этом месте это и будет конец участка.</span></li>
<li class="rvps10"><span class="rvts22">Теперь удаляете своё пробное нажатие (в окне FCEUX тут же мигнёт и исчезнет "</span><span class="rvts22">World 1-1",</span><span class="rvts22"> и останется только экран заставки, так как нажатия </span><span class="rvts32">Start</span><span class="rvts22"> больше нет).</span></li>
<li class="rvps10"><span class="rvts22">Ставите нажатие </span><span class="rvts32">Start</span><span class="rvts22"> на начало участка, то есть заведомо раньше, чем оно может сработать. Например, поставьте его на первый кадр мувика. Изображение в окне FCEUX мигнёт, но экран заставки останется без изменений, так как </span><span class="rvts32">Start</span><span class="rvts22"> не сработал.</span></li>
<li class="rvps10"><span class="rvts22">Зажимаете </span><span class="rvts34">Ctrl + Shift</span><span class="rvts22"> и начинаете периодически нажимать </span><span class="rvts34">Insert</span><span class="rvts22"> (раз в секунду или чаще это зависит от мощности вашего компьютера). После каждого нажатия </span><span class="rvts34">Ctrl + Shift + Insert</span><span class="rvts22"> символ кнопки </span><span class="rvts32">Start </span><span class="rvts22">отодвигается на один кадр вперёд, а в окне FCEUX вы видите, повлияло ли это нажатие на состояние игры в кадре 150, или не повлияло.</span></li>
<li class="rvps10"><span class="rvts22">Пока </span><span class="rvts32">Start </span><span class="rvts22">не доходит до момента, с которого игра начинает принимать Ввод, окно FCEUX будет показывать заставку. Но когда очередное нажатие </span><span class="rvts34">Ctrl + Shift + Insert</span><span class="rvts22"> передвинет </span><span class="rvts32">Start</span><span class="rvts22"> на подходящий кадр, в окне FCEUX появится экран "</span><span class="rvts22">World 1-1"</span><span class="rvts22">.</span></li>
<li class="rvps10"><span class="rvts22">Таким образом, вы обнаружили самый первый возможный кадр для нажатия </span><span class="rvts32">Start</span><span class="rvts22">. Номер этого кадра, скорее всего, будет намного меньше 100.</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Точно так же можно очень быстро находить оптимальную длительность зажатия кнопки </span><span class="rvts32">A</span><span class="rvts22"> для изменения высоты прыжка и приземления в нужной точке. Можно легко манипулировать удачей во многих играх. И вообще, удобство автоматического турбо-добегания наглядно проявляется в ситуациях, когда на участке действует всего один фактор оптимальности, и требуется быстро перебрать пару сотен однотипных вариантов.</span></p>
<p class="rvps10"><span class="rvts22">Полуавтоматический ТАСинг стимулирует меньше думать и больше экспериментировать. Во многих видеоиграх именно такой подход приводит к успеху, однако постарайтесь не увлечься комфортностью этого метода, забыв про остальные.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Плюсы полуавтоматического ТАСинга:</span></p>
<p class="rvps15"><span class="rvts23">+ </span><span class="rvts22">Постоянная отдача позволяет на ходу корректировать свои решения и заранее отсекать в уме заведомо ошибочные комбинации </span><span class="rvts22">Ввод</span><span class="rvts22">а. Это уменьшает количество требуемых исправлений и ускоряет рабочий процесс.</span></p>
<p class="rvps15"><span class="rvts23">+ </span><span class="rvts22">Мгновенная навигация к месту редактирования.</span></p>
<p class="rvps15"><span class="rvts23">+ </span><span class="rvts22">Возможность пропускать ненужные сцены и ассоциировать действие с итогом.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Минусы метода:</span></p>
<p class="rvps15"><span class="rvts23"> </span><span class="rvts22">Упор на мышиное управление.</span></p>
<p class="rvps15"><span class="rvts23"> </span><span class="rvts22">Настойчивая отдача провоцирует ТАСера отсекать некоторые нелогичные, но потенциально выигрышные комбинации.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts26">Когда использовать:</span><span class="rvts22"> </span><span class="rvts22">когда нужно отшлифовать участок, для которого уже известны все факторы оптимальности.</span></p>
<p class="rvps10"><span class="rvts22">Таким же образом можно очень быстро находить оптимальную длительность зажатия кнопки </span><span class="rvts32">A</span><span class="rvts22"> для приземления в нужной точке. Также можно быстро манипулировать удачей во многих играх. И вообще, удобство автоматического турбо-добегания наглядно проявляется в ситуациях, когда на участке важен только один фактор оптимальности, и требуется быстро перебрать сотню однотипных подходов.</span></p>
<p class="rvps10"><span class="rvts22">В целом, полуавтоматический метод стимулирует меньше думать и больше экспериментировать. Во многих видеоиграх такой подход приводит к успеху, однако ТАСинг требует от вас чего-то большего, так что постарайтесь не слишком увлекаться комфортностью этого метода.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Теперь вы изучили главные принципы работы в Тасэдиторе и уже можете начинать ТАСить свою любимую игру. </span><span class="rvts22">Лучше всего обучает практика, и только в процессе реальной разработки своего личного ТАСа вы сможете освоить все премудрости.</span></p>
<p class="rvps10"><span class="rvts22">После пары недель практического ТАСинга рекомендуется заново перечитать третью и четвёртую главу данного Курса, чтобы усвоить текст на более глубоком уровне, ведь во время первого чтения вы наверняка многое поняли не до конца.</span></p>
<p class="rvps10"><span class="rvts22">Плюсы метода:</span></p>
<p class="rvps14"><span class="rvts23">+ </span><span class="rvts22">Мгновенная навигация и высокая скорость работы побуждает выполнять больше тестов.</span></p>
<p class="rvps14"><span class="rvts23">+ </span><span class="rvts22">Постоянная отдача позволяет адаптироваться к игре на ходу, корректировать свои решения и преждевременно отсекать в уме ошибочные подходы.</span></p>
<p class="rvps14"><span class="rvts23">+ </span><span class="rvts22">Возможность пропускать ненужные сцены.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Минусы метода:</span></p>
<p class="rvps14"><span class="rvts23"> </span><span class="rvts22">Настойчивая игровая отдача провоцирует ТАСера отсекать некоторые нелогичные, но потенциально выигрышные подходы.</span></p>
<p class="rvps14"><span class="rvts23"> </span><span class="rvts22">Упор на мышиное управление.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts26">Когда рекомендуется использовать:</span><span class="rvts22"> </span><span class="rvts22">когда нужно отшлифовать участок, для которого уже известны все факторы оптимальности. Например, для быстрой пересинхронизации старого Ввода этот метод удобнее предыдущего. Также он может быть удобнее при создании первого прохождения участка.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Теперь вы изучили главные принципы работы в Тасэдиторе и можете начинать ТАСить интересующую игру. </span><span class="rvts22">Лучше всего обучает практика, и только в процессе реальной разработки своего личного ТАСа вы сможете освоить все премудрости этой деятельности.</span></p>
<p class="rvps10"><span class="rvts22">После нескольких недель практического ТАСинга рекомендуется заново перечитать третью и четвёртую главу данного Курса, чтобы понять текст на более глубоком уровне.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">В следующей главе: </span><a class="rvts28" href="ProgramCustomization.html">тонкая настройка программы</a><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<div class="rvps10"><table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid;">
<tr valign="top">
<td style="border-color: #000000; border-style: solid;"><p class="rvps10"><span class="rvts26">ПРАКТИЧЕСКОЕ ЗАДАНИЕ: </span><span class="rvts22">Хорошенько отшлифуйте </span><span class="rvts22">Ввод</span><span class="rvts22"> в распланированных участках своего тестового мувика. Если пробное разбиение Маркерами оказалось неудачным переразбивайте на ходу.</span></p>
<p class="rvps10"><span class="rvts22">Постарайтесь использовать только второй и третий методы ТАСинга, не прибегая к традиционному методу. Попробуйте также воспользоваться турбо в нужных местах. Если на оптимизацию целого игрового уровня вам не хватит терпения, постарайтесь хоть как-то завершить оставшийся промежуток уровня, даже если он будет не слишком оптимальным.</span></p>
<p class="rvps10"><span class="rvts22">Используйте только второй и третий методы ТАСинга, так как традиционный метод устарел. Попробуйте также воспользоваться турбо в нужных местах.</span></p>
<p class="rvps10"><span class="rvts26">Примерное время выполнения: </span><span class="rvts22">30-60 минут.</span></p>
</td>
</tr>
@ -145,6 +149,7 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/feature-tour/create-ebooks-for-amazon-kindle">Produce Kindle eBooks easily</a></p>
</div>

View File

@ -3,7 +3,7 @@
<head>
<title>Конспект спидраннера</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("SpeedrunningSynopsis");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("SpeedrunningSynopsis");
}
});
</script>
</head>
@ -52,102 +55,104 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">Конспект спидраннера</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps10"><span class="rvts22">Благодаря наличию однозначной цели, создание спидранов является наиболее простым видом ТАСинга, и соответствующие приёмы хорошо изучены. Здесь приводится классификация типовых задач спидраннера, возникающих во время шлифовки Ввода. Перед чтением этого раздела рекомендуется усвоить материалы </span><a class="rvts28" href="TASingProcess.html">Процесс ТАСинга</a><span class="rvts22"> и </span><a class="rvts28" href="TASingMethodology.html">Методология ТАСинга</a><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">В целом, при создании спидрана необходимо находить кратчайший способ прохождения каждого участка игры. Процесс поиска заключается в тестировании множества вариантов прохождения участка и выборе самого лучшего варианта. Здесь мы обсудим только проблему выбора.</span></p>
<p class="rvps10"><span class="rvts22">Для упрощения задачи ТАСеры обычно сравнивают между собой только два варианта: </span><span class="rvts26">новый рабочий</span><span class="rvts22"> вариант и </span><span class="rvts26">наилучший старый</span><span class="rvts22"> вариант, а все остальные старые варианты сразу забывают (впрочем, некоторые любопытные варианты всегда можно сохранить в Закладки).</span></p>
<p class="rvps10"><span class="rvts22">При создании спидрана необходимо находить кратчайший способ прохождения каждого участка игры. Процесс поиска заключается в тестировании множества подходов к прохождению участка и выборе самого лучшего подхода. Здесь мы обсудим только проблему выбора.</span></p>
<p class="rvps10"><span class="rvts22">Для упрощения задачи ТАСеры обычно сравнивают между собой только два подхода: </span><span class="rvts26">новый рабочий</span><span class="rvts22"> подход и </span><span class="rvts26">наилучший старый</span><span class="rvts22"> подход, а все остальные старые подходы сразу забывают (впрочем, некоторые любопытные подходы всегда можно сохранить в Закладки).</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Самый лучший из всех старых (ранее протестированных) вариантов может храниться:</span></p>
<p class="rvps10"><span class="rvts22">Самый лучший из всех старых (ранее протестированных) подходов может храниться:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">в Закладках рекомендуется</span></li>
<li class="rvps15"><span class="rvts22">в Журнале Истории автоматически, но временно</span></li>
<li class="rvps15"><span class="rvts22">в памяти ТАСера не рекомендуется</span></li>
<li class="rvps10"><span class="rvts22">в Закладках рекомендуется</span></li>
<li class="rvps10"><span class="rvts22">в Журнале Истории автоматически, но временно</span></li>
<li class="rvps10"><span class="rvts22">в памяти ТАСера не рекомендуется</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Когда новый рабочий вариант оказывается лучше (оптимальнее) наилучшего старого, автоматически подразумевается, что он лучше всех остальных старых вариантов, поэтому этот рабочий вариант становится наилучшим. В случае использования Закладок следует пересохранить новый вариант в тот же слот, где хранился наилучший старый вариант. По окончании поиска содержимое этого слота загружается в финальный мувик.</span></p>
<p class="rvps10"><span class="rvts22">Когда новый рабочий подход оказывается лучше (оптимальнее) наилучшего старого, автоматически подразумевается, что он лучше всех остальных старых подходов, поэтому этот рабочий подход сразу становится наилучшим. В случае использования Закладок следует пересохранить новый подход в тот же слот, где хранился наилучший старый подход. По окончании поиска содержимое этого слота загружается в финальный мувик.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Критерии оптимальности в спидранах:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">наличие/отсутствие определённого события в новом и старом варианте </span><span class="rvts71">(bool)</span></li>
<li class="rvps15"><span class="rvts22">время наступления целевого события в новом и старом варианте </span><span class="rvts71">(int)</span></li>
<li class="rvps15"><span class="rvts22">состояние игры на одном и том же кадре нового и старого мувика </span><span class="rvts71">(string)</span></li>
<li class="rvps10"><span class="rvts22">наличие/отсутствие определённого события в новом и старом подходе </span><span class="rvts72">(bool)</span></li>
<li class="rvps10"><span class="rvts22">время наступления целевого события в новом и старом подходе </span><span class="rvts72">(int)</span></li>
<li class="rvps10"><span class="rvts22">состояние игры на одном и том же кадре нового и старого мувика </span><span class="rvts72">(string)</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Соответственно, при сравнении двух вариантов вы делаете одно из трёх:</span></p>
<p class="rvps15"><a class="rvts28" href="SpeedrunningSynopsis.html#CompareEvent">1. &nbsp;Сравнение наличия/отсутствия события.</a></p>
<p class="rvps27"><a class="rvts62" href="SpeedrunningSynopsis.html#CompareEvent-A">А. По памяти</a></p>
<p class="rvps27"><a class="rvts62" href="SpeedrunningSynopsis.html#CompareEvent-B">B. С помощью Закладок</a></p>
<p class="rvps15"><a class="rvts28" href="SpeedrunningSynopsis.html#CompareTime">2. Сравнение времени наступления события.</a></p>
<p class="rvps27"><a class="rvts62" href="SpeedrunningSynopsis.html#CompareTime-A">A. По памяти</a></p>
<p class="rvps27"><a class="rvts62" href="SpeedrunningSynopsis.html#CompareTime-B">B. С помощью зелёной стрелки</a></p>
<p class="rvps27"><a class="rvts62" href="SpeedrunningSynopsis.html#CompareTime-C">C. С помощью Маркера</a></p>
<p class="rvps27"><a class="rvts62" href="SpeedrunningSynopsis.html#CompareTime-D">D. С помощью Закладок</a></p>
<p class="rvps15"><a class="rvts28" href="SpeedrunningSynopsis.html#CompareState">3. Сравнение состояния игры на одном и том же кадре.</a></p>
<p class="rvps27"><a class="rvts62" href="SpeedrunningSynopsis.html#CompareState-A">А. По памяти</a></p>
<p class="rvps27"><a class="rvts62" href="SpeedrunningSynopsis.html#CompareState-B">B. С помощью Закладок</a></p>
<p class="rvps27"><span class="rvts47"><br/></span></p>
<p class="rvps10"><span class="rvts22">Соответственно, при сравнении любой пары подходов вы делаете одно из трёх:</span></p>
<p class="rvps10"><a class="rvts28" href="SpeedrunningSynopsis.html#CompareEvent">1. &nbsp;Сравнение наличия/отсутствия события.</a></p>
<p class="rvps33"><a class="rvts63" href="SpeedrunningSynopsis.html#CompareEvent-A">А. По памяти</a></p>
<p class="rvps33"><a class="rvts63" href="SpeedrunningSynopsis.html#CompareEvent-B">B. С помощью Закладок</a></p>
<p class="rvps10"><a class="rvts28" href="SpeedrunningSynopsis.html#CompareTime">2. Сравнение времени наступления события.</a></p>
<p class="rvps33"><a class="rvts63" href="SpeedrunningSynopsis.html#CompareTime-A">A. По памяти</a></p>
<p class="rvps33"><a class="rvts63" href="SpeedrunningSynopsis.html#CompareTime-B">B. С помощью зелёной стрелки</a></p>
<p class="rvps33"><a class="rvts63" href="SpeedrunningSynopsis.html#CompareTime-C">C. С помощью Маркера</a></p>
<p class="rvps33"><a class="rvts63" href="SpeedrunningSynopsis.html#CompareTime-D">D. С помощью Закладок</a></p>
<p class="rvps10"><a class="rvts28" href="SpeedrunningSynopsis.html#CompareState">3. Сравнение состояния игры на одном и том же кадре.</a></p>
<p class="rvps33"><a class="rvts63" href="SpeedrunningSynopsis.html#CompareState-A">А. По памяти</a></p>
<p class="rvps33"><a class="rvts63" href="SpeedrunningSynopsis.html#CompareState-B">B. С помощью Закладок</a></p>
<p class="rvps32"><span class="rvts48"><br/></span></p>
<p class="rvps10"><a name="CompareEvent"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts26">1. Сравнение наличия/отсутствия события.</span></p>
<p class="rvps10"><span class="rvts22">Выигрывает вариант, где требуемое событие происходит в рамках текущего участка (а вредное событие, соответственно, не происходит). Появление требуемого события это всего лишь первый (и зачастую лёгкий) этап при создании Ввода, а следующим этапом будут попытки ускорить момент появления этого события.</span></p>
<p class="rvps10"><span class="rvts31">Перебор вариантов продолжается до первого успешного варианта, либо пока не надоест (тогда событие признаётся недостижимым).</span></p>
<p class="rvps10"><span class="rvts22">Выигрывает подход, где требуемое событие происходит в рамках текущего участка (а вредное событие, соответственно, не происходит). Появление требуемого события это всего лишь первый (и зачастую лёгкий) этап при создании Ввода, а следующим этапом будут попытки ускорить момент появления этого события.</span></p>
<p class="rvps10"><span class="rvts31">Перебор подходов продолжается до первого успешного подхода, либо пока не надоест (тогда событие признаётся недостижимым).</span></p>
<p class="rvps10"><span class="rvts22">Аналогия с программированием: сравнение двух Boolean (переменная логического типа), сравнение двух массивов Boolean.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="CompareEvent-A"></a>
<span class="rvts22">A. В большинстве случаев подходит простое понимание того факта, что требуемого события не удалось добиться в прошлых вариантах. Пример: </span><a class="rvts28" href="SemiautomaticTASing.html#FindStartButtonPress">нажатие кнопки </a><a class="rvts72" href="SemiautomaticTASing.html#FindStartButtonPress">Start</a><span class="rvts22">.</span></p>
<span class="rvts22">A. В большинстве случаев достаточно просто помнить тот факт, что требуемого события не удалось добиться в прошлых подходах. Пример: </span><a class="rvts28" href="SemiautomaticTASing.html#FindStartButtonPress">нажатие кнопки </a><a class="rvts73" href="SemiautomaticTASing.html#FindStartButtonPress">Start</a><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="CompareEvent-B"></a>
<span class="rvts22">B. Если целевое событие является комплексным (например, планируется одновременно подстрелить трёх врагов), рекомендуется в процессе перебора вариантов сохранять в Закладки те варианты, где требуемое событие выполнилось хотя бы частично (например, подстрелили двух врагов одновременно, а третьего позже). Если в конце концов целевое события окажется недостижимым, может сгодиться и такой частичный успех.</span></p>
<span class="rvts22">B. Если целевое событие является комплексным (например, планируется одновременно подстрелить трёх врагов), рекомендуется в процессе перебора подходов сохранять в Закладки те варианты, где требуемое событие выполнилось хотя бы частично (например, подстрелили двух врагов одновременно, а третьего позже). Если в конце концов целевое события окажется недостижимым, может сгодиться и такой частичный успех.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="CompareTime"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts26">2. Сравнение времени наступления события.</span></p>
<p class="rvps10"><span class="rvts22">Выигрывает вариант, где целевое событие наступает раньше. Время наступления целевого события определяется кадром, перед которым целевого события в игре ещё не было, а на этом кадре оно уже есть. Номер этого кадра определяется при наведении на него Курсора Проигрывателя и просмотре экрана FCEUX (или Memory Watch) для подтверждения.</span></p>
<p class="rvps10"><span class="rvts31">Перебор вариантов продолжается до тех пор, пока не надоест, либо пока не исчерпаются все возможные типы вариантов (тогда текущий лучший вариант признаётся идеальным (frame perfect), пока не обнаружены новые факторы).</span></p>
<p class="rvps10"><span class="rvts22">Выигрывает подход, где целевое событие наступает раньше. Время наступления целевого события определяется кадром, перед которым целевого события в игре ещё не было, а на этом кадре оно уже есть. Номер этого кадра определяется при наведении на него Курсора Проигрывателя и просмотре экрана FCEUX (или Memory Watch) для подтверждения.</span></p>
<p class="rvps10"><span class="rvts31">Перебор подходов продолжается до тех пор, пока не надоест, либо пока не исчерпаются все возможные типы подходов (тогда текущий лучший подход признаётся идеальным (frame perfect), пока не обнаружены новые факторы).</span></p>
<p class="rvps10"><span class="rvts22">Аналогия с программированием: сравнение двух целых чисел.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="CompareTime-A"></a>
<span class="rvts22">A. Для простейших участков и маленьких подучастков бывает достаточно запомнить лучший номер кадра в уме и сравнивать результаты новых вариантов с этим числом. Но в целом полагаться на человеческую память не рекомендуется. Подробнее: </span><a class="rvts28" href="TASingProcess.html#EndOfSegment">Процесс ТАСинга</a><span class="rvts22">.</span></p>
<span class="rvts22">A. Для простейших участков и маленьких подучастков бывает достаточно запомнить лучший номер кадра в уме и сравнивать результаты всех новых подходов с этим числом. Но в целом полагаться на человеческую память не рекомендуется. Подробнее: </span><a class="rvts28" href="TASingProcess.html#EndOfSegment">Процесс ТАСинга</a><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="CompareTime-B"></a>
<span class="rvts22">B. На несложных участках можно сверяться с зелёной стрелкой Тасэдитора. При её использовании подразумевается, что вы каждый раз оставляете Курсор Проигрывателя на кадре целевого события (это естественное поведение). Поэтому, если новый кадр целевого события находится выше зелёной стрелки, то новый вариант быстрее предыдущего. Подробнее: </span><a class="rvts28" href="NonlinearTASing.html#GreenArrow">Методология ТАСинга</a><span class="rvts22">.</span></p>
<span class="rvts22">B. На несложных участках можно сверяться с зелёной стрелкой Тасэдитора. При её использовании подразумевается, что вы каждый раз оставляете Курсор Проигрывателя на кадре целевого события (это естественное поведение). Поэтому, если новый кадр целевого события находится выше зелёной стрелки, то новый подход быстрее предыдущего. Подробнее: </span><a class="rvts28" href="NonlinearTASing.html#GreenArrow">Методология ТАСинга</a><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="CompareTime-C"></a>
<span class="rvts22">C. На сложных участках используйте отвязанный Маркер, который будет всегда указывать на текущий лучший номер кадра в Piano Roll. При каждом улучшении старого результата этот Маркер вручную перетаскивается повыше. Поэтому, если новый кадр целевого события находится выше Маркера, то новый вариант быстрее наилучшего старого. Подробнее: </span><a class="rvts28" href="ProgramCustomization.html#BindMarkerstoInput">Настройка программы</a><span class="rvts22">.</span></p>
<span class="rvts22">C. На сложных участках используйте отвязанный Маркер, который будет всегда указывать на текущий лучший номер кадра в Piano Roll. При каждом улучшении старого результата этот Маркер вручную перетаскивается повыше. Поэтому, если новый кадр целевого события находится выше Маркера, то новый подход быстрее наилучшего старого. Подробнее: </span><a class="rvts28" href="ProgramCustomization.html#BindMarkerstoInput">Настройка программы</a><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="CompareTime-D"></a>
<span class="rvts22">D. На участках любой степени сложности рекомендуется использовать Закладки, отображаемые в столбце иконок Piano Roll. При каждом улучшении старого результата текущий вариант вручную сохраняется в ту же Закладку, замещая собой наилучший старый вариант. Поэтому, если новый кадр целевого события находится выше иконки Закладки, то новый вариант быстрее наилучшего старого.</span></p>
<span class="rvts22">D. На участках любой степени сложности рекомендуется использовать Закладки, отображаемые в столбце иконок Piano Roll. При каждом улучшении старого результата текущий подход вручную сохраняется в ту же Закладку, замещая собой наилучший старый подход. Поэтому, если новый кадр целевого события находится выше иконки Закладки, то новый подход быстрее наилучшего старого.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="CompareState"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts26">3. Сравнение состояния игры на одном и том же кадре.</span></p>
<p class="rvps10"><span class="rvts22">Выигрывает вариант, в котором у игры в целом более выгодные характеристики. Этот тип сравнений актуально использовать для оценки сложных и многогранных игровых ситуаций. Например, в гонках Формула-1 приходится заботиться одновременно и о скорости, и о минимальной изношенности шин, поэтому на каждом участке трассы нужно искать оптимальный баланс, а не просто торопиться.</span></p>
<p class="rvps10"><span class="rvts22">Здесь у участка есть чётко определённый кадр окончания, и каждый новый тест должен проиграть участок до этого кадра. Тасэдитор запоминает номер этого кадра в виде зелёной стрелки, которая автоматически останавливает эмуляцию при просмотре новых вариантов. Так что от ТАСера требуется только изменять Ввод (создавая новые варианты), запускать просмотр, дожидаться остановки и оценивать результат (по экрану FCEUX или Memory Watch).</span></p>
<p class="rvps10"><span class="rvts31">Перебор вариантов продолжается до тех пор, пока не надоест, либо пока не исчерпаются все возможные типы вариантов (тогда текущий лучший вариант признаётся идеальным, пока не обнаружены новые факторы).</span></p>
<p class="rvps10"><span class="rvts22">Выигрывает подход, в котором у игры в целом более выгодные характеристики. Этот тип сравнений актуально использовать для оценки сложных и многогранных игровых ситуаций. Например, в гонках Формула-1 приходится заботиться одновременно и о скорости, и о минимальной изношенности шин, поэтому на каждом участке трассы нужно искать оптимальный баланс, а не просто торопиться.</span></p>
<p class="rvps10"><span class="rvts22">Здесь у участка есть чётко определённый кадр окончания, и каждый новый тест должен проиграть участок до этого кадра. Тасэдитор запоминает номер этого кадра в виде зелёной стрелки, которая автоматически останавливает эмуляцию при просмотре новых вариантов. Так что от ТАСера требуется только изменять Ввод (создавая новые подходы), запускать просмотр, дожидаться остановки и оценивать результат (по экрану FCEUX или Memory Watch).</span></p>
<p class="rvps10"><span class="rvts31">Перебор подходов продолжается до тех пор, пока не надоест, либо пока не исчерпаются все возможные типы подходов (тогда текущий лучший подход признаётся идеальным, пока не обнаружены новые факторы).</span></p>
<p class="rvps10"><span class="rvts22">Аналогия с программированием: сравнение двух строк, сравнение двух массивов целых чисел.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="CompareState-A"></a>
<span class="rvts22">A. Для простых участков бывает достаточно запомнить значение главной характеристики состояния игры, достигнутого в наилучшем варианте прохождения участка. Это значение сравнивается с характеристиками нового состояния игры, достигнутого в конце просмотра нового варианта. Если решено, что новое значение лучше, необходимо запомнить его вместо старого. Пример: </span><a class="rvts28" href="NonlinearTASing.html#LuckManipulation">манипуляция удачей</a><span class="rvts22">.</span></p>
<span class="rvts22">A. Для простых участков бывает достаточно запомнить значение главной характеристики состояния игры, достигнутого в наилучшем подходе. Это значение сравнивается с характеристиками нового состояния игры, достигнутого в конце просмотра нового подхода. Если решено, что новое значение лучше, необходимо запомнить его вместо старого. Пример: </span><a class="rvts28" href="NonlinearTASing.html#LuckManipulation">манипуляция удачей</a><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Когда важных характеристик больше, чем одна, рекомендуется не полагаться на человеческую память.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a name="CompareState-B"></a>
<span class="rvts22">B. На участках средней и высокой сложности, а особенно на гигантских участках (размером с целый уровень игры) используйте Закладки, хранящие альтернативные ответвления мувика. Наилучший вариант прохождения участка сохраняется в один слот, а новый тестируемый вариант сохраняется в другой слот. После этого можно легко переключаться между этими слотами и сравнивать значения каждой характеристики состояния игры. Кроме того, можно наводить курсор мыши на соответствующие Закладки, чтобы видеть скриншоты состояний игры и визуально сравнивать их характеристики с текущим изображением на экране FCEUX.</span></p>
<span class="rvts22">B. На участках средней и высокой сложности, а особенно на гигантских участках (размером с целый уровень игры) используйте Закладки, хранящие альтернативные ответвления мувика. Наилучший подход к прохождению участка сохраняется в один слот, а новый тестируемый подход сохраняется в другой слот. После этого можно легко переключаться между этими слотами и сравнивать значения каждой характеристики состояния игры. Кроме того, можно наводить курсор мыши на соответствующие Закладки, чтобы видеть скриншоты состояний игры и визуально сравнивать их характеристики с текущим изображением на экране FCEUX.</span></p>
<p class="rvps10"><span class="rvts22">Для отображения ячеек памяти на скриншотах рекомендуется использовать Lua-вывод на экран, тогда окно Memory Watch не понадобится, и об оптимальности можно будет успешно судить по одним скриншотам. Подробнее: </span><a class="rvts28" href="ProgramCustomization.html#DisplayBranchScreenshots">Настройка программы</a><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">В ситуации, когда некоторые характеристики в новом варианте оказались лучше, а некоторые хуже, требуется хорошенько взвесить их все (в уме, или используя обобщающую Lua-формулу) и решить, какое состояние игры лучше.</span></p>
<p class="rvps10"><span class="rvts22">При каждом улучшении старого результата новый вариант вручную сохраняется в ту же Закладку, замещая собой наилучший старый вариант.</span></p>
<p class="rvps10"><span class="rvts22">В ситуации, когда некоторые характеристики в новом подходе оказались лучше, а некоторые хуже, требуется хорошенько взвесить их все (в уме, или используя обобщающую Lua-формулу) и решить, какое состояние игры лучше.</span></p>
<p class="rvps10"><span class="rvts22">При каждом улучшении старого результата новый подход вручную сохраняется в ту же Закладку, замещая собой наилучший старый подход.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">После нахождения самого быстрого варианта прохождения участка ТАСер может дополнительно улучшить его, добавив немного развлекательности в игровые события. Критерии оптимальности при этом могут быть самыми разными, но при этом время прохождения участка должно оставаться без изменений.</span></p>
<p class="rvps10"><span class="rvts22">После нахождения самого быстрого подхода к прохождению участка ТАСер может дополнительно улучшить его, добавив немного развлекательности в игровые события. Критерии оптимальности при этом могут быть самыми разными, но при этом время прохождения участка должно оставаться без изменений.</span></p>
<p class="rvps10"><span class="rvts22">А можно отложить процесс облагораживания участка на будущее и сразу перейти к следующему участку.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/help-authoring-tool">Single source CHM, PDF, DOC and HTML Help creation</a></p>
</div>

View File

@ -3,7 +3,7 @@
<head>
<title>TAS Editor изнутри</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("TASEditorInside");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("TASEditorInside");
}
});
</script>
</head>
@ -48,6 +51,7 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">TAS Editor изнутри</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
@ -74,7 +78,8 @@
<p class="rvps12"><span class="rvts25"><br/></span></p>
<p class="rvps12"><span class="rvts25"><br/></span></p>
<p class="rvps12"><span class="rvts25"><br/></span></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/help-authoring-tool">Full featured multi-format Help generator</a></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/help-authoring-tool">Full-featured multi-format Help generator</a></p>
</div>
<div id="topic_footer">

View File

@ -3,7 +3,7 @@
<head>
<title>4. Методология ТАСинга</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("TASingMethodology");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("TASingMethodology");
}
});
</script>
</head>
@ -52,133 +55,147 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">Методология ТАСинга</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Эта глава посвящена центральному занятию в ТАСинге созданию оптимального </span><span class="rvts22">Ввод</span><span class="rvts22">а на отдельно взятом участке мувика. Размер участка может быть любым, критерии и факторы оптимизации могут быть разными, но именно благодаря упорной ручной шлифовке </span><span class="rvts22">Ввод</span><span class="rvts22">а ТАСы выглядят так блестяще.</span></p>
<p class="rvps10"><span class="rvts22">Процесс создания наилучшего </span><span class="rvts22">Ввод</span><span class="rvts22">а на оптимизируемом участке можно представить в виде зацикленного процесса исправления ошибок в предыдущих версиях </span><span class="rvts22">Ввод</span><span class="rvts22">а на этом участке. М</span><span class="rvts22">ы будем называть ошибкой любую нереализованную возможность приблизить ТАС к поставленной цели (к самому быстрому спидрану или самому красивому прохождению). </span><span class="rvts26">Большинство ошибок успешно исправляются многократным осмотром и модификацией участка.</span></p>
<p class="rvps10"><span class="rvts22">Эта глава посвящена центральному занятию в ТАСинге созданию оптимального </span><span class="rvts22">Ввод</span><span class="rvts22">а на отдельно взятом участке мувика. Именно благодаря упорной ручной шлифовке </span><span class="rvts22">Ввод</span><span class="rvts22">а ТАСы выглядят так блестяще. Размер участка может быть любым, критерии и факторы оптимальности могут быть разными, но метод в сущности один и тот же:</span><span class="rvts22"> перепробовать всевозможные подходы и выбрать самый лучший. </span><span class="rvts22">Вопрос только в том, как сделать это с минимальными затратами времени и усилий.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Чтобы исправить ошибку нужно:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps10"><span class="rvts37">Геймеры</span><span class="rvts22"> ошибочно считают, что для создания ТАСа достаточно просто один раз пройти игру, пользуясь сэйвами только в тех случаях, когда совершаются фатальные ошибки, приводящие к невозможности пройти текущий участок (например, смерть персонажа).</span></li>
<li class="rvps10"><span class="rvts37">ТАСеры-новички</span><span class="rvts22"> понимают, что для красивого ТАСа нужно исправлять </span><span class="rvts26">все</span><span class="rvts22"> замеченные ошибки (например, такие мелочи, как спотыкание о порог). Они тоже проходят каждый участок лишь один раз, но затрачивают на прохождение больше времени, чем простые игроки, так как сохраняются и загружают сэйвы гораздо чаще. При ТАСинге простых игр этого может быть достаточно.</span></li>
<li class="rvps10"><span class="rvts37">Опытные ТАСеры</span><span class="rvts22"> знают, что для совершенного ТАСа не достаточно исправления всех замеченных ошибок. Нужно также исправлять незамеченные ошибки. Учитывать неизвестные факторы. Подойти к задаче с неочевидной стороны. Для всего этого они проходят один и тот же участок несколько раз, исправляя все замеченные ошибки и пытаясь как-то не совершить незаметные.</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Нелегко убедить себя тратить время на альтернативные способы прохождения участка, когда он уже пройден, и в нём уже исправлены все явные ошибки. После достижения текущей внутриигровой цели хочется сразу ставить перед собой следующую цель в рамках игры. Однако следует помнить, что цель ТАСера сильно отличается от целей игрока. Поэтому нужно абстрагироваться от правил игры и не отступать от участка, пока не выполнена реальная цель, а не просто мелкая цель игрока.</span></p>
<p class="rvps10"><span class="rvts22">Это вообще самое сложное изобретать новые подходы к решению одной и той же задачи. Главным образом на ум ТАСеру приходит тот же самый подход, который использовал бы в этом месте игры обычный игрок. Поэтому в большинстве случаев вместо революционного пути используется эволюционный. ТАСер производит постепенную модификацию имеющегося базового подхода, то исправляя его ошибки, то проводя эксперименты. В ходе таких вдумчивых модификаций ТАСер пополняет свою базу знаний об игре, и в результате получается Ввод, до которого невозможно было догадаться сразу.</span></p>
<p class="rvps10"><span class="rvts22">Конечно, иногда приходит озарение, и некая революционная идея даёт потрясающие улучшения, превосходящие все выгоды от полировки. Ради таких эмоциональных моментов многие и любят ТАСинг. Только это не отменяет необходимость отшлифовывать новый революционный подход теми же самыми методами, чтобы сделать его ещё ближе к идеалу.</span></p>
<p class="rvps10"><span class="rvts22">Вместо чтения описываемых здесь техник вы можете сразу приступить к реальному ТАСингу, чтобы по завершении нескольких проектов выработать собственную методику. Но, вероятнее всего, через год ТАСинга вы придёте к описываемой здесь схеме работы.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Итак, процесс создания наилучшего </span><span class="rvts22">Ввод</span><span class="rvts22">а на оптимизируемом участке можно условно представить в виде зацикленного процесса исправления ошибок в предыдущих версиях </span><span class="rvts22">Ввод</span><span class="rvts22">а на этом участке. Ошибкой мы называем </span><span class="rvts22">любое отличие текущего Ввода от неизвестного идеального Ввода.</span><span class="rvts22"> В такой постановке вопроса хорошо то, что к совершенному Вводу можно приближаться постепенно, совершая небольшие шаги, которые реально разработать, даже не будучи гением. </span><span class="rvts26">Большинство ошибок успешно исправляются многократным осмотром и модификацией. </span><span class="rvts22">То есть, даже когда у вас нет никаких оригинальных идей, вы можете достигать успехов за счёт упорства. Успехи мотивируют продолжать работу, и это подготавливает почву для прорывных идей.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Чтобы исправить ошибку во Вводе мувика, нужно:</span></p>
<ol style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps10"><span class="rvts22">Осознать факт ошибки.</span></li>
<li class="rvps10"><span class="rvts22">Предположить способ решения.</span></li>
<li class="rvps10"><span class="rvts22">Осуществить навигацию к месту исправления.</span></li>
<li class="rvps10"><span class="rvts22">Внести изменения.</span></li>
<li class="rvps10"><span class="rvts22">Оценить результат и подтвердить факт исправления ошибки.</span></li>
<li class="rvps10"><span class="rvts22">Оценить результат и подтвердить факт исправления.</span></li>
</ol>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts26">1. </span><span class="rvts22">Осознание ошибки при ТАСинге происходит либо во время просмотра мувика в режиме Read-Only, либо прямо во время Записи/редактирования </span><span class="rvts22">Ввод</span><span class="rvts22">а.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts26">1. </span><span class="rvts22">Осознание ошибки происходит либо во время просмотра мувика в режиме Read-Only, либо прямо во время Записи/редактирования </span><span class="rvts22">Ввод</span><span class="rvts22">а.</span></p>
<div class="rvps10"><table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid;">
<tr valign="top">
<td style="border-color: #000000; border-style: solid; height: 15px;"><p class="rvps10"><span class="rvts46">Примечание: </span><span class="rvts47">Зачастую ТАСер вместо обнаружения реальной ошибки только предполагает, что данный участок ещё можно улучшить. Всегда полезно усомниться в идеальности текущего результата и поэкспериментировать с Вводом порой действительно обнаруживаются нереализованные возможности.</span></p>
<td style="border-color: #000000; border-style: solid; height: 15px;"><p class="rvps10"><span class="rvts47">Примечание: </span><span class="rvts48">Зачастую вместо обнаружения осязаемой ошибки ТАСер только предполагает, что данный участок ещё можно улучшить. Всегда полезно усомниться в идеальности текущего результата и поэкспериментировать с Вводом порой действительно обнаруживаются нереализованные возможности.</span></p>
</td>
</tr>
</table>
</div>
<p class="rvps10"><a name="loop"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts26">2. </span><span class="rvts22">Способы решения либо очевидны сразу, либо находятся экспериментальным путём. В редких случаях требуются расчёты и сравнения. В правильно выбранных участках все факторы оптимальности находятся внутри участка. Информация из предыдущих или последующих участков требуется редко.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts26">2. </span><span class="rvts22">Способы решения либо очевидны сразу, либо находятся экспериментальным путём. В редких случаях требуются расчёты и сравнения. В правильно выбранных участках все ключевые факторы оптимальности находятся внутри участка. Информация из предыдущих или последующих участков требуется редко.</span></p>
<div class="rvps10"><table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid;">
<tr valign="top">
<td style="border-color: #000000; border-style: solid; height: 15px;"><p class="rvps10"><span class="rvts46">Примечание: </span><span class="rvts47">Иногда ТАСер исправляет одну ошибку, незаметно создавая другую. В этом случае процесс оптимизации может пойти в неправильном направлении. К счастью, в ТАСинге такие ситуации возникают редко, так как видеоигры гораздо нагляднее и примитивнее реальной жизни, поэтому игроку проще обнаружить все факторы и верный критерий оптимальности. Тасэдитор дополнительно облегчает этот процесс благодаря умной визуализации данных.</span></p>
<td style="border-color: #000000; border-style: solid; height: 15px;"><p class="rvps10"><span class="rvts47">Примечание: </span><span class="rvts48">Иногда, исправляя одну ошибку, мы незаметно создаём другую. В этом случае процесс оптимизации мог бы пойти в неправильном направлении, но, к счастью, в ТАСинге такие ситуации возникают крайне редко, потому что видеоигры гораздо нагляднее и линейнее реальной жизни, поэтому игрок может обнаружить все факторы и верный критерий оптимальности. Тасэдитор дополнительно облегчает этот процесс благодаря визуализации данных.</span></p>
</td>
</tr>
</table>
</div>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts26">3. </span><span class="rvts22">Возможность навигации к месту ошибки является главным отличием ТАСинга от обычных спидранов. Простые игроки тоже могут осознать ошибку и понять способ её исправления, но только ТАСеры всегда возвращаются назад для её коррекции.</span></p>
<p class="rvps10"><span class="rvts22">В традиционном методе ТАСинга навигация к месту ошибки может занимать довольно много времени (несколько секунд). В Тасэдиторе навигация к любому кадру участка занимает менее секунды.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts26">3. </span><span class="rvts22">Возможность навигации к месту ошибки является главным отличием ТАСинга от обычных спидранов. Простые игроки могут осознать ошибку, но только ТАСеры всегда возвращаются назад для её коррекции.</span></p>
<p class="rvps10"><span class="rvts22">В традиционном методе ТАСинга навигация может занимать заметное количество времени и усилий. Тасэдитор же делает навигацию молниеносной..</span></p>
<div class="rvps10"><table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid;">
<tr valign="top">
<td style="border-color: #000000; border-style: solid; height: 15px;"><p class="rvps10"><span class="rvts46">Примечание: </span><span class="rvts47">Иногда место совершения ошибки находится на более раннем участке, а обнаруживается только на текущем. В этом случае нужно выявить участок совершения ошибки и отредактировать его согласно полученной информации от текущего участка. В традиционном методе ТАСинга можно просматривать и редактировать только один и тот же участок. В Тасэдиторе можно редактировать один участок, а просматривать другой.</span></p>
<td style="border-color: #000000; border-style: solid; height: 15px;"><p class="rvps10"><span class="rvts47">Примечание: </span><span class="rvts48">Иногда место совершения ошибки находится на более раннем участке, а обнаруживается только на текущем. В этом случае нужно выявить участок совершения ошибки и отредактировать его согласно полученной информации от проигрываемого участка. И в этом случае скорость навигации ещё более критична.</span></p>
</td>
</tr>
</table>
</div>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts26">4. </span><span class="rvts22">Внесение изменений это воплощение мыслей ТАСера в жизнь. Чем меньше задержка между мыслью и её реализацией, тем лучше.</span></p>
<p class="rvps10"><span class="rvts22">В традиционном методе ТАСинга исправление ошибки длится дольше, так как помимо перезаписи ошибочных кадров требуется ещё перезаписать весь последующий </span><span class="rvts22">Ввод.</span><span class="rvts22"> В Тасэдиторе это обычно не требуется.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts26">4. </span><span class="rvts22">Внесение изменений во Ввод это воплощение мыслей ТАСера в жизнь. Чем меньше задержка между мыслью и её реализацией, тем лучше.</span></p>
<p class="rvps10"><span class="rvts22">В традиционном методе ТАСинга модификация Ввода длится дольше, так как помимо перезаписи ошибочных кадров требуется ещё перезаписать соседние </span><span class="rvts22">кадры.</span><span class="rvts22"> В Тасэдиторе это обычно не требуется.</span></p>
<div class="rvps10"><table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid;">
<tr valign="top">
<td style="border-color: #000000; border-style: solid; height: 15px;"><p class="rvps10"><span class="rvts46">Примечание: </span><span class="rvts47">В действительности, любое изменение Ввода влечёт за собой изменения игрового процесса (поэтому-то Гринзона всегда усекается после кадра, где произошло изменение Ввода). Но в ряде случаев изменения игрового процесса носят незначительный характер, и старый Ввод по-прежнему синхронизируется с изменённым игровым процессом. В других случаях нужна небольшая модификация, но полная переработка Ввода почти никогда не требуется.</span></p>
<td style="border-color: #000000; border-style: solid; height: 15px;"><p class="rvps10"><span class="rvts47">Примечание: </span><span class="rvts48">Так как любое изменение Ввода влечёт за собой изменения игрового процесса, иногда и в Тасэдиторе может потребоваться пересинхронизация Ввода, следующего за местом исправления ошибки.</span></p>
</td>
</tr>
</table>
</div>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts26">5. </span><span class="rvts22">Чтобы увидеть результат, достаточно возобновить просмотр мувика с начала участка или прямо с места исправления ошибки, не перепроверяя предшествующие участки, так как исправление ошибки влияет только на последующие события.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts26">5. </span><span class="rvts22">Чтобы увидеть результат, достаточно возобновить просмотр мувика с начала участка или прямо с кадра исправления ошибки, не перепроверяя предшествующие участки, так как исправление ошибки влияет только на последующие события.</span></p>
<div class="rvps10"><table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid;">
<tr valign="top">
<td style="border-color: #000000; border-style: solid; height: 15px;"><p class="rvps10"><span class="rvts46">Примечание: </span><span class="rvts47">Если вы записываете не спидран, а развлекательный мувик, то после исправления ошибки (например, перемещение спрайта по более плавной траектории) всё-таки желательно просмотреть предшествующие события, чтобы это исправление удачно смотрелось не только в контексте своего участка, но и в общей последовательности игровых событий.</span></p>
<td style="border-color: #000000; border-style: solid; height: 15px;"><p class="rvps10"><span class="rvts47">Примечание: </span><span class="rvts48">Хотя, если вы записываете не спидран, а развлекательный мувик, после исправления ошибки (например, перемещение спрайта по более плавной траектории) всё-таки желательно просмотреть предшествующие события, чтобы это исправление удачно смотрелось не только в контексте своего участка, но и в общей последовательности игровых событий.</span></p>
</td>
</tr>
</table>
</div>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Досмотреть участок требуется до конца, то есть до момента, когда в игре происходит целевое событие, и к нему можно однозначно применить критерий оптимальности. </span><span class="rvts22">После этого ошибка либо считается исправленной/несуществующей, либо требуется вернуться к </span><a class="rvts28" href="TASingMethodology.html#loop">пункту 2</a><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Досмотреть участок требуется до конца, то есть до момента, когда в игре происходит целевое событие, и к нему можно надёжно применить критерий оптимальности. Потому что может оказаться, что это исправление только поначалу кажется выгодным, но в итоге только ухудшает участок.</span></p>
<p class="rvps10"><span class="rvts22">После оценки результата ошибка либо считается исправленной/несуществующей, либо требуется вернуться к </span><a class="rvts28" href="TASingMethodology.html#loop">шагу 2</a><span class="rvts22"> и переобдумать ситуацию.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps10"><a name="linear-tasing"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">До Тасэдитора ошибки в мувике исправлялись с помощью создания и загрузки сэйвов. Если вы не знакомы с этим методом ТАСинга, вот его суть:</span></p>
<p class="rvps10"><span class="rvts22">До Тасэдитора все ошибки (как явные, так и предполагаемые) исправлялись с помощью создания и загрузки сэйвов. Если вы не знакомы с традиционным методом ТАСинга, вот его основные принципы:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps10"><span class="rvts22">Игра всё время стоит на паузе. Пауза отпускается только при просмотре готовых участков.</span></li>
<li class="rvps10"><span class="rvts22">ТАСер поочерёдно впечатывает </span><span class="rvts22">Ввод</span><span class="rvts22"> в кадры, на которые указывает Курсор Проигрывателя. Он видит результат совершённого </span><span class="rvts22">Ввод</span><span class="rvts22">а через 1 кадр после впечатывания (иногда через несколько кадров). Опытный ТАСер после каждого сложновоспроизводимого движения создаёт сэйв, чтобы потом иметь возможность вернуться назад и не переписывать весь участок с начала.</span></li>
<li class="rvps10"><span class="rvts22">Чтобы исправить ошибку, ТАСер возвращается к месту ошибки и переписывает весь </span><span class="rvts22">Ввод</span><span class="rvts22">, начиная с кадра, требующего изменения. Если на этом кадре был сделан сэйв, можно сразу загрузить этот сэйв в режиме Read+Write и начать исправление. Если же имеются только сэйвы перед этим кадром, существует два варианта навигации. Первый вариант: загрузить предшествующий сэйв в режиме Read-Only и покадрово досмотреть мувик до нужного кадра, затем вернуться в режим Записи, тем самым сохранив старый Ввод на промежутке между кадром сэйва и кадром ошибки. Второй вариант: не переключаясь из режима Записи, загрузить ближайший сэйв и по памяти повторить старый Ввод, дойдя до кадра ошибки. Второй вариант используется чаще, потому что после сэйва обычно располагается легковоспроизводимый Ввод (например, простое зажатие </span><span class="rvts32">R + B</span><span class="rvts22">). Опытный ТАСер на всякий случай сразу создаёт на кадре ошибки сэйв, чтобы в следующий раз быстро возвращаться прямо к кадру, не тратя время на навигацию. Такая предусмотрительность имеет смысл, потому что ошибка редко исправляется с первой попытки, обычно требуется многократно переписывать один и тот же кусочек </span><span class="rvts22">Ввод</span><span class="rvts22">а, начиная примерно с одного и того же кадра.</span></li>
<li class="rvps10"><span class="rvts22">Неудобства метода наглядно проявляются, когда нужно увидеть отдалённый результат </span><span class="rvts22">Ввод</span><span class="rvts22">а (например, кнопка выбора была нажата сейчас, а шарик рулетки остановится только через несколько секунд). В таком случае ТАСер делает сэйв перед началом </span><span class="rvts22">Ввод</span><span class="rvts22">а, записывает решающий </span><span class="rvts22">Ввод</span><span class="rvts22"> и делает сэйв после него, а затем отпускает паузу и наспех проходит игру до появления результата. При удовлетворительном результате ТАСер загружает сэйв, идущий после решающего Ввода, и покадрово записывает оптимальное прохождение, уже будучи уверенным в успешном исходе. При неудовлетворительном результате он загружает начальный сэйв, меняет решающий </span><span class="rvts22">Ввод</span><span class="rvts22"> и повторяет все действия снова (создаёт сэйв на конец </span><span class="rvts22">Ввод</span><span class="rvts22">а, отключает паузу и ждёт результата). И так может продолжаться довольно долго, особенно если для просмотра отдалённого результата требуется не просто ждать, а ещё и вводить несущественные для результата нажатия.</span></li>
<li class="rvps10"><span class="rvts22">Чтобы скопировать старый </span><span class="rvts22">Ввод</span><span class="rvts22"> (например, разгон Марио в начале каждого уровня), ТАСер либо зазубривает комбинацию кнопок и каждый раз вбивает её заново, либо копирует кнопочную последовательность с помощью нескольких прыжков (загрузок сэйвов) между местом-источником и местом-приёмником. Игра посылается то на сэйв предыдущего </span><span class="rvts22">Ввод</span><span class="rvts22">а (посмотреть нажатия в режиме Read-Only и запомнить парочку в уме), то на сэйв текущего места записи (переключиться на Read+Write и выложить запомненные нажатия). Если после каждого прыжка пододвигать тот и другой сэйв на пару кадров вперёд, навигация между источником и приёмником </span><span class="rvts22">Ввод</span><span class="rvts22">а будет не очень утомительной. Ну а когда требуется скопировать длинную последовательность нажатий, используется внешний редактор </span><span class="rvts22">Ввод</span><span class="rvts22">а с функциями копипаста. Но переключение между разными программами сильно отвлекает ТАСера, поэтому зачастую проще скопировать </span><span class="rvts22">Ввод</span><span class="rvts22"> вручную.</span></li>
<li class="rvps10"><span class="rvts22">Чтобы посмотреть весь записанный уровень, ТАСер отключает Запись и загружает сэйв, поставленный в начале уровня (обычно для этого используется редкий слот на клавише </span><span class="rvts27">F10</span><span class="rvts22">). Затем он отпускает паузу и смотрит прохождение, как обычный зритель. После окончания просмотра ТАСер возвращается точно к последнему записанному кадру, загрузив его сэйв (обычно это наиболее часто используемый слот, </span><span class="rvts27">F1</span><span class="rvts22">), и начинает записывать новый участок.</span></li>
<li class="rvps10"><span class="rvts22">Таким образом, большинство слотов (из 10 имеющихся) используется для навигации между различными моментами игры. Используя термины Тасэдитора для навигации Курсором Проигрывателя по мувику. В особо напряжённых ситуациях десяти слотов может и не хватить для быстрой телепортации между всеми интересующими местами, но обычно хватает 5-7 штук, которыми опытный ТАСер жонглирует с поразительной скоростью.</span></li>
<li class="rvps10"><span class="rvts22">Парочка оставшихся слотов обычно используется для хранения альтернативных стратегий прохождения. Когда ТАСер заранее не знает, какой из двух вариантов прохождения уровня окажется лучше, он сначала записывает первый вариант, делает сэйв на окончание уровня в отдельный слот, а затем записывает второй вариант, и делает сэйв на окончание уровня в соседний слот. Затем попеременно загружает то один, то другой слот (или поочерёдно просматривает оба варианта мувика) и, выбрав лучший из них, продолжает запись, начиная с конца выбранного варианта, а другой вариант выбрасывается.</span></li>
<li class="rvps10"><span class="rvts22">Эмуляция игры почти всё время стоит на паузе. Пауза отпускается только при просмотре готовых участков.</span></li>
<li class="rvps10"><span class="rvts22">ТАСер последовательно впечатывает </span><span class="rvts22">Ввод</span><span class="rvts22"> в кадры, на которые указывает Курсор Проигрывателя. Он видит результат совершённого </span><span class="rvts22">Ввод</span><span class="rvts22">а на следующий кадр после впечатывания (а иногда через несколько кадров). Опытный ТАСер создаёт новый сэйв после любого </span><span class="rvts31">сложно воспроизводимого действия</span><span class="rvts22">, чтобы иметь возможность быстро возвращаться назад и не переигрывать весь участок с начала.</span></li>
<li class="rvps10"><span class="rvts22">Чтобы исправить ошибку, ТАСер возвращается к предполагаемому месту ошибки и переписывает весь </span><span class="rvts22">Ввод</span><span class="rvts22">, начиная с кадра, требующего изменения. Если на этом кадре был сделан сэйв, можно сразу загрузить этот сэйв в режиме Read+Write и начать впечатывать кнопки. Если же имеются только сэйвы на некотором расстоянии перед этим кадром, существует два варианта. </span><span class="rvts37">Вариант 1:</span><span class="rvts22"> загрузить ближайший сэйв в режиме Read-Only и досмотреть мувик до нужного кадра, затем переключиться обратно в режим Записи и начать исправление, тем самым не затронув Ввод на промежутке между кадром сэйва и кадром ошибки. </span><span class="rvts37">Вариант 2:</span><span class="rvts22"> сразу, не переключаясь из режима Записи, загрузить ближайший сэйв и по памяти повторить старый Ввод, дойдя до кадра ошибки, а затем начать исправление. Второй способ используется чаще, потому что после ближайшего сэйва обычно располагается </span><span class="rvts31">легко воспроизводимый Ввод</span><span class="rvts22"> (например, простое зажатие </span><span class="rvts32">R + B</span><span class="rvts22">). Также, по прибытии на предполагаемый кадр ошибки, опытный ТАСер машинально создаёт сэйв (на всякий случай!), чтобы в следующий раз быстро возвращаться прямо к кадру, не тратя время на навигацию. Такая предусмотрительность имеет смысл, потому что ошибки редко исправляются с первой попытки, обычно требуется многократно переписывать один и тот же кусочек </span><span class="rvts22">Ввод</span><span class="rvts22">а, начиная примерно с одного кадра.</span></li>
<li class="rvps10"><span class="rvts22">Неудобства этого традиционного метода наглядно проявляются, когда нужно увидеть отдалённый результат </span><span class="rvts22">Ввод</span><span class="rvts22">а (например, кнопка выбора была нажата сейчас, а шарик рулетки остановится только через несколько секунд). В таком случае ТАСер делает сэйв перед началом </span><span class="rvts22">Ввода</span><span class="rvts22">, записывает решающий </span><span class="rvts22">Ввод</span><span class="rvts22"> и делает сэйв после него, а затем отпускает паузу и наспех (неоптимально) проходит игру до появления результата. При удовлетворительном результате ТАСер загружает сэйв, идущий после решающего Ввода, и покадрово записывает оптимальное прохождение, уже будучи уверенным в успешном исходе. А при неудовлетворительном результате он загружает начальный сэйв, меняет решающий </span><span class="rvts22">Ввод</span><span class="rvts22"> и повторяет все действия снова (создаёт сэйв после </span><span class="rvts22">Ввод</span><span class="rvts22">а и наспех проходит до результата). И так может продолжаться довольно долго.</span></li>
<li class="rvps10"><span class="rvts22">Чтобы скопировать старый </span><span class="rvts22">Ввод</span><span class="rvts22"> (например, хитроумный разгон Марио в начале каждого уровня), ТАСер либо зазубривает комбинацию кнопок, либо копирует её по частям с помощью нескольких прыжков между местом-источником и местом-приёмником. Игра посылается то на сэйв предыдущего </span><span class="rvts22">Ввод</span><span class="rvts22">а (посмотреть нажатия в режиме Read-Only и запомнить парочку в уме), то на сэйв текущего места записи (переключиться на Read+Write и выложить запомненные нажатия). Если после каждого прыжка пододвигать тот и другой сэйв на пару кадров вперёд, навигация между источником и приёмником </span><span class="rvts22">Ввод</span><span class="rvts22">а будет не очень утомительной. И всё же, когда требуется скопировать длинную последовательность нажатий, используется внешний редактор </span><span class="rvts22">Ввод</span><span class="rvts22">а с функциями копипаста. Но переключение между разными программами сильно отвлекает ТАСера, поэтому зачастую проще скопировать </span><span class="rvts22">Ввод</span><span class="rvts22"> вручную.</span></li>
<li class="rvps23" style="text-indent: 30px"><span class="rvts22">Чтобы осмотреть текущий прогресс, ТАСер сохраняется, отключает Запись и загружает сэйв, оставленный в начале уровня (обычно для этого служит редко используемый слот на клавише </span><span class="rvts27">F10</span><span class="rvts22">). Затем он отпускает паузу и смотрит мувик, словно посторонний зритель. Для продолжения записи он включает режим Read+Write и возвращается точно к последнему записанному кадру, загрузив последний сэйв (обычно это наиболее часто используемый слот, </span><span class="rvts27">F1</span><span class="rvts22">). А если во время просмотра ТАСер принял решение изменить старый Ввод, он делает сэйв на этом месте, переключается на Read+Write и загружает только что созданный сэйв. Предварительно следует убедиться, что последнее актуальное состояние мувика сохранено не только в </span><span class="rvts27">F1</span><span class="rvts22">, но и в другой слот, который вы не будете трогать во время экспериментов со старым Вводом. Это нужно для того, чтобы в случае провала эксперимента можно было восстановить старый мувик, даже если слот </span><span class="rvts27">F1</span><span class="rvts22"> уже затёрт в ходе экспериментов.</span></li>
<li class="rvps10"><span class="rvts22">Таким образом, большинство из имеющихся 10 слотов используется для навигации между различными моментами игры. Используя термины Тасэдитора для навигации Курсором Проигрывателя по мувику. Даже на больших участках десяти слотов должно с лихвой хватить для быстрой телепортации между всеми интересующими местами. Обычно хватает 3-5 слотов, которыми опытный ТАСер жонглирует с поразительной скоростью.</span></li>
<li class="rvps10"><span class="rvts22">Парочка других слотов обычно используется для хранения альтернативных стратегий прохождения. Когда ТАСер заранее не знает, какой подход к прохождению большого участка (например, целого уровня игры) окажется лучше, он сначала отшлифовывает первый подход и сохраняет его в отдельный слот (например, </span><span class="rvts27">F8</span><span class="rvts22">), а затем отшлифовывает второй подход и делает сэйв в соседний слот (например, </span><span class="rvts27">F7</span><span class="rvts22">). Затем попеременно загружает то один, то другой слот (или даже просматривает оба ответвления мувика поочерёдно) и выбирает лучший из них, пересохраняет его в слот </span><span class="rvts27">F1</span><span class="rvts22"> и продолжает работу в этом ответвлении.</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Как видите, почти всё в традиционном методе ТАСинга делается благодаря сэйвам. </span><span class="rvts22">В Тасэдиторе же сэйвы (точнее, пришедшие на их место Закладки) не играют основную роль. Они здесь используются в основном для хранения альтернативных стратегий прохождения, а навигация Курсором Проигрывателя осуществляется либо с помощью перетаскивания, либо с помощью колеса мыши.</span></p>
<p class="rvps10"><span class="rvts22">Более того, при редактировании Ввода Тасэдитор делает упор на навигацию без Курсора Проигрывателя. Чтобы исправить ошибку, не обязательно возвращать саму игру к кадру с ошибкой, можно пролистать Piano Roll к этому месту и изменить </span><span class="rvts22">Ввод</span><span class="rvts22"> мышкой.</span></p>
<p class="rvps10"><span class="rvts22">Как видите, почти всё в традиционном методе ТАСинга делается благодаря сэйвам (Закладкам). </span><span class="rvts22">В Тасэдиторе они частично заменены Гринзоной и Журналом Истории, но и здесь они по-прежнему играют немаловажную роль, в основном для хранения альтернативных ответвлений. Навигацию Курсором Проигрывателя теперь быстрее осуществлять либо перетаскиванием, либо с помощью колеса мыши. </span><span class="rvts22">Более того, при редактировании Ввода теперь вообще не требуется возвращать Курсор Проигрывателя к кадру исправления, достаточно проскроллировать Piano Roll к этому месту и изменить </span><span class="rvts22">Ввод</span><span class="rvts22"> мышкой.</span></p>
<p class="rvps10"><span class="rvts22">Так как вместо Записи в Тасэдиторе эффективнее использовать редактирование, отпадает необходимость постоянно переключать режимы. Теперь эмулятор всё время находится в режиме Read-Only.</span></p>
<p class="rvps10"><span class="rvts22">Игра по-прежнему всё время стоит на паузе, но ТАСер теперь видит результат своего </span><span class="rvts22">Ввод</span><span class="rvts22">а не всегда, а только когда пожелает. Поначалу это может показаться неудобством (отсутствует привычная отдача от вводимых нажатий), но на самом деле в этом скрывается большой плюс Тасэдитора независимость пользователя от игры. Вместо механизма стандартной геймерской отдачи задействуются другие механизмы передачи информации. ТАСер всё равно получает все необходимые сведения о том, как игра воспринимает его </span><span class="rvts22">Ввод</span><span class="rvts22">, но информационный поток не вливается в него постоянно, а выдаётся по команде.</span></p>
<p class="rvps10"><span class="rvts22">Ну а при необходимости можно получить в Тасэдиторе многократно усиленную "отдачу" для этого нужно использовать третий метод ТАСинга.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Игра по-прежнему всё время стоит на паузе, но ТАСер теперь видит результат своего </span><span class="rvts22">Ввод</span><span class="rvts22">а не всегда, а только когда пожелает. Поначалу это может показаться неудобством (отсутствует привычная отдача от совершаемых нажатий), но на самом деле в этом скрывается большой плюс более высокий уровень независимости игрока от игры. Вместо механизма стандартной "вовлечённости в игровой процесс" задействуются другие механизмы передачи информации. Так что вы всё равно получите все необходимые сведения о том, как игра воспринимает ваши изменения </span><span class="rvts22">Ввода, просто этот</span><span class="rvts22"> информационный поток не будет вливаться в вас постоянно, а будет доставляться по команде.</span></p>
<p class="rvps10"><span class="rvts22">Ну а при необходимости можно получить в Тасэдиторе многократно усиленную отдачу. Для этого нужно использовать третий метод ТАСинга.</span></p>
<p class="rvps10"><span class="rvts22">Рассмотрим преимущества и недостатки всех трёх методов по порядку.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<div class="rvps10"><table width="100%" border="1" cellpadding="1" cellspacing="2" style="border-color: #000000; border-style: solid;">
<tr valign="top">
<td style="border-color: #000000; border-style: solid; height: 39px;"><p class="rvps10"><span class="rvts23"><br/></span></p>
<p class="rvps10"><span class="rvts23">Три метода ТАСинга в Тасэдиторе:</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 0px; margin-left: 50px; list-style-position: outside;">
<li class="rvps15" style="text-indent: 0px"><a class="rvts48" href="TraditionalTASing.html">Традиционный метод</a></li>
<li class="rvps14" style="text-indent: 0px"><a class="rvts49" href="TraditionalTASing.html">Традиционный метод</a></li>
</ul>
<ul style="text-indent: 0px; margin-left: 55px; list-style-position: outside;">
<li class="rvps15" style="text-indent: 0px"><span class="rvts22">навигация по участку Курсором Проигрывателя через прыжки по Закладкам</span></li>
<li class="rvps15" style="text-indent: 0px"><span class="rvts22">запись последовательностей с клавиатуры/джойстика</span></li>
<li class="rvps15" style="text-indent: 0px"><span class="rvts22">автоматический просмотр промежуточных результатов Ввода</span></li>
<li class="rvps14" style="text-indent: 0px"><span class="rvts22">навигация по Вводу Курсором Проигрывателя через прыжки по Закладкам</span></li>
<li class="rvps14" style="text-indent: 0px"><span class="rvts22">запись последовательностей </span><span class="rvts22">Ввода</span><span class="rvts22"> с клавиатуры/джойстика</span></li>
<li class="rvps14" style="text-indent: 0px"><span class="rvts22">автоматический просмотр промежуточных результатов </span><span class="rvts22">Ввода</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 0px; margin-left: 50px; list-style-position: outside;">
<li class="rvps15" style="text-indent: 0px"><a class="rvts49" href="NonlinearTASing.html">Нелинейный метод</a></li>
<li class="rvps14" style="text-indent: 0px"><a class="rvts50" href="NonlinearTASing.html">Нелинейный метод</a></li>
</ul>
<ul style="text-indent: 0px; margin-left: 55px; list-style-position: outside;">
<li class="rvps15" style="text-indent: 0px"><span class="rvts22">навигация </span><span class="rvts22">по участку </span><span class="rvts22">мышкой и Курсором Выделения</span></li>
<li class="rvps15" style="text-indent: 0px"><span class="rvts22">редактирование </span><span class="rvts22">Ввод</span><span class="rvts22">а мышкой/клавиатурой/джойстиком</span></li>
<li class="rvps15" style="text-indent: 0px"><span class="rvts22">по команде пользователя: просмотр промежуточных или итоговых результатов </span><span class="rvts22">Ввода</span></li>
<li class="rvps14" style="text-indent: 0px"><span class="rvts22">навигация </span><span class="rvts22">по Вводу </span><span class="rvts22">мышкой</span></li>
<li class="rvps14" style="text-indent: 0px"><span class="rvts22">редактирование Ввода мышкой/клавиатурой/джойстиком</span></li>
<li class="rvps14" style="text-indent: 0px"><span class="rvts22">по команде пользователя: просмотр промежуточных или итоговых результатов </span><span class="rvts22">Ввода</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 0px; margin-left: 50px; list-style-position: outside;">
<li class="rvps15" style="text-indent: 0px"><a class="rvts50" href="SemiautomaticTASing.html">Полуавтоматический метод</a></li>
<li class="rvps14" style="text-indent: 0px"><a class="rvts51" href="SemiautomaticTASing.html">Полуавтоматический метод</a></li>
</ul>
<ul style="text-indent: 0px; margin-left: 55px; list-style-position: outside;">
<li class="rvps15" style="text-indent: 0px"><span class="rvts22">навигация </span><span class="rvts22">по участку </span><span class="rvts22">мышкой и Курсором Выделения</span></li>
<li class="rvps15" style="text-indent: 0px"><span class="rvts22">редактирование </span><span class="rvts22">Ввод</span><span class="rvts22">а мышкой/клавиатурой/джойстиком</span></li>
<li class="rvps15" style="text-indent: 0px"><span class="rvts22">автоматический просмотр промежуточных или итоговых результатов </span><span class="rvts22">Ввода</span></li>
<li class="rvps14" style="text-indent: 0px"><span class="rvts22">навигация </span><span class="rvts22">по Вводу </span><span class="rvts22">мышкой</span></li>
<li class="rvps14" style="text-indent: 0px"><span class="rvts22">редактирование </span><span class="rvts22">Ввода</span><span class="rvts22"> мышкой/клавиатурой/джойстиком</span></li>
<li class="rvps14" style="text-indent: 0px"><span class="rvts22">автоматический просмотр промежуточных или итоговых результатов </span><span class="rvts22">Ввода</span></li>
</ul>
<p class="rvps14"><span class="rvts22"><br/></span></p>
</td>
</tr>
</table>
</div>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/feature-tour">Easily create Web Help sites</a></p>
</div>

View File

@ -3,7 +3,7 @@
<head>
<title>3. Процесс ТАСинга</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("TASingProcess");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("TASingProcess");
}
});
</script>
</head>
@ -52,75 +55,104 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">Процесс ТАСинга</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Суть ТАСинга в стремлении к абсолютному идеалу. Применив научный подход к прохождению видеоигр, можно увидеть в них не просто мимолётное развлечение, а сложную и интересную оптимизационную задачу.</span></p>
<p class="rvps10"><span class="rvts22">Для решения комплексных задач требуется проявлять не только изобретательность, но и методичность.</span></p>
<p class="rvps10"><span class="rvts22">Чтобы создать идеальное (или близкое к идеалу) прохождение игры, нужно сначала записать неидеальное прохождение, а затем заняться последовательным улучшением его отдельно взятых частей. Когда каждый фрагмент мувика является идеальным, можно говорить об идеальности всего ТАСа.</span></p>
<p class="rvps10"><span class="rvts22">Концентрация усилий на небольших участках мувика это ключ к успеху. Каждый рабочий участок должен быть достаточно большим, чтобы представлять из себя полноценную подзадачу, и при этом &nbsp;достаточно маленьким, чтобы эту задачу было легко решать.</span></p>
<p class="rvps10"><span class="rvts22">Без такой структуризации эффективный и комфортный ТАСинг невозможен. Слишком много факторов влияют на конечный результат, и какие-то из этих факторов дополняются или противоречат друг другу. Памяти человека не хватает, чтобы удержать в голове и просчитать все взаимосвязи игровых факторов на большом отрезке прохождения, а также найти оптимальную комбинацию этих факторов. Так что во время длительных игровых сессий у ТАСера, как и у обычного игрока, возникает естественный соблазн взять первые попавшиеся наблюдения в качестве основы для формирования решений. Обычному игроку такая беспечность сходит с рук, но ТАСер в итоге получит далёкое от идеала прохождение.</span></p>
<p class="rvps10"><span class="rvts22">Поэтому в реальном ТАСинге участки должны быть маленькими. Весь процесс ТАСинга можно представить таким образом: сидит человек, смотрит своё тестовое прохождение, намечает в нём небольшой кусочек и бросает все силы на его улучшение, затем намечает следующий, и так до конца игры.</span></p>
<p class="rvps10"><span class="rvts22">Конечно, это утрированная картина, ведь помимо непосредственно обработки мувика ТАСер ещё занимается предварительными исследованиями и экспериментами с игрой (для выявления скрытых факторов). Но это уже не имеет отношения к Тасэдитору.</span></p>
<p class="rvps10"><span class="rvts22">Умение интуитивно выбирать участки отличает опытного ТАСера от новичка. Многие ТАСеры даже не задумываются, чем они руководствуются, когда спонтанно акцентируют своё внимание на некоем участке </span><span class="rvts22">Ввод</span><span class="rvts22">а, подсознательно ограничивая начало и конец текущего этапа работ. Некоторые даже полагают, что просто записывают мувик кадр за кадром подряд, не замечая, что в основном работают в рамках "окна" размером в 20-200 кадров, и это окно передвигается вперёд по мувику не плавно, а прыжками (конец предыдущего участка зачастую становится началом следующего).</span></p>
<p class="rvps10"><span class="rvts22">Сейчас мы попробуем проанализировать этот навык, чтобы научиться осмысленнно определять границы текущего участка в каждом конкретном случае. А потом уже практика ТАСинга научит вас определять их машинально.</span></p>
<p class="rvps10"><span class="rvts22">Суть ТАСинга в стремлении к абсолютному совершенству. ТАСеры видят в прохождении видеоигр не просто развлечение, а сложную и интересную оптимизационную задачу.</span></p>
<p class="rvps10"><span class="rvts22">Людям нравится решать творческие задачи, так как это позволяет им выразить свою индивидуальность и усовершенствовать различные навыки. Однако в сложных задачах требуется проявлять не только изобретательность, но и методичность. В данном Руководстве описывается сухой и методичный аспект ТАСинга, а изобретательность вы должны будете проявить самостоятельно в реальной рабочей обстановке.</span></p>
<p class="rvps10"><span class="rvts22">В общем случае, чтобы создать совершенное (или очень близкое к идеалу) прохождение игры, нужно сначала записать несовершенное прохождение, а затем заняться последовательным улучшением его отдельно взятых частей. Когда каждый фрагмент мувика является идеальным, можно говорить об идеальности всего ТАСа.</span></p>
<p class="rvps10"><span class="rvts22">Концентрация усилий на небольших участках мувика это ключ к успеху. Каждый рабочий участок должен быть достаточно большим, чтобы представлять из себя адекватную подзадачу, и при этом &nbsp;достаточно маленьким, чтобы эту задачу было легко решать.</span></p>
<p class="rvps10"><span class="rvts22">Без такой структуризации эффективный и комфортный ТАСинг невозможен. Слишком много факторов влияют на конечный результат игры, и какие-то из этих факторов дополняются или противоречат друг другу. Памяти человека не хватает, чтобы удержать в голове и просчитать все взаимосвязи игровых факторов на большом отрезке прохождения. Так что во время длительных игровых сессий у ТАСера, как и у обычного игрока, возникает естественный соблазн взять первые попавшиеся наблюдения в качестве основы для формирования решений. Обычному игроку такая беспечность сходит с рук, но ТАСер в итоге получит далёкое от идеала прохождение.</span></p>
<p class="rvps10"><span class="rvts22">Поэтому в реальном ТАСинге участки должны быть маленькими. Намного меньше, чем размеры одного уровня типовой видеоигры. Весь процесс ТАСинга можно представить таким образом: человек смотрит запись своего незавершённого прохождения игры, намечает небольшой кусочек мувика и бросает все силы на его улучшение, затем намечает другой кусочек, и так до конца игры.</span></p>
<p class="rvps10"><span class="rvts22">Конечно, это неполная картина, ведь помимо непосредственно обработки мувика ТАСеры ещё занимаются исследованиями и экспериментами с игрой (для выявления скрытых факторов), и многим другим. Но это уже выходит за рамки данного Курса.</span></p>
<p class="rvps10"><span class="rvts22">Умение выбирать адекватные участки приходит с опытом. Многие ТАСеры даже не задумываются, чем они руководствуются, когда спонтанно акцентируют своё внимание на некоем участке игры, подсознательно ограничивая начало и конец текущего этапа работ. Некоторые полагают, что просто записывают мувик кадр за кадром подряд, но если посмотреть на это со стороны, можно заметить, что посторяющиеся перезаписи происходят в рамках окна размером в 20-200 кадров, и это окно передвигается вперёд по мувику не плавно, а прыжками (конец предыдущего участка зачастую становится началом следующего). Можете посмотреть видеозаписи ТАСинга вживую, и вы заметите определённую закономерность в обращении с сэйвами.</span></p>
<p class="rvps10"><span class="rvts22">Сейчас мы попробуем проанализировать это поведение, чтобы научиться осмысленнно определять границы текущего участка. А потом уже практика ТАСинга научит вас делать это машинально.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Правильно выбранный участок (подзадача) должен давать ТАСеру чёткую непротиворечивую </span><span class="rvts26">цель</span><span class="rvts22"> и простые однозначные </span><span class="rvts26">средства</span><span class="rvts22"> для её достижения.</span></p>
<p class="rvps10"><span class="rvts26">Цель</span><span class="rvts22"> прохождения любого участка игры это достижение определённого события. Например, целью прохождения всей игры является появление на экране надписи THE END. Целью прохождения одного уровня может быть событие "изменился счётчик уровней в оперативной памяти приставки" или "потемнел экран в конце текущего уровня". А целью небольшого участка может быть даже просто событие типа "персонаж приземлился по ту сторону ямы". Эти промежуточные цели определяются ситуацией в игре на данном участке мувика.</span></p>
<p class="rvps10"><span class="rvts22">Исходя из цели ТАСер формулирует в уме </span><span class="rvts26">критерий оптимальности</span><span class="rvts22"> правило, по которому он сможет сравнивать любые два способа прохождения участка игры. При ТАСинге недостаточно просто достигнуть цели, нужно перепробовать множество разных вариантов её достижения и выбрать из них самый лучший, используя некий критерий. Например, в спидране обычно лучшим вариантом прохождения участка считается тот вариант, в котором целевое событие наступает раньше. То есть, если в первом варианте прохождения участка целевое событие начинается на кадре 350, а во втором на кадре 340, то второй вариант лучше первого, и в финальном мувике должен остаться именно он.</span></p>
<p class="rvps10"><span class="rvts26">Средств</span><span class="rvts22"> достижения целевого события у игрока очень много. Теоретически, любой аспект геймплея (в том числе не учтённый разработчиками) может помочь или помешать ТАСеру. Чтобы не запутаться в этом многообразии, надо рассматривать все игровые возможности в виде </span><span class="rvts26">факторов оптимальности</span><span class="rvts22">. Фактор оптимальности это любой игровой аспект, который напрямую влияет на оптимальность прохождения участка.</span></p>
<p class="rvps10"><span class="rvts22">При такой постановке вопроса сразу отпадает множество неактуальных на данном участке возможностей. Например, обычный игрок может переждать врага в укрытии, но в спидране такая возможность даже не рассматривается. В результате у ТАСера остаётся ограниченный набор полезных действий и игровых индикаторов, за которыми требуется следить. И чем меньше участок, тем более ограничен и понятен этот набор, а значит, тем легче перебрать сочетания факторов и найти идеальную комбинацию действий.</span></p>
<p class="rvps10"><span class="rvts22">С другой стороны, чем меньше участок, тем менее его цель пересекается с финальной целью ТАСа. Финальная цель у ТАСера одна сделать идеальное прохождение, например, самое быстрое в мире (то есть счётчик кадров в момент окончания мувика должен иметь минимально возможное значение). Но в рамках каждого конкретного участка цель может быть другой, иногда даже противоположной по звучанию (например, продержаться как можно дольше в бонус-уровне, за счёт чего потом будет сэкономлено время в другом месте). Поэтому для совсем мелких участков критерий оптимальности обычно не применяется, и эти микро-участки оцениваются только в составе более крупного участка.</span></p>
<p class="rvps10"><span class="rvts22">Например, если во время перепрыгивания ямы вам необходимо отстреливаться от врагов, в принципе, можно рассматривать каждую выпущенную пулю в виде подучастка (чтобы изолировать и обдумать такие факторы как "таймер перезарядки", "максимум 3 пули на экране" и т.д.). Но сравнивать потом нужно будет именно варианты перепрыгивания через яму, в составе которых находятся подучастки с выстрелами. Даже если в первом варианте перепрыгивания (который заканчивается на кадре 350) вы подстрелили двух врагов, а во втором (заканчивается на 340) застрелили только одного, выбирать следует второй участок, так как его критерий оптимальности более соответствует финальной цели спидрана.</span></p>
<p class="rvps10"><span class="rvts22">Правильно выбранный участок (подзадача) должен давать ТАСеру чёткую непротиворечивую </span><span class="rvts22">цель</span><span class="rvts22"> и простые </span><span class="rvts22">средства</span><span class="rvts22"> для её достижения.</span></p>
<p class="rvps10"><span class="rvts26">Цель</span><span class="rvts22"> прохождения участка это обычно достижение определённого игрового события. Например, целью прохождения всей игры является появление на экране надписи "THE END". Целью прохождения одного уровня может быть событие "увеличилось значение счётчика уровней в оперативной памяти приставки" или же просто "потемнел экран в конце текущего уровня". А целью небольшого участка может быть даже просто событие типа "персонаж благополучно приземлился по ту сторону ямы". Эти промежуточные цели определяются контекстом.</span></p>
<p class="rvps10"><span class="rvts22">Исходя из цели ТАСер формулирует в уме </span><span class="rvts26">критерий оптимальности</span><span class="rvts22"> правило, по которому он сможет сравнивать любые два &nbsp;прохождения текущего участка игры. При ТАСинге недостаточно просто достигнуть цели, нужно перепробовать множество разных подходов к её достижению и в итоге выбрать из них самый лучший. Например, в спидране лучшим подходом к прохождению участка обычно считается тот, в котором целевое событие наступает раньше. То есть, если в первом подходе к прохождению участка целевое событие достигается на кадре 350, а во втором на кадре 340, то второй подход лучше первого, и в финальном мувике должен остаться именно он.</span></p>
<p class="rvps10"><span class="rvts26">Средств</span><span class="rvts22"> достижения целевого события у игрока очень много. Теоретически, любой аспект геймплея (в том числе не учтённый разработчиками) может каким-то образом помочь или помешать прогрессу. Поэтому, чтобы не запутаться в этом смутном многообразии возможностей, надо рассматривать все игровые аспекты в виде </span><span class="rvts22">факторов оптимальности</span><span class="rvts22">.</span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/smb-zigzag.png"/></p>
<p class="rvps10"><span class="rvts26">Фактор оптимальности</span><span class="rvts22"> это игровой аспект, который напрямую влияет на оптимальность прохождения участка. Слово "напрямую" подразумевает монотонную зависимость результата от степени применения фактора. Например, на этой картинке не существует монотонной зависимости между расстоянием до финиша и тем, как долго игрок держит кнопку </span><span class="rvts32">Вправо</span><span class="rvts22">. Ведь нажатие этой кнопки то помогает Марио приблизиться к финишу, то мешает, в зависимости от его текущего положения.</span></p>
<p class="rvps10"><span class="rvts22">Когда люди воспринимают такой участок целиком, им сложнее догадаться, в какой момент лучше всего отпускать кнопку </span><span class="rvts32">R</span><span class="rvts22">, когда нажимать </span><span class="rvts32">L</span><span class="rvts22"> и т.д. Чтобы упростить понимание комплексных зависимостей (и таким образом выявить факторы), подобные участки следует разбивать на несколько подучастков.</span></p>
<p class="rvps10"><span class="rvts22">При правильной постановке вопроса обычно сразу отпадает множество неактуальных возможностей. Например, обычный игрок может переждать, пока сильный враг сам уйдёт с дороги, но в спидране такая тактика не рассматривается.</span></p>
<p class="rvps10"><span class="rvts22">В результате у ТАСера остаётся ограниченный набор полезных действий и игровых индикаторов, за которыми требуется следить во время шлифовки одного участка. И чем меньше участок, тем ограниченнее и понятнее этот набор, а значит, тем легче перебрать сочетания факторов и найти идеальную последовательность действий.</span></p>
<p class="rvps10"><span class="rvts22">С другой стороны, чем меньше участок, тем менее его цель пересекается с финальной целью ТАСа. Финальная цель у ТАСера одна сделать идеальное прохождение, например, самое быстрое в мире (то есть счётчик кадров в момент окончания мувика должен иметь минимально возможное значение). Но в рамках каждого конкретного участка цель может быть совершенно другой, иногда даже противоположной (например, продержаться как можно дольше в бонус-уровне, за счёт чего потом будет сэкономлено время в другом месте). Поэтому для совсем мелких участков критерий оптимальности обычно не играет роли, и прохождение такого микро-участка оценивается только в составе прохождения полноценного участка.</span></p>
<p class="rvps10"><span class="rvts22">Например, если во время перепрыгивания ямы вам необходимо отстреливаться от врагов, в принципе, можно рассматривать каждую выпущенную пулю в виде отдельного подучастка (чтобы изолировать и обдумать такие факторы как "таймер перезарядки", "максимум 3 пули на экране" и т.д.). Но сравнивать потом нужно будет именно версии перепрыгивания через яму. Даже если в первом подходе к перепрыгиванию (который заканчивается на кадре 350) вы подстрелили двух врагов, а во втором (заканчивается на 340) застрелили только одного, выбирать следует второй подход, так как критерий оптимальности составного участка более соответствует финальной цели спидрана.</span></p>
<p class="rvps10"><span class="rvts22">Во время ТАСинга приходится поддерживать оптимальный баланс между необходимостью уменьшать участки ради поиска факторов и необходимостью увеличивать их ради адекватности критерия. Это умение приходит с опытом, так что можно просто положиться на интуицию и не заморачиваться.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Возьмём пример со слишком большим участком. В спидране Super Mario Bros требуется максимально быстро добраться от начала до конца World 1-1, то есть нужно максимизировать координату X персонажа, который перемещается слева направо. В начале уровня координата Марио равна нулю, а в конце уровня, допустим, равна тысяче. С помощью кнопок джойстика можно по-разному влиять на эту координату.</span></p>
<p class="rvps10"><span class="rvts22">Если в качестве оптимизируемого участка выбрать весь уровень от момента с </span><span class="rvts37">X = 0</span><span class="rvts22"> до события </span><span class="rvts37">X = 1000</span><span class="rvts22">, то у нас появляется однозначный критерий оптимальности при записи и оценке вариантов прохождения участка самым лучшим вариантом будет мувик с минимальным значением счётчика кадров на момент </span><span class="rvts37">X = 1000</span><span class="rvts22">. Итак, у нас есть критерий, но нет факторов. Как именно нужно нажимать кнопки, чтобы получить </span><span class="rvts37">X = 1000</span><span class="rvts22"> за наименьшее количество кадров? Здесь человек подключает логику и интуицию. При нажатии кнопки </span><span class="rvts32">R</span><span class="rvts22"> координата X обычно возрастает, а при нажатии </span><span class="rvts32">L</span><span class="rvts22"> убывает. И вот, самое очевидное решение зажать кнопку </span><span class="rvts32">R</span><span class="rvts22"> и узнать, через сколько кадров значение X дорастёт до тысячи. Однако при просмотре такого варианта в эмуляторе оказывается, что Марио упирается в препятствия, и координата X не растёт, хотя кнопка </span><span class="rvts32">R</span><span class="rvts22"> зажата. Тем самым обнаруживается новый фактор необходимость перепрыгивать препятствия и ямы. В результате применения кнопки </span><span class="rvts32">A</span><span class="rvts22"> персонаж вскоре достигает момента с </span><span class="rvts37">X = 1000</span><span class="rvts22">, и при этом по критерию оптимальности сразу отсеялись все варианты прохождения, где нажатия кнопки </span><span class="rvts32">A</span><span class="rvts22"> были менее своевременными (например, там, где Марио спотыкался о края труб, счётчик кадров в конце участка был больше).</span></p>
<p class="rvps10"><span class="rvts22">Тут игрок может посчитать, что учёл все факторы оптимальности, и что участок пройден идеально. Однако это не так. В Super Mario Bros довольно сложный физический движок. На координату X влияет текущее значение скорости, а на значение скорости влияет ускорение. На ускорение влияет кнопка </span><span class="rvts32">B</span><span class="rvts22"> и положение Марио в воздухе или на земле. Также существуют трубы-телепорты и полезные баги игры, вроде "flagpole glitch" и т.д. А в рабочей памяти человека может одновременно храниться лишь </span><a class="rvts28" href="http://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%BE_%D1%81%D0%B5%D0%BC%D1%8C_%D0%BF%D0%BB%D1%8E%D1%81-%D0%BC%D0%B8%D0%BD%D1%83%D1%81_%D0%B4%D0%B2%D0%B0" target="_blank">около 7 объектов</a><span class="rvts22">, поэтому часть факторов обязательно ускользнёт от вас во время редактирования </span><span class="rvts22">Ввод</span><span class="rvts22">а. Необходимо уменьшить участок до масштаба, при котором факторы проявляются по отдельности, или хотя бы небольшой группой.</span></p>
<p class="rvps10"><span class="rvts22">Сосредоточимся на участке от </span><span class="rvts37">X = 0</span><span class="rvts22"> до </span><span class="rvts37">X = 50</span><span class="rvts22">, критерий оптимальности тот же.</span><span class="rvts22"> Здесь уже становится заметно, что в первой половине участка Марио почему-то бежит медленнее, чем во второй, причём во второй половине он бежит всё время с одинаковой скоростью, которую можно принять за максимально возможную. Таким образом проявляется фактор ускорения, и ТАСер начинает думать, как бы на него повлиять. Благодаря экспериментам с прыжками он может обнаружить различие значений ускорения в воздухе и на земле. Таким образом проявляется ещё один фактор.</span></p>
<p class="rvps10"><span class="rvts22"> В результате по текущему критерию оптимальности к моменту с </span><span class="rvts37">X = 50</span><span class="rvts22"> быстрее приходит тот вариант мувика, где ТАСер в начале уровня создал сложную комбинацию из нажатий и отпусканий кнопок </span><span class="rvts32">R</span><span class="rvts22">, </span><span class="rvts32">B</span><span class="rvts22"> и </span><span class="rvts32">A</span><span class="rvts22">, а не просто зажал </span><span class="rvts32">R</span><span class="rvts22"> и </span><span class="rvts32">B</span><span class="rvts22">. И это прохождение уже гораздо ближе к идеалу, после этого можно на какое-то время успокоиться и взяться за следующий участок (от </span><span class="rvts37">X = 50</span><span class="rvts22"> до </span><span class="rvts37">первого препятствия)</span><span class="rvts22">.</span></p>
<div class="rvps10"><table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid;">
<tr valign="top">
<td valign="top" style="border-color: #000000; border-style: solid; height: 160px;"><p class="rvps10"><span class="rvts22">Возьмём пример со слишком большим участком. В спидране Super Mario Bros требуется максимально быстро добраться от начала до конца World 1-1, то есть нужно максимизировать координату X персонажа, который перемещается слева направо. Допустим, в начале уровня координата Марио равна нулю, а в конце уровня равна тысяче. С помощью кнопок джойстика можно по-разному влиять на эту координату.</span></p>
<p class="rvps10"><span class="rvts22">Если в качестве оптимизируемого участка выбрать весь уровень от момента с </span><span class="rvts37">X = 0</span><span class="rvts22"> до события </span><span class="rvts37">X = 1000</span><span class="rvts22">, то у нас есть однозначный критерий оптимальности (самым лучшим подходом будет мувик с минимальным значением счётчика кадров на момент </span><span class="rvts37">X &gt;= 1000</span><span class="rvts22">), но нет однозначных факторов. Как именно нужно нажимать кнопки, чтобы получить </span><span class="rvts37">X = 1000</span><span class="rvts22"> за наименьшее количество кадров? &nbsp;Можно применить логику и интуицию обычного игрока. При нажатии кнопки </span><span class="rvts32">R</span><span class="rvts22"> координата X обычно возрастает, а при нажатии </span><span class="rvts32">L</span><span class="rvts22"> убывает. Самое очевидное решение зажать кнопку </span><span class="rvts32">R</span><span class="rvts22"> и узнать, через сколько кадров значение X дорастёт до тысячи. При тестировании такого подхода в эмуляторе оказывается, что Марио упирается в препятствия, и координата X не растёт, хотя кнопка </span><span class="rvts32">R</span><span class="rvts22"> зажата. Тем самым обнаруживается новый фактор необходимость перепрыгивать препятствия и ямы. В результате применения кнопки </span><span class="rvts32">A</span><span class="rvts22"> Марио в итоге достигает момента с </span><span class="rvts37">X = 1000</span><span class="rvts22">, при этом по критерию оптимальности можно отсеять все подходы, где нажатия кнопки </span><span class="rvts32">A</span><span class="rvts22"> были несвоевременными (например, там, где Марио спотыкался о края труб, счётчик кадров в конце участка был больше).</span></p>
<p class="rvps10"><span class="rvts22">Тут игрок (точнее, ТАСер, застрявший в образе мышления игрока) может посчитать, что учёл все факторы оптимальности, и что участок пройден идеально. Однако это не так. В Super Mario Bros непростой физический движок. На координату X влияет текущее значение скорости, а на значение скорости влияет ускорение. На ускорение влияет кнопка </span><span class="rvts32">B</span><span class="rvts22">, буксование, направление и положение Марио в воздухе или на земле. Также существуют трубы-телепорты и полезные баги игры, вроде "flagpole glitch" и т.д. Много всего. А в рабочей памяти человека может одновременно храниться лишь </span><a class="rvts28" href="http://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%BE_%D1%81%D0%B5%D0%BC%D1%8C_%D0%BF%D0%BB%D1%8E%D1%81-%D0%BC%D0%B8%D0%BD%D1%83%D1%81_%D0%B4%D0%B2%D0%B0" target="_blank">около 7 объектов</a><span class="rvts22">, поэтому часть факторов непременно ускользает от вас во время редактирования </span><span class="rvts22">Ввода на большом участке</span><span class="rvts22">. Необходимо уменьшить участок до масштаба, при котором факторы проявляются по отдельности, или хотя бы небольшой группой.</span></p>
<p class="rvps10"><span class="rvts22">Например, если сосредоточиться на участке от </span><span class="rvts37">X = 0</span><span class="rvts22"> до </span><span class="rvts37">X = 100</span><span class="rvts22">, критерий оптимальности останется тем же. Зато з</span><span class="rvts22">десь уже становится заметно, что в первой половине участка Марио бежит медленнее, чем во второй, причём во второй половине он бежит всё время с одинаковой скоростью, которую можно принять за максимальную. Таким образом проявляется фактор ускорения, ТАСер добавляет эту ячейку RAM в просмотрщик памяти и начинает думать, как бы на повлиять на ускорение. Благодаря экспериментам с поворотами и прыжками он может обнаружить новые факторы. В результате по текущему критерию оптимальности к моменту с </span><span class="rvts37">X = 100</span><span class="rvts22"> быстрее приходит тот подход, где ТАСер в начале уровня создал сложную комбинацию из нажатий и отпусканий кнопок </span><span class="rvts32">R</span><span class="rvts22">, </span><span class="rvts32">L</span><span class="rvts22">, </span><span class="rvts32">B</span><span class="rvts22"> и </span><span class="rvts32">A</span><span class="rvts22">, а не просто зажал </span><span class="rvts32">R</span><span class="rvts22"> и </span><span class="rvts32">B</span><span class="rvts22">. И даже если новое прохождение участка быстрее старого всего на несколько кадров, оно намного ближе к совершенству.</span></p>
</td>
</tr>
</table>
</div>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Теперь рассмотрим другую крайность ТАСер выбирает очень маленький участок и ограничивается оптимизацией только заданного набора кадров. На таком масштабе хорошо видны цели и средства, весь участок целиком умещается в окне Piano Roll, работать одно удовольствие. Однако здесь возможна ситуация, когда мы получаем неверный критерий оптимальности, который противоречит финальной цели ТАСа.</span></p>
<p class="rvps10"><span class="rvts22">Например, если в SMB увлечься максимизацией скорости и ускорения в промежутках между каждой следующей сотней пикселей, можно забыть про трубу, которая сокращает путь к концу уровня. Ведь остановка и ныряние в трубу сбрасывают значение скорости в ноль, что противоречит плану по максимизации фактора "скорость". В данном случае участок был выбран неверно, и, как следствие, появился неверный критерий оптимальности ("на момент </span><span class="rvts37">X = 200</span><span class="rvts22"> счётчик кадров должен быть минимален"). Нужно было определить концом участка момент ныряния в трубу. Такие ошибки порой замечаются при повторном просмотре готового мувика на свежую голову, но иногда ошибка менее очевидна и обнаруживается только после опубликования.</span></p>
<div class="rvps10"><table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid;">
<tr valign="top">
<td valign="top" style="border-color: #000000; border-style: solid; height: 426px;"><p class="rvps10"><span class="rvts22">Теперь рассмотрим другую крайность. Когда участок слишком маленький, критерий его оптимальности может противоречить финальной цели ТАСа.</span></p>
<p class="rvps10"><span class="rvts22">Во-первых, если в SMB увлечься максимизацией скорости и ускорения в равных промежутках между </span><span class="rvts37">каждой следующей сотней пикселей</span><span class="rvts22">, можно забыть про трубу, которая сокращает путь к концу уровня. Ведь остановка и ныряние в трубу сбрасывают значение скорости в ноль, что противоречит цели текущего участка. В краткосрочном периоде фактор ныряния невыгоден для спидраннера, а про его долгосрочную выгоду вы можете случайно забыть, когда занимаетесь однотипными действиями.</span></p>
<p class="rvps10"><span class="rvts22">В данном случае участок был выбран недальновидно, и, как следствие, появился неверный критерий оптимальности ("на момент </span><span class="rvts37">X = 200</span><span class="rvts22"> счётчик кадров должен быть минимален"). Здесь концом участка должен быть момент, когда </span><span class="rvts37">любое нажатие </span><span class="rvts46">Вниз</span><span class="rvts37"> запускает анимацию ныряния</span><span class="rvts22"> Нужно было определить концом участка момент ныряния в трубу.</span></p>
<p class="rvps10"><span class="rvts22">Конечно, такие ошибки обычно замечаются при повторном просмотре готового мувика на свежую голову, но иногда ситуация менее очевидна, и обнаруживается только после опубликования.</span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/smb-segments.gif"/></p>
<p class="rvps10"><span class="rvts22">Например, в том же SMB после ныряния в трубу (мир 1-1) нужно добраться до выхода, находящегося справа. Казалось бы, требуется с первых мгновений начинать максимизацию скорости. Однако тесты показали, что в течение первой дюжины кадров правильнее всего будет зажать кнопку </span><span class="rvts32">L</span><span class="rvts22">, а не </span><span class="rvts32">R</span><span class="rvts22">, чтобы сначала приземлиться немного левее от стенки, через которую требуется перепрыгнуть. Если сразу зажать </span><span class="rvts32">R</span><span class="rvts22">, то Марио приземлится вплотную перед стенкой, и ему придётся прыгать вертикально вверх, &nbsp;обнулив всю набранную скорость.</span></p>
<p class="rvps10"><span class="rvts22">Таким образом, если вы выберете в качестве оптимизируемого участка промежуток из дюжины первых кадров (от </span><span class="rvts37">появления Марио</span><span class="rvts22"> до </span><span class="rvts37">приземления</span><span class="rvts22">) , критерий оптимальности подскажет вам неверную последовательность кнопок (по результатам тестов выиграет вариант с зажатием </span><span class="rvts32">R</span><span class="rvts22"> вместо </span><span class="rvts32">L</span><span class="rvts22">). Здесь нужно выбирать участок от первого кадра появления Марио до момента перепрыгивания угла стенки.</span></p>
<p class="rvps10"><span class="rvts22">Во-вторых, в том же SMB после ныряния в трубу (мир 1-1) нужно добраться до выхода, находящегося справа. Казалось бы, требуется с первых мгновений начинать максимизацию скорости. Однако, как видно на картинке, в течение первой дюжины кадров правильнее всего будет зажать кнопку </span><span class="rvts32">L</span><span class="rvts22">, а не </span><span class="rvts32">R</span><span class="rvts22">, чтобы сначала приземлиться немного поодаль от стенки, через которую требуется перепрыгнуть. Если сразу зажать </span><span class="rvts32">R</span><span class="rvts22">, то Марио приземлится вплотную перед стенкой, и ему придётся прыгать вертикально вверх, &nbsp;обнулив всю набранную скорость.</span></p>
<p class="rvps10"><span class="rvts22">Эта особенность вовсе не так очевидна, если в качестве оптимизируемого участка вы выбираете промежуток от </span><span class="rvts37">появления Марио</span><span class="rvts22"> до </span><span class="rvts37">приземления</span><span class="rvts22">. На таком маленьком участке критерий оптимальности наведёт вас на неверную последовательность кнопок.</span></p>
<p class="rvps10"><span class="rvts22">Здесь нужно выбирать участок от первого кадра </span><span class="rvts37">появления Марио</span><span class="rvts22"> до момента </span><span class="rvts37">преодоления угла стенки</span><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">К сожалению, даже опытные ТАСеры не всегда ставят правильные ограничения сразу. Иногда приходится передумывать и переделывать, выбрасывать результаты проделанных тестов и менять масштаб участка, заново проходить почти тот же самый момент в игре.</span></p>
</td>
</tr>
</table>
</div>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Конкретные размеры участка сильно различаются не только от игры к игре, но и от этапа к этапу в одной и той же игре. Опытные ТАСеры используют индивидуальный подход к каждому следующему участку (хоть и не задумываются об этом слишком долго). Выбирать следующий участок по тому же принципу, что и предыдущий плохая идея, это срабатывает только в очень однообразных играх.</span></p>
<p class="rvps10"><span class="rvts22">В принципе, можно измерять участок в кадрах (например, ставить цель максимизировать координату X на момент истечения первой сотни кадров мувика), но логичнее ассоциировать конец участка с каким-нибудь мелким рубежом в игре (например, удачное преодоление ловушки или убийство очередного врага) тогда сама цель будет подсказывать вам средства для её достижения. Задача типа "взять цветок максимально быстро" звучит гораздо понятнее, чем задача "на кадр 300 быть максимально близко к цветку".</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">В подавляющем большинстве видеоигр игровой процесс делится на "комнаты", "волны врагов" и "последовательности ловушек", между которыми обязательно присутствуют краткие моменты расслабления. Даже в играх со скроллингом и свободным исследованием мира дизайн уровней всегда таков, что можно выделить насыщенные участки и промежутки отдыха между ними. Дело в том, что </span><span class="rvts26">дизайнеры тоже структурируют задачу игрока на подзадачи</span><span class="rvts22">, так что в ряде случаев ТАСер может воспользоваться заготовленным разбиением. Главное, не забывать его критически оценивать и при необходимости доразбивать на более мелкие подучастки (впрочем, это дробление произойдёт само собой в процессе редактирования Ввода большого участка).</span></p>
<p class="rvps10"><span class="rvts22">Это можно сравнить с тем, как писатели разбивают книгу на главы (уровни игры), а главы на абзацы и предложения (участки). Простой читатель (игрок) довольствуется авторским разбиением для удобства чтения и впитывания авторского замысла. Но литературному критику (ТАСеру) необходимо уметь читать между строк, разбивая предложения по своему разумению.</span></p>
<p class="rvps10"><span class="rvts22">Например, в Super Mario Bros между каждой группой врагов есть относительно спокойный промежуток уровня, на котором не требуется особое мастерство управления, его можно бездумно пробежать или пропрыгать, зажав </span><span class="rvts32">Вправо </span><span class="rvts22">(подразумевается, что Марио уже давно разогнался до максимальной скорости). Идеальный ТАС в такие моменты почти не будет отличаться от неидеального прохождения. Эти моменты очень хорошо подходят в качестве промежуточных целей если обозначить здесь конец участка, то критерий его оптимальности не будет противоречить финальной цели ТАСа. И обычно эти моменты чередуются достаточно часто, чтобы полученный между ними участок был небольшим (одна-две сотни кадров), ну или потребуется разбиение его на два-три рабочих участка.</span></p>
<p class="rvps10"><span class="rvts22">Как вы могли заметить, данный документ избегает измерять участки реальным количеством кадров мувика. Потому что конкретные размеры участка сильно различаются как от игры к игре, так и от этапа к этапу. На некоторых участках игры так мало возможностей, что они могут длиться более тысячи кадров, и их всё равно будет легко проходить и перепроходить. Кстати, некоторые участки настолько просты, что их даже перепроходить не требуется, так как любое успешное прохождение является оптимальным (например, просмотр непропускаемых заставок между уровнями). А другие стадии игры, наоборот, перенасыщены событиями и факторами, и в них приходится попотеть даже над дюжиной кадров.</span></p>
<p class="rvps10"><span class="rvts22">Опытные ТАСеры подходят индивидуально к каждому следующему участку (хоть и не задумываются об этом слишком долго). Выбирать следующий участок по тому же принципу, что и предыдущий плохая идея, это срабатывает только в очень однообразных играх.</span></p>
<p class="rvps10"><span class="rvts22">Если хочется, можно ограничивать конец текущего участка неким фиксированным номером кадра (например, ставить себе цель максимизировать координату X на момент </span><span class="rvts37">счётчик кадров = 200</span><span class="rvts22">). Но обычно удобнее ассоциировать конец участка с каким-нибудь мелким рубежом в игре (преодоление ловушки или победа над очередным врагом) тогда сама цель будет подсказывать вам базовые средства для её достижения. Ведь задача типа "взять цветок максимально быстро" звучит гораздо понятнее (для игрока), чем задача "на кадр номер 300 быть максимально близко к цветку".</span></p>
<p class="rvps10"><span class="rvts22">В подавляющем большинстве видеоигр игровой процесс делится на "комнаты", "волны врагов" и "ловушки", между которыми обязательно присутствуют краткие периоды расслабления. Даже в играх со скроллингом и свободным исследованием мира дизайн уровней всегда таков, что можно выделить напряжённые моменты и наполняющие промежутки между ними. Дело в том, что </span><span class="rvts26">дизайнеры игр тоже структурируют задачу игрока на подзадачи</span><span class="rvts22">, и в ряде случаев ТАСер даже может позаимствовать заготовленное разбиение. Главное, не забывать его критически оценивать и при необходимости доразбивать на более мелкие подучастки. Впрочем, это дробление произойдёт естественным образом в процессе обработки Ввода на слишком большом участке. Так что далеко не всегда ТАСинг требует напряжённых мозговых усилий. Будучи умелым и сообразительным, можно в большинстве случаев просто плыть по течению и получать удовольствие от ТАСинга, не уступающее фану традиционных видеоигр.</span></p>
<p class="rvps10"><span class="rvts22">Всё это можно сравнить с тем, как писатели разбивают книгу на главы (уровни игры), а главы на параграфы и предложения (участки) для удобства чтения и постижения авторского замысла. Простой читатель (игрок) довольствуется авторским разбиением, но литературному критику (ТАСеру) необходимо уметь "читать между строк", разбивая текст по своему разумению.</span></p>
<p class="rvps10"><span class="rvts22">Например, в Super Mario Bros между каждой группой врагов есть спокойное пространство, на котором не требуется особое мастерство, его можно беззаботно пробежать или пропрыгать, зажав </span><span class="rvts32">Вправо </span><span class="rvts22">(подразумевается, что Марио уже давно разогнался до максимальной скорости). Для идеального прохождения таких моментов не требуются инструменты ТАСинга. Эти промежутки очень хорошо подходят в качестве целей если обозначить здесь конец участка, то критерий его оптимальности наверняка не будет противоречить финальной цели ТАСа. И обычно эти моменты чередуются достаточно часто, чтобы полученный между ними участок был приемлемой величины.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Разделение ТАСа на участки существовало всегда, но Тасэдитор делает этот процесс более осмысленным и понятным для новичка. В Тасэдиторе вы можете визуально отметить начало и конец любого участка с помощью Маркеров или Закладок.</span></p>
<p class="rvps10"><span class="rvts22">При просмотре тестового прохождения можно легко выбрать кадр начала участка момент в игре, когда все предшествующие факторы можно игнорировать. Так, например, в начале каждого уровня начинается очередной участок, потому что все факторы, действовашие на последнем участке предыдущего уровня (такие как счётчик жизней босса), утратили свою актуальность, уступив место новым факторам. Поэтому в начале каждого уровня имеет смысл ставить Маркер или Закладку, обозначив не только начало уровня, но и начало текущего рабочего участка. Благодаря визуальной отметке вы не будете отвлекаться на соседний Ввод при шлифовке участка и не потратите время на анализ устаревших факторов и тестирование бесполезных вариантов.</span></p>
<p class="rvps10"><span class="rvts22">Разделение ТАСа на участки существовало всегда, но Тасэдитор позволяет сделать этот процесс более наглядным. Здесь вы можете отметить начало и конец любого участка с помощью Маркеров или Закладок. Благодаря видимым границам вы не будете отвлекаться на соседний Ввод при шлифовке участка и сможете сосредоточиться на анализе только ближайших факторов.</span></p>
<p class="rvps10"><span class="rvts22">Кадр начала участка обычно выбирается при просмотре пробного прохождения текущего участка. Во время записи и просмотра такого прохождения вы уже выделяете в уме один или два ключевых фактора оптимальности. Поэтому логично сделать началом участка тот момент, начиная с которого эти факторы вступают в действие или резко изменяют свой характер. Так, например, в начале каждого уровня начинается новый участок, потому что игроку возвращается возможность двигаться вперёд (после окончания заставки между уровнями). Поэтому в начале каждого уровня имеет смысл ставить Маркер или Закладку, обозначив не только границу уровня, но и начало текущего рабочего участка.</span></p>
<p class="rvps10"><span class="rvts22">А если в процессе оптимизации обнаружатся факторы, которые вступают в действие раньше, чем начинается текущий участок, выбранные границы участка всегда можно изменить, либо разбить участок надвое.</span></p>
<p class="rvps10"><a name="EndOfSegment"></a>
<span class="rvts22">С концом участка дело обстоит немного иначе. Определившись с целью (например, довести координату X до значения 50) можно зафиксировать конец участка, установив второй Маркер/Закладку на кадре, где текущее неидеальное прохождение достигает этой цели. При шлифовке </span><span class="rvts22">Ввод</span><span class="rvts22">а мы постараемся достичь той же цели (</span><span class="rvts37">X = 50</span><span class="rvts22">) на более ранний кадр, или хотя бы на тот же. И если в ходе редактирования и тестов </span><span class="rvts22">Ввод</span><span class="rvts22">а обнаружится, что цель действительно можно достигнуть раньше, необходимо будет передвинуть замыкающий Маркер/Закладку выше (отметив улучшенный конец участка), а затем продолжить тестирование других вариантов в поисках ещё лучшего. В традиционном методе ТАСинга именно так постепенно передвигается вверх главная Закладка, хранящая лучшее на данный момент прохождение участка.</span></p>
<p class="rvps10"><span class="rvts22">В принципе, в Тасэдиторе вы можете дать волю своей лени и не отмечать конец участка ни Закладкой, ни Маркером, а просто держать цель в уме и примерно помнить, на каком кадре проявляется конечное событие в лучшем варианте. Эта мелочная экономия времени имеет смысл, когда участок очень прост, и его не потребуется многократно переделывать. Также, вместо замыкающего Маркера во многих случаях можно ориентироваться по зелёной стрелке, автоматически остающейся на кадре прошлого конца участка.</span></p>
<p class="rvps10"><span class="rvts22">Однако в сложных ТАСах, где голова заполнена обдумыванием множества факторов оптимальности, лучше не торопиться, а методично отмечать текущий конец участка Закладкой, перестанавливая эту Закладку в случае улучшения Ввода на участке. Ведь в сложных ТАСах улучшение участка это большое достижение, так что слишком часто изменять отметку конца участка вам не придётся.</span></p>
<p class="rvps10"><span class="rvts22">Когда появляется уверенность, что найдено наилучшее решение из всех возможных, надо переходить к следующему участку. Не нужно просто так удалять старые Маркеры, они могут пригодиться в будущем, когда вы усомнитесь в идеальности тех или иных решений (например, найдя новый трюк) и захотите отредактировать Ввод в ранее пройденных уровнях. Скорее всего, логика разбиения останется той же даже после появлении нового фактора (нового трюка), и готовое разбиение сэкономит вам время.</span></p>
<p class="rvps10"><span class="rvts22">Если в процессе тестирования вариантов Ввода на участке у вас появляется уверенность, что найдена наилучшая последовательность Ввода для первой половины (или трети) участка, имеет смысл разбить участок надвое и заняться только оставшимся вторым. Часто такие ситуации возникают, когда изначально взят слишком большой участок, и только при редактировании проявились логические подучастки в его составе. Это обычная практика.</span></p>
<span class="rvts22">Кадр конца текущего участка более подвижен, чем кадр начала. Определившись с целью (например, довести координату X до значения 50) можно отметить конец участка, установив второй Маркер/Закладку на кадре, где текущее неидеальное прохождение достигает этой цели. Затем с помощью шлифовки </span><span class="rvts22">Ввод</span><span class="rvts22">а мы постараемся достичь той же цели (</span><span class="rvts37">X = 50</span><span class="rvts22">) на более ранний кадр. И если в ходе редактирования и тестов </span><span class="rvts22">Ввод</span><span class="rvts22">а обнаружится, что цель действительно можно достигнуть раньше, необходимо будет передвинуть замыкающий Маркер/Закладку выше (на улучшенный конец участка). После этого, пока чувствуется потенциал к дальнейшему улучшению, нужно продолжать тестирование других подходов в поисках ещё лучшего. В традиционном методе ТАСинга именно так постепенно передвигается вверх главная Закладка (хранящая лучшее на данный момент прохождение участка).</span></p>
<p class="rvps10"><span class="rvts22">В принципе, иногда вы можете дать волю своей лени и не отмечать конец участка, а просто держать цель в уме и примерно помнить, на каком кадре проявляется целевое событие в лучшем случае. Это поведение имеет смысл, когда участок очень прост, и вы не планируете его многократно переделывать.</span></p>
<p class="rvps10"><span class="rvts22">Более того, в большинстве игр-платформеров, где у персонажа фиксированная скорость бега, многие участки уже с первого раза проходятся оптимально (достаточно зажать </span><span class="rvts32">Вправо</span><span class="rvts22"> и перепрыгивать простенькие препятствия). Так что, если вы не видите ни одной очевидной ошибки и не собираетесь искать скрытые недостатки, логично также пропускать оформление участка и сразу переходить к следующему. Для новичка такие простые игры подходят лучше всего, ведь их ТАСинг очень похож на казуальное прохождение игр с сэйвами (когда исправляются только самые очевидные ошибки, вроде падения в яму, а некритичные шероховатости игнорируются).</span></p>
<p class="rvps10"><span class="rvts22">Однако в сложных ТАСах, где голова заполнена обдумыванием множества факторов оптимальности, лучше не торопиться. Чтобы мыслительный процесс был более отчётливым, нужно чётко осознавать границы текущего участка. Поэтому отмечайте начало любого сложного участка Маркером, а конец отмечайте Закладкой из одного и того же слота, пересохраняя её при каждом улучшении участка. В сложных ТАСах улучшение участка это большое достижение, так что слишком часто изменять отметку конца участка вам не придётся.</span></p>
<p class="rvps10"><span class="rvts22">Когда появляется уверенность, что найдено идеальное решение участка, надо переходить к следующему участку. Не нужно просто так удалять старые Маркеры, они могут пригодиться в будущем, когда вы усомнитесь в идеальности тех или иных решений (например, найдя новый трюк) и захотите отредактировать Ввод в ранее пройденных уровнях. Скорее всего, логика разбиения останется той же даже после появлении нового фактора (нового трюка).</span></p>
<p class="rvps10"><span class="rvts22">Также, если посреди процесса оптимизации у вас появляется уверенность, что найдена наилучшая последовательность Ввода для первой половины (или трети) участка, имеет смысл разбить участок надвое и заняться только оставшимся вторым. Часто такие ситуации возникают, когда изначально взят слишком большой участок, и только при редактировании проявились логические подучастки в его составе.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Итак, если ваш характер не приемлет порядка, вы можете вовсе не ставить Маркеры и Закладки во время работы, представляя участки умозрительно. Но учтите, что эта информация тоже занимает часть рабочей памяти человека, так что в результате может не хватить места для каких-то факторов оптимальности, и вы этого даже не заметите.</span></p>
<p class="rvps10"><span class="rvts22">Если же вы, наоборот, любите порядок, рекомендуется после завершения шлифовки участка (а можно и до или во время шлифовки) добавлять к Маркерам текстовые Заметки! Желательно оставлять комментарий хотя бы к Маркеру в начале участка, например, название участка или тег. Таким образом вы одновременно с ТАСингом документируете его разработку, оформляете появляющийся Ввод и придаёте ему объективный смысл. Это особенно полезно при работе в соавторстве, но и при ТАСинге в одиночку вы можете заметить, что "документация" из прошлых уровней мотивирует продолжать ТАСинг следующих. Отнимая секунды на печать текста, Маркеры дают силы не забросить проект на годы.</span></p>
<p class="rvps10"><span class="rvts22">Также Заметки помогают полнее раскрыть потенциал хитроумных трюков и багов игры. Дело в том, что во время написания текста Заметки, вы формализуете собственные знания об описываемом явлении. Когда суть трюка хранится в голове, вам будет казаться, что вы знаете о нём всё, и что в текущем ТАСе он уже и так используется максимально эффективно. Но когда появляется объективная модель в виде словесного описания трюка, нередко раскрываются новые грани вещей, казавшихся очевидными. На сайте TASVideos.org часто были случаи, когда один ТАСер прочитал описание какого-то трюка в сабмишене другого ТАСера и обнаружил способ использовать этот трюк лучше автора. Также были случаи, когда сам автор, перечитав свой свежий сабмишен, хлопал себя по лбу и срочно записывал улучшение.</span></p>
<p class="rvps10"><span class="rvts22">Итак, если ваш характер не приемлет порядка, вы можете вовсе не пользоваться Маркерами и Закладками, оперируя только нечёткими игровыми понятиями и представляя участки в виде неких эмоциональных последовательностей событий. К сожалению, информация о нечёткой цели тоже занимает часть рабочей памяти человека, так что в результате вам может не хватить места для каких-то факторов оптимальности. И вы даже не заметите множество упущенных возможностей.</span></p>
<p class="rvps10"><span class="rvts22">Если же вы, наоборот, любите порядок, рекомендуется сопровождать Маркеры текстовыми Заметками, либо до, либо во время, либо после завершения оптимизации текущего участка. Например, придумать название участка или тег. Таким образом вы одновременно с ТАСингом документируете его разработку, оформляете появляющийся Ввод и придаёте ему объективный смысл. Это особенно полезно при работе в соавторстве, но и при ТАСинге в одиночку вы можете заметить, что "документация" из прошлых уровней мотивирует продолжать ТАСинг следующих. Отнимая секунды на печать текста, Заметки помогают не забросить проект на годы.</span></p>
<p class="rvps10"><span class="rvts22">Также они помогают полнее раскрыть потенциал хитроумных трюков и багов игры. Дело в том, что во время сочинения текста, вы формализуете собственные знания об описываемом явлении. Когда суть трюка хранится в голове, вам будет казаться, что вы уже знаете о нём всё, и что в текущем ТАСе он уже используется максимально эффективно. Но когда появляется объективная модель в виде словесного описания трюка, нередко раскрываются её новые грани.</span></p>
<p class="rvps10"><span class="rvts22">На сайте TASVideos.org часто были случаи, когда один ТАСер прочитал описание какого-то трюка в сабмишене другого ТАСера и обнаружил способ использовать этот трюк лучше автора. Также были случаи, когда сам автор, перечитав свой свежий сабмишен, хлопал себя по лбу и срочно записывал улучшение.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Несмотря на всю полезность Маркеров и организации рабочего процесса, основной целью ТАСинга является создание Ввода. На поиск идеальной последовательности нажатий на каждом участке уходит намного больше времени, чем на всё остальное.</span></p>
<p class="rvps10"><span class="rvts22">Зачастую почти сразу кажется, что текущий Ввод самый лучший из всех возможных (особенно при сравнении с первоначальным вариантом). Но обычно это не так, особенно если вы делаете вывод об оптимальности, ориентируясь только на экран FCEUX, а не на состояние памяти (Memory Watch). Поэтому всегда есть смысл предполагать текущий результат неидеальным. Если вы в данный момент не видите в нём никаких ошибок и потенциальных улучшений, то надо переходить к следующему участку, но не отвергать последующие попытки улучшить предыдущие участки.</span></p>
<p class="rvps10"><span class="rvts22">Чаще просматривайте готовую часть мувика с начала игры или начала уровня до последнего записанного участка и пытайтесь заметить несовершенства. Тасэдитор позволяет редактировать </span><span class="rvts22">Ввод</span><span class="rvts22"> прямо во время просмотра, поэтому любую спонтанную идею можно ввести посреди готовых участков сразу же, как только идея пришла в голову. Если она окажется неудачной, просто откатите последние изменения Истории или вернитесь во времени на Закладку с последним актуальным состоянием мувика. А если идея действительно улучшит ваш ТАС, после радостных известий необходимо будет ещё добиться синхронизации последующих участков </span><span class="rvts22">Ввод</span><span class="rvts22">а (так как из-за реализации этой идеи последующее состояние игры изменится). Причём переписывать весь последующий </span><span class="rvts22">Ввод </span><span class="rvts22">в большинстве случаев не требуется. Обычно достаточно лишь удалить или вставить пару кадров (сдвинув все участки вверх), или подправить несколько участков между местом реализации идеи и ближайшим чекпоинтом (конец уровня или т.п.). В Тасэдиторе всё это делается довольно быстро, а в ходе вынужденных исправлений вы можете обнаружить ещё какую-нибудь ошибку или нереализованную идею.</span></p>
<p class="rvps10"><span class="rvts22">Многие обгоны спидранов появлялись из-за обнаружения маленького улучшения в середине мувика, из-за чего приходилось потом переписывать (пересинхронизировать) всю вторую половину мувика и даже наталкиваться на новые улучшения. А потом эти новые трюки оказалось возможным применить в первом уровне игры. Движок у игры один, и если трюк сработал в одном уровне, он вполне может сработать в другом, где возникают подобные условия. И даже если условия не возникают, порой можно их создать за счёт потери чего-то менее ценного. В итоге весь мувик неоднократно переписывается почти с самого начала. Так из маленького улучшения вырастает серьёзный обгон.</span></p>
<p class="rvps10"><span class="rvts22">Главное не жалеть выбрасывать уже проделанную работу, когда многодневные труды по отшлифовке мувика становятся неактуальными из-за обнаружения ошибки (упущенной возможности оптимизации).</span></p>
<p class="rvps10"><span class="rvts22">ТАСинг традиционным методом очень быстро приучает ТАСера к мысли о неизбежности потерь. Сам принцип многократной перезаписи одного и того же участка предлагает ТАСеру оценивать свой прогресс количеством затраченных попыток, ушедших впустую. Ведь при ТАСинге без Тасэдитора выбрасывать проделанную работу приходится на каждом шагу, как в мелочах, так и по-крупному.</span></p>
<p class="rvps10"><span class="rvts22">Тасэдитор позволяет предотвратить некоторые мелкие потери, но он не спасает от необходимости крупных переделок в случае обнаружения новых факторов оптимизации. Например, проходя третий уровень, вы можете обнаружить новый трюк, который также срабатывает на первом уровне, теперь вам необходимо заново переделывать не только первый и третий уровни, но, скорее всего, и второй, к которому новый трюк не имеет никакого отношения. Конечно, во второй раз те же самые уровни ТАСить гораздо проще, но сам факт выброшенного времени иногда удручает, и поначалу даже кажется, что исправление старой ошибки не стоит того, чтобы тратить на него время. В этом случае следует, не долго думая, либо заставить себя сделать это, либо отложить исправление на следующий раз, оставив рядом с ошибкой Маркер с памяткой, детально описывающей суть проблемы. Если к моменту окончания ТАСа таких отложенных планов накапливается немало, придётся назвать почти готовый мувик "тестовым пробегом" и после продолжительного отдыха взяться за его переписывание. Впрочем, ревизия готового ТАСа имеет смысл всегда, даже когда на уме нет запланированных улучшений.</span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Создание идеального ТАСа может занять от нескольких дней до нескольких лет, в зависимости от сложности выбранной игры. Основная часть этого времени уходит на поиск идеальной последовательности нажатий на каждом участке.</span></p>
<p class="rvps10"><span class="rvts22">Зачастую почти сразу кажется, что текущий Ввод самый лучший из всех возможных. Но обычно это не так, особенно если вы делаете вывод, ориентируясь только на внешнее изображение эмулируемой игры, а не на её внутреннее состояние (Memory Watch). Поэтому всегда есть смысл предполагать текущий результат неидеальным. Если вы не видите в нём никаких ошибок и потенциальных улучшений, попробуйте пересмотреть текущий участок в составе нескольких предыдущих (например, просмотреть последние полминуты своего мувика), ведь есть шанс, что в предыдущих участках скрывались неучтённые факторы оптимальности, которые влияют на текущий участок. Если всё равно не появляется никаких идей, то надо переходить к следующему участку, но не отвергать последующие попытки раскритиковать и улучшить готовые участки.</span></p>
<p class="rvps10"><span class="rvts22">Просматривайте готовую часть мувика почаще с начала игры или начала уровня и пытайтесь заметить несовершенства. Тасэдитор позволяет редактировать </span><span class="rvts22">Ввод в любом месте мувика</span><span class="rvts22"> прямо во время просмотра, поэтому любую спонтанную идею можно ввести посреди готовых участков сразу же, как только идея пришла в голову. Если она окажется неудачной, откатите последние изменения или вернитесь во времени на Закладку, хранящую последнее стабильное состояние мувика.</span></p>
<p class="rvps10"><a name="resyncing"></a>
<span class="rvts22">А если идея действительно улучшит ваш ТАС, после радостных предвкушений необходимо будет ещё добиться синхронизации последующих участков </span><span class="rvts22">Ввод</span><span class="rvts22">а (так как из-за реализации этой идеи последующее состояние игры изменится). Причём переписывать весь последующий </span><span class="rvts22">Ввод </span><span class="rvts22">в большинстве случаев не требуется. Обычно достаточно лишь удалить или вставить пару кадров (сдвинув все участки вверх или вниз), или подправить несколько участков между местом реализации идеи и ближайшим чекпоинтом (конец текущего уровня или т.п.). Чекпоинты обычно сбрасывают большинство игровых характеристик в значение по умолчанию (например, заставляют вас пройти точно по платформе, тем самым выравняв координату Y), так что после чекпоинта ваш старый Ввод подойдёт к новой хронологии игры, как только вы передвинете его на новое место (чтобы он совпал с ходом игровых событий).</span></p>
<p class="rvps10"><span class="rvts22">Даже в тех случаях, когда вам приходится переписывать значительные отрезки мувика, пересинхронизация делается гораздо проще, чем ТАСинг с нуля, ведь теперь вы уже знаете лучший подход к каждому участку, и требуется только повторить прошлые результаты. А иногда удаётся даже превзойти старый результат, потому что во время вынужденных исправлений и пересинхронизации старого Ввода вы всё ещё обладаете ТАСерским критическим мышлением, так что по ходу дела можете обнаружить ещё какую-нибудь старую ошибку или нереализованную идею.</span></p>
<p class="rvps10"><span class="rvts22">Иногда это смахивает на снежную лавину растут не только хлопоты, но и упоение масштабом открытий. </span><span class="rvts22">Многие обгоны спидранов появлялись из-за обнаружения маленького улучшения в середине мувика, из-за чего потом приходилось переписывать всю вторую половину мувика (чтобы пересинхронизировать её традиционным методом) и в процессе наталкиваться на новые открытия. А потом эти новые трюки оказалось возможным применить в первом уровне игры! Ведь движок у игры один, и если трюк сработал в одном уровне, он вполне может сработать в другом, где возникают подобные условия. Даже если условия не возникают, порой можно их создать за счёт потери чего-то менее ценного. В итоге весь мувик неоднократно переписывается почти с самого начала, а из маленького улучшения вырастает серьёзный обгон.</span></p>
<p class="rvps10"><span class="rvts22">Надо научиться не жалеть выбрасывать уже проделанную работу. Время от времени при ТАСинге приходится переосмысливать даже полностью отшлифованные части мувика. Традиционный метод очень быстро приучает к неизбежности потерь времени, потому что переписывать участок приходится даже из-за банальной невнимательности или соскользнувшего пальца. Тасэдитор позволяет предотвратить подобные мелкие потери, но он не спасает от необходимости перепробовать новые подходы при обнаружении новых факторов оптимальности.</span></p>
<p class="rvps10"><span class="rvts22">Например, отшлифовывая Ввод в конце World 1-3, вы обнаружили новый трюк, который также срабатывает в World 1-1 и позволяет взять гриб. Теперь вам необходимо заново переделать не только 1-1 и 1-3, но и 1-2, потому что теперь вы проходите World 1-2 с большим Марио. Конечно, во второй раз те же самые уровни ТАСить проще, но сам факт выброшенного времени поначалу удручает. Иногда кажется, что исправление старой ошибки не стоит того, чтобы тратить на него ещё дополнительное время. Тут не нужно долго думать, надо только выбрать одно из двух либо сразу приступить к исправлению, либо отложить его на неопределённый срок (оставив рядом Маркер с памяткой, детально описывающей суть проблемы). Если к моменту окончания проекта накапливается критическая масса таких отложенных планов, придётся назвать готовый мувик "тестовым пробегом" и, возможно, опубликовать его, хотя бы как WIP (work in progress). А после продолжительного отдыха, когда появится желание, можно взяться за его переписывание (улучшение).</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Несмотря на все сложности, ТАСинг может приносить радость не только зрителям, но и автору. ТАСы создаются людьми, для которых вышеописанный характер работ вполне уравновешивается восторгом от промежуточных и итоговых результатов. Во многих смыслах ТАСинг похож на особую мета-видеоигру со своим уникальным геймплеем. И пока игры дают фан, люди играют в них независимо от степени хардкорности. </span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">В следующей главе: </span><a class="rvts28" href="TASingMethodology.html">описание методов оптимизации Ввода</a><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<div class="rvps10"><table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid;">
<tr valign="top">
<td style="border-color: #000000; border-style: solid;"><p class="rvps10"><span class="rvts26">ПРАКТИЧЕСКОЕ ЗАДАНИЕ: </span></p>
<p class="rvps10"><span class="rvts22">Просмотрите в Тасэдиторе неидеальное прохождение 1 уровня, записанное в прошлом практическом занятии, и с помощью Маркеров разделите его на участки по собственному принципу. Если мувик длинный, не нужно структурировать его полностью, требуется только прочувствовать принципы разбиения.</span></p>
<td style="border-color: #000000; border-style: solid;"><p class="rvps10"><span class="rvts26">ПРАКТИЧЕСКОЕ ЗАДАНИЕ: </span><span class="rvts22">Просмотрите в Тасэдиторе неидеальное прохождение 1 уровня, созданное вами в прошлой главе, и с помощью Маркеров разделите его на участки по собственному принципу. Если мувик длинный, не нужно структурировать его полностью, требуется только прочувствовать принципы.</span></p>
<p class="rvps10"><span class="rvts26">Примерное время выполнения: </span><span class="rvts22">5-10 минут.</span></p>
</td>
</tr>
@ -131,6 +163,7 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/help-authoring-tool">Free help authoring environment</a></p>
</div>

View File

@ -3,7 +3,7 @@
<head>
<title>Заглавная страница</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("Title");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("Title");
}
});
</script>
</head>
@ -46,6 +49,7 @@
</div>
<div id="topic_content">
<p></p>
<p class="rvps5"><span class="rvts6"><br/></span></p>
<p class="rvps5"><span class="rvts6"><br/></span></p>
<p class="rvps4"><span class="rvts8">TAS Editor 1.0</span></p>
@ -116,6 +120,7 @@
<p class="rvps3"><span class="rvts6"><br/></span></p>
<p class="rvps3"><span class="rvts6"><br/></span></p>
<p class="rvps3"><span class="rvts6"><br/></span></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com">Free HTML Help documentation generator</a></p>
</div>

View File

@ -3,7 +3,7 @@
<head>
<title>2.2. Панель инструментов</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("Toolbox");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("Toolbox");
}
});
</script>
</head>
@ -52,6 +55,7 @@
</div>
<div id="topic_content">
<p></p>
<p><span class="rvts20">Панель инструментов</span></p>
<p class="rvps5"><span class="rvts39"><br/></span></p>
<p class="rvps5"><img alt="" style="padding : 1px;" src="lib/taseditor-smb.png"/></p>
@ -59,13 +63,13 @@
<p class="rvps10"><span class="rvts22">Панель инструментов содержит 7 разделов:</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><a class="rvts40" href="Toolbox.html#playback">Playback Проигрыватель</a></li>
<li class="rvps15"><a class="rvts40" href="Toolbox.html#recorder">Recorder Рекордер</a></li>
<li class="rvps15"><a class="rvts40" href="Toolbox.html#splicer">Splicer Монтажный инструмент</a></li>
<li class="rvps15"><a class="rvts40" href="Toolbox.html#lua">Lua Луа-автоматизация</a></li>
<li class="rvps15"><a class="rvts40" href="Toolbox.html#bookmarks">Bookmarks Закладки</a></li>
<li class="rvps15"><a class="rvts40" href="Toolbox.html#history">History Журнал Истории</a></li>
<li class="rvps15"><a class="rvts40" href="Toolbox.html#selection">кнопки навигации Курсором Выделения</a></li>
<li class="rvps14"><a class="rvts40" href="Toolbox.html#playback">Playback Проигрыватель</a></li>
<li class="rvps14"><a class="rvts40" href="Toolbox.html#recorder">Recorder Рекордер</a></li>
<li class="rvps14"><a class="rvts40" href="Toolbox.html#splicer">Splicer Монтажный инструмент</a></li>
<li class="rvps14"><a class="rvts40" href="Toolbox.html#lua">Lua Луа-автоматизация</a></li>
<li class="rvps14"><a class="rvts40" href="Toolbox.html#bookmarks">Bookmarks Закладки</a></li>
<li class="rvps14"><a class="rvts40" href="Toolbox.html#history">History Журнал Истории</a></li>
<li class="rvps14"><a class="rvts40" href="Toolbox.html#selection">кнопки навигации Курсором Выделения</a></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
@ -135,16 +139,16 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">По сути это стандартные возможности любого текстового редактора, но в Тасэдиторе их можно применять к </span><span class="rvts22">Ввод</span><span class="rvts22">у прямо во время эмуляции игры, что позволяет на лету анализировать результаты их применения и гибко перестраивать свои планы.</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts23">Copy </span><span class="rvts22">(</span><span class="rvts34">Ctrl + C</span><span class="rvts22">) копирует весь выделенный </span><span class="rvts22">Ввод</span><span class="rvts22"> в Буфер Обмена.</span></li>
<li class="rvps15"><span class="rvts23">Paste </span><span class="rvts22">(</span><span class="rvts34">Ctrl + V</span><span class="rvts22">) вставляет </span><span class="rvts22">Ввод</span><span class="rvts22"> из Буфера Обмена в мувик, начиная с кадра, где стоит Курсор Выделения. Старые данные мувика на этом месте затираются новыми, либо объединяются, если у Рекордера установлена галочка "Superimpose".</span></li>
<li class="rvps15"><span class="rvts23">Paste Insert </span><span class="rvts22">(</span><span class="rvts34">Ctrl + </span><span class="rvts34">Shift</span><span class="rvts34"> + </span><span class="rvts34">V</span><span class="rvts22">) раздвигает мувик и вставляет данные из Буфера Обмена, начиная с кадра, где стоит Курсор Выделения. Старые данные мувика отодвигаются вниз.</span></li>
<li class="rvps15"><span class="rvts23">Clear </span><span class="rvts22">(</span><span class="rvts34">Delete</span><span class="rvts22">) очищает выделенные кадры, удаляя с них нажатия всех кнопок.</span></li>
<li class="rvps15"><span class="rvts23">Cut </span><span class="rvts22">(</span><span class="rvts34">Ctrl + X</span><span class="rvts22">) = </span><span class="rvts23">Copy</span><span class="rvts22"> + </span><span class="rvts23">Clear</span><span class="rvts22"> копирует </span><span class="rvts22">Ввод</span><span class="rvts22"> из выделенного участка мувика и очищает этот участок.</span></li>
<li class="rvps15"><span class="rvts23">Delete </span><span class="rvts22">(</span><span class="rvts34">Ctrl + Delete</span><span class="rvts22">) удаляет выделенные кадры из мувика, сдвигая последующие кадры на их место. Очень удобно таким образом перемещать </span><span class="rvts22">Ввод</span><span class="rvts22"> вверх.</span></li>
<li class="rvps15"><span class="rvts23">Insert </span><span class="rvts22">(</span><span class="rvts34">Ctrl + Shift + Insert</span><span class="rvts22">) вставляет в мувик пустой кадр перед каждым выделенным кадром, сдвигая существующий Ввод вперёд. Удобно таким образом перемещать </span><span class="rvts22">Ввод</span><span class="rvts22"> вниз.</span></li>
<li class="rvps15"><span class="rvts23">Clone </span><span class="rvts22">(</span><span class="rvts34">Ctrl + Insert</span><span class="rvts22">) аналог </span><span class="rvts23">Insert</span><span class="rvts22">, но вместо пустоты в мувик вставляются копии выделенных кадров. Зачастую этот способ предпочтительнее.</span></li>
<li class="rvps15"><span class="rvts23">Insert number of frames </span><span class="rvts22">(</span><span class="rvts34">Insert</span><span class="rvts22">) позволяет вставить на место Курсора Выделения любое желаемое количество пустых кадров. При нажатии клавиши </span><span class="rvts34">Insert</span><span class="rvts22"> появляется окошко для ввода требуемого количества кадров, нужно напечатать число и нажать OK. Если передумали, можно нажать Cancel (Esc) для убирания окошка.</span></li>
<li class="rvps15"><span class="rvts23">Truncate</span><span class="rvts22"> удаляет все кадры мувика, начиная со следующего за Курсором Выделения. Редко используемая функция, поэтому у неё нет хоткея, она доступна только через меню программы или меню по правой кнопке мыши.</span></li>
<li class="rvps10"><span class="rvts23">Copy </span><span class="rvts22">(</span><span class="rvts34">Ctrl + C</span><span class="rvts22">) копирует весь выделенный </span><span class="rvts22">Ввод</span><span class="rvts22"> в Буфер Обмена.</span></li>
<li class="rvps10"><span class="rvts23">Paste </span><span class="rvts22">(</span><span class="rvts34">Ctrl + V</span><span class="rvts22">) вставляет </span><span class="rvts22">Ввод</span><span class="rvts22"> из Буфера Обмена в мувик, начиная с кадра, где стоит Курсор Выделения. Старые данные мувика на этом месте затираются новыми, либо объединяются, если у Рекордера установлена галочка "Superimpose".</span></li>
<li class="rvps10"><span class="rvts23">Paste Insert </span><span class="rvts22">(</span><span class="rvts34">Ctrl + </span><span class="rvts34">Shift</span><span class="rvts34"> + </span><span class="rvts34">V</span><span class="rvts22">) раздвигает мувик и вставляет данные из Буфера Обмена, начиная с кадра, где стоит Курсор Выделения. Старые данные мувика отодвигаются вниз.</span></li>
<li class="rvps10"><span class="rvts23">Clear </span><span class="rvts22">(</span><span class="rvts34">Delete</span><span class="rvts22">) очищает выделенные кадры, удаляя с них нажатия всех кнопок.</span></li>
<li class="rvps10"><span class="rvts23">Cut </span><span class="rvts22">(</span><span class="rvts34">Ctrl + X</span><span class="rvts22">) = </span><span class="rvts23">Copy</span><span class="rvts22"> + </span><span class="rvts23">Clear</span><span class="rvts22"> копирует </span><span class="rvts22">Ввод</span><span class="rvts22"> из выделенного участка мувика и очищает этот участок.</span></li>
<li class="rvps10"><span class="rvts23">Delete </span><span class="rvts22">(</span><span class="rvts34">Ctrl + Delete</span><span class="rvts22">) удаляет выделенные кадры из мувика, сдвигая последующие кадры на их место. Очень удобно таким образом перемещать </span><span class="rvts22">Ввод</span><span class="rvts22"> вверх.</span></li>
<li class="rvps10"><span class="rvts23">Insert </span><span class="rvts22">(</span><span class="rvts34">Ctrl + Shift + Insert</span><span class="rvts22">) вставляет в мувик пустой кадр перед каждым выделенным кадром, сдвигая существующий Ввод вперёд. Удобно таким образом перемещать </span><span class="rvts22">Ввод</span><span class="rvts22"> вниз.</span></li>
<li class="rvps10"><span class="rvts23">Clone </span><span class="rvts22">(</span><span class="rvts34">Ctrl + Insert</span><span class="rvts22">) аналог </span><span class="rvts23">Insert</span><span class="rvts22">, но вместо пустоты в мувик вставляются копии выделенных кадров. Зачастую этот способ предпочтительнее.</span></li>
<li class="rvps10"><span class="rvts23">Insert number of frames </span><span class="rvts22">(</span><span class="rvts34">Insert</span><span class="rvts22">) позволяет вставить на место Курсора Выделения любое желаемое количество пустых кадров. При нажатии клавиши </span><span class="rvts34">Insert</span><span class="rvts22"> появляется окошко для ввода требуемого количества кадров, нужно напечатать число и нажать OK. Если передумали, можно нажать Cancel (Esc) для убирания окошка.</span></li>
<li class="rvps10"><span class="rvts23">Truncate</span><span class="rvts22"> удаляет все кадры мувика, начиная со следующего за Курсором Выделения. Редко используемая функция, поэтому у неё нет хоткея, она доступна только через меню программы или меню по правой кнопке мыши.</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Наиболее часто во время ТАСинга в Тасэдиторе вы будете использовать </span><span class="rvts34">Ctrl + Delete</span><span class="rvts22"> (</span><span class="rvts23">Delete Frames</span><span class="rvts22">) и </span><span class="rvts34">Ctrl + Insert</span><span class="rvts22"> (</span><span class="rvts23">Clone Frames</span><span class="rvts22">) для быстрого перемещения редактируемых участков вверх/вниз по &nbsp;списку кадров, тем самым совершая в игре определённые действия раньше или позже по времени.</span></p>
@ -258,6 +262,7 @@
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/feature-tour">Easily create Help documents</a></p>
</div>

View File

@ -3,7 +3,7 @@
<head>
<title>4.1. Традиционный ТАСинг</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" />
@ -19,15 +19,18 @@
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/hnd.js"></script>
<script type="text/javascript">
if (top.frames.length == 0)
$(document).ready(function()
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("TraditionalTASing");
}
if (top.frames.length == 0)
{
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length);
top.location.href = "index.html?" + sTopicUrl;
}
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{
top.FrameTOC.SelectTocItem("TraditionalTASing");
}
});
</script>
</head>
@ -52,71 +55,84 @@
</div>
<div id="topic_content">
<p><span class="rvts20">Традиционный ТАСинг в Тасэдиторе</span></p>
<p></p>
<p><span class="rvts20">Традиционный ТАСинг</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/toolbox-method1.png"/></p>
<p class="rvps10"><span class="rvts22">В этом методе </span><span class="rvts22">Ввод</span><span class="rvts22"> не редактируется точечными изменениями, а записывается целыми сессиями различной длительности (обычно короткими).</span></p>
<p class="rvps10"><span class="rvts22">Для переключения между просмотром и редактированием необходимо включать и выключать режим Записи (клавиша </span><span class="rvts27">Q</span><span class="rvts22"> по умолчанию). Рекомендуется установить галочку "Follow cursor", чтобы наблюдать записываемый </span><span class="rvts22">Ввод</span><span class="rvts22"> в Piano Roll.</span></p>
<p class="rvps10"><span class="rvts22">Этот метод по форме похож на простое прохождение видеоигр, однако имеет совершенно иное содержание и требует иной образ мышления.</span></p>
<p class="rvps10"><span class="rvts22">Редактирование Ввода здесь осуществляется с помощью записи нового Ввода поверх имеющегося.</span></p>
<p class="rvps10"><span class="rvts22">Для переключения между просмотром и редактированием мувика необходимо включать и выключать режим Записи (клавиша </span><span class="rvts27">Q</span><span class="rvts22"> по умолчанию). Рекомендуется установить галочку "Follow cursor", чтобы наблюдать записываемый </span><span class="rvts22">Ввод</span><span class="rvts22"> в Piano Roll.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts23">Основное занятие ТАСера:</span></p>
<p class="rvps10"><span class="rvts53"><br/></span></p>
<p class="rvps10"><span class="rvts23">Основное занятие:</span></p>
<p class="rvps10"><span class="rvts54"><br/></span></p>
<ol style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Поставить Курсор Проигрывателя на начало редактируемого участка мувика, создать на этом кадре Закладку 1, определиться с целью.</span></li>
<li class="rvps15"><span class="rvts22">Предположить наличие ошибки на участке, взвесить имеющиеся факторы оптимальности и прикинуть способ исправления ошибки (как именно требуется изменить </span><span class="rvts22">Ввод</span><span class="rvts22">, начиная с какого кадра и т.д.).</span></li>
<li class="rvps15"><span class="rvts22">Осуществить навигацию к месту исправления ошибки (например, загрузить Закладку 1 и заново проиграть до нужного кадра, либо загрузить заранее заготовленную Закладку прямо на нужном кадре).</span></li>
<li class="rvps15"><span class="rvts22">В режиме Read+Write пройти игру </span><span class="rvts22">до наступления целевого события, записав </span><span class="rvts22">Ввод, отличающийся от уже имевшегося на этом участке</span><span class="rvts22">. По ходу записи следует периодически создавать Закладки в свободных слотах для ускорения навигации в случае, когда нужно откатить предыдущее действие.</span></li>
<li class="rvps15"><span class="rvts22">Когда ошибочность тестируемого варианта очевидна ещё до окончания записи участка, имеет смысл сразу вернуться к пункту 2.</span></li>
<li class="rvps15"><span class="rvts22">[</span><span class="rvts37">необязательный пункт</span><span class="rvts22">] </span><span class="rvts22">Сохранить готовый вариант во временную Закладку.</span></li>
<li class="rvps15"><span class="rvts22">Если это не первый вариант прохождения участка, сравнить полученный результат с лучшим результатом, используя критерий оптимальности. Если новый вариант оказался лучше (или если это ваш первый вариант прохождения участка), сохранить результат в Закладку 9. </span><span class="rvts22">Слот 9 будет отвечать за хранение самого лучшего результата шлифовки участка.</span></li>
<li class="rvps15"><span class="rvts22">Вернуться к пункту 2 и опробовать ещё варианты, до тех пор пока не иссякнут идеи по данному участку.</span></li>
<li class="rvps15"><span class="rvts22">[</span><span class="rvts37">необязательный пункт</span><span class="rvts22">] </span><span class="rvts22">Если идеи иссякают, можно почерпнуть информацию из прошлого: пересмотреть несколько предыдущих участков в режиме Read-Only (например, загрузить Закладку 0, поставленную на начало уровня). Также можно получить пищу для ума из будущего: поиграть в события игры, идущие после окончания текущего участка.</span></li>
<li class="rvps15"><span class="rvts22">Когда идеи полностью иссякли, восстановить лучший вариант прохождения из Закладки 9 в текущий мувик, определиться со следующим участком и вернуться к пункту 1.</span></li>
<li class="rvps10"><span class="rvts22">Поставить Курсор Проигрывателя на начало редактируемого участка мувика, создать на этом кадре Закладку, определиться с целью.</span></li>
<li class="rvps10"><span class="rvts22">Предположить наличие ошибки на участке, взвесить имеющиеся факторы оптимальности и прикинуть способ исправления ошибки.</span></li>
<li class="rvps10"><span class="rvts22">Осуществить навигацию к месту исправления ошибки (загрузить Закладку и, при необходимости, быстро повторить имеющийся Ввод до нужного кадра).</span></li>
<li class="rvps10"><span class="rvts22">В режиме Read+Write пройти игру </span><span class="rvts22">до наступления целевого события, записав </span><span class="rvts22">Ввод, отличающийся от уже имевшегося на этом участке</span><span class="rvts22">. По ходу записи следует периодически создавать Закладки в свободных слотах для ускорения навигации.</span></li>
<li class="rvps10"><span class="rvts22">Если во время печати Ввода совершена ошибка, вернуться к шагу 3. Если же достичь целевого события с помощью выбранного подхода никак не удаётся, можно сдаться и перейти к шагу 8.</span></li>
<li class="rvps10"><span class="rvts22">[</span><span class="rvts37">необязательный шаг</span><span class="rvts22">] </span><span class="rvts22">Сохранить готовый подход во временную Закладку, например, в слот </span><span class="rvts27">8</span><span class="rvts22">.</span></li>
<li class="rvps10"><span class="rvts22">Если это не первый подход к прохождению участка, сравнить новый результат с лучшим старым результатом, используя критерий оптимальности. Если новый подход оказался лучше (или это первый подход), сохранить результат в Закладку </span><span class="rvts27">9</span><span class="rvts22">. </span><span class="rvts22">Слот </span><span class="rvts27">9</span><span class="rvts22"> будет отвечать за хранение самого лучшего результата шлифовки участка.</span></li>
<li class="rvps10"><span class="rvts22">Если осталось желание испробовать другие подходы, следует вернуться к шагу 2, и так до тех пор пока не иссякнут идеи по данному участку.</span></li>
<li class="rvps10"><span class="rvts22">[</span><span class="rvts37">необязательный шаг</span><span class="rvts22">] </span><span class="rvts22">Когда идеи начинают иссякать, </span><span class="rvts22">можно почерпнуть информацию из прошлого, переиграв несколько предыдущих участков мувика (например, загрузить Закладку </span><span class="rvts27">0</span><span class="rvts22">, поставленную на начало уровня). Также можно получить пищу для ума из будущего, сыграв в события игры, идущие после окончания текущего участка.</span></li>
<li class="rvps10"><span class="rvts22">Когда идеи полностью иссякли, восстановить лучший подход из Закладки </span><span class="rvts27">9</span><span class="rvts22"> в текущий мувик и перейти к следующему участку.</span></li>
</ol>
<p class="rvps15"><span class="rvts22"><br/></span></p>
<p class="rvps14"><span class="rvts22"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps2"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Эти 10 пунктов могут описать не только ТАСинг, но вообще любой процесс создания Ввода в эмуляторе.</span></p>
<p class="rvps10"><span class="rvts22">Например, когда вы просто записываете пробное прохождение игры (то есть играете с сэйвами, но без упорной шлифовки) вы используете только пункты 1 5. При этом вам сгодится любое успешное прохождение участка, так что при первом же наступлении конечного события вы сразу с пункта 5 переходите на пункт 1, к следующему участку. В таком прохождении вы сохраняетесь ради быстрой навигации в случае фатальной ошибки (например, не успел нажать кнопку </span><span class="rvts32">A</span><span class="rvts22"> и упал в яму), чтобы не пришлось переписывать Ввод с самого начала игры.</span></p>
<p class="rvps10"><span class="rvts22">Ну а во время серьёзной записи ТАСа необходимо не просто достичь конечного события в игре, но перепробовать множество различных вариантов достижения, чтобы в итоге выбрать самый лучший. Поэтому необходимо многократно повторить пункты 2 8, пока не возникнет чувство, что участок пройден идеально. </span><span class="rvts22">Пункты 6 10 отличают ТАСинг от простой игры с сэйвами.</span></p>
<p class="rvps10"><span class="rvts22">Когда вы просто записываете пробное прохождение игры (то есть играете с сэйвами, но без шлифовки) вы делаете только шаги 3 5. При этом вам сгодится любое успешное прохождение участка, так что при первом же наступлении целевого события вы сразу переходите к следующему участку. В таком прохождении вы сохраняетесь только ради быстрой навигации в случае фатальной ошибки (например, не успел нажать кнопку </span><span class="rvts32">A</span><span class="rvts22"> и упал в яму), так как вы не хотите переписывать Ввод с самого начала игры.</span></p>
<p class="rvps10"><span class="rvts22">Ну а во время серьёзной записи ТАСа необходимо перепробовать множество различных подходов, чтобы в итоге выбрать самый лучший. Поэтому необходимо многократно повторить шаги 2 8, пока не возникнет чувство, что участок пройден идеально. Шаги</span><span class="rvts22"> 6 9 отличают ТАСинг от казуальной игры с сэйвами.</span></p>
<p class="rvps10"><span class="rvts22">Процесс Записи </span><span class="rvts22">Ввода (шаг 4)</span><span class="rvts22"> представляет собой редактирование </span><span class="rvts22">Ввод</span><span class="rvts22">а прямо во время просмотра результатов. То есть просматривая состояние игры на кадр 200, вы готовите </span><span class="rvts22">Ввод</span><span class="rvts22"> для кадра 201 (кладёте пальцы на нужные кнопки), а затем передаёте этот Ввод в игру &nbsp;с помощью </span><span class="rvts27">Frame Advance</span><span class="rvts22"> и сразу же видите результат состояние игры на кадр 201 (это если ориентироваться по состоянию оперативной памяти, а изображение на экране игры всегда отстаёт ещё на 1 кадр). Полученный результат обычно является лишь промежуточным, то есть его можно использовать для оценки своего прогресса (на шаге 5), но нельзя использовать для сравнения прошлого и текущего подхода к прохождению участка (на шаге</span><span class="rvts22"> </span><span class="rvts22">7). То есть не нужно применять критерий оптимальности после каждого кадра. Даже если в начале участка вы обгоняете прошлый подход, где-нибудь в середине вы можете отстать. Только при достижении конца участка (шаг 6) у вас появляется объективная основа для сравнений различных подходов.</span></p>
<p class="rvps10"><span class="rvts22">Больше всего времени в этом цикле занимают шаги 3 и 4. Зачастую, прежде чем дойти до целевого события, требуется повторить шаги 3, 4 и 5 несколько раз подряд, записывая и отбраковывая решения, ошибочность которых очевидна даже без сравнений с прошлыми </span><span class="rvts22">подходами</span><span class="rvts22">. Н</span><span class="rvts22">апример, если вашего персонажа посреди разбега убивает враг, то сразу понятно, что далее вводить кнопки разбега быссмысленно, нужно откатиться назад и переписать </span><span class="rvts22">Ввод</span><span class="rvts22"> так, чтобы враг промахнулся. В особо напряжённых ситуациях лучше даже разбить текущий участок на подучастки (</span><span class="rvts22">до</span><span class="rvts22"> и </span><span class="rvts22">после</span><span class="rvts22"> взаимодействия с врагом), чтобы оптимизировать их по отдельности. Иначе вы устанете уже после завершения первого подхода и не захотите больше работать с этим участком игры. Свои силы тоже нужно расходовать оптимально!</span></p>
<p class="rvps10"><a name="savestates"></a>
<span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Так как редактирование </span><span class="rvts22">Ввод</span><span class="rvts22">а в этом методе осуществляется с помощью Курсора Проигрывателя (а не с помощью курсора мыши), то для эффективной работы необходимо научиться быстро доставлять голубой курсор к любому нужному кадру. По мере наработки опыта ТАСеры приучаются "жонглировать" Закладками на уровне моторной памяти. Они машинально создают промежуточные и вспомогательные Закладки во время записи </span><span class="rvts22">Ввода,</span><span class="rvts22"> и зачастую </span><span class="rvts22">не глядя</span><span class="rvts22"> находят нужный слот.</span></p>
<p class="rvps10"><span class="rvts22">Эта виртуозность приходит со временем, обычно уже после завершения парочки ТАСов. Вырабатываются определённые привычки, один палец прирастает к </span><span class="rvts27">Frame Advance</span><span class="rvts22">, логически распределяются типовые обязанности между десятью слотами Закладок, чтобы в нужные моменты пальцы тянулись к нужным клавишам. Например, у некоторых ТАСеров слоты распределяются так:</span></p>
<p class="rvps21"><span class="rvts22"><br/></span></p>
<p class="rvps21"><img alt="" style="padding : 1px;" src="lib/savestate_slots.png"/></p>
<p class="rvps21"><span class="rvts22"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps10"><span class="rvts27">F10</span><span class="rvts22"> указывает на начало текущего уровня игры, чтобы просматривать недавние участки без просмотра всего мувика. </span><span class="rvts37">Используется для навигации.</span></li>
<li class="rvps10"><span class="rvts27">F9</span><span class="rvts22"> отвечает за хранение наилучшего результата на текущем участке. </span><span class="rvts37">Используется для хранения.</span></li>
<li class="rvps10"><span class="rvts27">F2</span><span class="rvts22">-</span><span class="rvts27">F6</span><span class="rvts22"> используются для Закладок после каждого </span><span class="rvts31">сложно воспроизводимого действия в</span><span class="rvts22"> текущем походе к участку. Эти Закладки требуются быстрой навигации по текущему участку. Одна из них указывает на начало участка, а остальные используются по мере необходимости (могут быть вообще не использованы, если участок короткий и простой). Эти Закладки машинально создаются по мере успешной записи Ввода. </span><span class="rvts37">Используются для навигации.</span></li>
<li class="rvps10"><span class="rvts27">F1</span><span class="rvts22"> хранит резервную копию мувика на последнем успешном кадре. В этот слот с параноидальной частотой сохраняется резервная копия рабочего мувика, чтобы из любой ситуации всегда можно было вернуться к последнему стабильному состоянию (например, после загрузок других Закладок, или после записи эксперимента). Так в традиционном методе реализуется простенький откат (undo). Иногда дополнительно к </span><span class="rvts27">F1</span><span class="rvts22"> используется </span><span class="rvts27">F2</span><span class="rvts22"> для обеспечения двух уровней отката, но это усложняет логику резервного сохранения (требуется чередовать слоты), и обычно одного слота вполне достаточно. </span><span class="rvts37">Используется для хранения.</span></li>
<li class="rvps10"><span class="rvts27">F7</span><span class="rvts22">-</span><span class="rvts27">F8</span><span class="rvts22"> могут хранить результаты альтернативных стратегий, которые не лучше, чем то, что хранится в </span><span class="rvts27">F9</span><span class="rvts22">, но всё же представляют интерес. В эти же слоты (либо в </span><span class="rvts27">F2</span><span class="rvts22">-</span><span class="rvts27">F6</span><span class="rvts22">) на шаге 6 временно сохраняется результат нового готового подхода, чтобы пристальнее сравнить его с лучшим результатом (быстро переключаясь между </span><span class="rvts27">F8</span><span class="rvts22"> и </span><span class="rvts27">F9</span><span class="rvts22">). </span><span class="rvts37">Используются для хранения.</span></li>
<li class="rvps10"><span class="rvts22">При создании улучшения чужого ТАСа слоты </span><span class="rvts27">F5</span><span class="rvts22">-</span><span class="rvts27">F7</span><span class="rvts22"> могут быть отведены для разных стадий старого мувика. Например, </span><span class="rvts27">F5</span><span class="rvts22"> отвечает за начало текущего уровня в чужом мувике, </span><span class="rvts27">F6</span><span class="rvts22"> за начало текущего участка в чужом мувике, </span><span class="rvts27">F7</span><span class="rvts22"> за конец участка в чужом мувике. </span><span class="rvts37">Используются для хранения и навигации по содержимому чужого мувика.</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Процесс Записи </span><span class="rvts22">Ввод</span><span class="rvts22">а представляет собой редактирование </span><span class="rvts22">Ввод</span><span class="rvts22">а прямо во время просмотра. То есть просматривая состояние игры на кадр 200, вы готовите </span><span class="rvts22">Ввод</span><span class="rvts22"> для кадра 201 (кладёте пальцы на нужные кнопки), а затем с помощью </span><span class="rvts27">Frame Advance</span><span class="rvts22"> передаёте этот Ввод в игру и сразу же видите результат состояние игры на кадр 201 (если ориентироваться по состоянию оперативной памяти). Этот результат является промежуточным, его можно использовать для примерной оценки текущей игровой ситуации, но нельзя использовать для сравнения прошлой и текущей стратегии прохождения участка. Так что не нужно применять критерий оптимальности после каждого введённого/просмотренного кадра. Даже если в начале участка вы обгоняете прошлый вариант, в середине вы можете отстать. Только при достижении конца участка (пункт 6) появляется объективная основа для сравнений. Поэтому конец участка надо выбирать правильно.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Основную часть рабочего времени в этом цикле занимают пункты 3 и 4. Порой, прежде чем дойти до конца участка, требуется несколько раз повторить пункты 2, 3, 4 и 5, записывая и отбраковывая решения, ошибочность которых становится очевидной почти сразу, даже без сравнений с прошлыми вариантами прохождения. Н</span><span class="rvts22">апример, если вашего персонажа посреди разбега убивает враг, то сразу понятно, что далее вводить кнопки разбега быссмысленно, нужно откатиться назад и переписать </span><span class="rvts22">Ввод</span><span class="rvts22"> так, чтобы враг промахнулся. В особо напряжённых ситуациях лучше даже разбить текущий участок на подучастки </span><span class="rvts37">до</span><span class="rvts22"> и </span><span class="rvts37">после</span><span class="rvts22"> взаимодействия с врагом, чтобы оптимизировать их по отдельности.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Так как редактирование </span><span class="rvts22">Ввод</span><span class="rvts22">а в этом методе осуществляется с помощью Курсора Проигрывателя (а не с помощью курсора мыши), то для эффективной работы необходимо научиться быстро доставлять голубой курсор к нужному кадру, пока не забылась текущая идея по улучшению участка. По мере наработки опыта ТАСеры приучаются жонглировать Закладками на уровне моторной памяти, машинально создавая промежуточные Закладки во время записи </span><span class="rvts22">Ввод</span><span class="rvts22">а и беспечно загружая их при малейшей необходимости. Этому навыку невозможно научить, это приходит со временем, обычно после завершения первого-второго ТАСа.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Плюсы метода:</span></p>
<p class="rvps15"><span class="rvts51">+ </span><span class="rvts22">Интуитивно понятный любому геймеру процесс.</span></p>
<p class="rvps15"><span class="rvts51">+ </span><span class="rvts22">Постоянная отдача позволяет на ходу корректировать свои решения и заранее отсекать в уме заведомо ошибочные комбинации </span><span class="rvts22">Ввод</span><span class="rvts22">а. Это уменьшает количество требуемых исправлений.</span></p>
<p class="rvps15"><span class="rvts51">+ </span><span class="rvts22">Границы текущего участка машинально отмечаются с помощью Закладок (ради навигации), приучая ТАСера к порядку.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Минусы метода:</span></p>
<p class="rvps15"><span class="rvts51"> </span><span class="rvts22">Настойчивая отдача провоцирует ТАСера отсекать некоторые нелогичные, но потенциально выигрышные комбинации.</span></p>
<p class="rvps15"><span class="rvts51"></span><span class="rvts26"> </span><span class="rvts22">Медленная навигация к месту ошибки может отвлечь от мысли.</span></p>
<p class="rvps15"><span class="rvts51"></span><span class="rvts26"> </span><span class="rvts22">Так как Закладок всего 10, границы прошлых участков теряются при создании нового участка.</span></p>
<p class="rvps15"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts26">Когда использовать: </span><span class="rvts22">при записи пробного прохождения участка, когда не важна точность, но требуется примерное выполнение запланированной последовательности действий. А в отшлифовке </span><span class="rvts22">Ввод</span><span class="rvts22">а этот метод значительно уступает остальным. </span><span class="rvts22">Тем не менее, если вы новичок, рекомендуется освоить этот метод ТАСинга, так как инструменты для его применения есть в большинстве современных эмуляторов, а Тасэдитор пока есть только в FCEUX.</span></p>
<p class="rvps10"><span class="rvts22">Этот навык во многом похож на навык игры на музыкальном инструменте. Чем быстрее вы его выработаете, тем лучше, ведь пока вы его не освоили, традиционный процесс ТАСинга будет казаться вам слишком утомительным. Из-за этого многие люди считают порог вхождения слишком высоким. Зато тем, кто освоился с техникой скоростного использования сэйвов, остальные премудрости ТАСинга даются легче.</span></p>
<p class="rvps10"><span class="rvts22">Впрочем, теперь есть Тасэдитор. Он отменяет необходимость тренировки пальцев, давая возможность быстрой навигации по мувику без Закладок. И приучаться к постоянному сохранению в </span><span class="rvts27">F1</span><span class="rvts22"> больше не нужно, так как есть Журнал Истории. Так что, в принципе, вы можете забыть о традиционном методе и сразу же начать редактирование мувика и тестирование подходов с помощью </span><a class="rvts28" href="NonlinearTASing.html">нелинейного метода ТАСинга</a><span class="rvts22">.</span></p>
<p class="rvps10"><span class="rvts22">Тасэдитор также расширяет возможности традиционного метода:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps24" style="text-indent: 30px"><span class="rvts22">Появились новые способы навигации Курсором Проигрывателя, которые позволяют быстрее попадать к любому желаемому месту и реже создавать Закладки.</span></li>
<li class="rvps10"><span class="rvts22">При загрузке Закладки мувик не усекается после кадра Закладки. Поэтому теперь можно сначала записать, к примеру, участок кадров 900-1000, а затем записать участок 700-900, не потеряв при этом данные участка 900-1000.</span></li>
<li class="rvps10"><span class="rvts22">Возможность использовать Тасэдитор вместо внешнего редактора </span><span class="rvts22">Ввод</span><span class="rvts22">а (для копипаста и т.п.).</span></li>
<li class="rvps10"><span class="rvts22">Визуализация Закладок, </span><span class="rvts22">Ввода</span><span class="rvts22">, лага и т.д.</span></li>
<li class="rvps10"><span class="rvts22">Дополнительные инструменты: мультитрекинг, наложение, шаблоны, авто-подгонка Ввода и т.д.</span></li>
</ul>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">При миграции в Тасэдитор традиционный метод несколько усовершенствовался по сравнению с тем же методом вне Тасэдитора:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps15"><span class="rvts22">Появилась возможность не повторять заново весь </span><span class="rvts22">Ввод </span><span class="rvts22">от ближайшего сэйва до места ошибки и от места ошибки до конца участка. Для навигации без затирания Ввода можно прямо в режиме Записи вращать колесо мыши или перемещать Курсор Проигрывателя любым другим способом (кроме способа </span><span class="rvts27">Frame Advance</span><span class="rvts22">, т.к. он будет затирать старый Ввод).</span></li>
<li class="rvps23" style="text-indent: 30px"><span class="rvts22">Появились новые способы навигации Курсором Проигрывателя (обратная перемотка, прыжки по Маркерам, прыжки по Закладкам без необходимости выключения Записи). Это позволяет быстрее попадать к любому желаемому месту и реже создавать Закладки.</span></li>
<li class="rvps15"><span class="rvts22">При загрузке ответвления Закладки мувик не усекается после кадра Закладки. Поэтому теперь можно сначала записать, к примеру, участок кадров 900-1000, а затем записать участок 700-900, не потеряв при этом записанные данные 900-1000 (но, возможно, потребуется пересинхронизация нажатий).</span></li>
<li class="rvps15"><span class="rvts22">Возможность использовать Тасэдитор вместо внешнего редактора </span><span class="rvts22">Ввод</span><span class="rvts22">а (для копипаста и т.п.).</span></li>
<li class="rvps15"><span class="rvts22">Визуализация </span><span class="rvts22">Ввод</span><span class="rvts22">а, лага, ответвлений Закладок и т.д.</span></li>
<li class="rvps15"><span class="rvts22">Дополнительные инструменты: мультитрекинг, наложение, шаблоны, авто-подгонка Ввода и т.д.</span></li>
</ul>
<p class="rvps10"><span class="rvts22">Плюсы метода:</span></p>
<p class="rvps14"><span class="rvts52">+ </span><span class="rvts22">Процесс интуитивно понятен любому геймеру.</span></p>
<p class="rvps14"><span class="rvts52">+ </span><span class="rvts22">Постоянная отдача позволяет адаптироваться к игре на ходу, корректировать свои решения и преждевременно отсекать в уме ошибочные подходы.</span></p>
<p class="rvps14"><span class="rvts52">+ </span><span class="rvts22">Границы текущего участка всегда отмечаются с помощью Закладок (ради навигации), тем самым приучая ТАСера к порядку.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22">Минусы метода:</span></p>
<p class="rvps14"><span class="rvts52"> </span><span class="rvts22">Настойчивая игровая отдача провоцирует ТАСера отсекать некоторые нелогичные, но потенциально выигрышные подходы.</span></p>
<p class="rvps14"><span class="rvts52"></span><span class="rvts26"> </span><span class="rvts22">Медленная навигация может отвлечь от мысли и повысить утомляемость.</span></p>
<p class="rvps14"><span class="rvts52"></span><span class="rvts26"> </span><span class="rvts22">Так как количество Закладок ограничено, оазметка прошлых участков теряется при создании нового участка, так что требуется выписывать некоторые вещи в текстовый файл.</span></p>
<p class="rvps14"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts26">Когда рекомендуется использовать: </span><span class="rvts22">никогда. Можно воспользоваться Записью при первом пробном прохождении участка (или всей игры), когда не важна точность. А в отшлифовке </span><span class="rvts22">Ввод</span><span class="rvts22">а этот метод значительно уступает остальным. </span><span class="rvts22">Тем не менее, имеет смысл освоить этот метод, так как инструменты для его применения есть во многих современных эмуляторах, а Тасэдитор пока есть только в FCEUX.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><a class="rvts28" href="NonlinearTASing.html">Следующий метод</a><span class="rvts22"> гораздо эффективнее, хоть и требует некоторого привыкания.</span></p>
<p class="rvps10"><a class="rvts28" href="NonlinearTASing.html">Следующий метод</a><span class="rvts22"> эффективнее, но на нормальное прохождение игр он похож ещё меньше.</span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p class="rvps10"><span class="rvts22"><br/></span></p>
<p></p>
<p class="rvps8"><span class="rvts18">Created with the Personal Edition of HelpNDoc: </span><a class="rvts19" href="http://www.helpndoc.com/feature-tour">Easily create CHM Help documents</a></p>
</div>

View File

@ -264,19 +264,18 @@ span.rvts45
}
span.rvts46
{
font-size: 11pt;
font-weight: bold;
color: #008817;
text-decoration: underline;
}
span.rvts47
{
}
a.rvts48, span.rvts48
{
font-size: 11pt;
font-weight: bold;
color: #0000ff;
text-decoration: underline;
}
a.rvts48:hover { color: #0000ff; }
span.rvts48
{
}
a.rvts49, span.rvts49
{
font-size: 11pt;
@ -293,157 +292,165 @@ a.rvts50, span.rvts50
text-decoration: underline;
}
a.rvts50:hover { color: #0000ff; }
span.rvts51
a.rvts51, span.rvts51
{
font-size: 11pt;
font-weight: bold;
color: #0000ff;
text-decoration: underline;
}
a.rvts51:hover { color: #0000ff; }
span.rvts52
{
font-size: 12pt;
font-weight: bold;
}
span.rvts52 /* Font Style */
span.rvts53 /* Font Style */
{
font-size: 11pt;
color: #4f81bd;
}
span.rvts53
span.rvts54
{
font-size: 11pt;
font-weight: bold;
}
span.rvts54
span.rvts55
{
font-size: 11pt;
}
span.rvts55
span.rvts56
{
color: #004000;
}
a.rvts56, span.rvts56
a.rvts57, span.rvts57
{
color: #0000ff;
text-decoration: underline;
}
a.rvts56:hover { color: #0000ff; }
span.rvts57
a.rvts57:hover { color: #0000ff; }
span.rvts58
{
font-size: 6pt;
}
span.rvts58
span.rvts59
{
font-size: 16pt;
text-decoration: underline;
}
span.rvts59
span.rvts60
{
color: #000000;
}
span.rvts60
span.rvts61
{
font-size: 11pt;
font-weight: bold;
color: #000000;
}
a.rvts61, span.rvts61
{
font-size: 11pt;
color: #0000ff;
text-decoration: underline;
}
a.rvts61:hover { color: #0000ff; }
a.rvts62, span.rvts62
{
font-size: 11pt;
color: #0000ff;
text-decoration: underline;
}
a.rvts62:hover { color: #0000ff; }
span.rvts63
a.rvts63, span.rvts63
{
color: #0000ff;
text-decoration: underline;
}
a.rvts63:hover { color: #0000ff; }
span.rvts64
{
font-size: 11pt;
text-decoration: underline;
}
span.rvts64
span.rvts65
{
}
span.rvts65
span.rvts66
{
font-size: 11pt;
color: #0a8200;
}
span.rvts66
span.rvts67
{
font-size: 9pt;
font-weight: bold;
}
a.rvts67, span.rvts67
a.rvts68, span.rvts68
{
font-size: 9pt;
font-weight: bold;
color: #0000ff;
text-decoration: underline;
}
a.rvts67:hover { color: #0000ff; }
span.rvts68
a.rvts68:hover { color: #0000ff; }
span.rvts69
{
font-weight: bold;
color: #ffffff;
}
span.rvts69
span.rvts70
{
font-size: 12pt;
font-family: 'Courier New', 'Courier', monospace;
color: #000080;
}
span.rvts70 /* Font Style */
span.rvts71 /* Font Style */
{
font-size: 11pt;
font-style: italic;
color: #243f60;
}
span.rvts71 /* Font Style */
span.rvts72 /* Font Style */
{
font-size: 11pt;
color: #333399;
}
a.rvts72, span.rvts72
a.rvts73, span.rvts73
{
font-size: 11pt;
font-weight: bold;
color: #0000ff;
text-decoration: underline;
}
a.rvts72:hover { color: #0000ff; }
span.rvts73
a.rvts73:hover { color: #0000ff; }
span.rvts74
{
font-size: 11pt;
font-style: italic;
font-weight: bold;
}
span.rvts74
{
font-size: 24pt;
text-decoration: underline;
}
span.rvts75
{
font-size: 24pt;
text-decoration: underline;
}
a.rvts76, span.rvts76
span.rvts76
{
font-size: 24pt;
text-decoration: underline;
}
a.rvts77, span.rvts77
{
color: #0000ff;
text-decoration: underline;
}
a.rvts76:hover { color: #0000ff; }
a.rvts77, span.rvts77
a.rvts77:hover { color: #0000ff; }
a.rvts78, span.rvts78
{
font-weight: bold;
color: #ffffff;
text-decoration: underline;
}
a.rvts77:hover { color: #0000ff; }
span.rvts78
a.rvts78:hover { color: #0000ff; }
span.rvts79
{
color: #ffffff;
}
span.rvts79
span.rvts80
{
color: #333399;
}
@ -516,14 +523,14 @@ p,ul,ol /* Paragraph Style */
}
.rvps14
{
text-align: left;
text-indent: 30px;
padding: 0px 0px 0px 0px;
margin: 0px 0px 0px 0px;
}
.rvps15
{
text-align: justify;
text-indent: 30px;
padding: 0px 0px 0px 0px;
margin: 0px 0px 0px 0px;
}
.rvps16 /* Paragraph Style */
{
@ -558,16 +565,44 @@ p,ul,ol /* Paragraph Style */
}
.rvps24
{
text-indent: 20px;
text-align: justify;
}
.rvps25 /* Paragraph Style */
.rvps25
{
text-align: justify;
margin: 0px 0px 0px 50px;
}
.rvps26 /* Paragraph Style */
.rvps26
{
text-align: justify;
}
.rvps27
{
text-align: justify;
}
.rvps28
{
text-indent: 20px;
}
.rvps29
{
text-align: justify;
text-indent: 20px;
}
.rvps30 /* Paragraph Style */
{
}
.rvps31 /* Paragraph Style */
{
}
.rvps32
{
text-indent: 30px;
margin: 0px 0px 0px 30px;
}
.rvps33
{
text-align: justify;
text-indent: 30px;
margin: 0px 0px 0px 30px;
}

View File

@ -4,8 +4,8 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<title>TAS Editor Manual Rus</title>
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<title>TAS Editor Manual, Russian Version</title>
<script type="text/javascript">
var sTopic = "";
if (top.location.href.lastIndexOf("?") > 0)

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1019 B

View File

@ -2,9 +2,9 @@
<html>
<head>
<title>TAS Editor Manual Rus- Table of Contents</title>
<title>TAS Editor Manual, Russian Version- Table of Contents</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="HelpNDoc Personal Edition 3.6.0.345">
<meta name="generator" content="HelpNDoc Personal Edition 3.7.1.482">
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/silver-theme/jquery-ui-1.8.12.custom.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/dynatree/chm/ui.dynatree.css" />
@ -32,7 +32,9 @@
$(document).ready(function()
{
var sAnchorName = top.location.href.substring(top.location.href.lastIndexOf("#") + 1, top.location.href.length);
var sAnchorName = '';
try { sAnchorName = top.location.href.substring(top.location.href.lastIndexOf("#") + 1, top.location.href.length); }
catch(err) { sAnchorName = ''; }
var nSelectedTab = 0;
if (sAnchorName == '_index') nSelectedTab = 1
else if (sAnchorName == '_search') nSelectedTab = 2;