225 lines
61 KiB
HTML
225 lines
61 KiB
HTML
<html>
|
||
|
||
<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">
|
||
<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" />
|
||
<!--[if lte IE 8]>
|
||
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" />
|
||
<![endif]-->
|
||
<style type="text/css">
|
||
#topic_header
|
||
{
|
||
background-color: #EFEFEF;
|
||
}
|
||
</style>
|
||
<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)
|
||
{
|
||
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>
|
||
|
||
<body>
|
||
|
||
<div id="topic_header">
|
||
<div id="topic_header_content">
|
||
<h1>6. Продвинутые возможности</h1>
|
||
|
||
<div id="topic_breadcrumb">
|
||
<a href="BeginnersGuide.html">Курс для новичка</a> ›› </div>
|
||
</div>
|
||
<div id="topic_header_nav">
|
||
<a href="BeginnersGuide.html"><img src="img/arrow_up.png" alt="Parent"/></a>
|
||
|
||
<a href="ProgramCustomization.html"><img src="img/arrow_left.png" alt="Previous"/></a>
|
||
|
||
<a href="Reference.html"><img src="img/arrow_right.png" alt="Next"/></a>
|
||
|
||
</div>
|
||
<div class="clear"></div>
|
||
</div>
|
||
<div id="topic_content">
|
||
|
||
<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="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>
|
||
<p class="rvps10"><span class="rvts22"><br/></span></p>
|
||
<p class="rvps10"><span class="rvts22">Проект Тасэдитора сохраняется на диске в виде fm3-файла. В этом файле сохраняются все существенные аспекты состояния работы, чтобы можно было в точности восстановить отложенное состояние рабочего процесса. Размер этого "мгновенного снимка" может занимать немало места (в зависимости от объёма Гринзоны он может составлять сотни мегабайт).</span></p>
|
||
<p class="rvps10"><span class="rvts22">Поэтому в случаях, когда вам нужно выложить проект в Интернете (например, для опубликования), имеет смысл сохранять в проекте не полный снимок рабочего процесса, а только необходимую информацию. Для этого нужно выбрать в меню Тасэдитора пункт </span><span class="rvts26">File -> 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-файл в текстовом формате, что увеличит размер файла, но позволит редактировать его в любом текстовом редакторе. Однако Тасэдитор гораздо лучше приспособлен к редактированию мувиков, поэтому рекомендуется оставить эту галочку установленной и воздержаться от изменений содержимого 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">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="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 -> Export to FM2</span><span class="rvts22">. Появится окно, где можно выбрать формат целевого мувика (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 -> Open</span><span class="rvts22">) нужно применить фильтр "All Files (*.*)" и выбрать требуемый fm2-мувик. Тасэдитор выдаст сообщение о том, что данный файл не является проектом и потребует подтверждения загрузки. При положительном ответе Тасэдитор создаст новый проект, используя Ввод и настройки (1P/2P/Fourscore) из данного fm2-файла.</span></p>
|
||
<p class="rvps10"><span class="rvts22">Кроме того, вы можете импортировать Ввод из любого fm2 или fm3-файла с помощью </span><span class="rvts26">File -> 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="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>
|
||
<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>
|
||
</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></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="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"><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="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"><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">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"><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"><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>
|
||
<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="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 -> Lua -> 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"><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"> </span><span class="rvts55">marioX = memory.readbyte(0x3AD)</span></p>
|
||
<p class="rvps2"><span class="rvts55"></span><span class="rvts55"> </span><span class="rvts55">marioY = memory.readbyte(0xCE)</span></p>
|
||
<p class="rvps2"><span class="rvts55"></span><span class="rvts55"> </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>
|
||
</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"><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"> </span><span class="rvts55">selection_table = taseditor.getselection()</span></p>
|
||
<p class="rvps2"><span class="rvts55"></span><span class="rvts55"> </span><span class="rvts55">if (selection_table ~= nil) then</span></p>
|
||
<p class="rvps2"><span class="rvts55"></span><span class="rvts55"> </span><span class="rvts55"> </span><span class="rvts55">for i = 1, #selection_table do</span></p>
|
||
<p class="rvps2"><span class="rvts55"></span><span class="rvts55"> </span><span class="rvts55"> </span><span class="rvts55"> </span><span class="rvts55">selected_frame = selection_table[i]</span></p>
|
||
<p class="rvps2"><span class="rvts55"></span><span class="rvts55"> </span><span class="rvts55"> </span><span class="rvts55"> </span><span class="rvts55">joypad1data = taseditor.getinput(selected_frame, 1)</span></p>
|
||
<p class="rvps2"><span class="rvts55"></span><span class="rvts55"> </span><span class="rvts55"> </span><span class="rvts55"> </span><span class="rvts55">taseditor.submitinputchange(selected_frame, 2, joypad1data)</span></p>
|
||
<p class="rvps2"><span class="rvts55"></span><span class="rvts55"> </span><span class="rvts55"> </span><span class="rvts55">end</span></p>
|
||
<p class="rvps2"><span class="rvts55"></span><span class="rvts55"> </span><span class="rvts55"> </span><span class="rvts55">taseditor.applyinputchanges("Copy 1P->2P")</span></p>
|
||
<p class="rvps2"><span class="rvts55"></span><span class="rvts55"> </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>
|
||
</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"><img align="right" alt="" style="padding : 6px;" src="lib/lua-run-manual.png"/></p>
|
||
<p class="rvps10"><span class="rvts22">Этот весьма простой скрипт уже представляет из себя полезный инструмент, который может пригодиться вам при создании ТАСов с управлением двумя игроками одновременно. После запуска этого скрипта вы во время ТАСинга сможете выделять в 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"><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"><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/help-authoring-tool">Single source CHM, PDF, DOC and HTML Help creation</a></p>
|
||
</div>
|
||
|
||
<div id="topic_footer">
|
||
|
||
<div id="topic_footer_content">
|
||
Copyright © 2011-2012 АнС</div>
|
||
</div>
|
||
</body>
|
||
|
||
</html>
|
||
|